# Block and frame class implementations for GDBtk. # Copyright (C) 1997, 1998, 1999 Cygnus Solutions # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License (GPL) as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ------------------------------------------------------------------ # Block # ------------------------------------------------------------------ itcl::body Block::constructor {start end args} { # Record runtime info about this block set _start $start set _end $end set _variables [_findVariables] eval configure $args } # Destroy ourself. itcl::body Block::destructor {} { # Each block is responsible for destroying its # variables and removing them from the list of # of all variables for this frame foreach var $_variables { $var delete } } # Return a list of variables defined in this block # This list is determined when we are created. itcl::body Block::variables {} { return $_variables } # Find the new variables for this block. itcl::body Block::_findVariables {} { # Find the new variables for this block. set variables [gdb_block_variables $_start $_end] # Create variables. set vars {} foreach variable $variables { # Be paranoid: catch errors constructing variable. set err [catch {gdb_variable create -expr $variable} obj] if {!$err} { lappend vars $obj } } return $vars } itcl::body Block::update {} { set changed {} foreach var $_variables { set changed [concat $changed [$var update]] } return $changed } itcl::body Block::info {} { return [list $_start $_end] } # ------------------------------------------------------------------ # Frame # ------------------------------------------------------------------ itcl::body Frame::constructor {addr} { set _addr $addr # Create all blocks in the selected frame set _blocks {} _createBlocks [gdb_get_blocks] } itcl::body Frame::destructor {} { # destroy our own blocks foreach block $_blocks { _removeBlock $block } } itcl::body Frame::_removeBlock {blockObj} { set i [lsearch $_blocks $blockObj] if {$i != -1} { set _blocks [lreplace $_blocks $i $i] delete object $blockObj } } itcl::body Frame::_addBlock {block} { set start [lindex $block 0] set end [lindex $block 1] set b [Block \#auto $start $end] lappend _blocks $b return $b } itcl::body Frame::_createBlocks {blocks} { foreach block $blocks { set b [_addBlock $block] } } itcl::body Frame::update {} { set vars {} foreach block $_blocks { set vars [concat $vars [$block update]] } return $vars } itcl::body Frame::variables {} { set vars {} foreach block $_blocks { set vars [concat $vars [$block variables]] } return $vars } itcl::body Frame::new {} { # find any new variables. So get a list of all blocks, # eliminate duplicates, and get those variables. set blocks [gdb_get_blocks] set new {} foreach block $blocks { set b [_findBlock $block] if {$b == ""} { # Found a new block. Create it get its variables set b [_addBlock $block] set new [concat $new [$b variables]] } } return $new } itcl::body Frame::deleteOld {} { foreach block [_oldBlocks] { _removeBlock $block } } itcl::body Frame::_oldBlocks {} { set blocks [gdb_get_blocks] set oldObjs $_blocks foreach block $blocks { set obj [_findBlock $block] if {$obj != ""} { # Found it.. Remove it from old set i [lsearch $oldObjs $obj] set oldObjs [lreplace $oldObjs $i $i] } } return $oldObjs } itcl::body Frame::old {} { # All the variables in the blocks in old are now gone... # We don't remove blocks here, since the frontend viewer # might want to keep these variables around for a little while # longer. set vars {} set old [_oldBlocks] foreach block $old { set vars [concat $vars [$block variables]] } return $vars } itcl::body Frame::_findBlock {block} { foreach b $_blocks { set info [$b info] if {$info == $block} { return $b } } return "" } itcl::body Frame::_findBlockIndex {block} { set i 0 foreach b $_blocks { set info [$b info] if {$info == $block} { return $i } incr i } return -1 }