From 57629fc2c907b7eda60ca8faef465acba8ef1ede Mon Sep 17 00:00:00 2001 From: pooryorick Date: Tue, 4 Oct 2016 12:27:09 +0000 Subject: Fix for [ef5373e6fa0617ee]. Operands are interpreted numerically when possible. --- generic/tclExecute.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index df36958..a6c5603 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -5378,9 +5378,42 @@ TEBCresume( case INST_STR_NEQ: /* String (in)equality check */ case INST_STR_CMP: /* String compare. */ stringCompare: + { + ClientData ptr1; + int type1; value2Ptr = OBJ_AT_TOS; valuePtr = OBJ_UNDER_TOS; + GetNumberFromObj(NULL, valuePtr, &ptr1, &type1); + GetNumberFromObj(NULL, value2Ptr, &ptr1, &type1); + + if (valuePtr->typePtr == &tclDoubleType + || valuePtr->typePtr == &tclIntType +#ifndef TCL_WIDE_INT_IS_LONG + || valuePtr->typePtr == &tclWideIntType +#endif + || valuePtr->typePtr == &tclBignumType + ) { + valuePtr = Tcl_DuplicateObj(valuePtr); + TclInvalidateStringRep(valuePtr); + TclGetString(valuePtr); + } + + if (value2Ptr->typePtr == &tclDoubleType + || value2Ptr->typePtr == &tclIntType +#ifndef TCL_WIDE_INT_IS_LONG + || value2Ptr->typePtr == &tclWideIntType +#endif + || value2Ptr->typePtr == &tclBignumType + ) { + value2Ptr = Tcl_DuplicateObj(value2Ptr); + TclInvalidateStringRep(value2Ptr); + TclGetString(value2Ptr); + } + + Tcl_IncrRefCount(valuePtr); + Tcl_IncrRefCount(value2Ptr); + if (valuePtr == value2Ptr) { match = 0; } else { @@ -5501,7 +5534,10 @@ TEBCresume( TRACE(("\"%.20s\" \"%.20s\" => %d\n", O2S(valuePtr), O2S(value2Ptr), (match < 0 ? -1 : match > 0 ? 1 : 0))); + Tcl_DecrRefCount(valuePtr); + Tcl_DecrRefCount(value2Ptr); JUMP_PEEPHOLE_F(match, 1, 2); + } case INST_STR_LEN: valuePtr = OBJ_AT_TOS; -- cgit v0.12