Chromium Code Reviews| Index: src/builtins/builtins-string.cc |
| diff --git a/src/builtins/builtins-string.cc b/src/builtins/builtins-string.cc |
| index 4ccccbc85970cb89ab3977d9ac9c7791d918cdc6..4338676275f8828a4f0fe4a7b54cc1f7b9b0af8a 100644 |
| --- a/src/builtins/builtins-string.cc |
| +++ b/src/builtins/builtins-string.cc |
| @@ -758,8 +758,28 @@ BUILTIN(StringPrototypeEndsWith) { |
| int start = end - search_string->length(); |
| if (start < 0) return isolate->heap()->false_value(); |
| - FlatStringReader str_reader(isolate, String::Flatten(str)); |
| - FlatStringReader search_reader(isolate, String::Flatten(search_string)); |
| + str = String::Flatten(str); |
| + search_string = String::Flatten(search_string); |
| + |
| + DisallowHeapAllocation no_gc; // ensure vectors stay valid |
| + String::FlatContent str_content = str->GetFlatContent(); |
| + String::FlatContent search_content = search_string->GetFlatContent(); |
| + |
| + if (str_content.IsOneByte() && search_content.IsOneByte()) { |
| + Vector<const uint8_t> str_vector = str_content.ToOneByteVector(); |
| + Vector<const uint8_t> search_vector = search_content.ToOneByteVector(); |
| + const char* str_ptr = |
| + reinterpret_cast<const char*>(str_vector.start() + start); |
| + const char* search_ptr = |
| + reinterpret_cast<const char*>(search_vector.start()); |
| + |
| + if (strncmp(str_ptr, search_ptr, search_string->length()) == 0) { |
| + return *isolate->factory()->true_value(); |
|
Yang
2016/11/16 12:13:24
isolate->heap()->true_value()
also, why don't we
petermarshall
2016/11/16 12:19:15
Oops, yep.
|
| + } |
| + } |
| + |
| + FlatStringReader str_reader(isolate, str); |
| + FlatStringReader search_reader(isolate, search_string); |
| for (int i = 0; i < search_string->length(); i++) { |
| if (str_reader.Get(start + i) != search_reader.Get(i)) { |