From 76a689aef30bb27f1e24881a16991f7209a15132 Mon Sep 17 00:00:00 2001 From: Miguel Sofer Date: Mon, 8 Sep 2008 03:55:18 +0000 Subject: * generic/tclCompile.c (TclCompileTokens): * generic/tclExecute.c (CompileExprObj): fix a perf bug (found by Alex Ferrieux) where some variables in the LVT where not being accessed by index. Fix missing localCache management in compiled expressions found while analyzing the bug. --- ChangeLog | 8 ++++++++ generic/tclCompile.c | 26 ++++++++++++-------------- generic/tclExecute.c | 14 +++++++------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b8c409..21faefc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-09-07 Miguel Sofer + * generic/tclCompile.c (TclCompileTokens): + * generic/tclExecute.c (CompileExprObj): fix a perf bug (found by + Alex Ferrieux) where some variables in the LVT where not being + accessed by index. Fix missing localCache management in compiled + expressions found while analyzing the bug. + +2008-09-07 Miguel Sofer + * doc/namespace.n: fix [Bug 2098441] 2008-09-04 Miguel Sofer diff --git a/generic/tclCompile.c b/generic/tclCompile.c index d79ba9d..a0ab92b 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompile.c,v 1.155 2008/08/20 15:41:21 dkf Exp $ + * RCS: @(#) $Id: tclCompile.c,v 1.156 2008/09/08 03:55:18 msofer Exp $ */ #include "tclInt.h" @@ -1670,19 +1670,17 @@ TclCompileTokens( name = tokenPtr[1].start; nameBytes = tokenPtr[1].size; - localVarName = -1; - if (envPtr->procPtr != NULL) { - localVarName = 1; - for (i = 0, p = name; i < nameBytes; i++, p++) { - if ((*p == ':') && (i < nameBytes-1) && (*(p+1) == ':')) { - localVarName = -1; - break; - } else if ((*p == '(') - && (tokenPtr->numComponents == 1) - && (*(name + nameBytes - 1) == ')')) { - localVarName = 0; - break; - } + + localVarName = 1; + for (i = 0, p = name; i < nameBytes; i++, p++) { + if ((*p == ':') && (i < nameBytes-1) && (*(p+1) == ':')) { + localVarName = -1; + break; + } else if ((*p == '(') + && (tokenPtr->numComponents == 1) + && (*(name + nameBytes - 1) == ')')) { + localVarName = 0; + break; } } diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 308806c..326cc18 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -14,7 +14,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclExecute.c,v 1.409 2008/09/04 16:34:52 msofer Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.410 2008/09/08 03:55:21 msofer Exp $ */ #include "tclInt.h" @@ -1291,7 +1291,8 @@ CompileExprObj( if (((Interp *) *codePtr->interpHandle != iPtr) || (codePtr->compileEpoch != iPtr->compileEpoch) || (codePtr->nsPtr != namespacePtr) - || (codePtr->nsEpoch != namespacePtr->resolverEpoch)) { + || (codePtr->nsEpoch != namespacePtr->resolverEpoch) + || (codePtr->localCachePtr != iPtr->varFramePtr->localCachePtr)) { objPtr->typePtr->freeIntRepProc(objPtr); objPtr->typePtr = (Tcl_ObjType *) NULL; } @@ -1328,6 +1329,10 @@ CompileExprObj( objPtr->typePtr = &exprCodeType; TclFreeCompileEnv(&compEnv); codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr; + if (iPtr->varFramePtr->localCachePtr) { + codePtr->localCachePtr = iPtr->varFramePtr->localCachePtr; + codePtr->localCachePtr->refCount++; + } #ifdef TCL_COMPILE_DEBUG if (tclTraceCompile == 2) { TclPrintByteCodeObj(interp, objPtr); @@ -1522,11 +1527,6 @@ TclCompileObj( } codePtr->compileEpoch = iPtr->compileEpoch; } else { - /* - * This byteCode is invalid: free it and recompile. - */ - - objPtr->typePtr->freeIntRepProc(objPtr); goto recompileObj; } } -- cgit v0.12