diff options
author | dgp <dgp@users.sourceforge.net> | 2013-09-19 16:33:36 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2013-09-19 16:33:36 (GMT) |
commit | 44d124101c6297b356f7de3917c4d0666b8a0e31 (patch) | |
tree | f49caee0b0f406649f1cc264fbb507d72a762bb8 | |
parent | c057be2da7fa9708565dfbf205fede984267ea30 (diff) | |
download | tcl-44d124101c6297b356f7de3917c4d0666b8a0e31.zip tcl-44d124101c6297b356f7de3917c4d0666b8a0e31.tar.gz tcl-44d124101c6297b356f7de3917c4d0666b8a0e31.tar.bz2 |
Line numbers wrong in compiled [global] and [variable].
-rw-r--r-- | generic/tclCompCmds.c | 18 | ||||
-rw-r--r-- | tests/upvar.test | 10 |
2 files changed, 22 insertions, 6 deletions
diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c index 8e26a30..809a6c6 100644 --- a/generic/tclCompCmds.c +++ b/generic/tclCompCmds.c @@ -6007,14 +6007,17 @@ TclCompileGlobalCmd( */ varTokenPtr = TokenAfter(parsePtr->tokenPtr); - for(i=2; i<=numWords; varTokenPtr = TokenAfter(varTokenPtr),i++) { + for(i=1; i<numWords; varTokenPtr = TokenAfter(varTokenPtr),i++) { localIndex = IndexTailVarIfKnown(interp, varTokenPtr, envPtr); if(localIndex < 0) { return TCL_ERROR; } - CompileWord(envPtr, varTokenPtr, interp, 1); + /* TODO: Consider what values can pass through the + * IndexTailVarIfKnown() screen. Full CompileWord() + * likely does not apply here. Push known value instead. */ + CompileWord(envPtr, varTokenPtr, interp, i); TclEmitInstInt4(INST_NSUPVAR, localIndex, envPtr); } @@ -6076,7 +6079,7 @@ TclCompileVariableCmd( */ valueTokenPtr = parsePtr->tokenPtr; - for(i=2; i<=numWords; i+=2) { + for(i=1; i<numWords; i+=2) { varTokenPtr = TokenAfter(valueTokenPtr); valueTokenPtr = TokenAfter(varTokenPtr); @@ -6086,15 +6089,18 @@ TclCompileVariableCmd( return TCL_ERROR; } - CompileWord(envPtr, varTokenPtr, interp, 1); + /* TODO: Consider what values can pass through the + * IndexTailVarIfKnown() screen. Full CompileWord() + * likely does not apply here. Push known value instead. */ + CompileWord(envPtr, varTokenPtr, interp, i); TclEmitInstInt4(INST_VARIABLE, localIndex, envPtr); - if (i != numWords) { + if (i != numWords-1) { /* * A value has been given: set the variable, pop the value */ - CompileWord(envPtr, valueTokenPtr, interp, 1); + CompileWord(envPtr, valueTokenPtr, interp, i+1); TclEmitInstInt4(INST_STORE_SCALAR4, localIndex, envPtr); TclEmitOpcode(INST_POP, envPtr); } diff --git a/tests/upvar.test b/tests/upvar.test index f90abef..79c2d53 100644 --- a/tests/upvar.test +++ b/tests/upvar.test @@ -573,6 +573,16 @@ test upvar-NS-3.2 {CompileWord OBOE} -setup { } -cleanup { rename linenumber {} } -result 1 +test upvar-NS-3.3 {CompileWord OBOE} -setup { + proc linenumber {} {dict get [info frame -1] line} +} -body { + apply {n { + variable x {*}{ + } [return [incr n -[linenumber]]] + }} [linenumber] +} -cleanup { + rename linenumber {} +} -result 1 # cleanup |