|
Packit |
62fe53 |
# Copyright (C) 1992-2016 Free Software Foundation, Inc.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
# This file is part of DejaGnu.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
# DejaGnu is free software; you can redistribute it and/or modify it
|
|
Packit |
62fe53 |
# under the terms of the GNU General Public License as published by
|
|
Packit |
62fe53 |
# the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
62fe53 |
# (at your option) any later version.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
# DejaGnu is distributed in the hope that it will be useful, but
|
|
Packit |
62fe53 |
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
62fe53 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
62fe53 |
# General Public License for more details.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
# You should have received a copy of the GNU General Public License
|
|
Packit |
62fe53 |
# along with DejaGnu; if not, write to the Free Software Foundation,
|
|
Packit |
62fe53 |
# Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# This file was written by Rob Savoye <rob@welcomehome.org>.
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Dump the values of a shell expression representing variable names.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc dumpvars { args } {
|
|
Packit |
62fe53 |
uplevel 1 [list foreach i [uplevel 1 "info vars $args"] {
|
|
Packit |
62fe53 |
if { [catch "array names $i" names ] } {
|
|
Packit |
62fe53 |
eval "puts \"${i} = \$${i}\""
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
eval "puts \"$i\($k\) = \$$i\($k\)\""
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
]
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Dump the values of a shell expression representing variable names.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc dumplocals { args } {
|
|
Packit |
62fe53 |
uplevel 1 [list foreach i [uplevel 1 "info locals $args"] {
|
|
Packit |
62fe53 |
if { [catch "array names $i" names ] } {
|
|
Packit |
62fe53 |
eval "puts \"${i} = \$${i}\""
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
eval "puts \"$i\($k\) = \$$i\($k\)\""
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
]
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Dump the body of procedures specified by a regexp.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc dumprocs { args } {
|
|
Packit |
62fe53 |
foreach i [info procs $args] {
|
|
Packit |
62fe53 |
puts "\nproc $i \{ [info args $i] \} \{ [info body $i]\}"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Dump all the current watchpoints.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc dumpwatch { args } {
|
|
Packit |
62fe53 |
foreach i [uplevel 1 "info vars $args"] {
|
|
Packit |
62fe53 |
set tmp ""
|
|
Packit |
62fe53 |
if { [catch "uplevel 1 array name $i" names] } {
|
|
Packit |
62fe53 |
set tmp [uplevel 1 trace vinfo $i]
|
|
Packit |
62fe53 |
if {![string match "" $tmp]} {
|
|
Packit |
62fe53 |
puts "$i $tmp"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
set tmp [uplevel 1 trace vinfo [set i]($k)]
|
|
Packit |
62fe53 |
if {![string match "" $tmp]} {
|
|
Packit |
62fe53 |
puts "[set i]($k) = $tmp"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Trap a watchpoint for an array.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc watcharray { array element op } {
|
|
Packit |
62fe53 |
upvar [set array]($element) avar
|
|
Packit |
62fe53 |
switch -- $op {
|
|
Packit |
62fe53 |
"w" { puts "New value of [set array]($element) is $avar" }
|
|
Packit |
62fe53 |
"r" { puts "[set array]($element) (= $avar) was just read" }
|
|
Packit |
62fe53 |
"u" { puts "[set array]($element) (= $avar) was just unset" }
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc watchvar { v ignored op } {
|
|
Packit |
62fe53 |
upvar $v var
|
|
Packit |
62fe53 |
switch -- $op {
|
|
Packit |
62fe53 |
"w" { puts "New value of $v is $var" }
|
|
Packit |
62fe53 |
"r" { puts "$v (=$var) was just read" }
|
|
Packit |
62fe53 |
"u" { puts "$v (=$var) was just unset" }
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Watch when a variable is written.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc watchunset { arg } {
|
|
Packit |
62fe53 |
if { [catch "uplevel 1 array name $arg" names ] } {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable $arg u watchvar
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable [set arg]($k) u watcharray
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Watch when a variable is written.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc watchwrite { arg } {
|
|
Packit |
62fe53 |
if { [catch "uplevel 1 array name $arg" names ] } {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable $arg w watchvar
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable [set arg]($k) w watcharray
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Watch when a variable is read.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc watchread { arg } {
|
|
Packit |
62fe53 |
if { [catch "uplevel 1 array name $arg" names ] } {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable $arg r watchvar
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
if {![uplevel 1 info exists $arg]} {
|
|
Packit |
62fe53 |
puts stderr "$arg does not exist"
|
|
Packit |
62fe53 |
return
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
uplevel 1 trace variable [set arg]($k) r watcharray
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Delete a watchpoint.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc watchdel { args } {
|
|
Packit |
62fe53 |
foreach i [uplevel 1 "info vars $args"] {
|
|
Packit |
62fe53 |
set tmp ""
|
|
Packit |
62fe53 |
if { [catch "uplevel 1 array name $i" names] } {
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete $i w watchvar"
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete $i r watchvar"
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete $i u watchvar"
|
|
Packit |
62fe53 |
} else {
|
|
Packit |
62fe53 |
foreach k $names {
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete [set i]($k) w watcharray"
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete [set i]($k) r watcharray"
|
|
Packit |
62fe53 |
catch "uplevel 1 trace vdelete [set i]($k) u watcharray"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# This file creates GDB style commands for the Tcl debugger
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc print { var } {
|
|
Packit |
62fe53 |
puts "$var"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc quit { } {
|
|
Packit |
62fe53 |
log_and_exit
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc bt { } {
|
|
Packit |
62fe53 |
# The w command is provided by the Tcl debugger.
|
|
Packit |
62fe53 |
puts "[w]"
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
# Create some stub procedures since we can't alias the command names.
|
|
Packit |
62fe53 |
#
|
|
Packit |
62fe53 |
proc dp { args } {
|
|
Packit |
62fe53 |
uplevel 1 dumprocs $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc dv { args } {
|
|
Packit |
62fe53 |
uplevel 1 dumpvars $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc dl { args } {
|
|
Packit |
62fe53 |
uplevel 1 dumplocals $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc dw { args } {
|
|
Packit |
62fe53 |
uplevel 1 dumpwatch $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc q { } {
|
|
Packit |
62fe53 |
quit
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc p { args } {
|
|
Packit |
62fe53 |
uplevel 1 print $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc wu { args } {
|
|
Packit |
62fe53 |
uplevel 1 watchunset $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc ww { args } {
|
|
Packit |
62fe53 |
uplevel 1 watchwrite $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc wr { args } {
|
|
Packit |
62fe53 |
uplevel 1 watchread $args
|
|
Packit |
62fe53 |
}
|
|
Packit |
62fe53 |
|
|
Packit |
62fe53 |
proc wd { args } {
|
|
Packit |
62fe53 |
uplevel 1 watchdel $args
|
|
Packit |
62fe53 |
}
|