Index: TODO =================================================================== diff -u -r89376e0f64856bb395fdb4407c9646787545a08b -rdb040438a3c030830d17aff502ca7bff91eba9b7 --- TODO (.../TODO) (revision 89376e0f64856bb395fdb4407c9646787545a08b) +++ TODO (.../TODO) (revision db040438a3c030830d17aff502ca7bff91eba9b7) @@ -1362,14 +1362,14 @@ - updated migration guide - fixed several common typos +- documented behavior of upvar/uplevel with aliases on scripted procs + through regression test + TODO: - subcmd * handle sucmd for other method factories * handle absence of -create flag in resolve_method_path (for introspection) - -- aliases on procs are a problem, when upvar is used (see info default/instdefault in xotcl2.tcl) - - interfaces in documentation for slots (see for more details ::nx::Class#superclass in nx.tcl). - nameing Index: library/xotcl/library/xotcl2.tcl =================================================================== diff -u -r89376e0f64856bb395fdb4407c9646787545a08b -rdb040438a3c030830d17aff502ca7bff91eba9b7 --- library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision 89376e0f64856bb395fdb4407c9646787545a08b) +++ library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision db040438a3c030830d17aff502ca7bff91eba9b7) @@ -419,7 +419,9 @@ argName [$o ::nsf::cmd::${allocation}Info::method args $method] \ flag [$o ::nsf::cmd::${allocation}Info::method parameter $method] { if {$argName eq $arg} { - upvar 2 $varName default + # upvar 2 $varName default + # use "my" here to avoid surprises with aliases or interceptors + my upvar $varName default #puts "--- info_default var '$varName' level=[info level]" if {[llength $flag] == 2} { set default [lindex $flag 1] @@ -513,10 +515,6 @@ :alias classchildren ::nsf::cmd::ObjectInfo::children :alias classparent ::nsf::cmd::ObjectInfo::parent :proc default {method arg varName} { - # TODO: interesting observation: we cannot use the alias to - # objectInfo here, but we have to rewrite the proc, since an - # alias introduces currently a new frame, which would require a - # "upvar 2 ..." set r [::xotcl::info_default Object [self] $method $arg $varName] #puts "--- var '$varName' level=[info level]" return $r @@ -529,11 +527,6 @@ :proc instcommands {{pattern ""}} {my ::nsf::cmd::ClassInfo::methods {*}$pattern} :proc instdefault {method arg varName} { set r [::xotcl::info_default Class [self] $method $arg $varName] - #puts "--- default for [self].$method $arg -> $r [info exists var]" - #puts "--- var '$var' level=[info level]" - #puts "--- level 0 [info level [info level]]" - #puts "--- level -1 [info level [expr [info level]-1]]" - #puts "--- level -2 [info level [expr [info level]-2]]" return $r } :alias instfilter ::nsf::cmd::ClassInfo::filtermethods Index: tests/aliastest.tcl =================================================================== diff -u -rd168a26bce713de8daa5bbe79d740926e961c5bc -rdb040438a3c030830d17aff502ca7bff91eba9b7 --- tests/aliastest.tcl (.../aliastest.tcl) (revision d168a26bce713de8daa5bbe79d740926e961c5bc) +++ tests/aliastest.tcl (.../aliastest.tcl) (revision db040438a3c030830d17aff502ca7bff91eba9b7) @@ -408,4 +408,59 @@ ? {D create d1} ::ns2::d1 ? {d1 foo} ::ns1::B } -} \ No newline at end of file +} + +Test parameter count 10 +Test case proc-alias { + + nx::Class create C { + :method foo {} {upvar x y; info exists y} + :method bar {} {set x 1; :foo} + + :alias bar_ [:info method handle bar] + :alias foo_ [:info method handle foo] + :method bar2 {} {set x 1; :foo_} + + :create c1 + } + + nx::Class create D { + :method foo {} {:upvar x y; info exists y} + :method bar {} {set x 1; :foo} + + :alias foo_ [:info method handle foo] + :alias bar_ [:info method handle bar] + :method bar2 {} {set x 1; :foo_} + + :create d1 + } + + nx::Class create M { + :method foo args next + :method bar args next + :method foo_ args next + :method bar_ args next + :method bar_ args next + } + + ? {c1 bar} 1 + ? {c1 bar_} 1 + ? {c1 bar2} 0 ;# upvar reaches into to alias-redirector + + ? {d1 bar} 1 + ? {d1 bar_} 1 + ? {d1 bar2} 1 + + c1 mixin add M + + ? {c1 bar} 0 ;# upvar reaches into to mixin method + ? {c1 bar_} 0 ;# upvar reaches into to mixin method + ? {c1 bar2} 0 ;# upvar reaches into to mixin method + + d1 mixin add M + + ? {d1 bar} 1 + ? {d1 bar_} 1 + ? {d1 bar2} 1 + +}