Created
February 6, 2017 12:16
-
-
Save samcv/3632be9e3f90944fbb14353080740959 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/core/interp.c b/src/core/interp.c | |
index efc1f853..752cde43 100644 | |
--- a/src/core/interp.c | |
+++ b/src/core/interp.c | |
@@ -1464,7 +1464,9 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex | |
goto NEXT; | |
OP(unicmp_s): | |
GET_REG(cur_op, 0).i64 = MVM_unicode_string_compare(tc, | |
- GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); | |
+ GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, | |
+ GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, | |
+ GET_REG(cur_op, 10).i64); | |
cur_op += 12; | |
goto NEXT; | |
OP(eqat_s): | |
diff --git a/src/strings/unicode_ops.c b/src/strings/unicode_ops.c | |
index 6d80b7b9..b4416c1b 100644 | |
--- a/src/strings/unicode_ops.c | |
+++ b/src/strings/unicode_ops.c | |
@@ -24,7 +24,7 @@ MVMint32 MVM_unicode_collation_tertiary (MVMThreadContext *tc, MVMint32 codepoin | |
* then use the decomposed codepoint's weights. */ | |
MVMint64 MVM_unicode_string_compare | |
(MVMThreadContext *tc, MVMString *a, MVMString *b, | |
- MVMint32 collation_mode, MVMint32 lang_mode, MVMint32 country_mode) { | |
+ MVMint64 collation_mode, MVMint64 lang_mode, MVMint64 country_mode) { | |
MVMStringIndex alen, blen; | |
/* Iteration variables */ | |
MVMGraphemeIter a_gi, b_gi; | |
@@ -48,7 +48,16 @@ MVMint64 MVM_unicode_string_compare | |
/* Initialize a grapheme iterator */ | |
MVM_string_gi_init(tc, &a_gi, a); | |
MVM_string_gi_init(tc, &b_gi, b); | |
- | |
+ fprintf(stderr, "collation_mode[%i] lang_mode[%i] country_mode[%i]\n", collation_mode, lang_mode, country_mode); | |
+ if ( collation_mode & 1) { | |
+ fprintf(stderr, "primary\n"); | |
+ } | |
+ if (collation_mode & 2) { | |
+ fprintf(stderr, "secondary\n"); | |
+ } | |
+ if (collation_mode & 4) { | |
+ fprintf(stderr, "tertiary\n"); | |
+ } | |
/* Otherwise, need to iterate by grapheme */ | |
while (MVM_string_gi_has_more(tc, s_has_more_gi)) { | |
ai = MVM_string_gi_get_grapheme(tc, &a_gi); | |
@@ -70,15 +79,21 @@ MVMint64 MVM_unicode_string_compare | |
/* result_a is the base character of the grapheme. */ | |
result_a = synth_a->base; | |
- ai_coll_val += MVM_unicode_collation_primary(tc, result_a); | |
- ai_coll_val += MVM_unicode_collation_secondary(tc, result_a); | |
- ai_coll_val += MVM_unicode_collation_tertiary(tc, result_a); | |
- while (a_ci.synth_codes) { | |
- /* Take the current combiner as the result_a. */ | |
- result_a = a_ci.synth_codes[a_ci.visited_synth_codes]; | |
+ if (collation_mode & 1) | |
ai_coll_val += MVM_unicode_collation_primary(tc, result_a); | |
+ if (collation_mode & 2) | |
ai_coll_val += MVM_unicode_collation_secondary(tc, result_a); | |
+ if (collation_mode & 4) | |
ai_coll_val += MVM_unicode_collation_tertiary(tc, result_a); | |
+ while (a_ci.synth_codes) { | |
+ /* Take the current combiner as the result_a. */ | |
+ result_a = a_ci.synth_codes[a_ci.visited_synth_codes]; | |
+ if (collation_mode & 1) | |
+ ai_coll_val += MVM_unicode_collation_primary(tc, result_a); | |
+ if (collation_mode & 2) | |
+ ai_coll_val += MVM_unicode_collation_secondary(tc, result_a); | |
+ if (collation_mode & 4) | |
+ ai_coll_val += MVM_unicode_collation_tertiary(tc, result_a); | |
/* If we've seen all of the synthetics, clear up so we'll take another | |
* grapheme next time around. */ | |
a_ci.visited_synth_codes++; | |
@@ -87,9 +102,12 @@ MVMint64 MVM_unicode_string_compare | |
} | |
} | |
else { | |
- ai_coll_val += MVM_unicode_collation_primary(tc, ai); | |
- ai_coll_val += MVM_unicode_collation_secondary(tc, ai); | |
- ai_coll_val += MVM_unicode_collation_tertiary(tc, ai); | |
+ if (collation_mode & 1) | |
+ ai_coll_val += MVM_unicode_collation_primary(tc, ai); | |
+ if (collation_mode & 2) | |
+ ai_coll_val += MVM_unicode_collation_secondary(tc, ai); | |
+ if (collation_mode & 4) | |
+ ai_coll_val += MVM_unicode_collation_tertiary(tc, ai); | |
} | |
if (bi < 0) { | |
MVMCodepointIter b_ci; | |
@@ -105,15 +123,21 @@ MVMint64 MVM_unicode_string_compare | |
/* result_b is the base character of the grapheme. */ | |
result_b = synth_b->base; | |
- bi_coll_val += MVM_unicode_collation_primary(tc, result_b); | |
- bi_coll_val += MVM_unicode_collation_secondary(tc, result_b); | |
- bi_coll_val += MVM_unicode_collation_tertiary(tc, result_b); | |
- while (b_ci.synth_codes) { | |
- /* Take the current combiner as the result_b. */ | |
- result_b = b_ci.synth_codes[b_ci.visited_synth_codes]; | |
+ if (collation_mode & 1) | |
bi_coll_val += MVM_unicode_collation_primary(tc, result_b); | |
+ if (collation_mode & 2) | |
bi_coll_val += MVM_unicode_collation_secondary(tc, result_b); | |
+ if (collation_mode & 4) | |
bi_coll_val += MVM_unicode_collation_tertiary(tc, result_b); | |
+ while (b_ci.synth_codes) { | |
+ /* Take the current combiner as the result_b. */ | |
+ result_b = b_ci.synth_codes[b_ci.visited_synth_codes]; | |
+ if (collation_mode & 1) | |
+ bi_coll_val += MVM_unicode_collation_primary(tc, result_b); | |
+ if (collation_mode & 2) | |
+ bi_coll_val += MVM_unicode_collation_secondary(tc, result_b); | |
+ if (collation_mode & 4) | |
+ bi_coll_val += MVM_unicode_collation_tertiary(tc, result_b); | |
/* If we've seen all of the synthetics, clear up so we'll take another | |
* grapheme next time around. */ | |
b_ci.visited_synth_codes++; | |
@@ -122,9 +146,12 @@ MVMint64 MVM_unicode_string_compare | |
} | |
} | |
else { | |
- bi_coll_val += MVM_unicode_collation_primary(tc, bi); | |
- bi_coll_val += MVM_unicode_collation_secondary(tc, bi); | |
- bi_coll_val += MVM_unicode_collation_tertiary(tc, bi); | |
+ if (collation_mode & 1) | |
+ bi_coll_val += MVM_unicode_collation_primary(tc, bi); | |
+ if (collation_mode & 2) | |
+ bi_coll_val += MVM_unicode_collation_secondary(tc, bi); | |
+ if (collation_mode & 4) | |
+ bi_coll_val += MVM_unicode_collation_tertiary(tc, bi); | |
} | |
if ( (ai_coll_val != 0 && bi_coll_val != 0) && (ai_coll_val != bi_coll_val) ) { | |
return ai_coll_val < bi_coll_val ? -3 : 3; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment