summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c56
1 files changed, 51 insertions, 5 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index af44323..728a847 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5440,22 +5440,58 @@ TEBCresume(
}
} else {
/*
- * strcmp can't do a simple memcmp in order to handle the
- * special Tcl \xC0\x80 null encoding for utf-8.
+ * In order to handle the special Tcl \xC0\x80 null encoding
+ * for utf-8, strcmp can't do a simple memcmp.
*/
- s1 = TclGetStringFromObj(valuePtr, &s1len);
- s2 = TclGetStringFromObj(value2Ptr, &s2len);
+ {
+ int empty;
+ if ((empty = TclCheckEmptyString(valuePtr)) > 0) {
+ switch (TclCheckEmptyString(value2Ptr)) {
+ case -1:
+ s1 = "";
+ s1len = 0;
+ s2 = TclGetStringFromObj(value2Ptr, &s2len);
+ break;
+ case 0:
+ match = -1;
+ goto matchdone;
+ case 1:
+ match = 0;
+ goto matchdone;
+ }
+ } else if (TclCheckEmptyString(value2Ptr) > 0) {
+ switch (empty) {
+ case -1:
+ s2 = "";
+ s2len = 0;
+ s1 = TclGetStringFromObj(valuePtr, &s1len);
+ break;
+ case 0:
+ match = 1;
+ goto matchdone;
+ case 1:
+ match = 0;
+ goto matchdone;
+ }
+ } else {
+ s1 = TclGetStringFromObj(valuePtr, &s1len);
+ s2 = TclGetStringFromObj(value2Ptr, &s2len);
+ }
+ }
+
+
if (checkEq) {
memCmpFn = memcmp;
} else {
memCmpFn = (memCmpFn_t) TclpUtfNcmp2;
}
+
}
if (checkEq && (s1len != s2len)) {
match = 1;
- } else {
+ } else {
/*
* The comparison function should compare up to the minimum
* byte length only.
@@ -5468,6 +5504,8 @@ TEBCresume(
}
}
+ matchdone:
+
/*
* Make sure only -1,0,1 is returned
* TODO: consider peephole opt.
@@ -6142,6 +6180,14 @@ TEBCresume(
value2Ptr = OBJ_AT_TOS;
valuePtr = OBJ_UNDER_TOS;
+ /*
+ Try to determine, without triggering generation of a string
+ representation, whether one value is not a number.
+ */
+ if (TclCheckEmptyString(valuePtr) > 0 || TclCheckEmptyString(value2Ptr) > 0) {
+ goto stringCompare;
+ }
+
if (GetNumberFromObj(NULL, valuePtr, &ptr1, &type1) != TCL_OK
|| GetNumberFromObj(NULL, value2Ptr, &ptr2, &type2) != TCL_OK) {
/*