summaryrefslogtreecommitdiffstats
path: root/generic/tclCompExpr.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2013-09-12 17:42:36 (GMT)
committerdgp <dgp@users.sourceforge.net>2013-09-12 17:42:36 (GMT)
commit3e3fe2606ae5233ae213b95fd91d7d05d2987659 (patch)
tree84a90bcb94d36ff3c3a877deacfa1619f17c3e41 /generic/tclCompExpr.c
parent23bb5a2c20bd07e4b66ad4293fb927128e9e975b (diff)
downloadtcl-3e3fe2606ae5233ae213b95fd91d7d05d2987659.zip
tcl-3e3fe2606ae5233ae213b95fd91d7d05d2987659.tar.gz
tcl-3e3fe2606ae5233ae213b95fd91d7d05d2987659.tar.bz2
Stop allocating JumpFixups for jumps that can never need any fixing up.
Diffstat (limited to 'generic/tclCompExpr.c')
-rw-r--r--generic/tclCompExpr.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c
index 4afb069..7684c70 100644
--- a/generic/tclCompExpr.c
+++ b/generic/tclCompExpr.c
@@ -2269,12 +2269,6 @@ CompileExprTree(
newJump = TclStackAlloc(interp, sizeof(JumpList));
newJump->next = jumpPtr;
jumpPtr = newJump;
- newJump = TclStackAlloc(interp, sizeof(JumpList));
- newJump->next = jumpPtr;
- jumpPtr = newJump;
- newJump = TclStackAlloc(interp, sizeof(JumpList));
- newJump->next = jumpPtr;
- jumpPtr = newJump;
break;
}
} else if (nodePtr->mark == MARK_RIGHT) {
@@ -2328,6 +2322,8 @@ CompileExprTree(
break;
}
} else {
+ int pc1, pc2;
+
switch (nodePtr->lexeme) {
case START:
case QUESTION:
@@ -2377,7 +2373,9 @@ CompileExprTree(
jumpPtr->next->jump.codeOffset += 3;
}
TclFixupForwardJump(envPtr, &jumpPtr->jump,
- jumpPtr->next->jump.codeOffset + 2 -jumpPtr->jump.codeOffset, 127);
+ jumpPtr->next->jump.codeOffset + 2
+ - jumpPtr->jump.codeOffset, 127);
+
freePtr = jumpPtr;
jumpPtr = jumpPtr->next;
TclStackFree(interp, freePtr);
@@ -2388,32 +2386,27 @@ CompileExprTree(
case AND:
case OR:
CLANG_ASSERT(jumpPtr);
- TclEmitForwardJump(envPtr, (nodePtr->lexeme == AND)
- ? TCL_FALSE_JUMP : TCL_TRUE_JUMP,
- &jumpPtr->next->jump);
+ pc1 = CurrentOffset(envPtr);
+ TclEmitInstInt1((nodePtr->lexeme == AND) ? INST_JUMP_FALSE1
+ : INST_JUMP_TRUE1, 0, envPtr);
TclEmitPush(TclRegisterNewLiteral(envPtr,
(nodePtr->lexeme == AND) ? "1" : "0", 1), envPtr);
- TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP,
- &jumpPtr->next->next->jump);
+ pc2 = CurrentOffset(envPtr);
+ TclEmitInstInt1(INST_JUMP1, 0, envPtr);
TclAdjustStackDepth(-1, envPtr);
- TclFixupForwardJumpToHere(envPtr, &jumpPtr->next->jump, 127);
+ TclStoreInt1AtPtr(CurrentOffset(envPtr) - pc1,
+ envPtr->codeStart + pc1 + 1);
if (TclFixupForwardJumpToHere(envPtr, &jumpPtr->jump, 127)) {
- jumpPtr->next->next->jump.codeOffset += 3;
+ pc2 += 3;
}
TclEmitPush(TclRegisterNewLiteral(envPtr,
(nodePtr->lexeme == AND) ? "0" : "1", 1), envPtr);
- TclFixupForwardJumpToHere(envPtr, &jumpPtr->next->next->jump,
- 127);
+ TclStoreInt1AtPtr(CurrentOffset(envPtr) - pc2,
+ envPtr->codeStart + pc2 + 1);
convert = 0;
freePtr = jumpPtr;
jumpPtr = jumpPtr->next;
TclStackFree(interp, freePtr);
- freePtr = jumpPtr;
- jumpPtr = jumpPtr->next;
- TclStackFree(interp, freePtr);
- freePtr = jumpPtr;
- jumpPtr = jumpPtr->next;
- TclStackFree(interp, freePtr);
break;
default:
TclEmitOpcode(instruction[nodePtr->lexeme], envPtr);