Posted to tcl by APN at Mon Jul 26 15:35:32 GMT 2010view raw

  1. Tcl_CatchObjCmd(dummy, interp, objc, objv)
  2. 231 ClientData dummy; /* Not used. */
  3. 232 Tcl_Interp *interp; /* Current interpreter. */
  4. 233 int objc; /* Number of arguments. */
  5. 234 Tcl_Obj *CONST objv[]; /* Argument objects. */
  6. 235 {
  7. 236 Tcl_Obj *varNamePtr = NULL;
  8. 237 int result;
  9. 238
  10. 239 if ((objc != 2) && (objc != 3)) {
  11. 240 Tcl_WrongNumArgs(interp, 1, objv, "command ?varName?");
  12. 241 return TCL_ERROR;
  13. 242 }
  14. 243
  15. 244 /*
  16. 245 * Save a pointer to the variable name object, if any, in case the
  17. 246 * Tcl_EvalObj reallocates the bytecode interpreter's evaluation
  18. 247 * stack rendering objv invalid.
  19. 248 */
  20. 249
  21. 250 if (objc == 3) {
  22. 251 varNamePtr = objv[2];
  23. 252 }
  24. 253
  25. 254 result = Tcl_EvalObjEx(interp, objv[1], 0);
  26. 255
  27. 256 if (objc == 3) {
  28. 257 if (Tcl_ObjSetVar2(interp, varNamePtr, NULL,
  29. 258 Tcl_GetObjResult(interp), 0) == NULL) {
  30. 259 Tcl_ResetResult(interp);
  31. 260 Tcl_AppendToObj(Tcl_GetObjResult(interp),
  32. 261 "couldn't save command result in variable", -1);
  33. 262 return TCL_ERROR;
  34. 263 }
  35. 264 }
  36. 265
  37. 266 /*
  38. 267 * Set the interpreter's object result to an integer object holding the
  39. 268 * integer Tcl_EvalObj result. Note that we don't bother generating a
  40. 269 * string representation. We reset the interpreter's object result
  41. 270 * to an unshared empty object and then set it to be an integer object.
  42. 271 */
  43. 272
  44. 273 Tcl_ResetResult(interp);
  45. 274 Tcl_SetIntObj(Tcl_GetObjResult(interp), result);
  46. 275 return TCL_OK;
  47. 276 }
  48. 277