45 Tcl_Obj *CONST objv[],
62 Interp *iPtr = (Interp *) interp;
65 Trace *tracePtr, *nextPtr;
68 CallFrame *savedVarFramePtr;
71 Tcl_ResetResult(interp);
80 if (iPtr->flags & DELETED) {
81 Tcl_AppendToObj(Tcl_GetObjResult(interp),
82 "attempt to call eval in deleted interpreter", -1);
83 Tcl_SetErrorCode(interp,
"CORE",
"IDELETE",
84 "attempt to call eval in deleted interpreter",
94 if (iPtr->numLevels >= iPtr->maxNestingDepth) {
95 iPtr->result =
"too many nested calls to Tcl_Eval (infinite loop?)";
106 if (TclpCheckStackSpace() == 0) {
109 iPtr->result =
"too many nested calls to Tcl_Eval (infinite loop?)";
122 cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);
123 if (cmdPtr == NULL) {
124 newObjv = (Tcl_Obj **) ckalloc( (((
unsigned)objc + 1) * (
unsigned)
sizeof (Tcl_Obj *)));
125 for (i = objc-1; i >= 0; i--) {
126 newObjv[i+1] = objv[i];
128 newObjv[0] = Tcl_NewStringObj(
"unknown", -1);
129 Tcl_IncrRefCount(newObjv[0]);
130 cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, newObjv[0]);
131 if (cmdPtr == NULL) {
132 Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
133 "invalid command name \"", Tcl_GetString(objv[0]),
"\"",
137 code = EvalObjv(interp, objc+1, newObjv, command, length, 0);
139 Tcl_DecrRefCount(newObjv[0]);
140 ckfree((
char *) newObjv);
149 commandCopy = command;
151 for (tracePtr = iPtr->tracePtr; tracePtr != NULL; tracePtr = nextPtr) {
152 nextPtr = tracePtr->nextPtr;
153 if (iPtr->numLevels > tracePtr->level) {
173 length = (int) strlen(command);
174 }
else if ((
size_t)length < strlen(command)) {
175 commandCopy = (
char *) ckalloc((
unsigned) (length + 1));
176 strncpy(commandCopy, command, (
size_t) length);
177 commandCopy[length] = 0;
180 (*tracePtr->proc)(tracePtr->clientData, interp, iPtr->numLevels,
181 commandCopy, (Tcl_Command) cmdPtr, objc, objv);
188 if (commandCopy != command) {
189 ckfree((
char *) commandCopy);
197 savedVarFramePtr = iPtr->varFramePtr;
198 if (flags & TCL_EVAL_GLOBAL) {
199 iPtr->varFramePtr = NULL;
201 code = (*cmdPtr->objProc)(cmdPtr->objClientData, interp, objc, objv);
202 iPtr->varFramePtr = savedVarFramePtr;
203 if (Tcl_AsyncReady()) {
204 code = Tcl_AsyncInvoke(interp, code);
214 if (*(iPtr->result) != 0) {
215 (void) Tcl_GetObjResult(interp);
248 Tcl_Obj *CONST objv[],
255 Interp *iPtr = (Interp *)interp;
258 char *cmdString =
"";
262 for (tracePtr = iPtr->tracePtr; tracePtr; tracePtr = tracePtr->nextPtr) {
266 if (iPtr->numLevels < tracePtr->level) {
273 Tcl_DStringInit(&cmdBuf);
274 for (i = 0; i < objc; i++) {
275 Tcl_DStringAppendElement(&cmdBuf, Tcl_GetString(objv[i]));
277 cmdString = Tcl_DStringValue(&cmdBuf);
278 cmdLen = Tcl_DStringLength(&cmdBuf);
288 code = EvalObjv(interp, objc, objv, cmdString, cmdLen, flags);
289 if (code == TCL_ERROR && cmdLen == 0)
293 Tcl_LogCommandInfo(interp, cmdString, cmdString, cmdLen);
301 Tcl_DStringFree(&cmdBuf);
328 ClientData clientData,
331 Tcl_Obj *
const objv[])
333 Tcl_Obj *bodyObj, *handlersObj, *finallyObj = NULL;
334 int i, bodyShared, haveHandlers, dummy, code;
335 static const char *
const handlerNames[] = {
336 "finally",
"on",
"trap", NULL
339 TryFinally, TryOn, TryTrap
349 Tcl_WrongNumArgs(interp, 1, objv,
350 "body ?handler ...? ?finally script?");
354 TclNewObj(handlersObj);
357 for (i=2 ; i<objc ; i++) {
361 if (Tcl_GetIndexFromObj(interp, objv[i], handlerNames,
"handler type",
362 0, &type) != TCL_OK) {
363 Tcl_DecrRefCount(handlersObj);
366 switch ((
enum Handlers) type) {
369 Tcl_SetObjResult(interp, Tcl_NewStringObj(
370 "finally clause must be last", -1));
371 Tcl_DecrRefCount(handlersObj);
372 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"FINALLY",
373 "NONTERMINAL", NULL);
375 }
else if (i == objc-1) {
376 Tcl_SetObjResult(interp, Tcl_NewStringObj(
377 "wrong # args to finally clause: must be"
378 " \"... finally script\"", -1));
379 Tcl_DecrRefCount(handlersObj);
380 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"FINALLY",
384 finallyObj = objv[++i];
389 Tcl_SetObjResult(interp, Tcl_NewStringObj(
390 "wrong # args to on clause: must be \"... on code"
391 " variableList script\"", -1));
392 Tcl_DecrRefCount(handlersObj);
393 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"ON",
397 if (TclGetCompletionCodeFromObj(interp, objv[i+1], &code) != TCL_OK) {
398 Tcl_DecrRefCount(handlersObj);
406 Tcl_SetObjResult(interp, Tcl_NewStringObj(
407 "wrong # args to trap clause: "
408 "must be \"... trap pattern variableList script\"",
410 Tcl_DecrRefCount(handlersObj);
411 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"TRAP",
416 if (Tcl_ListObjLength(NULL, objv[i+1], &dummy) != TCL_OK) {
417 Tcl_SetObjResult(interp, Tcl_ObjPrintf(
418 "bad prefix '%s': must be a list",
419 Tcl_GetString(objv[i+1])));
420 Tcl_DecrRefCount(handlersObj);
421 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"TRAP",
428 if (Tcl_ListObjLength(interp, objv[i+2], &dummy) != TCL_OK) {
429 Tcl_DecrRefCount(handlersObj);
434 TclNewIntObj(info[1], code);
435 if (info[2] == NULL) {
441 bodyShared = !strcmp(TclGetString(objv[i+3]),
"-");
442 Tcl_ListObjAppendElement(NULL, handlersObj,
443 Tcl_NewListObj(5, info));
450 Tcl_SetObjResult(interp, Tcl_NewStringObj(
451 "last non-finally clause must not have a body of \"-\"", -1));
452 Tcl_DecrRefCount(handlersObj);
453 Tcl_SetErrorCode(interp,
"TCL",
"OPERATION",
"TRY",
"BADFALLTHROUGH",
458 Tcl_DecrRefCount(handlersObj);
466 code = TclEvalObjEx(interp, bodyObj, 0, ((Interp *) interp)->cmdFramePtr, 1);
469 return TclEvalObjEx(interp, bodyObj, 0, ((Interp *) interp)->cmdFramePtr, 1);
#define Atl_EvalObjv(...)