summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2016-10-04 12:27:09 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2016-10-04 12:27:09 (GMT)
commit57629fc2c907b7eda60ca8faef465acba8ef1ede (patch)
tree97b27fad9df56a87c4aac0dca1dd9e497b15fbb2
parent2735ae8a8f3cd9a14778858d17f195bf54fc3303 (diff)
downloadtcl-57629fc2c907b7eda60ca8faef465acba8ef1ede.zip
tcl-57629fc2c907b7eda60ca8faef465acba8ef1ede.tar.gz
tcl-57629fc2c907b7eda60ca8faef465acba8ef1ede.tar.bz2
Fix for [ef5373e6fa0617ee]. Operands are interpreted numerically when possible.
-rw-r--r--generic/tclExecute.c36
1 files changed, 36 insertions, 0 deletions
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;