Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | improved stack checking under TCL_COMPILE_DEBUG |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
33d3915a8092db7c49a61a6a34dd16bd |
User & Date: | mig 2013-01-05 03:43:05 |
Context
2013-01-06
| ||
20:40 | Don't depend on Spencer-specific regexp syntax (/u and /U) any more in unrelated places . Bump http... check-in: f38c7f79f0 user: jan.nijtmans tags: trunk | |
2013-01-05
| ||
18:16 | merge trunk check-in: 6c03a15d80 user: dkf tags: dkf-bytecode-8.6-main | |
16:58 | merge trunk check-in: 6f7f4d94f9 user: mig tags: mig-nre-mods | |
05:08 | merge trunk, fix stack computation tocompensate for current BC errors check-in: e8a597b33c user: mig tags: mig-alloc-reform | |
04:20 | merge trunk check-in: bf3c0ee683 user: mig tags: mig-strip-brutal | |
03:43 | improved stack checking under TCL_COMPILE_DEBUG check-in: 33d3915a80 user: mig tags: trunk | |
00:39 | merge fork check-in: b18953345f user: jan.nijtmans tags: trunk | |
Changes
Changes to generic/tclExecute.c.
︙ | ︙ | |||
255 256 257 258 259 260 261 | * and within range. */ /* Verify the stack depth, only when no expansion is in progress */ #if TCL_COMPILE_DEBUG #define CHECK_STACK() \ | > | | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | * and within range. */ /* Verify the stack depth, only when no expansion is in progress */ #if TCL_COMPILE_DEBUG #define CHECK_STACK() \ ValidatePcAndStackTop(codePtr, pc, CURR_DEPTH, \ /*checkStack*/ auxObjList == NULL) #else #define CHECK_STACK() #endif #define NEXT_INST_F(pcAdjustment, nCleanup, resultHandling) \ do { \ TCL_CT_ASSERT((nCleanup >= 0) && (nCleanup <= 2)); \ |
︙ | ︙ | |||
692 693 694 695 696 697 698 | #endif /* TCL_COMPILE_STATS */ #ifdef TCL_COMPILE_DEBUG static const char * GetOpcodeName(const unsigned char *pc); static void PrintByteCodeInfo(ByteCode *codePtr); static const char * StringForResultCode(int result); static void ValidatePcAndStackTop(ByteCode *codePtr, const unsigned char *pc, int stackTop, | | | 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 | #endif /* TCL_COMPILE_STATS */ #ifdef TCL_COMPILE_DEBUG static const char * GetOpcodeName(const unsigned char *pc); static void PrintByteCodeInfo(ByteCode *codePtr); static const char * StringForResultCode(int result); static void ValidatePcAndStackTop(ByteCode *codePtr, const unsigned char *pc, int stackTop, int checkStack); #endif /* TCL_COMPILE_DEBUG */ static ByteCode * CompileExprObj(Tcl_Interp *interp, Tcl_Obj *objPtr); static void DeleteExecStack(ExecStack *esPtr); static void DupExprCodeInternalRep(Tcl_Obj *srcPtr, Tcl_Obj *copyPtr); MODULE_SCOPE int TclCompareTwoNumbers(Tcl_Obj *valuePtr, Tcl_Obj *value2Ptr); |
︙ | ︙ | |||
2250 2251 2252 2253 2254 2255 2256 | cleanup0: #ifdef TCL_COMPILE_DEBUG /* * Skip the stack depth check if an expansion is in progress. */ | | < | 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 | cleanup0: #ifdef TCL_COMPILE_DEBUG /* * Skip the stack depth check if an expansion is in progress. */ CHECK_STACK(); if (traceInstructions) { fprintf(stdout, "%2d: %2d ", iPtr->numLevels, (int) CURR_DEPTH); TclPrintInstruction(codePtr, pc); fflush(stdout); } #endif /* TCL_COMPILE_DEBUG */ |
︙ | ︙ | |||
8567 8568 8569 8570 8571 8572 8573 | register ByteCode *codePtr, /* The bytecode whose summary is printed to * stdout. */ const unsigned char *pc, /* Points to first byte of a bytecode * instruction. The program counter. */ int stackTop, /* Current stack top. Must be between * stackLowerBound and stackUpperBound * (inclusive). */ | < | | | | | | 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 | register ByteCode *codePtr, /* The bytecode whose summary is printed to * stdout. */ const unsigned char *pc, /* Points to first byte of a bytecode * instruction. The program counter. */ int stackTop, /* Current stack top. Must be between * stackLowerBound and stackUpperBound * (inclusive). */ int checkStack) /* 0 if the stack depth check should be * skipped. */ { int stackUpperBound = codePtr->maxStackDepth; /* Greatest legal value for stackTop. */ unsigned relativePc = (unsigned) (pc - codePtr->codeStart); unsigned long codeStart = (unsigned long) codePtr->codeStart; unsigned long codeEnd = (unsigned long) (codePtr->codeStart + codePtr->numCodeBytes); unsigned char opCode = *pc; if (((unsigned long) pc < codeStart) || ((unsigned long) pc > codeEnd)) { fprintf(stderr, "\nBad instruction pc 0x%p in TclNRExecuteByteCode\n", pc); Tcl_Panic("TclNRExecuteByteCode execution failure: bad pc"); } if ((unsigned) opCode > LAST_INST_OPCODE) { fprintf(stderr, "\nBad opcode %d at pc %u in TclNRExecuteByteCode\n", (unsigned) opCode, relativePc); Tcl_Panic("TclNRExecuteByteCode execution failure: bad opcode"); } if (checkStack && ((stackTop < 0) || (stackTop > stackUpperBound))) { int numChars; const char *cmd = GetSrcInfoForPc(pc, codePtr, &numChars, NULL); fprintf(stderr, "\nBad stack top %d at pc %u in TclNRExecuteByteCode (min 0, max %i)", stackTop, relativePc, stackUpperBound); if (cmd != NULL) { Tcl_Obj *message; TclNewLiteralStringObj(message, "\n executing "); Tcl_IncrRefCount(message); Tcl_AppendLimitedToObj(message, cmd, numChars, 100, NULL); fprintf(stderr,"%s\n", Tcl_GetString(message)); |
︙ | ︙ |