diff options
author | dgp <dgp@users.sourceforge.net> | 2011-09-15 16:27:42 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2011-09-15 16:27:42 (GMT) |
commit | 329d21be60a1bdc13412ea27da64c5e267038a3c (patch) | |
tree | 0246761d67f1f962dc31862f8e273843f53f3918 /generic/tclCompExpr.c | |
parent | 3d82e72f1f6c683c27d1b2006ed06bd0b39c366d (diff) | |
download | tcl-329d21be60a1bdc13412ea27da64c5e267038a3c.zip tcl-329d21be60a1bdc13412ea27da64c5e267038a3c.tar.gz tcl-329d21be60a1bdc13412ea27da64c5e267038a3c.tar.bz2 |
3408408 Partial improvement by sharing as literals the computed values of
constant subexpressions when we can do so without incurring the cost of
string rep generation.
Diffstat (limited to 'generic/tclCompExpr.c')
-rw-r--r-- | generic/tclCompExpr.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c index 80f21e4..d96670c 100644 --- a/generic/tclCompExpr.c +++ b/generic/tclCompExpr.c @@ -2471,8 +2471,30 @@ CompileExprTree( if (ExecConstantExprTree(interp, nodes, next, litObjvPtr) == TCL_OK) { - TclEmitPush(TclAddLiteralObj(envPtr, - Tcl_GetObjResult(interp), NULL), envPtr); + int index; + Tcl_Obj *objPtr = Tcl_GetObjResult(interp); + + /* + * Don't generate a string rep, but if we have one + * already, then use it to share via the literal table. + */ + if (objPtr->bytes) { + Tcl_Obj *tableValue; + + index = TclRegisterNewLiteral(envPtr, objPtr->bytes, + objPtr->length); + tableValue = envPtr->literalArrayPtr[index].objPtr; + if ((tableValue->typePtr == NULL) && + (objPtr->typePtr != NULL)) { + /* Same intrep surgery as for OT_LITERAL */ + tableValue->typePtr = objPtr->typePtr; + tableValue->internalRep = objPtr->internalRep; + objPtr->typePtr = NULL; + } + } else { + index = TclAddLiteralObj(envPtr, objPtr, NULL); + } + TclEmitPush(index, envPtr); } else { TclCompileSyntaxError(interp, envPtr); } |