summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2018-05-06 13:45:21 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2018-05-06 13:45:21 (GMT)
commit86c6a11cdb30d7f9e34ca6882a9882556d0aace2 (patch)
tree2d42195613e381259e5a0b0cefbd9c83b248921b /generic/tclExecute.c
parente383cd7b266a40eadc6cb39fc9b38b8ebae91834 (diff)
downloadtcl-86c6a11cdb30d7f9e34ca6882a9882556d0aace2.zip
tcl-86c6a11cdb30d7f9e34ca6882a9882556d0aace2.tar.gz
tcl-86c6a11cdb30d7f9e34ca6882a9882556d0aace2.tar.bz2
Preparation to deduplicate code between byte-compiled and legacy
implementations of [string compare].
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c120
1 files changed, 2 insertions, 118 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 728a847..a76e686 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5384,128 +5384,12 @@ TEBCresume(
value2Ptr = OBJ_AT_TOS;
valuePtr = OBJ_UNDER_TOS;
- if (valuePtr == value2Ptr) {
- match = 0;
- } else {
- /*
- * We only need to check (in)equality when we have equal length
- * strings. We can use memcmp in all (n)eq cases because we
- * don't need to worry about lexical LE/BE variance.
- */
-
- typedef int (*memCmpFn_t)(const void*, const void*, size_t);
- memCmpFn_t memCmpFn;
+ {
int checkEq = ((*pc == INST_EQ) || (*pc == INST_NEQ)
|| (*pc == INST_STR_EQ) || (*pc == INST_STR_NEQ));
-
- if (TclIsPureByteArray(valuePtr)
- && TclIsPureByteArray(value2Ptr)) {
- s1 = (char *) Tcl_GetByteArrayFromObj(valuePtr, &s1len);
- s2 = (char *) Tcl_GetByteArrayFromObj(value2Ptr, &s2len);
- memCmpFn = memcmp;
- } else if ((valuePtr->typePtr == &tclStringType)
- && (value2Ptr->typePtr == &tclStringType)) {
- /*
- * Do a unicode-specific comparison if both of the args are of
- * String type. If the char length == byte length, we can do a
- * memcmp. In benchmark testing this proved the most efficient
- * check between the unicode and string comparison operations.
- */
-
- s1len = Tcl_GetCharLength(valuePtr);
- s2len = Tcl_GetCharLength(value2Ptr);
- if ((s1len == valuePtr->length)
- && (valuePtr->bytes != NULL)
- && (s2len == value2Ptr->length)
- && (value2Ptr->bytes != NULL)) {
- s1 = valuePtr->bytes;
- s2 = value2Ptr->bytes;
- memCmpFn = memcmp;
- } else {
- s1 = (char *) Tcl_GetUnicode(valuePtr);
- s2 = (char *) Tcl_GetUnicode(value2Ptr);
- if (
-#ifdef WORDS_BIGENDIAN
- 1
-#else
- checkEq
-#endif
- ) {
- memCmpFn = memcmp;
- s1len *= sizeof(Tcl_UniChar);
- s2len *= sizeof(Tcl_UniChar);
- } else {
- memCmpFn = (memCmpFn_t) Tcl_UniCharNcmp;
- }
- }
- } else {
- /*
- * In order to handle the special Tcl \xC0\x80 null encoding
- * for utf-8, strcmp can't do a simple memcmp.
- */
-
- {
- 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 {
- /*
- * The comparison function should compare up to the minimum
- * byte length only.
- */
- match = memCmpFn(s1, s2,
- (size_t) ((s1len < s2len) ? s1len : s2len));
- if (match == 0) {
- match = s1len - s2len;
- }
- }
+ match = TclStringCmp(valuePtr, value2Ptr, checkEq);
}
- matchdone:
-
/*
* Make sure only -1,0,1 is returned
* TODO: consider peephole opt.