diff options
| author | pooryorick <com.digitalsmarties@pooryorick.com> | 2018-05-05 17:04:08 (GMT) |
|---|---|---|
| committer | pooryorick <com.digitalsmarties@pooryorick.com> | 2018-05-05 17:04:08 (GMT) |
| commit | e383cd7b266a40eadc6cb39fc9b38b8ebae91834 (patch) | |
| tree | b296d02849a41ef7aa58e8749d93e0042cf23142 /generic/tclExecute.c | |
| parent | 096a011c439f5f857ba14ba0827fcead0572233e (diff) | |
| parent | 3a3fd2954f11d13424d941346c5ede39c3bf175f (diff) | |
| download | tcl-e383cd7b266a40eadc6cb39fc9b38b8ebae91834.zip tcl-e383cd7b266a40eadc6cb39fc9b38b8ebae91834.tar.gz tcl-e383cd7b266a40eadc6cb39fc9b38b8ebae91834.tar.bz2 | |
Avoid generating string representation when comparing the empty string.
Diffstat (limited to 'generic/tclExecute.c')
| -rw-r--r-- | generic/tclExecute.c | 56 |
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) { /* |
