diff options
author | dgp <dgp@users.sourceforge.net> | 2013-09-19 15:57:38 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2013-09-19 15:57:38 (GMT) |
commit | ca6f2ab2df7b8a97fdf2352dea3552713bcb88e0 (patch) | |
tree | 5ca0d8a6e02c3d315bedc65a7807d52625146c78 /generic/tclCompCmdsGR.c | |
parent | 100b2b2e05bfa69635582926388fe5b9adc6baa3 (diff) | |
parent | 77946f661583330fa93c84272c3cb2d06ee1ec9d (diff) | |
download | tcl-ca6f2ab2df7b8a97fdf2352dea3552713bcb88e0.zip tcl-ca6f2ab2df7b8a97fdf2352dea3552713bcb88e0.tar.gz tcl-ca6f2ab2df7b8a97fdf2352dea3552713bcb88e0.tar.bz2 |
Line numbers wrong in compiled [upvar].
Diffstat (limited to 'generic/tclCompCmdsGR.c')
-rw-r--r-- | generic/tclCompCmdsGR.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/generic/tclCompCmdsGR.c b/generic/tclCompCmdsGR.c index 150c378..ae1b6a1 100644 --- a/generic/tclCompCmdsGR.c +++ b/generic/tclCompCmdsGR.c @@ -2568,16 +2568,14 @@ TclCompileUpvarCmd( Tcl_Token *tokenPtr, *otherTokenPtr, *localTokenPtr; int isScalar, localIndex, numWords, i; DefineLineInformation; /* TIP #280 */ - Tcl_Obj *objPtr = Tcl_NewObj(); + Tcl_Obj *objPtr; if (envPtr->procPtr == NULL) { - Tcl_DecrRefCount(objPtr); return TCL_ERROR; } numWords = parsePtr->numWords; if (numWords < 3) { - Tcl_DecrRefCount(objPtr); return TCL_ERROR; } @@ -2585,6 +2583,7 @@ TclCompileUpvarCmd( * Push the frame index if it is known at compile time */ + objPtr = Tcl_NewObj(); tokenPtr = TokenAfter(parsePtr->tokenPtr); if (TclWordKnownAtCompileTime(tokenPtr, objPtr)) { CallFrame *framePtr; @@ -2603,16 +2602,17 @@ TclCompileUpvarCmd( if (numWords%2) { return TCL_ERROR; } + /* TODO: Push the known value instead? */ CompileWord(envPtr, tokenPtr, interp, 1); otherTokenPtr = TokenAfter(tokenPtr); - i = 4; + i = 2; } else { if (!(numWords%2)) { return TCL_ERROR; } PushStringLiteral(envPtr, "1"); otherTokenPtr = tokenPtr; - i = 3; + i = 1; } } else { Tcl_DecrRefCount(objPtr); @@ -2625,12 +2625,12 @@ TclCompileUpvarCmd( * be called at runtime. */ - for (; i<=numWords; i+=2, otherTokenPtr = TokenAfter(localTokenPtr)) { + for (; i<numWords; i+=2, otherTokenPtr = TokenAfter(localTokenPtr)) { localTokenPtr = TokenAfter(otherTokenPtr); - CompileWord(envPtr, otherTokenPtr, interp, 1); + CompileWord(envPtr, otherTokenPtr, interp, i); PushVarNameWord(interp, localTokenPtr, envPtr, 0, - &localIndex, &isScalar, 1); + &localIndex, &isScalar, i+1); if ((localIndex < 0) || !isScalar) { return TCL_ERROR; |