Zoran Vasiljevic schrieb:
Hi!

After I have observed some very subtle and hard-to-reproduce
bugs in our app, I found out that Tcl object handling in
some places in NS code, although "by the book" is really a
source of trouble. Like:

    Tcl_SetIntObj(Tcl_GetObjResult(interp), 1);   /* Unsafe? */

This construct assumes that object stored in the interp
result is not shared.

But, when I modify it to look like:

   Tcl_SetObjResult(interp, Tcl_NewIntObj(1));    /* Safe! */


Another option is to use
Tcl_ResetResult()

* Side effects:
*    It resets the result object to an unshared empty object. It
*    then restores the interpreter's string result area to its default
*    initialized state, freeing up any memory that may have been
*    allocated. It also clears any error information for the interpreter.

When i developed the byte-code support for xotcl, i found some
subtle differences on that, depending on byte-code-compiled code or
not (this was with some earlier tcl 8.4 versions).

Not sure, what's faster, resetResult() + setIntObj() or
setObjResult() + newIntObj(). The difference in speed is most likely
not significant. however, resetResult allows to append to the object,
clears error state, etc.

-gustaf

Reply via email to