#
|
#
|
# Tests for "upvar" across interpreter boundaries
|
# Tests for "upvar" across interpreter boundaries
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# AUTHOR: Michael J. McLennan
|
# AUTHOR: Michael J. McLennan
|
# Bell Labs Innovations for Lucent Technologies
|
# Bell Labs Innovations for Lucent Technologies
|
# mmclennan@lucent.com
|
# mmclennan@lucent.com
|
# http://www.tcltk.com/itcl
|
# http://www.tcltk.com/itcl
|
#
|
#
|
# RCS: $Id: upvar.test,v 1.1.1.1 2002-01-16 10:24:47 markom Exp $
|
# RCS: $Id: upvar.test,v 1.1.1.1 2002-01-16 10:24:47 markom Exp $
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# Copyright (c) 1993-1998 Lucent Technologies, Inc.
|
# Copyright (c) 1993-1998 Lucent Technologies, Inc.
|
# ======================================================================
|
# ======================================================================
|
# See the file "license.terms" for information on usage and
|
# See the file "license.terms" for information on usage and
|
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# DEFINE SOME USEFUL ROUTINES
|
# DEFINE SOME USEFUL ROUTINES
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
proc upvarTest_show_var {var val} {
|
proc upvarTest_show_var {var val} {
|
return "$var>>$val"
|
return "$var>>$val"
|
}
|
}
|
|
|
proc upvarTest_upvar_in_procs {} {
|
proc upvarTest_upvar_in_procs {} {
|
set upvarTest_var_local "value in main interp"
|
set upvarTest_var_local "value in main interp"
|
foo do {
|
foo do {
|
upvar upvarTest_var_local var
|
upvar upvarTest_var_local var
|
set var
|
set var
|
}
|
}
|
}
|
}
|
|
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# CREATE SOME OBJECTS
|
# CREATE SOME OBJECTS
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
Foo foo
|
Foo foo
|
Baz baz
|
Baz baz
|
|
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# UPVAR TESTS
|
# UPVAR TESTS
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
test {"::" sends command to global interp but preserves
|
test {"::" sends command to global interp but preserves
|
local variables. This ensures that when control
|
local variables. This ensures that when control
|
shifts to the global scope for Extended Tcl commands,
|
shifts to the global scope for Extended Tcl commands,
|
Expect commands, etc., local variables will be
|
Expect commands, etc., local variables will be
|
recognized.} {
|
recognized.} {
|
foo do {
|
foo do {
|
set localvar "special"
|
set localvar "special"
|
::eval {upvarTest_show_var localvar $localvar}
|
::eval {upvarTest_show_var localvar $localvar}
|
}
|
}
|
} {
|
} {
|
$result == "Foo says 'localvar>>special'"
|
$result == "Foo says 'localvar>>special'"
|
}
|
}
|
|
|
|
|
test {"upvar" can cross interp boundaries to access local variables} {
|
test {"upvar" can cross interp boundaries to access local variables} {
|
upvarTest_upvar_in_procs
|
upvarTest_upvar_in_procs
|
} {
|
} {
|
$result == "Foo says 'value in main interp'"
|
$result == "Foo says 'value in main interp'"
|
}
|
}
|
|
|
test {"upvar" can cross interp boundaries to access global variables} {
|
test {"upvar" can cross interp boundaries to access global variables} {
|
set upvarTest_var_global "value in main interp"
|
set upvarTest_var_global "value in main interp"
|
foo do {
|
foo do {
|
upvar upvarTest_var_global var
|
upvar upvarTest_var_global var
|
set var
|
set var
|
}
|
}
|
} {
|
} {
|
$result == "Foo says 'value in main interp'"
|
$result == "Foo says 'value in main interp'"
|
}
|
}
|
|
|
test {"upvar" can handle multiple call frames on the stack} {
|
test {"upvar" can handle multiple call frames on the stack} {
|
set upvarTest_var_global "new value"
|
set upvarTest_var_global "new value"
|
foo do {
|
foo do {
|
foo do {
|
foo do {
|
upvar #0 upvarTest_var_global var
|
upvar #0 upvarTest_var_global var
|
set var
|
set var
|
}
|
}
|
}
|
}
|
} {
|
} {
|
$result == "Foo says 'Foo says 'new value''"
|
$result == "Foo says 'Foo says 'new value''"
|
}
|
}
|
|
|
test {"upvar" can cross class interp boundaries} {
|
test {"upvar" can cross class interp boundaries} {
|
baz do {
|
baz do {
|
set localvar "value in Baz"
|
set localvar "value in Baz"
|
foo do {
|
foo do {
|
upvar localvar var
|
upvar localvar var
|
set var
|
set var
|
}
|
}
|
}
|
}
|
} {
|
} {
|
$result == "Baz says 'Foo says 'value in Baz''"
|
$result == "Baz says 'Foo says 'value in Baz''"
|
}
|
}
|
|
|
test {"upvar" can cross class interp boundaries back to main interp} {
|
test {"upvar" can cross class interp boundaries back to main interp} {
|
set upvarTest_var_global "global value"
|
set upvarTest_var_global "global value"
|
baz do {
|
baz do {
|
foo do {
|
foo do {
|
upvar 2 upvarTest_var_global var
|
upvar 2 upvarTest_var_global var
|
set var
|
set var
|
}
|
}
|
}
|
}
|
} {
|
} {
|
$result == "Baz says 'Foo says 'global value''"
|
$result == "Baz says 'Foo says 'global value''"
|
}
|
}
|
|
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
# CLEAN UP
|
# CLEAN UP
|
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
foo delete
|
foo delete
|
baz delete
|
baz delete
|
|
|