summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index a2a465a..ad7f630 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5437,22 +5437,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);
+ if (TclCheckEmptyString(valuePtr) > 0) {
+ s1 = "";
+ s1len = 0;
+ switch (TclCheckEmptyString(value2Ptr)) {
+ case -1:
+ s2 = TclGetStringFromObj(value2Ptr, &s2len);
+ break;
+ case 0:
+ /* Synthesize a value for comparison */
+ s2 = "1";
+ s2len = 1;
+ break;
+ case 1:
+ s2 = "";
+ s2len = 0;
+ }
+ } else if (TclCheckEmptyString(value2Ptr) > 0) {
+ s2 = "";
+ s2len = 0;
+ switch (TclCheckEmptyString(valuePtr)) {
+ case -1:
+ s1 = TclGetStringFromObj(valuePtr, &s1len);
+ break;
+ case 0:
+ /* Synthesize a value for comparison */
+ s1 = "1";
+ s1len = 1;
+ break;
+ case 1:
+ s1 = "";
+ s1len = 0;
+ }
+ } 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.
@@ -6163,6 +6199,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) > 1 || TclCheckEmptyString(value2Ptr) > 1) {
+ goto stringCompare;
+ }
+
if (GetNumberFromObj(NULL, valuePtr, &ptr1, &type1) != TCL_OK) {
/*
* At least one non-numeric argument - compare as strings.