Index: TODO =================================================================== diff -u -rc627ae1e5e7223daa711d6d5995c068a6c09be2c -r034490f4d862d615639d57b2805667dbccbfc33e --- TODO (.../TODO) (revision c627ae1e5e7223daa711d6d5995c068a6c09be2c) +++ TODO (.../TODO) (revision 034490f4d862d615639d57b2805667dbccbfc33e) @@ -1956,10 +1956,12 @@ - xotcl2: fixed and completed results of "info instforward" and "info forward" - serializer: fixed handling of nsf::configure options +- nx: added "-returns" to forwarder + TODO: - "-returns" - * leave syntax as is for method? + * add regression test to forwarder with returns * handle "-returns" in serializer - change allowempty to "orempty" or "empty" Index: library/nx/nx.tcl =================================================================== diff -u -r99bb4b85e4a123d25f8b867b3498171eadaa2015 -r034490f4d862d615639d57b2805667dbccbfc33e --- library/nx/nx.tcl (.../nx.tcl) (revision 99bb4b85e4a123d25f8b867b3498171eadaa2015) +++ library/nx/nx.tcl (.../nx.tcl) (revision 034490f4d862d615639d57b2805667dbccbfc33e) @@ -278,26 +278,40 @@ Object public method forward { method - -default -methodprefix -objscope:switch -onerror -verbose:switch + -default -methodprefix -objscope:switch -onerror -returns -verbose:switch target:optional args } { array set "" [:__resolve_method_path -per-object $method] - set r [::nsf::forward $(object) -per-object $(methodName) \ - {*}[lrange [::nsf::current args] 1 end]] + set arguments [lrange [::nsf::current args] 1 end] + if {[info exists returns]} { + # search for "-returns" in the arguments before $args ... + set p [lsearch -exact [lrange $arguments 0 [expr {[llength $arguments]-[llength $args]}]] -returns] + # ... and remove it if found + if {$p > -1} {set arguments [lreplace $arguments $p $p+1]} + } + set r [::nsf::forward $(object) -per-object $(methodName) {*}$arguments] ::nsf::methodproperty $(object) -per-object $r call-protected \ [::nsf::dispatch $(object) __default_method_call_protection] + if {[info exists returns]} {::nsf::methodproperty $(object) $r returns $returns} return $r } Class public method forward { method - -default -methodprefix -objscope:switch -onerror -verbose:switch + -default -methodprefix -objscope:switch -onerror -returns -verbose:switch target:optional args } { array set "" [:__resolve_method_path $method] - set r [::nsf::forward $(object) $(methodName) \ - {*}[lrange [::nsf::current args] 1 end]] + set arguments [lrange [::nsf::current args] 1 end] + if {[info exists returns]} { + # search for "-returns" in the arguments before $args ... + set p [lsearch -exact [lrange $arguments 0 [expr {[llength $arguments]-[llength $args]}]] -returns] + # ... and remove it if found + if {$p > -1} {set arguments [lreplace $arguments $p $p+1]} + } + set r [::nsf::forward $(object) $(methodName) {*}$arguments] ::nsf::methodproperty $(object) $r call-protected \ [::nsf::dispatch $(object) __default_method_call_protection] + if {[info exists returns]} {::nsf::methodproperty $(object) $r returns $returns} return $r }