4 .HLL 'Tcl', 'tcl_group'
8 .param pmc argv :slurpy
12 if argc < 2 goto bad_args
14 .local pmc __call_level, call_chain
16 __call_level = get_root_global ['_tcl'], '__call_level'
17 call_chain = get_root_global ['_tcl'], 'call_chain'
18 call_level = elements call_chain
20 .local int new_call_level, defaulted
22 (new_call_level,defaulted) = __call_level($P0)
23 if defaulted == 1 goto skip
29 if $I0 == 1 goto bad_args
31 # for each othervar/myvar pair, created a mapping from
33 .local pmc __make, __set, __find_var
34 __make = get_root_global ['_tcl'], '__make'
35 __set = get_root_global ['_tcl'], '__set'
36 __find_var = get_root_global ['_tcl'], '__find_var'
38 .local int counter, argc
42 difference = call_level - new_call_level
44 if counter >= argc goto done
46 .local string old_var, new_var
47 old_var = argv[counter]
49 new_var = argv[counter]
51 if new_call_level == 0 goto store_var
52 $P0 = __find_var(new_var, 'depth'=>1)
53 if null $P0 goto store_var
56 $S0 .= '" already exists'
60 .local pmc saved_call_chain
61 saved_call_chain = new 'ResizablePMCArray'
64 if $I0 == difference goto save_chain_end
66 push saved_call_chain, $P0
71 $P1 = __make(old_var, 'depth'=>1)
73 # restore the old level
76 if $I0 == difference goto restore_chain_end
77 $P0 = pop saved_call_chain
80 goto restore_chain_loop
83 # because we don't want to use assign here (we want to provide a new
84 # alias, not use an existing one), do this work by hand
86 if call_level goto lexical
90 ns = __namespace(new_var, 1)
95 ns = get_root_namespace ns
111 tcl_error 'wrong # args: should be "upvar ?level? otherVar localVar ?otherVar localVar ...?"'
119 # vim: expandtab shiftwidth=4 ft=pir: