Fork me on GitHub

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • external/tcl/tclExecute.c

    rd7d2da3 radeddd8  
    5151
    5252/*
    53  * Variable that controls whether execution tracing is enabled and, if so,
    54  * what level of tracing is desired:
    55  *    0: no execution tracing
    56  *    1: trace invocations of Tcl procs only
    57  *    2: trace invocations of all (not compiled away) commands
    58  *    3: display each instruction executed
    59  * This variable is linked to the Tcl variable "tcl_traceExec".
    60  */
    61 
    62 int tclTraceExec = 0;
    63 
    64 /*
    6553 * The following global variable is use to signal matherr that Tcl
    6654 * is responsible for the arithmetic, so errors can be handled in a
     
    10290};
    10391   
    104 /*
    105  * Mapping from Tcl result codes to strings; used for error and debugging
    106  * messages.
    107  */
    108 
    109 #ifdef TCL_COMPILE_DEBUG
    110 static char *resultStrings[] = {
    111     "TCL_OK", "TCL_ERROR", "TCL_RETURN", "TCL_BREAK", "TCL_CONTINUE"
    112 };
    113 #endif /* TCL_COMPILE_DEBUG */
    114 
    115 /*
    116  * The following are statistics-related variables that record information
    117  * about the bytecode compiler and interpreter's operation. This includes
    118  * an array that records for each instruction how often it is executed.
    119  */
    120 
    121 #ifdef TCL_COMPILE_STATS
    122 static long numExecutions = 0;
    123 static int instructionCount[256];
    124 #endif /* TCL_COMPILE_STATS */
    125 
    12692/*
    12793 * Macros for testing floating-point values for certain special cases. Test
     
    187153#define POP_OBJECT() \
    188154    (stackPtr[stackTop--].o)
    189 
    190 /*
    191  * Macros used to trace instruction execution. The macros TRACE,
    192  * TRACE_WITH_OBJ, and O2S are only used inside TclExecuteByteCode.
    193  * O2S is only used in TRACE* calls to get a string from an object.
    194  *
    195  * NOTE THAT CLIENTS OF O2S ARE LIKELY TO FAIL IF THE OBJECT'S
    196  * STRING REP CONTAINS NULLS.
    197  */
    198 
    199 #ifdef TCL_COMPILE_DEBUG
    200        
    201 #define O2S(objPtr) \
    202     Tcl_GetStringFromObj((objPtr), &length)
    203        
    204 #ifdef TCL_COMPILE_STATS
    205 #define TRACE(a) \
    206     if (traceInstructions) { \
    207         fprintf(stdout, "%d: %d,%ld (%u) ", iPtr->numLevels, \
    208                stackTop, (tclObjsAlloced - tclObjsFreed), \
    209                (unsigned int)(pc - codePtr->codeStart)); \
    210         printf a; \
    211         fflush(stdout); \
    212     }
    213 #define TRACE_WITH_OBJ(a, objPtr) \
    214     if (traceInstructions) { \
    215         fprintf(stdout, "%d: %d,%ld (%u) ", iPtr->numLevels, \
    216                stackTop, (tclObjsAlloced - tclObjsFreed), \
    217                (unsigned int)(pc - codePtr->codeStart)); \
    218         printf a; \
    219         bytes = Tcl_GetStringFromObj((objPtr), &length); \
    220         TclPrintSource(stdout, bytes, TclMin(length, 30)); \
    221         fprintf(stdout, "\n"); \
    222         fflush(stdout); \
    223     }
    224 #else  /* not TCL_COMPILE_STATS */
    225 #define TRACE(a) \
    226     if (traceInstructions) { \
    227         fprintf(stdout, "%d: %d (%u) ", iPtr->numLevels, stackTop, \
    228                (unsigned int)(pc - codePtr->codeStart)); \
    229         printf a; \
    230         fflush(stdout); \
    231     }
    232 #define TRACE_WITH_OBJ(a, objPtr) \
    233     if (traceInstructions) { \
    234         fprintf(stdout, "%d: %d (%u) ", iPtr->numLevels, stackTop, \
    235                (unsigned int)(pc - codePtr->codeStart)); \
    236         printf a; \
    237         bytes = Tcl_GetStringFromObj((objPtr), &length); \
    238         TclPrintSource(stdout, bytes, TclMin(length, 30)); \
    239         fprintf(stdout, "\n"); \
    240         fflush(stdout); \
    241     }
    242 #endif /* TCL_COMPILE_STATS */
    243 
    244 #else  /* not TCL_COMPILE_DEBUG */
    245        
    246 #define TRACE(a)
    247 #define TRACE_WITH_OBJ(a, objPtr)
    248 #define O2S(objPtr)
    249        
    250 #endif /* TCL_COMPILE_DEBUG */
    251155
    252156/*
     
    274178static int              ExprUnaryFunc _ANSI_ARGS_((Tcl_Interp *interp,
    275179                            ExecEnv *eePtr, ClientData clientData));
    276 #ifdef TCL_COMPILE_STATS
    277 static int              EvalStatsCmd _ANSI_ARGS_((ClientData clientData,
    278                             Tcl_Interp *interp, int argc, char **argv));
    279 #endif /* TCL_COMPILE_STATS */
    280180static void             FreeCmdNameInternalRep _ANSI_ARGS_((
    281181                            Tcl_Obj *objPtr));
     
    293193static int              SetCmdNameFromAny _ANSI_ARGS_((Tcl_Interp *interp,
    294194                            Tcl_Obj *objPtr));
    295 #ifdef TCL_COMPILE_DEBUG
    296 static char *           StringForResultCode _ANSI_ARGS_((int result));
    297 #endif /* TCL_COMPILE_DEBUG */
    298195static void             UpdateStringOfCmdName _ANSI_ARGS_((Tcl_Obj *objPtr));
    299 #ifdef TCL_COMPILE_DEBUG
    300 static void             ValidatePcAndStackTop _ANSI_ARGS_((
    301                             ByteCode *codePtr, unsigned char *pc,
    302                             int stackTop, int stackLowerBound,
    303                             int stackUpperBound));
    304 #endif /* TCL_COMPILE_DEBUG */
    305196
    306197/*
     
    368259 *
    369260 * Side effects:
    370  *      This procedure initializes the array of instruction names. If
    371  *      compiling with the TCL_COMPILE_STATS flag, it initializes the
    372  *      array that counts the executions of each instruction and it
    373  *      creates the "evalstats" command. It also registers the command name
    374  *      Tcl_ObjType. It also establishes the link between the Tcl
    375  *      "tcl_traceExec" and C "tclTraceExec" variables.
     261 *      This procedure initializes the array of instruction names.
    376262 *
    377263 *----------------------------------------------------------------------
     
    391277    for (i = 0;  instructionTable[i].name != NULL;  i++) {
    392278        opName[i] = instructionTable[i].name;
    393     }
    394 
    395 #ifdef TCL_COMPILE_STATS   
    396     (VOID *) memset(instructionCount, 0, sizeof(instructionCount));
    397     (VOID *) memset(tclByteCodeCount, 0, sizeof(tclByteCodeCount));
    398     (VOID *) memset(tclSourceCount, 0, sizeof(tclSourceCount));
    399 
    400     Tcl_CreateCommand(interp, "evalstats", EvalStatsCmd,
    401                       (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
    402 #endif /* TCL_COMPILE_STATS */
    403    
    404     if (Tcl_LinkVar(interp, "tcl_traceExec", (char *) &tclTraceExec,
    405                     TCL_LINK_INT) != TCL_OK) {
    406         panic("InitByteCodeExecution: can't create link for tcl_traceExec variable");
    407279    }
    408280}
     
    598470                                 * process break, continue, and errors. */
    599471    int result = TCL_OK;        /* Return code returned after execution. */
    600     int traceInstructions = (tclTraceExec == 3);
    601472    Tcl_Obj *valuePtr, *value2Ptr, *namePtr, *objPtr;
    602473    char *bytes;
    603474    int length;
    604475    long i;
    605     Tcl_DString command;        /* Used for debugging. If tclTraceExec >= 2
    606                                  * holds a string representing the last
    607                                  * command invoked. */
    608476
    609477    /*
     
    620488
    621489    /*
    622      * THIS PROC FAILS IF AN OBJECT'S STRING REP HAS A NULL BYTE.
    623      */
    624 
    625     if (tclTraceExec >= 2) {
    626         PrintByteCodeInfo(codePtr);
    627 #ifdef TCL_COMPILE_STATS
    628         fprintf(stdout, "  Starting stack top=%d, system objects=%ld\n",
    629                 eePtr->stackTop, (tclObjsAlloced - tclObjsFreed));
    630 #else
    631         fprintf(stdout, "  Starting stack top=%d\n", eePtr->stackTop);
    632 #endif /* TCL_COMPILE_STATS */
    633         fflush(stdout);
    634     }
    635 
    636 #ifdef TCL_COMPILE_STATS
    637     numExecutions++;
    638 #endif /* TCL_COMPILE_STATS */
    639 
    640     /*
    641490     * Make sure the catch stack is large enough to hold the maximum number
    642491     * of catch commands that could ever be executing at the same time. This
     
    659508
    660509    /*
    661      * Initialize the buffer that holds a string containing the name and
    662      * arguments for the last invoked command.
    663      */
    664 
    665     Tcl_DStringInit(&command);
    666 
    667     /*
    668510     * Loop executing instructions until a "done" instruction, a TCL_RETURN,
    669511     * or some error.
     
    671513
    672514    for (;;) {
    673 #ifdef TCL_COMPILE_DEBUG
    674         ValidatePcAndStackTop(codePtr, pc, stackTop, initStackTop,
    675                 eePtr->stackEnd);
    676 #else /* not TCL_COMPILE_DEBUG */
    677         if (traceInstructions) {
    678 #ifdef TCL_COMPILE_STATS
    679             fprintf(stdout, "%d: %d,%ld ", iPtr->numLevels, stackTop,
    680                     (tclObjsAlloced - tclObjsFreed));
    681 #else /* TCL_COMPILE_STATS */
    682             fprintf(stdout, "%d: %d ", iPtr->numLevels, stackTop);
    683 #endif /* TCL_COMPILE_STATS */
    684             TclPrintInstruction(codePtr, pc);
    685             fflush(stdout);
    686         }
    687 #endif /* TCL_COMPILE_DEBUG */
    688        
    689515        opCode = *pc;
    690 #ifdef TCL_COMPILE_STATS   
    691         instructionCount[opCode]++;
    692 #endif /* TCL_COMPILE_STATS */
    693516
    694517        switch (opCode) {
     
    710533                panic("TclExecuteByteCode execution failure: end stack top != start stack top");
    711534            }
    712             TRACE_WITH_OBJ(("done => return code=%d, result is ", result),
    713                     iPtr->objResultPtr);
    714535            goto done;
    715536           
     
    717538            valuePtr = objArrayPtr[TclGetUInt1AtPtr(pc+1)];
    718539            PUSH_OBJECT(valuePtr);
    719             TRACE_WITH_OBJ(("push1 %u => ", TclGetUInt1AtPtr(pc+1)),
    720                     valuePtr);
    721540            ADJUST_PC(2);
    722541           
     
    724543            valuePtr = objArrayPtr[TclGetUInt4AtPtr(pc+1)];
    725544            PUSH_OBJECT(valuePtr);
    726             TRACE_WITH_OBJ(("push4 %u => ", TclGetUInt4AtPtr(pc+1)),
    727                     valuePtr);
    728545            ADJUST_PC(5);
    729546           
    730547        case INST_POP:
    731548            valuePtr = POP_OBJECT();
    732             TRACE_WITH_OBJ(("pop => discarding "), valuePtr);
    733549            TclDecrRefCount(valuePtr); /* finished with pop'ed object. */
    734550            ADJUST_PC(1);
     
    737553            valuePtr = stackPtr[stackTop].o;
    738554            PUSH_OBJECT(Tcl_DuplicateObj(valuePtr));
    739             TRACE_WITH_OBJ(("dup => "), valuePtr);
    740555            ADJUST_PC(1);
    741556
     
    790605               
    791606                PUSH_OBJECT(concatObjPtr);
    792                 TRACE_WITH_OBJ(("concat %u => ", opnd), concatObjPtr);
    793607                ADJUST_PC(2);
    794608            }
     
    815629                                    * Init. to avoid compiler warning. */
    816630                Tcl_Command cmd;
    817 #ifdef TCL_COMPILE_DEBUG
    818                 int isUnknownCmd = 0;
    819                 char cmdNameBuf[30];
    820 #endif /* TCL_COMPILE_DEBUG */
    821631               
    822632                /*
     
    867677                                "invalid command name \"", cmdName, "\"",
    868678                                (char *) NULL);
    869                         TRACE(("%s %u => unknown proc not found: ",
    870                                opName[opCode], objc));
    871679                        result = TCL_ERROR;
    872680                        goto checkForCatch;
    873681                    }
    874682                    cmdPtr = (Command *) cmd;
    875 #ifdef TCL_COMPILE_DEBUG
    876                     isUnknownCmd = 1;
    877 #endif /*TCL_COMPILE_DEBUG*/                   
    878683                    stackTop++; /* need room for new inserted objv[0] */
    879684                    for (i = objc;  i >= 0;  i--) {
     
    918723                Tcl_ResetResult(interp);
    919724
    920                 if (tclTraceExec >= 2) {
    921                     char buffer[50];
    922 
    923                     sprintf(buffer, "%d: (%u) invoking ", iPtr->numLevels,
    924                             (unsigned int)(pc - codePtr->codeStart));
    925                     Tcl_DStringAppend(&command, buffer, -1);
    926                    
    927 #ifdef TCL_COMPILE_DEBUG
    928                     if (traceInstructions) { /* tclTraceExec == 3 */
    929                         strncpy(cmdNameBuf, cmdName, 20);
    930                         TRACE(("%s %u => call ", opName[opCode],
    931                                (isUnknownCmd? objc-1 : objc)));
    932                     } else {
    933                         fprintf(stdout, "%s", buffer);
    934                     }
    935 #else /* TCL_COMPILE_DEBUG */
    936                     fprintf(stdout, "%s", buffer);
    937 #endif /*TCL_COMPILE_DEBUG*/
    938 
    939                     for (i = 0;  i < objc;  i++) {
    940                         bytes = TclGetStringFromObj(objv[i], &length);
    941                         TclPrintSource(stdout, bytes, TclMin(length, 15));
    942                         fprintf(stdout, " ");
    943 
    944                         sprintf(buffer, "\"%.*s\" ", TclMin(length, 15), bytes);
    945                         Tcl_DStringAppend(&command, buffer, -1);
    946                     }
    947                     fprintf(stdout, "\n");
    948                     fflush(stdout);
    949 
    950                     Tcl_DStringFree(&command);
    951                 }
    952 
    953725                iPtr->cmdCount++;
    954726                DECACHE_STACK_INFO();
     
    996768                     */
    997769                    PUSH_OBJECT(Tcl_GetObjResult(interp));
    998                     TRACE_WITH_OBJ(("%s %u => ...after \"%.20s\", result=",
    999                             opName[opCode], objc, cmdNameBuf),
    1000                             Tcl_GetObjResult(interp));
    1001770                    ADJUST_PC(pcAdjustment);
    1002771                   
     
    1015784                            /*catchOnly*/ 0, codePtr);
    1016785                    if (rangePtr == NULL) {
    1017                         TRACE(("%s %u => ... after \"%.20s\", no encl. loop or catch, returning %s\n",
    1018                                 opName[opCode], objc, cmdNameBuf,
    1019                                 StringForResultCode(result)));
    1020786                        goto abnormalReturn; /* no catch exists to check */
    1021787                    }
     
    1025791                            newPcOffset = rangePtr->breakOffset;
    1026792                        } else if (rangePtr->continueOffset == -1) {
    1027                             TRACE(("%s %u => ... after \"%.20s\", %s, loop w/o continue, checking for catch\n",
    1028                                    opName[opCode], objc, cmdNameBuf,
    1029                                    StringForResultCode(result)));
    1030793                            goto checkForCatch;
    1031794                        } else {
    1032795                            newPcOffset = rangePtr->continueOffset;
    1033796                        }
    1034                         TRACE(("%s %u => ... after \"%.20s\", %s, range at %d, new pc %d\n",
    1035                                opName[opCode], objc, cmdNameBuf,
    1036                                StringForResultCode(result),
    1037                                rangePtr->codeOffset, newPcOffset));
    1038797                        break;
    1039798                    case CATCH_EXCEPTION_RANGE:
    1040                         TRACE(("%s %u => ... after \"%.20s\", %s...\n",
    1041                                opName[opCode], objc, cmdNameBuf,
    1042                                StringForResultCode(result)));
    1043799                        goto processCatch; /* it will use rangePtr */
    1044800                    default:
     
    1054810                     * enclosing catch exception range, if any.
    1055811                     */
    1056                     TRACE_WITH_OBJ(("%s %u => ... after \"%.20s\", TCL_ERROR ",
    1057                             opName[opCode], objc, cmdNameBuf),
    1058                             Tcl_GetObjResult(interp));
    1059812                    goto checkForCatch;
    1060813
     
    1065818                     * for an enclosing catch exception range, if any.
    1066819                     */
    1067                     TRACE(("%s %u => ... after \"%.20s\", TCL_RETURN\n",
    1068                             opName[opCode], objc, cmdNameBuf));
    1069820                    goto checkForCatch;
    1070821
    1071822                default:
    1072                     TRACE_WITH_OBJ(("%s %u => ... after \"%.20s\", OTHER RETURN CODE %d ",
    1073                             opName[opCode], objc, cmdNameBuf, result),
    1074                             Tcl_GetObjResult(interp));
    1075823                    goto checkForCatch;
    1076824                } /* end of switch on result from invoke instruction */
     
    1088836               
    1089837                PUSH_OBJECT(Tcl_GetObjResult(interp));
    1090                 TRACE_WITH_OBJ(("evalStk \"%.30s\" => ", O2S(objPtr)),
    1091                         Tcl_GetObjResult(interp));
    1092838                TclDecrRefCount(objPtr);
    1093839                ADJUST_PC(1);
     
    1109855                        codePtr);
    1110856                if (rangePtr == NULL) {
    1111                     TRACE(("evalStk \"%.30s\" => no encl. loop or catch, returning %s\n",
    1112                             O2S(objPtr), StringForResultCode(result)));
    1113857                    Tcl_DecrRefCount(objPtr);
    1114858                    goto abnormalReturn;    /* no catch exists to check */
     
    1119863                        newPcOffset = rangePtr->breakOffset;
    1120864                    } else if (rangePtr->continueOffset == -1) {
    1121                         TRACE(("evalStk \"%.30s\" => %s, loop w/o continue, checking for catch\n",
    1122                                O2S(objPtr), StringForResultCode(result)));
    1123865                        Tcl_DecrRefCount(objPtr);
    1124866                        goto checkForCatch;
     
    1127869                    }
    1128870                    result = TCL_OK;
    1129                     TRACE_WITH_OBJ(("evalStk \"%.30s\" => %s, range at %d, new pc %d ",
    1130                             O2S(objPtr), StringForResultCode(result),
    1131                             rangePtr->codeOffset, newPcOffset), valuePtr);
    1132871                    break;
    1133872                case CATCH_EXCEPTION_RANGE:
    1134                     TRACE_WITH_OBJ(("evalStk \"%.30s\" => %s ",
    1135                             O2S(objPtr), StringForResultCode(result)),
    1136                             valuePtr);
    1137873                    Tcl_DecrRefCount(objPtr);
    1138874                    goto processCatch;  /* it will use rangePtr */
     
    1144880                continue;       /* restart outer instruction loop at pc */
    1145881            } else { /* eval returned TCL_ERROR, TCL_RETURN, unknown code */
    1146                 TRACE_WITH_OBJ(("evalStk \"%.30s\" => ERROR: ", O2S(objPtr)),
    1147                         Tcl_GetObjResult(interp));
    1148882                Tcl_DecrRefCount(objPtr);
    1149883                goto checkForCatch;
     
    1157891            CACHE_STACK_INFO();
    1158892            if (result != TCL_OK) {
    1159                 TRACE_WITH_OBJ(("exprStk \"%.30s\" => ERROR: ",
    1160                         O2S(objPtr)), Tcl_GetObjResult(interp));
    1161893                Tcl_DecrRefCount(objPtr);
    1162894                goto checkForCatch;
    1163895            }
    1164896            stackPtr[++stackTop].o = valuePtr; /* already has right refct */
    1165             TRACE_WITH_OBJ(("exprStk \"%.30s\" => ", O2S(objPtr)), valuePtr);
    1166897            TclDecrRefCount(objPtr);
    1167898            ADJUST_PC(1);
     
    1182913            CACHE_STACK_INFO();
    1183914            if (valuePtr == NULL) {
    1184                 TRACE_WITH_OBJ(("%s %u => ERROR: ", opName[opCode], opnd),
    1185                         Tcl_GetObjResult(interp));
    1186915                result = TCL_ERROR;
    1187916                goto checkForCatch;
    1188917            }
    1189918            PUSH_OBJECT(valuePtr);
    1190             TRACE_WITH_OBJ(("%s %u => ", opName[opCode], opnd), valuePtr);
    1191919            ADJUST_PC(pcAdjustment);
    1192920
     
    1198926            CACHE_STACK_INFO();
    1199927            if (valuePtr == NULL) {
    1200                 TRACE_WITH_OBJ(("loadScalarStk \"%.30s\" => ERROR: ",
    1201                         O2S(namePtr)), Tcl_GetObjResult(interp));
    1202928                Tcl_DecrRefCount(namePtr);
    1203929                result = TCL_ERROR;
     
    1205931            }
    1206932            PUSH_OBJECT(valuePtr);
    1207             TRACE_WITH_OBJ(("loadScalarStk \"%.30s\" => ",
    1208                     O2S(namePtr)), valuePtr);
    1209933            TclDecrRefCount(namePtr);
    1210934            ADJUST_PC(1);
     
    1228952                CACHE_STACK_INFO();
    1229953                if (valuePtr == NULL) {
    1230                     TRACE_WITH_OBJ(("%s %u \"%.30s\" => ERROR: ",
    1231                             opName[opCode], opnd, O2S(elemPtr)),
    1232                             Tcl_GetObjResult(interp));
    1233954                    Tcl_DecrRefCount(elemPtr);
    1234955                    result = TCL_ERROR;
     
    1236957                }
    1237958                PUSH_OBJECT(valuePtr);
    1238                 TRACE_WITH_OBJ(("%s %u \"%.30s\" => ",
    1239                         opName[opCode], opnd, O2S(elemPtr)), valuePtr);
    1240959                TclDecrRefCount(elemPtr);
    1241960            }
     
    1252971                CACHE_STACK_INFO();
    1253972                if (valuePtr == NULL) {
    1254                     TRACE_WITH_OBJ(("loadArrayStk \"%.30s(%.30s)\" => ERROR: ",
    1255                             O2S(namePtr), O2S(elemPtr)),
    1256                             Tcl_GetObjResult(interp));
    1257973                    Tcl_DecrRefCount(namePtr);
    1258974                    Tcl_DecrRefCount(elemPtr);
     
    1261977                }
    1262978                PUSH_OBJECT(valuePtr);
    1263                 TRACE_WITH_OBJ(("loadArrayStk \"%.30s(%.30s)\" => ",
    1264                         O2S(namePtr), O2S(elemPtr)), valuePtr);
    1265979                TclDecrRefCount(namePtr);
    1266980                TclDecrRefCount(elemPtr);
     
    1275989            CACHE_STACK_INFO();
    1276990            if (valuePtr == NULL) {
    1277                 TRACE_WITH_OBJ(("loadStk \"%.30s\" => ERROR: ",
    1278                         O2S(namePtr)), Tcl_GetObjResult(interp));
    1279991                Tcl_DecrRefCount(namePtr);
    1280992                result = TCL_ERROR;
     
    1282994            }
    1283995            PUSH_OBJECT(valuePtr);
    1284             TRACE_WITH_OBJ(("loadStk \"%.30s\" => ", O2S(namePtr)),
    1285                     valuePtr);
    1286996            TclDecrRefCount(namePtr);
    1287997            ADJUST_PC(1);
     
    13031013            CACHE_STACK_INFO();
    13041014            if (value2Ptr == NULL) {
    1305                 TRACE_WITH_OBJ(("%s %u <- \"%.30s\" => ERROR: ",
    1306                         opName[opCode], opnd, O2S(valuePtr)),
    1307                         Tcl_GetObjResult(interp));
    13081015                Tcl_DecrRefCount(valuePtr);
    13091016                result = TCL_ERROR;
     
    13111018            }
    13121019            PUSH_OBJECT(value2Ptr);
    1313             TRACE_WITH_OBJ(("%s %u <- \"%.30s\" => ",
    1314                     opName[opCode], opnd, O2S(valuePtr)), value2Ptr);
    13151020            TclDecrRefCount(valuePtr);
    13161021            ADJUST_PC(pcAdjustment);
     
    13241029            CACHE_STACK_INFO();
    13251030            if (value2Ptr == NULL) {
    1326                 TRACE_WITH_OBJ(
    1327                         ("storeScalarStk \"%.30s\" <- \"%.30s\" => ERROR: ",
    1328                         O2S(namePtr), O2S(valuePtr)),
    1329                         Tcl_GetObjResult(interp));
    13301031                Tcl_DecrRefCount(namePtr);
    13311032                Tcl_DecrRefCount(valuePtr);
     
    13341035            }
    13351036            PUSH_OBJECT(value2Ptr);
    1336             TRACE_WITH_OBJ(
    1337                     ("storeScalarStk \"%.30s\" <- \"%.30s\" => ",
    1338                     O2S(namePtr),
    1339                     O2S(valuePtr)),
    1340                     value2Ptr);
    13411037            TclDecrRefCount(namePtr);
    13421038            TclDecrRefCount(valuePtr);
     
    13631059                CACHE_STACK_INFO();
    13641060                if (value2Ptr == NULL) {
    1365                     TRACE_WITH_OBJ(
    1366                             ("%s %u \"%.30s\" <- \"%.30s\" => ERROR: ",
    1367                             opName[opCode], opnd, O2S(elemPtr),
    1368                             O2S(valuePtr)), Tcl_GetObjResult(interp));
    13691061                    Tcl_DecrRefCount(elemPtr);
    13701062                    Tcl_DecrRefCount(valuePtr);
     
    13731065                }
    13741066                PUSH_OBJECT(value2Ptr);
    1375                 TRACE_WITH_OBJ(("%s %u \"%.30s\" <- \"%.30s\" => ",
    1376                         opName[opCode], opnd, O2S(elemPtr), O2S(valuePtr)),
    1377                         value2Ptr);
    13781067                TclDecrRefCount(elemPtr);
    13791068                TclDecrRefCount(valuePtr);
     
    13931082                CACHE_STACK_INFO();
    13941083                if (value2Ptr == NULL) {
    1395                     TRACE_WITH_OBJ(("storeArrayStk \"%.30s(%.30s)\" <- \"%.30s\" => ERROR: ",
    1396                             O2S(namePtr), O2S(elemPtr), O2S(valuePtr)),
    1397                             Tcl_GetObjResult(interp));
    13981084                    Tcl_DecrRefCount(namePtr);
    13991085                    Tcl_DecrRefCount(elemPtr);
     
    14031089                }
    14041090                PUSH_OBJECT(value2Ptr);
    1405                 TRACE_WITH_OBJ(("storeArrayStk \"%.30s(%.30s)\" <- \"%.30s\" => ",
    1406                         O2S(namePtr), O2S(elemPtr), O2S(valuePtr)),
    1407                         value2Ptr);
    14081091                TclDecrRefCount(namePtr);
    14091092                TclDecrRefCount(elemPtr);
     
    14201103            CACHE_STACK_INFO();
    14211104            if (value2Ptr == NULL) {
    1422                 TRACE_WITH_OBJ(("storeStk \"%.30s\" <- \"%.30s\" => ERROR: ",
    1423                         O2S(namePtr), O2S(valuePtr)),
    1424                         Tcl_GetObjResult(interp));
    14251105                Tcl_DecrRefCount(namePtr);
    14261106                Tcl_DecrRefCount(valuePtr);
     
    14291109            }
    14301110            PUSH_OBJECT(value2Ptr);
    1431             TRACE_WITH_OBJ(("storeStk \"%.30s\" <- \"%.30s\" => ",
    1432                     O2S(namePtr), O2S(valuePtr)), value2Ptr);
    14331111            TclDecrRefCount(namePtr);
    14341112            TclDecrRefCount(valuePtr);
     
    14411119                result = tclIntType.setFromAnyProc(interp, valuePtr);
    14421120                if (result != TCL_OK) {
    1443                     TRACE_WITH_OBJ(("incrScalar1 %u (by %s) => ERROR converting increment amount to int: ",
    1444                             opnd, O2S(valuePtr)), Tcl_GetObjResult(interp));
    14451121                    Tcl_DecrRefCount(valuePtr);
    14461122                    goto checkForCatch;
     
    14521128            CACHE_STACK_INFO();
    14531129            if (value2Ptr == NULL) {
    1454                 TRACE_WITH_OBJ(("incrScalar1 %u (by %ld) => ERROR: ",
    1455                         opnd, i), Tcl_GetObjResult(interp));
    14561130                Tcl_DecrRefCount(valuePtr);
    14571131                result = TCL_ERROR;
     
    14591133            }
    14601134            PUSH_OBJECT(value2Ptr);
    1461             TRACE_WITH_OBJ(("incrScalar1 %u (by %ld) => ", opnd, i),
    1462                     value2Ptr);
    14631135            TclDecrRefCount(valuePtr);
    14641136            ADJUST_PC(2);
     
    14711143                result = tclIntType.setFromAnyProc(interp, valuePtr);
    14721144                if (result != TCL_OK) {
    1473                     TRACE_WITH_OBJ(("%s \"%.30s\" (by %s) => ERROR converting increment amount to int: ",
    1474                             opName[opCode], O2S(namePtr), O2S(valuePtr)),
    1475                             Tcl_GetObjResult(interp));
    14761145                    Tcl_DecrRefCount(namePtr);
    14771146                    Tcl_DecrRefCount(valuePtr);
     
    14851154            CACHE_STACK_INFO();
    14861155            if (value2Ptr == NULL) {
    1487                 TRACE_WITH_OBJ(("%s \"%.30s\" (by %ld) => ERROR: ",
    1488                         opName[opCode], O2S(namePtr), i),
    1489                         Tcl_GetObjResult(interp));
    14901156                Tcl_DecrRefCount(namePtr);
    14911157                Tcl_DecrRefCount(valuePtr);
     
    14941160            }
    14951161            PUSH_OBJECT(value2Ptr);
    1496             TRACE_WITH_OBJ(("%s \"%.30s\" (by %ld) => ",
    1497                     opName[opCode], O2S(namePtr), i), value2Ptr);
    14981162            Tcl_DecrRefCount(namePtr);
    14991163            Tcl_DecrRefCount(valuePtr);
     
    15101174                    result = tclIntType.setFromAnyProc(interp, valuePtr);
    15111175                    if (result != TCL_OK) {
    1512                         TRACE_WITH_OBJ(("incrArray1 %u \"%.30s\" (by %s) => ERROR converting increment amount to int: ",
    1513                                 opnd, O2S(elemPtr), O2S(valuePtr)),
    1514                                 Tcl_GetObjResult(interp));
    15151176                        Tcl_DecrRefCount(elemPtr);
    15161177                        Tcl_DecrRefCount(valuePtr);
     
    15241185                CACHE_STACK_INFO();
    15251186                if (value2Ptr == NULL) {
    1526                     TRACE_WITH_OBJ(("incrArray1 %u \"%.30s\" (by %ld) => ERROR: ",
    1527                             opnd, O2S(elemPtr), i),
    1528                             Tcl_GetObjResult(interp));
    15291187                    Tcl_DecrRefCount(elemPtr);
    15301188                    Tcl_DecrRefCount(valuePtr);
     
    15331191                }
    15341192                PUSH_OBJECT(value2Ptr);
    1535                 TRACE_WITH_OBJ(("incrArray1 %u \"%.30s\" (by %ld) => ",
    1536                         opnd, O2S(elemPtr), i), value2Ptr);
    15371193                Tcl_DecrRefCount(elemPtr);
    15381194                Tcl_DecrRefCount(valuePtr);
     
    15501206                    result = tclIntType.setFromAnyProc(interp, valuePtr);
    15511207                    if (result != TCL_OK) {
    1552                         TRACE_WITH_OBJ(("incrArrayStk \"%.30s(%.30s)\" (by %s) => ERROR converting increment amount to int: ",
    1553                                 O2S(namePtr), O2S(elemPtr), O2S(valuePtr)),
    1554                                 Tcl_GetObjResult(interp));
    15551208                        Tcl_DecrRefCount(namePtr);
    15561209                        Tcl_DecrRefCount(elemPtr);
     
    15651218                CACHE_STACK_INFO();
    15661219                if (value2Ptr == NULL) {
    1567                     TRACE_WITH_OBJ(("incrArrayStk \"%.30s(%.30s)\" (by %ld) => ERROR: ",
    1568                             O2S(namePtr), O2S(elemPtr), i),
    1569                             Tcl_GetObjResult(interp));
    15701220                    Tcl_DecrRefCount(namePtr);
    15711221                    Tcl_DecrRefCount(elemPtr);
     
    15751225                }
    15761226                PUSH_OBJECT(value2Ptr);
    1577                 TRACE_WITH_OBJ(("incrArrayStk \"%.30s(%.30s)\" (by %ld) => ",
    1578                         O2S(namePtr), O2S(elemPtr), i), value2Ptr);
    15791227                Tcl_DecrRefCount(namePtr);
    15801228                Tcl_DecrRefCount(elemPtr);
     
    15901238            CACHE_STACK_INFO();
    15911239            if (value2Ptr == NULL) {
    1592                 TRACE_WITH_OBJ(("incrScalar1Imm %u %ld => ERROR: ",
    1593                         opnd, i), Tcl_GetObjResult(interp));
    15941240                result = TCL_ERROR;
    15951241                goto checkForCatch;
    15961242            }
    15971243            PUSH_OBJECT(value2Ptr);
    1598             TRACE_WITH_OBJ(("incrScalar1Imm %u %ld => ", opnd, i),
    1599                     value2Ptr);
    16001244            ADJUST_PC(3);
    16011245
     
    16091253            CACHE_STACK_INFO();
    16101254            if (value2Ptr == NULL) {
    1611                 TRACE_WITH_OBJ(("%s \"%.30s\" %ld => ERROR: ",
    1612                         opName[opCode], O2S(namePtr), i),
    1613                         Tcl_GetObjResult(interp));
    16141255                result = TCL_ERROR;
    16151256                Tcl_DecrRefCount(namePtr);
     
    16171258            }
    16181259            PUSH_OBJECT(value2Ptr);
    1619             TRACE_WITH_OBJ(("%s \"%.30s\" %ld => ",
    1620                     opName[opCode], O2S(namePtr), i), value2Ptr);
    16211260            TclDecrRefCount(namePtr);
    16221261            ADJUST_PC(2);
     
    16341273                CACHE_STACK_INFO();
    16351274                if (value2Ptr == NULL) {
    1636                     TRACE_WITH_OBJ(("incrArray1Imm %u \"%.30s\" (by %ld) => ERROR: ",
    1637                             opnd, O2S(elemPtr), i),
    1638                             Tcl_GetObjResult(interp));
    16391275                    Tcl_DecrRefCount(elemPtr);
    16401276                    result = TCL_ERROR;
     
    16421278                }
    16431279                PUSH_OBJECT(value2Ptr);
    1644                 TRACE_WITH_OBJ(("incrArray1Imm %u \"%.30s\" (by %ld) => ",
    1645                         opnd, O2S(elemPtr), i), value2Ptr);
    16461280                Tcl_DecrRefCount(elemPtr);
    16471281            }
     
    16601294                CACHE_STACK_INFO();
    16611295                if (value2Ptr == NULL) {
    1662                     TRACE_WITH_OBJ(("incrArrayStkImm \"%.30s(%.30s)\" (by %ld) => ERROR: ",
    1663                             O2S(namePtr), O2S(elemPtr), i),
    1664                             Tcl_GetObjResult(interp));
    16651296                    Tcl_DecrRefCount(namePtr);
    16661297                    Tcl_DecrRefCount(elemPtr);
     
    16691300                }
    16701301                PUSH_OBJECT(value2Ptr);
    1671                 TRACE_WITH_OBJ(("incrArrayStkImm \"%.30s(%.30s)\" (by %ld) => ",
    1672                         O2S(namePtr), O2S(elemPtr), i), value2Ptr);
    16731302                Tcl_DecrRefCount(namePtr);
    16741303                Tcl_DecrRefCount(elemPtr);
     
    16781307        case INST_JUMP1:
    16791308            opnd = TclGetInt1AtPtr(pc+1);
    1680             TRACE(("jump1 %d => new pc %u\n", opnd,
    1681                    (unsigned int)(pc + opnd - codePtr->codeStart)));
    16821309            ADJUST_PC(opnd);
    16831310
    16841311        case INST_JUMP4:
    16851312            opnd = TclGetInt4AtPtr(pc+1);
    1686             TRACE(("jump4 %d => new pc %u\n", opnd,
    1687                    (unsigned int)(pc + opnd - codePtr->codeStart)));
    16881313            ADJUST_PC(opnd);
    16891314
     
    17091334                    result = Tcl_GetBooleanFromObj(interp, valuePtr, &b);
    17101335                    if (result != TCL_OK) {
    1711                         TRACE_WITH_OBJ(("%s %d => ERROR: ", opName[opCode],
    1712                                 opnd), Tcl_GetObjResult(interp));
    17131336                        Tcl_DecrRefCount(valuePtr);
    17141337                        goto checkForCatch;
     
    17161339                }
    17171340                if (b) {
    1718                     TRACE(("%s %d => %.20s true, new pc %u\n",
    1719                             opName[opCode], opnd, O2S(valuePtr),
    1720                             (unsigned int)(pc+opnd - codePtr->codeStart)));
    17211341                    TclDecrRefCount(valuePtr);
    17221342                    ADJUST_PC(opnd);
    17231343                } else {
    1724                     TRACE(("%s %d => %.20s false\n", opName[opCode], opnd,
    1725                             O2S(valuePtr)));
    17261344                    TclDecrRefCount(valuePtr);
    17271345                    ADJUST_PC(pcAdjustment);
     
    17501368                    result = Tcl_GetBooleanFromObj(interp, valuePtr, &b);
    17511369                    if (result != TCL_OK) {
    1752                         TRACE_WITH_OBJ(("%s %d => ERROR: ", opName[opCode],
    1753                                 opnd), Tcl_GetObjResult(interp));
    17541370                        Tcl_DecrRefCount(valuePtr);
    17551371                        goto checkForCatch;
     
    17571373                }
    17581374                if (b) {
    1759                     TRACE(("%s %d => %.20s true\n", opName[opCode], opnd,
    1760                             O2S(valuePtr)));
    17611375                    TclDecrRefCount(valuePtr);
    17621376                    ADJUST_PC(pcAdjustment);
    17631377                } else {
    1764                     TRACE(("%s %d => %.20s false, new pc %u\n",
    1765                             opName[opCode], opnd, O2S(valuePtr),
    1766                            (unsigned int)(pc + opnd - codePtr->codeStart)));
    17671378                    TclDecrRefCount(valuePtr);
    17681379                    ADJUST_PC(opnd);
     
    18041415                    }
    18051416                    if (result != TCL_OK) {
    1806                         TRACE(("%s \"%.20s\" => ILLEGAL TYPE %s \n",
    1807                                 opName[opCode], O2S(valuePtr),
    1808                                 (t1Ptr? t1Ptr->name : "null")));
    18091417                        IllegalExprOperandType(interp, opCode, valuePtr);
    18101418                        Tcl_DecrRefCount(valuePtr);
     
    18301438                    }
    18311439                    if (result != TCL_OK) {
    1832                         TRACE(("%s \"%.20s\" => ILLEGAL TYPE %s \n",
    1833                                 opName[opCode], O2S(value2Ptr),
    1834                                 (t2Ptr? t2Ptr->name : "null")));
    18351440                        IllegalExprOperandType(interp, opCode, value2Ptr);
    18361441                        Tcl_DecrRefCount(valuePtr);
     
    18511456                if (Tcl_IsShared(valuePtr)) {
    18521457                    PUSH_OBJECT(Tcl_NewLongObj(iResult));
    1853                     TRACE(("%s %.20s %.20s => %d\n", opName[opCode],
    1854                            O2S(valuePtr), O2S(value2Ptr), iResult));
    18551458                    TclDecrRefCount(valuePtr);
    18561459                } else {        /* reuse the valuePtr object */
    1857                     TRACE(("%s %.20s %.20s => %d\n",
    1858                            opName[opCode], /* NB: stack top is off by 1 */
    1859                            O2S(valuePtr), O2S(value2Ptr), iResult));
    18601460                    Tcl_SetLongObj(valuePtr, iResult);
    18611461                    ++stackTop; /* valuePtr now on stk top has right r.c. */
     
    20131613                if (Tcl_IsShared(valuePtr)) {
    20141614                    PUSH_OBJECT(Tcl_NewLongObj(iResult));
    2015                     TRACE(("%s %.20s %.20s => %ld\n", opName[opCode],
    2016                         O2S(valuePtr), O2S(value2Ptr), iResult));
    20171615                    TclDecrRefCount(valuePtr);
    20181616                } else {        /* reuse the valuePtr object */
    2019                     TRACE(("%s %.20s %.20s => %ld\n",
    2020                         opName[opCode], /* NB: stack top is off by 1 */
    2021                         O2S(valuePtr), O2S(value2Ptr), iResult));
    20221617                    Tcl_SetLongObj(valuePtr, iResult);
    20231618                    ++stackTop; /* valuePtr now on stk top has right r.c. */
     
    20491644                            valuePtr, &i);
    20501645                    if (result != TCL_OK) {
    2051                         TRACE(("%s %.20s %.20s => ILLEGAL 1st TYPE %s\n",
    2052                               opName[opCode], O2S(valuePtr), O2S(value2Ptr),
    2053                               (valuePtr->typePtr?
    2054                                    valuePtr->typePtr->name : "null")));
    20551646                        IllegalExprOperandType(interp, opCode, valuePtr);
    20561647                        Tcl_DecrRefCount(valuePtr);
     
    20651656                            value2Ptr, &i2);
    20661657                    if (result != TCL_OK) {
    2067                         TRACE(("%s %.20s %.20s => ILLEGAL 2nd TYPE %s\n",
    2068                               opName[opCode], O2S(valuePtr), O2S(value2Ptr),
    2069                               (value2Ptr->typePtr?
    2070                                    value2Ptr->typePtr->name : "null")));
    20711658                        IllegalExprOperandType(interp, opCode, value2Ptr);
    20721659                        Tcl_DecrRefCount(valuePtr);
     
    20851672                     */
    20861673                    if (i2 == 0) {
    2087                         TRACE(("mod %ld %ld => DIVIDE BY ZERO\n", i, i2));
    20881674                        Tcl_DecrRefCount(valuePtr);
    20891675                        Tcl_DecrRefCount(value2Ptr);
     
    21371723                if (Tcl_IsShared(valuePtr)) {
    21381724                    PUSH_OBJECT(Tcl_NewLongObj(iResult));
    2139                     TRACE(("%s %ld %ld => %ld\n", opName[opCode], i, i2,
    2140                            iResult));
    21411725                    TclDecrRefCount(valuePtr);
    21421726                } else {        /* reuse the valuePtr object */
    2143                     TRACE(("%s %ld %ld => %ld\n", opName[opCode], i, i2,
    2144                         iResult)); /* NB: stack top is off by 1 */
    21451727                    Tcl_SetLongObj(valuePtr, iResult);
    21461728                    ++stackTop; /* valuePtr now on stk top has right r.c. */
     
    21861768                    }
    21871769                    if (result != TCL_OK) {
    2188                         TRACE(("%s %.20s %.20s => ILLEGAL 1st TYPE %s\n",
    2189                                opName[opCode], s, O2S(value2Ptr),
    2190                                (valuePtr->typePtr?
    2191                                     valuePtr->typePtr->name : "null")));
    21921770                        IllegalExprOperandType(interp, opCode, valuePtr);
    21931771                        Tcl_DecrRefCount(valuePtr);
     
    22121790                    }
    22131791                    if (result != TCL_OK) {
    2214                         TRACE(("%s %.20s %.20s => ILLEGAL 2nd TYPE %s\n",
    2215                                opName[opCode], O2S(valuePtr), s,
    2216                                (value2Ptr->typePtr?
    2217                                     value2Ptr->typePtr->name : "null")));
    22181792                        IllegalExprOperandType(interp, opCode, value2Ptr);
    22191793                        Tcl_DecrRefCount(valuePtr);
     
    22461820                    case INST_DIV:
    22471821                        if (d2 == 0.0) {
    2248                             TRACE(("div %.6g %.6g => DIVIDE BY ZERO\n",
    2249                                    d1, d2));
    22501822                            Tcl_DecrRefCount(valuePtr);
    22511823                            Tcl_DecrRefCount(value2Ptr);
     
    22611833                   
    22621834                    if (IS_NAN(dResult) || IS_INF(dResult)) {
    2263                         TRACE(("%s %.20s %.20s => IEEE FLOATING PT ERROR\n",
    2264                                opName[opCode], O2S(valuePtr), O2S(value2Ptr)));
    22651835                        TclExprFloatError(interp, dResult);
    22661836                        result = TCL_ERROR;
     
    22911861                         */
    22921862                        if (i2 == 0) {
    2293                             TRACE(("div %ld %ld => DIVIDE BY ZERO\n",
    2294                                     i, i2));
    22951863                            Tcl_DecrRefCount(valuePtr);
    22961864                            Tcl_DecrRefCount(value2Ptr);
     
    23181886                    if (doDouble) {
    23191887                        PUSH_OBJECT(Tcl_NewDoubleObj(dResult));
    2320                         TRACE(("%s %.6g %.6g => %.6g\n", opName[opCode],
    2321                                d1, d2, dResult));
    23221888                    } else {
    23231889                        PUSH_OBJECT(Tcl_NewLongObj(iResult));
    2324                         TRACE(("%s %ld %ld => %ld\n", opName[opCode],
    2325                                i, i2, iResult));
    23261890                    }
    23271891                    TclDecrRefCount(valuePtr);
    23281892                } else {            /* reuse the valuePtr object */
    23291893                    if (doDouble) { /* NB: stack top is off by 1 */
    2330                         TRACE(("%s %.6g %.6g => %.6g\n", opName[opCode],
    2331                                d1, d2, dResult));
    23321894                        Tcl_SetDoubleObj(valuePtr, dResult);
    23331895                    } else {
    2334                         TRACE(("%s %ld %ld => %ld\n", opName[opCode],
    2335                                i, i2, iResult));
    23361896                        Tcl_SetLongObj(valuePtr, iResult);
    23371897                    }
     
    23631923                    }
    23641924                    if (result != TCL_OK) {
    2365                         TRACE(("%s \"%.20s\" => ILLEGAL TYPE %s \n",
    2366                                 opName[opCode], s,
    2367                                 (tPtr? tPtr->name : "null")));
    23681925                        IllegalExprOperandType(interp, opCode, valuePtr);
    23691926                        goto checkForCatch;
    23701927                    }
    23711928                }
    2372                 TRACE_WITH_OBJ(("uplus %s => ", O2S(valuePtr)), valuePtr);
    23731929            }
    23741930            ADJUST_PC(1);
     
    23991955                    }
    24001956                    if (result != TCL_OK) {
    2401                         TRACE(("%s \"%.20s\" => ILLEGAL TYPE %s\n",
    2402                                 opName[opCode], s,
    2403                                (tPtr? tPtr->name : "null")));
    24041957                        IllegalExprOperandType(interp, opCode, valuePtr);
    24051958                        Tcl_DecrRefCount(valuePtr);
     
    24171970                        objPtr = Tcl_NewLongObj(
    24181971                                (opCode == INST_UMINUS)? -i : !i);
    2419                         TRACE_WITH_OBJ(("%s %ld => ", opName[opCode], i),
    2420                                 objPtr); /* NB: stack top is off by 1 */
    24211972                    } else {
    24221973                        d = valuePtr->internalRep.doubleValue;
     
    24301981                            objPtr = Tcl_NewLongObj((d==0.0)? 1 : 0);
    24311982                        }
    2432                         TRACE_WITH_OBJ(("%s %.6g => ", opName[opCode], d),
    2433                                 objPtr); /* NB: stack top is off by 1 */
    24341983                    }
    24351984                    PUSH_OBJECT(objPtr);
     
    24431992                        Tcl_SetLongObj(valuePtr,
    24441993                                (opCode == INST_UMINUS)? -i : !i);
    2445                         TRACE_WITH_OBJ(("%s %ld => ", opName[opCode], i),
    2446                                 valuePtr); /* NB: stack top is off by 1 */
    24471994                    } else {
    24481995                        d = valuePtr->internalRep.doubleValue;
     
    24562003                            Tcl_SetLongObj(valuePtr, (d==0.0)? 1 : 0);
    24572004                        }
    2458                         TRACE_WITH_OBJ(("%s %.6g => ", opName[opCode], d),
    2459                                 valuePtr); /* NB: stack top is off by 1 */
    24602005                    }
    24612006                    ++stackTop; /* valuePtr now on stk top has right r.c. */
     
    24812026                            valuePtr, &i);
    24822027                    if (result != TCL_OK) {   /* try to convert to double */
    2483                         TRACE(("bitnot \"%.20s\" => ILLEGAL TYPE %s\n",
    2484                                O2S(valuePtr), (tPtr? tPtr->name : "null")));
    24852028                        IllegalExprOperandType(interp, opCode, valuePtr);
    24862029                        Tcl_DecrRefCount(valuePtr);
     
    24922035                if (Tcl_IsShared(valuePtr)) {
    24932036                    PUSH_OBJECT(Tcl_NewLongObj(~i));
    2494                     TRACE(("bitnot 0x%lx => (%lu)\n", i, ~i));
    24952037                    TclDecrRefCount(valuePtr);
    24962038                } else {
     
    25002042                    Tcl_SetLongObj(valuePtr, ~i);
    25012043                    ++stackTop; /* valuePtr now on stk top has right r.c. */
    2502                     TRACE(("bitnot 0x%lx => (%lu)\n", i, ~i));
    25032044                }
    25042045            }
     
    25152056
    25162057                if ((opnd < 0) || (opnd > LAST_BUILTIN_FUNC)) {
    2517                     TRACE(("UNRECOGNIZED BUILTIN FUNC CODE %d\n", opnd));
    25182058                    panic("TclExecuteByteCode: unrecognized builtin function code %d", opnd);
    25192059                }
     
    25282068                    goto checkForCatch;
    25292069                }
    2530                 TRACE_WITH_OBJ(("callBuiltinFunc1 %d => ", opnd),
    2531                         stackPtr[stackTop].o);
    25322070            }
    25332071            ADJUST_PC(2);
     
    25552093                    goto checkForCatch;
    25562094                }
    2557                 TRACE_WITH_OBJ(("callFunc1 %d => ", objc),
    2558                         stackPtr[stackTop].o);
    25592095                ADJUST_PC(2);
    25602096            }
     
    26272163                        d = valuePtr->internalRep.doubleValue;
    26282164                        if (IS_NAN(d) || IS_INF(d)) {
    2629                             TRACE(("tryCvtToNumeric \"%.20s\" => IEEE FLOATING PT ERROR\n",
    2630                                    O2S(valuePtr)));
    26312165                            TclExprFloatError(interp, d);
    26322166                            result = TCL_ERROR;
     
    26362170                    shared = shared;            /* lint, shared not used. */
    26372171                    converted = converted;      /* lint, converted not used. */
    2638                     TRACE(("tryCvtToNumeric \"%.20s\" => numeric, %s, %s\n",
    2639                            O2S(valuePtr),
    2640                            (converted? "converted" : "not converted"),
    2641                            (shared? "shared" : "not shared")));
    2642                 } else {
    2643                     TRACE(("tryCvtToNumeric \"%.20s\" => not numeric\n",
    2644                            O2S(valuePtr)));
    26452172                }
    26462173            }
     
    26602187                    codePtr);
    26612188            if (rangePtr == NULL) {
    2662                 TRACE(("break => no encl. loop or catch, returning TCL_BREAK\n"));
    26632189                result = TCL_BREAK;
    26642190                goto abnormalReturn; /* no catch exists to check */
     
    26672193            case LOOP_EXCEPTION_RANGE:
    26682194                result = TCL_OK;
    2669                 TRACE(("break => range at %d, new pc %d\n",
    2670                        rangePtr->codeOffset, rangePtr->breakOffset));
    26712195                break;
    26722196            case CATCH_EXCEPTION_RANGE:
    26732197                result = TCL_BREAK;
    2674                 TRACE(("break => ...\n"));
    26752198                goto processCatch; /* it will use rangePtr */
    26762199            default:
     
    26932216                    codePtr);
    26942217            if (rangePtr == NULL) {
    2695                 TRACE(("continue => no encl. loop or catch, returning TCL_CONTINUE\n"));
    26962218                result = TCL_CONTINUE;
    26972219                goto abnormalReturn;
     
    27002222            case LOOP_EXCEPTION_RANGE:
    27012223                if (rangePtr->continueOffset == -1) {
    2702                     TRACE(("continue => loop w/o continue, checking for catch\n"));
    27032224                    goto checkForCatch;
    27042225                } else {
    27052226                    result = TCL_OK;
    2706                     TRACE(("continue => range at %d, new pc %d\n",
    2707                            rangePtr->codeOffset, rangePtr->continueOffset));
    27082227                }
    27092228                break;
    27102229            case CATCH_EXCEPTION_RANGE:
    27112230                result = TCL_CONTINUE;
    2712                 TRACE(("continue => ...\n"));
    27132231                goto processCatch; /* it will use rangePtr */
    27142232            default:
     
    27442262                TclSetVarScalar(iterVarPtr);
    27452263                TclClearVarUndefined(iterVarPtr);
    2746                 TRACE(("foreach_start4 %u => loop iter count temp %d\n",
    2747                         opnd, iterTmpIndex));
    27482264            }
    27492265            ADJUST_PC(5);
     
    27942310                    result = Tcl_ListObjLength(interp, listPtr, &listLen);
    27952311                    if (result != TCL_OK) {
    2796                         TRACE_WITH_OBJ(("foreach_step4 %u => ERROR converting list %ld, \"%s\": ",
    2797                                 opnd, i, O2S(listPtr)),
    2798                                 Tcl_GetObjResult(interp));
    27992312                        goto checkForCatch;
    28002313                    }
     
    28402353                            CACHE_STACK_INFO();
    28412354                            if (value2Ptr == NULL) {
    2842                                 TRACE_WITH_OBJ(("foreach_step4 %u => ERROR init. index temp %d: ",
    2843                                        opnd, varIndex),
    2844                                        Tcl_GetObjResult(interp));
    28452355                                if (setEmptyStr) {
    28462356                                    Tcl_DecrRefCount(elemPtr); /* unneeded */
     
    28622372
    28632373                PUSH_OBJECT(Tcl_NewLongObj(continueLoop));
    2864                 TRACE(("foreach_step4 %u => %d lists, iter %d, %s loop\n",
    2865                         opnd, numLists, iterNum,
    2866                         (continueLoop? "continue" : "exit")));
    28672374            }
    28682375            ADJUST_PC(5);
     
    28752382             */
    28762383            catchStackPtr[++catchTop] = stackTop;
    2877             TRACE(("beginCatch4 %u => catchTop=%d, stackTop=%d\n",
    2878                     TclGetUInt4AtPtr(pc+1), catchTop, stackTop));
    28792384            ADJUST_PC(5);
    28802385
     
    28822387            catchTop--;
    28832388            result = TCL_OK;
    2884             TRACE(("endCatch => catchTop=%d\n", catchTop));
    28852389            ADJUST_PC(1);
    28862390
    28872391        case INST_PUSH_RESULT:
    28882392            PUSH_OBJECT(Tcl_GetObjResult(interp));
    2889             TRACE_WITH_OBJ(("pushResult => "), Tcl_GetObjResult(interp));
    28902393            ADJUST_PC(1);
    28912394
    28922395        case INST_PUSH_RETURN_CODE:
    28932396            PUSH_OBJECT(Tcl_NewLongObj(result));
    2894             TRACE(("pushReturnCode => %u\n", result));
    28952397            ADJUST_PC(1);
    28962398
    28972399        default:
    2898             TRACE(("UNRECOGNIZED INSTRUCTION %u\n", opCode));
    28992400            panic("TclExecuteByteCode: unrecognized opCode %u", opCode);
    29002401        } /* end of switch on opCode */
     
    29262427        rangePtr = TclGetExceptionRangeForPc(pc, /*catchOnly*/ 1, codePtr);
    29272428        if (rangePtr == NULL) {
    2928             TRACE(("   ... no enclosing catch, returning %s\n",
    2929                     StringForResultCode(result)));
    29302429            goto abnormalReturn;
    29312430        }
     
    29452444            TclDecrRefCount(valuePtr);
    29462445        }
    2947         TRACE(("  ... found catch at %d, catchTop=%d, unwound to %d, new pc %u\n",
    2948                 rangePtr->codeOffset, catchTop, catchStackPtr[catchTop],
    2949                 (unsigned int)(rangePtr->catchOffset)));
    29502446        pc = (codePtr->codeStart + rangePtr->catchOffset);
    29512447        continue;               /* restart the execution loop at pc */
     
    29752471#undef STATIC_CATCH_STACK_SIZE
    29762472}
    2977 
    2978 
    2979 /*
    2980  *----------------------------------------------------------------------
    2981  *
    2982  * PrintByteCodeInfo --
    2983  *
    2984  *      This procedure prints a summary about a bytecode object to stdout.
    2985  *      It is called by TclExecuteByteCode when starting to execute the
    2986  *      bytecode object if tclTraceExec has the value 2 or more.
    2987  *
    2988  * Results:
    2989  *      None.
    2990  *
    2991  * Side effects:
    2992  *      None.
    2993  *
    2994  *----------------------------------------------------------------------
    2995  */
    2996 
    2997 static void
    2998 PrintByteCodeInfo(codePtr)
    2999     register ByteCode *codePtr; /* The bytecode whose summary is printed
    3000                                  * to stdout. */
    3001 {
    3002     Proc *procPtr = codePtr->procPtr;
    3003     int numCmds = codePtr->numCommands;
    3004     int numObjs = codePtr->numObjects;
    3005     int objBytes, i;
    3006 
    3007     objBytes = (numObjs * sizeof(Tcl_Obj));
    3008     for (i = 0;  i < numObjs;  i++) {
    3009         Tcl_Obj *litObjPtr = codePtr->objArrayPtr[i];
    3010         if (litObjPtr->bytes != NULL) {
    3011             objBytes += litObjPtr->length;
    3012         }
    3013     }
    3014    
    3015     fprintf(stdout, "\nExecuting ByteCode 0x%x, ref ct %u, epoch %u, interp 0x%x(epoch %u)\n",
    3016             (unsigned int) codePtr, codePtr->refCount,
    3017             codePtr->compileEpoch, (unsigned int) codePtr->iPtr,
    3018             codePtr->iPtr->compileEpoch);
    3019    
    3020     fprintf(stdout, "  Source: ");
    3021     TclPrintSource(stdout, codePtr->source, 70);
    3022 
    3023     fprintf(stdout, "\n  Cmds %d, chars %d, inst %u, objs %u, aux %d, stk depth %u, code/src %.2fn",
    3024             numCmds, codePtr->numSrcChars, codePtr->numCodeBytes, numObjs,
    3025             codePtr->numAuxDataItems, codePtr->maxStackDepth,
    3026             (codePtr->numSrcChars?
    3027                     ((float)codePtr->totalSize)/((float)codePtr->numSrcChars) : 0.0));
    3028 
    3029     fprintf(stdout, "  Code %zu = %u(header)+%d(inst)+%d(objs)+%u(exc)+%u(aux)+%d(cmd map)\n",
    3030             codePtr->totalSize, sizeof(ByteCode), codePtr->numCodeBytes,
    3031             objBytes, (codePtr->numExcRanges * sizeof(ExceptionRange)),
    3032             (codePtr->numAuxDataItems * sizeof(AuxData)),
    3033             codePtr->numCmdLocBytes);
    3034 
    3035     if (procPtr != NULL) {
    3036         fprintf(stdout,
    3037                 "  Proc 0x%x, ref ct %d, args %d, compiled locals %d\n",
    3038                 (unsigned int) procPtr, procPtr->refCount,
    3039                 procPtr->numArgs, procPtr->numCompiledLocals);
    3040     }
    3041 }
    3042 
    3043 
    3044 /*
    3045  *----------------------------------------------------------------------
    3046  *
    3047  * ValidatePcAndStackTop --
    3048  *
    3049  *      This procedure is called by TclExecuteByteCode when debugging to
    3050  *      verify that the program counter and stack top are valid during
    3051  *      execution.
    3052  *
    3053  * Results:
    3054  *      None.
    3055  *
    3056  * Side effects:
    3057  *      Prints a message to stderr and panics if either the pc or stack
    3058  *      top are invalid.
    3059  *
    3060  *----------------------------------------------------------------------
    3061  */
    3062 
    3063 #ifdef TCL_COMPILE_DEBUG
    3064 static void
    3065 ValidatePcAndStackTop(codePtr, pc, stackTop, stackLowerBound, stackUpperBound)
    3066     register ByteCode *codePtr; /* The bytecode whose summary is printed
    3067                                  * to stdout. */
    3068     unsigned char *pc;          /* Points to first byte of a bytecode
    3069                                  * instruction. The program counter. */
    3070     int stackTop;               /* Current stack top. Must be between
    3071                                  * stackLowerBound and stackUpperBound
    3072                                  * (inclusive). */
    3073     int stackLowerBound;        /* Smallest legal value for stackTop. */
    3074     int stackUpperBound;        /* Greatest legal value for stackTop. */
    3075 {
    3076     unsigned int relativePc = (unsigned int) (pc - codePtr->codeStart);
    3077     unsigned int codeStart = (unsigned int) codePtr->codeStart;
    3078     unsigned int codeEnd = (unsigned int)
    3079             (codePtr->codeStart + codePtr->numCodeBytes);
    3080     unsigned char opCode = *pc;
    3081 
    3082     if (((unsigned int) pc < codeStart) || ((unsigned int) pc > codeEnd)) {
    3083         fprintf(stderr, "\nBad instruction pc 0x%x in TclExecuteByteCode\n",
    3084                 (unsigned int) pc);
    3085         panic("TclExecuteByteCode execution failure: bad pc");
    3086     }
    3087     if ((unsigned int) opCode > LAST_INST_OPCODE) {
    3088         fprintf(stderr, "\nBad opcode %d at pc %u in TclExecuteByteCode\n",
    3089                 (unsigned int) opCode, relativePc);
    3090         panic("TclExecuteByteCode execution failure: bad opcode");
    3091     }
    3092     if ((stackTop < stackLowerBound) || (stackTop > stackUpperBound)) {
    3093         int numChars;
    3094         char *cmd = GetSrcInfoForPc(pc, codePtr, &numChars);
    3095         char *ellipsis = "";
    3096        
    3097         fprintf(stderr, "\nBad stack top %d at pc %u in TclExecuteByteCode",
    3098                 stackTop, relativePc);
    3099         if (cmd != NULL) {
    3100             if (numChars > 100) {
    3101                 numChars = 100;
    3102                 ellipsis = "...";
    3103             }
    3104             fprintf(stderr, "\n executing %.*s%s\n", numChars, cmd,
    3105                     ellipsis);
    3106         } else {
    3107             fprintf(stderr, "\n");
    3108         }
    3109         panic("TclExecuteByteCode execution failure: bad stack top");
    3110     }
    3111 }
    3112 #endif /* TCL_COMPILE_DEBUG */
    31132473
    31142474
     
    42713631
    42723632
    4273 #ifdef TCL_COMPILE_STATS
    4274 /*
    4275  *----------------------------------------------------------------------
    4276  *
    4277  * TclLog2 --
    4278  *
    4279  *      Procedure used while collecting compilation statistics to determine
    4280  *      the log base 2 of an integer.
    4281  *
    4282  * Results:
    4283  *      Returns the log base 2 of the operand. If the argument is less
    4284  *      than or equal to zero, a zero is returned.
    4285  *
    4286  * Side effects:
    4287  *      None.
    4288  *
    4289  *----------------------------------------------------------------------
    4290  */
    4291 
    4292 int
    4293 TclLog2(value)
    4294     register int value;         /* The integer for which to compute the
    4295                                  * log base 2. */
    4296 {
    4297     register int n = value;
    4298     register int result = 0;
    4299 
    4300     while (n > 1) {
    4301         n = n >> 1;
    4302         result++;
    4303     }
    4304     return result;
    4305 }
    4306 
    4307 
    4308 /*
    4309  *----------------------------------------------------------------------
    4310  *
    4311  * EvalStatsCmd --
    4312  *
    4313  *      Implements the "evalstats" command that prints instruction execution
    4314  *      counts to stdout.
    4315  *
    4316  * Results:
    4317  *      Standard Tcl results.
    4318  *
    4319  * Side effects:
    4320  *      None.
    4321  *
    4322  *----------------------------------------------------------------------
    4323  */
    4324 
    4325 static int
    4326 EvalStatsCmd(unused, interp, argc, argv)
    4327     ClientData unused;          /* Unused. */
    4328     Tcl_Interp *interp;         /* The current interpreter. */
    4329     int argc;                   /* The number of arguments. */
    4330     char **argv;                /* The argument strings. */
    4331 {
    4332     register double total = 0.0;
    4333     register int i;
    4334     int maxSizeDecade = 0;
    4335     double totalHeaderBytes = (tclNumCompilations * sizeof(ByteCode));
    4336 
    4337     for (i = 0;  i < 256;  i++) {
    4338         if (instructionCount[i] != 0) {
    4339             total += instructionCount[i];
    4340         }
    4341     }
    4342 
    4343     for (i = 31;  i >= 0;  i--) {
    4344         if ((tclSourceCount[i] > 0) && (tclByteCodeCount[i] > 0)) {
    4345             maxSizeDecade = i;
    4346             break;
    4347         }
    4348     }
    4349 
    4350     fprintf(stdout, "\nNumber of compilations           %ld\n",
    4351             tclNumCompilations);
    4352     fprintf(stdout, "Number of executions               %ld\n",
    4353             numExecutions);
    4354     fprintf(stdout, "Average executions/compilation     %.0f\n",
    4355             ((float) numExecutions/tclNumCompilations));
    4356    
    4357     fprintf(stdout, "\nInstructions executed            %.0f\n",
    4358             total);
    4359     fprintf(stdout, "Average instructions/compile       %.0f\n",
    4360             total/tclNumCompilations);
    4361     fprintf(stdout, "Average instructions/execution     %.0f\n",
    4362             total/numExecutions);
    4363    
    4364     fprintf(stdout, "\nTotal source bytes               %.6g\n",
    4365             tclTotalSourceBytes);
    4366     fprintf(stdout, "Total code bytes           %.6g\n",
    4367             tclTotalCodeBytes);
    4368     fprintf(stdout, "Average code/compilation   %.0f\n",
    4369             tclTotalCodeBytes/tclNumCompilations);
    4370     fprintf(stdout, "Average code/source                %.2f\n",
    4371             tclTotalCodeBytes/tclTotalSourceBytes);
    4372     fprintf(stdout, "Current source bytes               %.6g\n",
    4373             tclCurrentSourceBytes);
    4374     fprintf(stdout, "Current code bytes         %.6g\n",
    4375             tclCurrentCodeBytes);
    4376     fprintf(stdout, "Current code/source                %.2f\n",
    4377             tclCurrentCodeBytes/tclCurrentSourceBytes);
    4378    
    4379     fprintf(stdout, "\nTotal objects allocated          %ld\n",
    4380             tclObjsAlloced);
    4381     fprintf(stdout, "Total objects freed                %ld\n",
    4382             tclObjsFreed);
    4383     fprintf(stdout, "Current objects:           %ld\n",
    4384             (tclObjsAlloced - tclObjsFreed));
    4385 
    4386     fprintf(stdout, "\nBreakdown of code byte requirements:\n");
    4387     fprintf(stdout, "                   Total bytes      Pct of    Avg per\n");
    4388     fprintf(stdout, "                                  all code    compile\n");
    4389     fprintf(stdout, "Total code        %12.6g        100%%   %8.2f\n",
    4390             tclTotalCodeBytes, tclTotalCodeBytes/tclNumCompilations);
    4391     fprintf(stdout, "Header            %12.6g   %8.2f%%   %8.2f\n",
    4392             totalHeaderBytes,
    4393             ((totalHeaderBytes * 100.0) / tclTotalCodeBytes),
    4394             totalHeaderBytes/tclNumCompilations);
    4395     fprintf(stdout, "Instructions      %12.6g   %8.2f%%   %8.2f\n",
    4396             tclTotalInstBytes,
    4397             ((tclTotalInstBytes * 100.0) / tclTotalCodeBytes),
    4398             tclTotalInstBytes/tclNumCompilations);
    4399     fprintf(stdout, "Objects           %12.6g   %8.2f%%   %8.2f\n",
    4400             tclTotalObjBytes,
    4401             ((tclTotalObjBytes * 100.0) / tclTotalCodeBytes),
    4402             tclTotalObjBytes/tclNumCompilations);
    4403     fprintf(stdout, "Exception table   %12.6g   %8.2f%%   %8.2f\n",
    4404             tclTotalExceptBytes,
    4405             ((tclTotalExceptBytes * 100.0) / tclTotalCodeBytes),
    4406             tclTotalExceptBytes/tclNumCompilations);
    4407     fprintf(stdout, "Auxiliary data    %12.6g   %8.2f%%   %8.2f\n",
    4408             tclTotalAuxBytes,
    4409             ((tclTotalAuxBytes * 100.0) / tclTotalCodeBytes),
    4410             tclTotalAuxBytes/tclNumCompilations);
    4411     fprintf(stdout, "Command map       %12.6g   %8.2f%%   %8.2f\n",
    4412             tclTotalCmdMapBytes,
    4413             ((tclTotalCmdMapBytes * 100.0) / tclTotalCodeBytes),
    4414             tclTotalCmdMapBytes/tclNumCompilations);
    4415    
    4416     fprintf(stdout, "\nSource and ByteCode size distributions:\n");
    4417     fprintf(stdout, "    binary decade          source    code\n");
    4418     for (i = 0;  i <= maxSizeDecade;  i++) {
    4419         int decadeLow, decadeHigh;
    4420 
    4421         if (i == 0) {
    4422             decadeLow = 0;
    4423         } else {
    4424             decadeLow = 1 << i;
    4425         }
    4426         decadeHigh = (1 << (i+1)) - 1;
    4427         fprintf(stdout, "       %6d -%6d                %6d     %6d\n",
    4428                 decadeLow, decadeHigh,
    4429                 tclSourceCount[i], tclByteCodeCount[i]);
    4430     }
    4431 
    4432     fprintf(stdout, "\nInstruction counts:\n");
    4433     for (i = 0;  i < 256;  i++) {
    4434         if (instructionCount[i]) {
    4435             fprintf(stdout, "%20s %8d %6.2f%%\n",
    4436                     opName[i], instructionCount[i],
    4437                     (instructionCount[i] * 100.0)/total);
    4438         }
    4439     }
    4440 
    4441 #ifdef TCL_MEM_DEBUG
    4442     fprintf(stdout, "\nHeap Statistics:\n");
    4443     TclDumpMemoryInfo(stdout);
    4444 #endif /* TCL_MEM_DEBUG */
    4445 
    4446     return TCL_OK;
    4447 }
    4448 #endif /* TCL_COMPILE_STATS */
    4449 
    4450 
    44513633/*
    44523634 *----------------------------------------------------------------------
     
    47583940    panic("UpdateStringOfCmdName should never be invoked");
    47593941}
    4760 
    4761 
    4762 #ifdef TCL_COMPILE_DEBUG
    4763 /*
    4764  *----------------------------------------------------------------------
    4765  *
    4766  * StringForResultCode --
    4767  *
    4768  *      Procedure that returns a human-readable string representing a
    4769  *      Tcl result code such as TCL_ERROR.
    4770  *
    4771  * Results:
    4772  *      If the result code is one of the standard Tcl return codes, the
    4773  *      result is a string representing that code such as "TCL_ERROR".
    4774  *      Otherwise, the result string is that code formatted as a
    4775  *      sequence of decimal digit characters. Note that the resulting
    4776  *      string must not be modified by the caller.
    4777  *
    4778  * Side effects:
    4779  *      None.
    4780  *
    4781  *----------------------------------------------------------------------
    4782  */
    4783 
    4784 static char *
    4785 StringForResultCode(result)
    4786     int result;                 /* The Tcl result code for which to
    4787                                  * generate a string. */
    4788 {
    4789     static char buf[20];
    4790    
    4791     if ((result >= TCL_OK) && (result <= TCL_CONTINUE)) {
    4792         return resultStrings[result];
    4793     }
    4794     TclFormatInt(buf, result);
    4795     return buf;
    4796 }
    4797 #endif /* TCL_COMPILE_DEBUG */
Note: See TracChangeset for help on using the changeset viewer.