OLD | NEW |
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 11716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11727 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver_string, | 11727 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver_string, |
11728 Object::ToString(isolate, receiver)); | 11728 Object::ToString(isolate, receiver)); |
11729 | 11729 |
11730 Handle<String> search_string; | 11730 Handle<String> search_string; |
11731 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string, | 11731 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, search_string, |
11732 Object::ToString(isolate, search)); | 11732 Object::ToString(isolate, search)); |
11733 | 11733 |
11734 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, | 11734 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, |
11735 Object::ToInteger(isolate, position)); | 11735 Object::ToInteger(isolate, position)); |
11736 | 11736 |
11737 double index = std::max(position->Number(), 0.0); | 11737 uint32_t index = receiver_string->ToValidIndex(*position); |
11738 index = std::min(index, static_cast<double>(receiver_string->length())); | 11738 return Smi::FromInt( |
11739 | 11739 String::IndexOf(isolate, receiver_string, search_string, index)); |
11740 return Smi::FromInt(String::IndexOf(isolate, receiver_string, search_string, | |
11741 static_cast<uint32_t>(index))); | |
11742 } | 11740 } |
11743 | 11741 |
11744 namespace { | 11742 namespace { |
11745 | 11743 |
11746 template <typename T> | 11744 template <typename T> |
11747 int SearchString(Isolate* isolate, String::FlatContent receiver_content, | 11745 int SearchString(Isolate* isolate, String::FlatContent receiver_content, |
11748 Vector<T> pat_vector, int start_index) { | 11746 Vector<T> pat_vector, int start_index) { |
11749 if (receiver_content.IsOneByte()) { | 11747 if (receiver_content.IsOneByte()) { |
11750 return SearchString(isolate, receiver_content.ToOneByteVector(), pat_vector, | 11748 return SearchString(isolate, receiver_content.ToOneByteVector(), pat_vector, |
11751 start_index); | 11749 start_index); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11937 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, | 11935 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, |
11938 Object::ToNumber(position)); | 11936 Object::ToNumber(position)); |
11939 | 11937 |
11940 uint32_t start_index; | 11938 uint32_t start_index; |
11941 | 11939 |
11942 if (position->IsNaN()) { | 11940 if (position->IsNaN()) { |
11943 start_index = receiver_string->length(); | 11941 start_index = receiver_string->length(); |
11944 } else { | 11942 } else { |
11945 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, | 11943 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, position, |
11946 Object::ToInteger(isolate, position)); | 11944 Object::ToInteger(isolate, position)); |
11947 | 11945 start_index = receiver_string->ToValidIndex(*position); |
11948 double position_number = std::max(position->Number(), 0.0); | |
11949 position_number = std::min(position_number, | |
11950 static_cast<double>(receiver_string->length())); | |
11951 start_index = static_cast<uint32_t>(position_number); | |
11952 } | 11946 } |
11953 | 11947 |
11954 uint32_t pattern_length = search_string->length(); | 11948 uint32_t pattern_length = search_string->length(); |
11955 uint32_t receiver_length = receiver_string->length(); | 11949 uint32_t receiver_length = receiver_string->length(); |
11956 | 11950 |
11957 if (start_index + pattern_length > receiver_length) { | 11951 if (start_index + pattern_length > receiver_length) { |
11958 start_index = receiver_length - pattern_length; | 11952 start_index = receiver_length - pattern_length; |
11959 } | 11953 } |
11960 | 11954 |
11961 if (pattern_length == 0) { | 11955 if (pattern_length == 0) { |
(...skipping 8449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20411 // depend on this. | 20405 // depend on this. |
20412 return DICTIONARY_ELEMENTS; | 20406 return DICTIONARY_ELEMENTS; |
20413 } | 20407 } |
20414 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20408 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
20415 return kind; | 20409 return kind; |
20416 } | 20410 } |
20417 } | 20411 } |
20418 | 20412 |
20419 } // namespace internal | 20413 } // namespace internal |
20420 } // namespace v8 | 20414 } // namespace v8 |
OLD | NEW |