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

Side by Side Diff: src/objects.cc

Issue 2350963004: [builtins] Move StringIndexOf to a C++ builtin. (Closed)
Patch Set: Change IndexOf usage to use unchecked version Created 4 years, 2 months 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 11577 matching lines...) Expand 10 before | Expand all | Expand 10 after
11588 } 11588 }
11589 } 11589 }
11590 if (r < 0) { 11590 if (r < 0) {
11591 result = ComparisonResult::kLessThan; 11591 result = ComparisonResult::kLessThan;
11592 } else if (r > 0) { 11592 } else if (r > 0) {
11593 result = ComparisonResult::kGreaterThan; 11593 result = ComparisonResult::kGreaterThan;
11594 } 11594 }
11595 return result; 11595 return result;
11596 } 11596 }
11597 11597
11598 int String::IndexOf(Isolate* isolate, Handle<String> sub, Handle<String> pat, 11598 Object* String::IndexOf(Isolate* isolate, Handle<Object> receiver,
11599 int start_index) { 11599 Handle<Object> search, Handle<Object> position) {
11600 if (receiver->IsNull(isolate) || receiver->IsUndefined(isolate)) {
11601 THROW_NEW_ERROR_RETURN_FAILURE(
11602 isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined,
11603 isolate->factory()->NewStringFromAsciiChecked(
11604 "String.prototype.indexOf")));
11605 }
11606 Handle<String> receiver_string;
11607 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver_string,
11608 Object::ToString(isolate, receiver));
11609
11610 Handle<String> search_string;
11611 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string,
11612 Object::ToString(isolate, search));
11613
11614 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position,
11615 Object::ToInteger(isolate, position));
11616
11617 double position_number = std::max(position->Number(), 0.0);
Franzi 2016/09/23 11:37:00 Can we call the double index and inline start_inde
petermarshall 2016/10/06 22:43:11 Done
11618 position_number =
11619 std::min(position_number, static_cast<double>(receiver_string->length()));
11620 uint32_t start_index = static_cast<uint32_t>(position_number);
11621
11622 return Smi::FromInt(
11623 String::IndexOf(isolate, receiver_string, search_string, start_index));
11624 }
11625
11626 int String::IndexOf(Isolate* isolate, Handle<String> receiver,
11627 Handle<String> search, int start_index) {
11600 DCHECK(0 <= start_index); 11628 DCHECK(0 <= start_index);
11601 DCHECK(start_index <= sub->length()); 11629 DCHECK(start_index <= receiver->length());
11602 11630
11603 int pattern_length = pat->length(); 11631 uint32_t search_length = search->length();
11604 if (pattern_length == 0) return start_index; 11632 if (search_length == 0) return start_index;
11605 11633
11606 int subject_length = sub->length(); 11634 uint32_t receiver_length = receiver->length();
11607 if (start_index + pattern_length > subject_length) return -1; 11635 if (start_index + search_length > receiver_length) return -1;
11608 11636
11609 sub = String::Flatten(sub); 11637 receiver = String::Flatten(receiver);
11610 pat = String::Flatten(pat); 11638 search = String::Flatten(search);
11611 11639
11640 int first_index = -1;
11612 DisallowHeapAllocation no_gc; // ensure vectors stay valid 11641 DisallowHeapAllocation no_gc; // ensure vectors stay valid
11613 // Extract flattened substrings of cons strings before getting encoding. 11642 // Extract flattened substrings of cons strings before getting encoding.
11614 String::FlatContent seq_sub = sub->GetFlatContent(); 11643 String::FlatContent receiver_content = receiver->GetFlatContent();
11615 String::FlatContent seq_pat = pat->GetFlatContent(); 11644 String::FlatContent search_content = search->GetFlatContent();
11616 11645
11617 // dispatch on type of strings 11646 // dispatch on type of strings
11618 if (seq_pat.IsOneByte()) { 11647 if (search_content.IsOneByte()) {
11619 Vector<const uint8_t> pat_vector = seq_pat.ToOneByteVector(); 11648 Vector<const uint8_t> pat_vector = search_content.ToOneByteVector();
11620 if (seq_sub.IsOneByte()) { 11649 if (receiver_content.IsOneByte()) {
11621 return SearchString(isolate, seq_sub.ToOneByteVector(), pat_vector, 11650 return SearchString(isolate, receiver_content.ToOneByteVector(),
11622 start_index); 11651 pat_vector, start_index);
11623 } 11652 }
11624 return SearchString(isolate, seq_sub.ToUC16Vector(), pat_vector, 11653 return first_index = SearchString(isolate, receiver_content.ToUC16Vector(),
Franzi 2016/09/23 11:37:00 We can get rid of first_index.
11654 pat_vector, start_index);
11655 }
11656 Vector<const uc16> pat_vector = search_content.ToUC16Vector();
11657 if (receiver_content.IsOneByte()) {
11658 return SearchString(isolate, receiver_content.ToOneByteVector(), pat_vector,
11625 start_index); 11659 start_index);
11626 } 11660 }
11627 Vector<const uc16> pat_vector = seq_pat.ToUC16Vector(); 11661 return SearchString(isolate, receiver_content.ToUC16Vector(), pat_vector,
11628 if (seq_sub.IsOneByte()) { 11662 start_index);
11629 return SearchString(isolate, seq_sub.ToOneByteVector(), pat_vector,
11630 start_index);
11631 }
11632 return SearchString(isolate, seq_sub.ToUC16Vector(), pat_vector, start_index);
11633 } 11663 }
11634 11664
11635 namespace { // for String.Prototype.lastIndexOf 11665 namespace { // for String.Prototype.lastIndexOf
11636 11666
11637 template <typename schar, typename pchar> 11667 template <typename schar, typename pchar>
11638 int StringMatchBackwards(Vector<const schar> subject, 11668 int StringMatchBackwards(Vector<const schar> subject,
11639 Vector<const pchar> pattern, int idx) { 11669 Vector<const pchar> pattern, int idx) {
11640 int pattern_length = pattern.length(); 11670 int pattern_length = pattern.length();
11641 DCHECK(pattern_length >= 1); 11671 DCHECK(pattern_length >= 1);
11642 DCHECK(idx + pattern_length <= subject.length()); 11672 DCHECK(idx + pattern_length <= subject.length());
(...skipping 7956 matching lines...) Expand 10 before | Expand all | Expand 10 after
19599 19629
19600 Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) { 19630 Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) {
19601 Isolate* isolate = module->GetIsolate(); 19631 Isolate* isolate = module->GetIsolate();
19602 Handle<ObjectHashTable> exports(module->exports(), isolate); 19632 Handle<ObjectHashTable> exports(module->exports(), isolate);
19603 Handle<Cell> cell(Cell::cast(exports->Lookup(name))); 19633 Handle<Cell> cell(Cell::cast(exports->Lookup(name)));
19604 return handle(cell->value(), isolate); 19634 return handle(cell->value(), isolate);
19605 } 19635 }
19606 19636
19607 } // namespace internal 19637 } // namespace internal
19608 } // namespace v8 19638 } // namespace v8
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/runtime/runtime-strings.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698