Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: src/builtins/builtins-string.cc

Issue 2577143002: [runtime] Add PositiveNumberToUint32 helper to avoid double to uint roundtrip (Closed)
Patch Set: avoid overflows Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/conversions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins/builtins-utils.h" 5 #include "src/builtins/builtins-utils.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/code-stub-assembler.h" 8 #include "src/code-stub-assembler.h"
9 #include "src/regexp/regexp-utils.h" 9 #include "src/regexp/regexp-utils.h"
10 10
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 Object::ToString(isolate, search)); 754 Object::ToString(isolate, search));
755 755
756 Handle<Object> position = args.atOrUndefined(isolate, 2); 756 Handle<Object> position = args.atOrUndefined(isolate, 2);
757 int end; 757 int end;
758 758
759 if (position->IsUndefined(isolate)) { 759 if (position->IsUndefined(isolate)) {
760 end = str->length(); 760 end = str->length();
761 } else { 761 } else {
762 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, 762 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position,
763 Object::ToInteger(isolate, position)); 763 Object::ToInteger(isolate, position));
764 double index = std::max(position->Number(), 0.0); 764 end = str->ToValidIndex(*position);
765 index = std::min(index, static_cast<double>(str->length()));
766 end = static_cast<uint32_t>(index);
767 } 765 }
768 766
769 int start = end - search_string->length(); 767 int start = end - search_string->length();
770 if (start < 0) return isolate->heap()->false_value(); 768 if (start < 0) return isolate->heap()->false_value();
771 769
772 str = String::Flatten(str); 770 str = String::Flatten(str);
773 search_string = String::Flatten(search_string); 771 search_string = String::Flatten(search_string);
774 772
775 DisallowHeapAllocation no_gc; // ensure vectors stay valid 773 DisallowHeapAllocation no_gc; // ensure vectors stay valid
776 String::FlatContent str_content = str->GetFlatContent(); 774 String::FlatContent str_content = str->GetFlatContent();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 "String.prototype.includes"))); 814 "String.prototype.includes")));
817 } 815 }
818 Handle<String> search_string; 816 Handle<String> search_string;
819 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string, 817 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string,
820 Object::ToString(isolate, search)); 818 Object::ToString(isolate, search));
821 Handle<Object> position; 819 Handle<Object> position;
822 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 820 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
823 isolate, position, 821 isolate, position,
824 Object::ToInteger(isolate, args.atOrUndefined(isolate, 2))); 822 Object::ToInteger(isolate, args.atOrUndefined(isolate, 2)));
825 823
826 double index = std::max(position->Number(), 0.0); 824 uint32_t index = str->ToValidIndex(*position);
827 index = std::min(index, static_cast<double>(str->length())); 825 int index_in_str = String::IndexOf(isolate, str, search_string, index);
828
829 int index_in_str = String::IndexOf(isolate, str, search_string,
830 static_cast<uint32_t>(index));
831 return *isolate->factory()->ToBoolean(index_in_str != -1); 826 return *isolate->factory()->ToBoolean(index_in_str != -1);
832 } 827 }
833 828
834 // ES6 section 21.1.3.8 String.prototype.indexOf ( searchString [ , position ] ) 829 // ES6 section 21.1.3.8 String.prototype.indexOf ( searchString [ , position ] )
835 BUILTIN(StringPrototypeIndexOf) { 830 BUILTIN(StringPrototypeIndexOf) {
836 HandleScope handle_scope(isolate); 831 HandleScope handle_scope(isolate);
837 832
838 return String::IndexOf(isolate, args.receiver(), 833 return String::IndexOf(isolate, args.receiver(),
839 args.atOrUndefined(isolate, 1), 834 args.atOrUndefined(isolate, 1),
840 args.atOrUndefined(isolate, 2)); 835 args.atOrUndefined(isolate, 2));
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 Object::ToString(isolate, search)); 1190 Object::ToString(isolate, search));
1196 1191
1197 Handle<Object> position = args.atOrUndefined(isolate, 2); 1192 Handle<Object> position = args.atOrUndefined(isolate, 2);
1198 int start; 1193 int start;
1199 1194
1200 if (position->IsUndefined(isolate)) { 1195 if (position->IsUndefined(isolate)) {
1201 start = 0; 1196 start = 0;
1202 } else { 1197 } else {
1203 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, 1198 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position,
1204 Object::ToInteger(isolate, position)); 1199 Object::ToInteger(isolate, position));
1205 double index = std::max(position->Number(), 0.0); 1200 start = str->ToValidIndex(*position);
1206 index = std::min(index, static_cast<double>(str->length()));
1207 start = static_cast<uint32_t>(index);
1208 } 1201 }
1209 1202
1210 if (start + search_string->length() > str->length()) { 1203 if (start + search_string->length() > str->length()) {
1211 return isolate->heap()->false_value(); 1204 return isolate->heap()->false_value();
1212 } 1205 }
1213 1206
1214 FlatStringReader str_reader(isolate, String::Flatten(str)); 1207 FlatStringReader str_reader(isolate, String::Flatten(str));
1215 FlatStringReader search_reader(isolate, String::Flatten(search_string)); 1208 FlatStringReader search_reader(isolate, String::Flatten(search_string));
1216 1209
1217 for (int i = 0; i < search_string->length(); i++) { 1210 for (int i = 0; i < search_string->length(); i++) {
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 Runtime::kThrowIncompatibleMethodReceiver, context, 1455 Runtime::kThrowIncompatibleMethodReceiver, context,
1463 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( 1456 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked(
1464 "String Iterator.prototype.next", TENURED)), 1457 "String Iterator.prototype.next", TENURED)),
1465 iterator); 1458 iterator);
1466 assembler.Return(result); // Never reached. 1459 assembler.Return(result); // Never reached.
1467 } 1460 }
1468 } 1461 }
1469 1462
1470 } // namespace internal 1463 } // namespace internal
1471 } // namespace v8 1464 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/conversions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698