diff options
author | gahr <gahr@gahr.ch> | 2017-04-27 10:37:07 (GMT) |
---|---|---|
committer | gahr <gahr@gahr.ch> | 2017-04-27 10:37:07 (GMT) |
commit | 57ae78cc1371c90145848c5689df2613fa446dfd (patch) | |
tree | 5bf6f35133eb055a6f25e631f4009342ee8b4e50 /generic | |
parent | 90fde58143eea5e3f626221a006cf6ac3e398ebe (diff) | |
download | tcl-57ae78cc1371c90145848c5689df2613fa446dfd.zip tcl-57ae78cc1371c90145848c5689df2613fa446dfd.tar.gz tcl-57ae78cc1371c90145848c5689df2613fa446dfd.tar.bz2 |
[04e26c02c0] Provide an unsafe version of the GetNumberFromObj for use when we
know the arguments are ok
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclExecute.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index ad80b28..0283e72 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -492,7 +492,9 @@ VarHashCreateVar( /* * Macro used in this file to save a function call for common uses of - * TclGetNumberFromObj(). The ANSI C "prototype" is: + * TclGetNumberFromObj(). An "unsafe" version is available when objPtr + * is known to be of numeric type and valid (non-NAN) value already. + * The ANSI C "prototype" is: * * MODULE_SCOPE int GetNumberFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, * ClientData *ptrPtr, int *tPtr); @@ -514,6 +516,14 @@ VarHashCreateVar( (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) +#define GetNumberFromObjUnsafe(objPtr, ptrPtr, tPtr) \ + ((objPtr)->typePtr == &tclIntType) \ + ? (*(tPtr) = TCL_NUMBER_LONG, \ + *(ptrPtr) = (ClientData) \ + (&((objPtr)->internalRep.longValue))) : \ + (*(tPtr) = TCL_NUMBER_DOUBLE, \ + *(ptrPtr) = (ClientData) \ + (&((objPtr)->internalRep.doubleValue))) #else /* !TCL_WIDE_INT_IS_LONG */ #define GetNumberFromObj(interp, objPtr, ptrPtr, tPtr) \ (((objPtr)->typePtr == &tclIntType) \ @@ -534,6 +544,18 @@ VarHashCreateVar( (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) +#define GetNumberFromObjUnsafe(objPtr, ptrPtr, tPtr) \ + ((objPtr)->typePtr == &tclIntType) \ + ? (*(tPtr) = TCL_NUMBER_LONG, \ + *(ptrPtr) = (ClientData) \ + (&((objPtr)->internalRep.longValue))) : \ + ((objPtr)->typePtr == &tclWideIntType) \ + ? (*(tPtr) = TCL_NUMBER_WIDE, \ + *(ptrPtr) = (ClientData) \ + (&((objPtr)->internalRep.wideValue))) : \ + (*(tPtr) = TCL_NUMBER_DOUBLE, \ + *(ptrPtr) = (ClientData) \ + (&((objPtr)->internalRep.doubleValue))) #endif /* TCL_WIDE_INT_IS_LONG */ /* @@ -9241,8 +9263,8 @@ TclCompareTwoNumbers( Tcl_WideInt w1, w2; #endif - (void) GetNumberFromObj(NULL, valuePtr, &ptr1, &type1); - (void) GetNumberFromObj(NULL, value2Ptr, &ptr2, &type2); + GetNumberFromObjUnsafe(valuePtr, &ptr1, &type1); + GetNumberFromObjUnsafe(value2Ptr, &ptr2, &type2); switch (type1) { case TCL_NUMBER_LONG: |