Posted to tcl by APN at Mon Jul 26 15:35:32 GMT 2010view pretty
Tcl_CatchObjCmd(dummy, interp, objc, objv) 231 ClientData dummy; /* Not used. */ 232 Tcl_Interp *interp; /* Current interpreter. */ 233 int objc; /* Number of arguments. */ 234 Tcl_Obj *CONST objv[]; /* Argument objects. */ 235 { 236 Tcl_Obj *varNamePtr = NULL; 237 int result; 238 239 if ((objc != 2) && (objc != 3)) { 240 Tcl_WrongNumArgs(interp, 1, objv, "command ?varName?"); 241 return TCL_ERROR; 242 } 243 244 /* 245 * Save a pointer to the variable name object, if any, in case the 246 * Tcl_EvalObj reallocates the bytecode interpreter's evaluation 247 * stack rendering objv invalid. 248 */ 249 250 if (objc == 3) { 251 varNamePtr = objv[2]; 252 } 253 254 result = Tcl_EvalObjEx(interp, objv[1], 0); 255 256 if (objc == 3) { 257 if (Tcl_ObjSetVar2(interp, varNamePtr, NULL, 258 Tcl_GetObjResult(interp), 0) == NULL) { 259 Tcl_ResetResult(interp); 260 Tcl_AppendToObj(Tcl_GetObjResult(interp), 261 "couldn't save command result in variable", -1); 262 return TCL_ERROR; 263 } 264 } 265 266 /* 267 * Set the interpreter's object result to an integer object holding the 268 * integer Tcl_EvalObj result. Note that we don't bother generating a 269 * string representation. We reset the interpreter's object result 270 * to an unshared empty object and then set it to be an integer object. 271 */ 272 273 Tcl_ResetResult(interp); 274 Tcl_SetIntObj(Tcl_GetObjResult(interp), result); 275 return TCL_OK; 276 } 277