diff options
| author | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-12-13 11:02:15 (GMT) |
|---|---|---|
| committer | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-12-13 11:02:15 (GMT) |
| commit | 7fdc92442c29deeae4fd7c198fa148f6b5e418c5 (patch) | |
| tree | e4d00861fe1bf524826adc3c3653eccbc77dac74 | |
| parent | 4aa9667a4349d8332706b1a6637f95fedb69aa3b (diff) | |
| parent | cd6bd7db5614d86dca0a26e5d6c3dd5a41f76649 (diff) | |
| download | tcl-7fdc92442c29deeae4fd7c198fa148f6b5e418c5.zip tcl-7fdc92442c29deeae4fd7c198fa148f6b5e418c5.tar.gz tcl-7fdc92442c29deeae4fd7c198fa148f6b5e418c5.tar.bz2 | |
Fix Tcl_DecrRefCount macro, not to refer to its objPtr parameter twice.
| -rw-r--r-- | generic/tcl.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/generic/tcl.h b/generic/tcl.h index 147672c..5a85c33 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -854,10 +854,7 @@ typedef struct Tcl_Obj { * whether an object is shared (i.e. has reference count > 1). Note: clients * should use Tcl_DecrRefCount() when they are finished using an object, and * should never call TclFreeObj() directly. TclFreeObj() is only defined and - * made public in tcl.h to support Tcl_DecrRefCount's macro definition. Note - * also that Tcl_DecrRefCount() refers to the parameter "obj" twice. This - * means that you should avoid calling it with an expression that is expensive - * to compute or has side effects. + * made public in tcl.h to support Tcl_DecrRefCount's macro definition. */ void Tcl_IncrRefCount(Tcl_Obj *objPtr); @@ -2504,7 +2501,12 @@ EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr); * http://c2.com/cgi/wiki?TrivialDoWhileLoop */ # define Tcl_DecrRefCount(objPtr) \ - do { if (--(objPtr)->refCount <= 0) TclFreeObj(objPtr); } while(0) + do { \ + Tcl_Obj *obj = (objPtr); \ + if ((obj)->refCount-- < 2) { \ + TclFreeObj(obj); \ + } \ + } while(0) # define Tcl_IsShared(objPtr) \ ((objPtr)->refCount > 1) #endif |
