| Index: src/runtime/runtime-strings.cc
|
| diff --git a/src/runtime/runtime-strings.cc b/src/runtime/runtime-strings.cc
|
| index 0e6bf8308c3bd47ae19acdac9faeead3e4920330..b8ccbc8d93a98b5d1935c35d73165b07082b00b4 100644
|
| --- a/src/runtime/runtime-strings.cc
|
| +++ b/src/runtime/runtime-strings.cc
|
| @@ -419,70 +419,22 @@ RUNTIME_FUNCTION(Runtime_CharFromCode) {
|
|
|
| RUNTIME_FUNCTION(Runtime_StringCompare) {
|
| HandleScope handle_scope(isolate);
|
| - DCHECK(args.length() == 2);
|
| -
|
| + DCHECK_EQ(2, args.length());
|
| CONVERT_ARG_HANDLE_CHECKED(String, x, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(String, y, 1);
|
| -
|
| isolate->counters()->string_compare_runtime()->Increment();
|
| -
|
| - // A few fast case tests before we flatten.
|
| - if (x.is_identical_to(y)) return Smi::FromInt(EQUAL);
|
| - if (y->length() == 0) {
|
| - if (x->length() == 0) return Smi::FromInt(EQUAL);
|
| - return Smi::FromInt(GREATER);
|
| - } else if (x->length() == 0) {
|
| - return Smi::FromInt(LESS);
|
| - }
|
| -
|
| - int d = x->Get(0) - y->Get(0);
|
| - if (d < 0)
|
| - return Smi::FromInt(LESS);
|
| - else if (d > 0)
|
| - return Smi::FromInt(GREATER);
|
| -
|
| - // Slow case.
|
| - x = String::Flatten(x);
|
| - y = String::Flatten(y);
|
| -
|
| - DisallowHeapAllocation no_gc;
|
| - Object* equal_prefix_result = Smi::FromInt(EQUAL);
|
| - int prefix_length = x->length();
|
| - if (y->length() < prefix_length) {
|
| - prefix_length = y->length();
|
| - equal_prefix_result = Smi::FromInt(GREATER);
|
| - } else if (y->length() > prefix_length) {
|
| - equal_prefix_result = Smi::FromInt(LESS);
|
| - }
|
| - int r;
|
| - String::FlatContent x_content = x->GetFlatContent();
|
| - String::FlatContent y_content = y->GetFlatContent();
|
| - if (x_content.IsOneByte()) {
|
| - Vector<const uint8_t> x_chars = x_content.ToOneByteVector();
|
| - if (y_content.IsOneByte()) {
|
| - Vector<const uint8_t> y_chars = y_content.ToOneByteVector();
|
| - r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
|
| - } else {
|
| - Vector<const uc16> y_chars = y_content.ToUC16Vector();
|
| - r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
|
| - }
|
| - } else {
|
| - Vector<const uc16> x_chars = x_content.ToUC16Vector();
|
| - if (y_content.IsOneByte()) {
|
| - Vector<const uint8_t> y_chars = y_content.ToOneByteVector();
|
| - r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
|
| - } else {
|
| - Vector<const uc16> y_chars = y_content.ToUC16Vector();
|
| - r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
|
| - }
|
| - }
|
| - Object* result;
|
| - if (r == 0) {
|
| - result = equal_prefix_result;
|
| - } else {
|
| - result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
|
| + switch (String::Compare(x, y)) {
|
| + case ComparisonResult::kLessThan:
|
| + return Smi::FromInt(LESS);
|
| + case ComparisonResult::kEqual:
|
| + return Smi::FromInt(EQUAL);
|
| + case ComparisonResult::kGreaterThan:
|
| + return Smi::FromInt(GREATER);
|
| + case ComparisonResult::kUndefined:
|
| + break;
|
| }
|
| - return result;
|
| + UNREACHABLE();
|
| + return Smi::FromInt(0);
|
| }
|
|
|
|
|
|
|