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

Side by Side Diff: src/objects.cc

Issue 2350963004: [builtins] Move StringIndexOf to a C++ builtin. (Closed)
Patch Set: Address Franzi's comments Created 4 years, 3 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
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-strings.cc » ('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 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) {
Benedikt Meurer 2016/09/23 03:51:33 I'd like to keep this version of String::IndexOf a
11600 DCHECK(0 <= start_index); 11600 if (receiver->IsNull(isolate) || receiver->IsUndefined(isolate)) {
11601 DCHECK(start_index <= sub->length()); 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));
11602 11609
11603 int pattern_length = pat->length(); 11610 Handle<String> search_string;
11604 if (pattern_length == 0) return start_index; 11611 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string,
11612 Object::ToString(isolate, search));
11605 11613
11606 int subject_length = sub->length(); 11614 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position,
11607 if (start_index + pattern_length > subject_length) return -1; 11615 Object::ToInteger(isolate, position));
11608 11616
11609 sub = String::Flatten(sub); 11617 double position_number = std::max(position->Number(), 0.0);
11610 pat = String::Flatten(pat); 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);
11611 11621
11622 uint32_t search_length = search_string->length();
11623 if (search_length == 0) return Smi::FromInt(start_index);
11624
11625 uint32_t receiver_length = receiver_string->length();
11626 if (start_index + search_length > receiver_length) return Smi::FromInt(-1);
11627
11628 receiver_string = String::Flatten(receiver_string);
11629 search_string = String::Flatten(search_string);
11630
11631 int first_index = -1;
11612 DisallowHeapAllocation no_gc; // ensure vectors stay valid 11632 DisallowHeapAllocation no_gc; // ensure vectors stay valid
11613 // Extract flattened substrings of cons strings before getting encoding. 11633 // Extract flattened substrings of cons strings before getting encoding.
11614 String::FlatContent seq_sub = sub->GetFlatContent(); 11634 String::FlatContent receiver_content = receiver_string->GetFlatContent();
11615 String::FlatContent seq_pat = pat->GetFlatContent(); 11635 String::FlatContent search_content = search_string->GetFlatContent();
11616 11636
11617 // dispatch on type of strings 11637 // dispatch on type of strings
11618 if (seq_pat.IsOneByte()) { 11638 if (search_content.IsOneByte()) {
11619 Vector<const uint8_t> pat_vector = seq_pat.ToOneByteVector(); 11639 Vector<const uint8_t> pat_vector = search_content.ToOneByteVector();
11620 if (seq_sub.IsOneByte()) { 11640 if (receiver_content.IsOneByte()) {
11621 return SearchString(isolate, seq_sub.ToOneByteVector(), pat_vector, 11641 return Smi::FromInt(SearchString(isolate,
11622 start_index); 11642 receiver_content.ToOneByteVector(),
11643 pat_vector, start_index));
11623 } 11644 }
11624 return SearchString(isolate, seq_sub.ToUC16Vector(), pat_vector, 11645 return Smi::FromInt(
11625 start_index); 11646 first_index = SearchString(isolate, receiver_content.ToUC16Vector(),
11647 pat_vector, start_index));
11626 } 11648 }
11627 Vector<const uc16> pat_vector = seq_pat.ToUC16Vector(); 11649 Vector<const uc16> pat_vector = search_content.ToUC16Vector();
11628 if (seq_sub.IsOneByte()) { 11650 if (receiver_content.IsOneByte()) {
11629 return SearchString(isolate, seq_sub.ToOneByteVector(), pat_vector, 11651 return Smi::FromInt(SearchString(
11630 start_index); 11652 isolate, receiver_content.ToOneByteVector(), pat_vector, start_index));
11631 } 11653 }
11632 return SearchString(isolate, seq_sub.ToUC16Vector(), pat_vector, start_index); 11654 return Smi::FromInt(SearchString(isolate, receiver_content.ToUC16Vector(),
11655 pat_vector, start_index));
11633 } 11656 }
11634 11657
11635 namespace { // for String.Prototype.lastIndexOf 11658 namespace { // for String.Prototype.lastIndexOf
11636 11659
11637 template <typename schar, typename pchar> 11660 template <typename schar, typename pchar>
11638 int StringMatchBackwards(Vector<const schar> subject, 11661 int StringMatchBackwards(Vector<const schar> subject,
11639 Vector<const pchar> pattern, int idx) { 11662 Vector<const pchar> pattern, int idx) {
11640 int pattern_length = pattern.length(); 11663 int pattern_length = pattern.length();
11641 DCHECK(pattern_length >= 1); 11664 DCHECK(pattern_length >= 1);
11642 DCHECK(idx + pattern_length <= subject.length()); 11665 DCHECK(idx + pattern_length <= subject.length());
(...skipping 7956 matching lines...) Expand 10 before | Expand all | Expand 10 after
19599 19622
19600 Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) { 19623 Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) {
19601 Isolate* isolate = module->GetIsolate(); 19624 Isolate* isolate = module->GetIsolate();
19602 Handle<ObjectHashTable> exports(module->exports(), isolate); 19625 Handle<ObjectHashTable> exports(module->exports(), isolate);
19603 Handle<Cell> cell(Cell::cast(exports->Lookup(name))); 19626 Handle<Cell> cell(Cell::cast(exports->Lookup(name)));
19604 return handle(cell->value(), isolate); 19627 return handle(cell->value(), isolate);
19605 } 19628 }
19606 19629
19607 } // namespace internal 19630 } // namespace internal
19608 } // namespace v8 19631 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-strings.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698