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

Side by Side Diff: src/runtime/runtime-strings.cc

Issue 2613723002: [runtime] Use DCHECK_EQ instead of DCHECK for number of args. (Closed)
Patch Set: Rebase. Created 3 years, 11 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/runtime/runtime-simd.cc ('k') | src/runtime/runtime-symbol.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/runtime/runtime-utils.h" 5 #include "src/runtime/runtime-utils.h"
6 6
7 #include "src/arguments.h" 7 #include "src/arguments.h"
8 #include "src/regexp/jsregexp-inl.h" 8 #include "src/regexp/jsregexp-inl.h"
9 #include "src/string-builder.h" 9 #include "src/string-builder.h"
10 #include "src/string-case.h" 10 #include "src/string-case.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 String); 54 String);
55 Handle<String> second = 55 Handle<String> second =
56 isolate->factory()->NewSubString(subject, index + 1, subject->length()); 56 isolate->factory()->NewSubString(subject, index + 1, subject->length());
57 return isolate->factory()->NewConsString(cons1, second); 57 return isolate->factory()->NewConsString(cons1, second);
58 } 58 }
59 } 59 }
60 60
61 61
62 RUNTIME_FUNCTION(Runtime_StringReplaceOneCharWithString) { 62 RUNTIME_FUNCTION(Runtime_StringReplaceOneCharWithString) {
63 HandleScope scope(isolate); 63 HandleScope scope(isolate);
64 DCHECK(args.length() == 3); 64 DCHECK_EQ(3, args.length());
65 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 65 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
66 CONVERT_ARG_HANDLE_CHECKED(String, search, 1); 66 CONVERT_ARG_HANDLE_CHECKED(String, search, 1);
67 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2); 67 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2);
68 68
69 // If the cons string tree is too deep, we simply abort the recursion and 69 // If the cons string tree is too deep, we simply abort the recursion and
70 // retry with a flattened subject string. 70 // retry with a flattened subject string.
71 const int kRecursionLimit = 0x1000; 71 const int kRecursionLimit = 0x1000;
72 bool found = false; 72 bool found = false;
73 Handle<String> result; 73 Handle<String> result;
74 if (StringReplaceOneCharWithString(isolate, subject, search, replace, &found, 74 if (StringReplaceOneCharWithString(isolate, subject, search, replace, &found,
75 kRecursionLimit).ToHandle(&result)) { 75 kRecursionLimit).ToHandle(&result)) {
76 return *result; 76 return *result;
77 } 77 }
78 if (isolate->has_pending_exception()) return isolate->heap()->exception(); 78 if (isolate->has_pending_exception()) return isolate->heap()->exception();
79 79
80 subject = String::Flatten(subject); 80 subject = String::Flatten(subject);
81 if (StringReplaceOneCharWithString(isolate, subject, search, replace, &found, 81 if (StringReplaceOneCharWithString(isolate, subject, search, replace, &found,
82 kRecursionLimit).ToHandle(&result)) { 82 kRecursionLimit).ToHandle(&result)) {
83 return *result; 83 return *result;
84 } 84 }
85 if (isolate->has_pending_exception()) return isolate->heap()->exception(); 85 if (isolate->has_pending_exception()) return isolate->heap()->exception();
86 // In case of empty handle and no pending exception we have stack overflow. 86 // In case of empty handle and no pending exception we have stack overflow.
87 return isolate->StackOverflow(); 87 return isolate->StackOverflow();
88 } 88 }
89 89
90 // ES6 #sec-string.prototype.indexof 90 // ES6 #sec-string.prototype.indexof
91 // String.prototype.indexOf(searchString [, position]) 91 // String.prototype.indexOf(searchString [, position])
92 RUNTIME_FUNCTION(Runtime_StringIndexOf) { 92 RUNTIME_FUNCTION(Runtime_StringIndexOf) {
93 HandleScope scope(isolate); 93 HandleScope scope(isolate);
94 DCHECK(args.length() == 3); 94 DCHECK_EQ(3, args.length());
95 return String::IndexOf(isolate, args.at(0), args.at(1), args.at(2)); 95 return String::IndexOf(isolate, args.at(0), args.at(1), args.at(2));
96 } 96 }
97 97
98 // ES6 #sec-string.prototype.indexof 98 // ES6 #sec-string.prototype.indexof
99 // String.prototype.indexOf(searchString, position) 99 // String.prototype.indexOf(searchString, position)
100 // Fast version that assumes that does not perform conversions of the incoming 100 // Fast version that assumes that does not perform conversions of the incoming
101 // arguments. 101 // arguments.
102 RUNTIME_FUNCTION(Runtime_StringIndexOfUnchecked) { 102 RUNTIME_FUNCTION(Runtime_StringIndexOfUnchecked) {
103 HandleScope scope(isolate); 103 HandleScope scope(isolate);
104 DCHECK(args.length() == 3); 104 DCHECK_EQ(3, args.length());
105 Handle<String> receiver_string = args.at<String>(0); 105 Handle<String> receiver_string = args.at<String>(0);
106 Handle<String> search_string = args.at<String>(1); 106 Handle<String> search_string = args.at<String>(1);
107 int index = std::min(std::max(args.smi_at(2), 0), receiver_string->length()); 107 int index = std::min(std::max(args.smi_at(2), 0), receiver_string->length());
108 108
109 return Smi::FromInt(String::IndexOf(isolate, receiver_string, search_string, 109 return Smi::FromInt(String::IndexOf(isolate, receiver_string, search_string,
110 static_cast<uint32_t>(index))); 110 static_cast<uint32_t>(index)));
111 } 111 }
112 112
113 RUNTIME_FUNCTION(Runtime_StringLastIndexOf) { 113 RUNTIME_FUNCTION(Runtime_StringLastIndexOf) {
114 HandleScope handle_scope(isolate); 114 HandleScope handle_scope(isolate);
115 return String::LastIndexOf(isolate, args.at(0), args.at(1), 115 return String::LastIndexOf(isolate, args.at(0), args.at(1),
116 isolate->factory()->undefined_value()); 116 isolate->factory()->undefined_value());
117 } 117 }
118 118
119 RUNTIME_FUNCTION(Runtime_SubString) { 119 RUNTIME_FUNCTION(Runtime_SubString) {
120 HandleScope scope(isolate); 120 HandleScope scope(isolate);
121 DCHECK(args.length() == 3); 121 DCHECK_EQ(3, args.length());
122 122
123 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 123 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
124 int start, end; 124 int start, end;
125 // We have a fast integer-only case here to avoid a conversion to double in 125 // We have a fast integer-only case here to avoid a conversion to double in
126 // the common case where from and to are Smis. 126 // the common case where from and to are Smis.
127 if (args[1]->IsSmi() && args[2]->IsSmi()) { 127 if (args[1]->IsSmi() && args[2]->IsSmi()) {
128 CONVERT_SMI_ARG_CHECKED(from_number, 1); 128 CONVERT_SMI_ARG_CHECKED(from_number, 1);
129 CONVERT_SMI_ARG_CHECKED(to_number, 2); 129 CONVERT_SMI_ARG_CHECKED(to_number, 2);
130 start = from_number; 130 start = from_number;
131 end = to_number; 131 end = to_number;
(...skipping 11 matching lines...) Expand all
143 return isolate->ThrowIllegalOperation(); 143 return isolate->ThrowIllegalOperation();
144 } 144 }
145 isolate->counters()->sub_string_runtime()->Increment(); 145 isolate->counters()->sub_string_runtime()->Increment();
146 146
147 return *isolate->factory()->NewSubString(string, start, end); 147 return *isolate->factory()->NewSubString(string, start, end);
148 } 148 }
149 149
150 150
151 RUNTIME_FUNCTION(Runtime_StringAdd) { 151 RUNTIME_FUNCTION(Runtime_StringAdd) {
152 HandleScope scope(isolate); 152 HandleScope scope(isolate);
153 DCHECK(args.length() == 2); 153 DCHECK_EQ(2, args.length());
154 CONVERT_ARG_HANDLE_CHECKED(Object, obj1, 0); 154 CONVERT_ARG_HANDLE_CHECKED(Object, obj1, 0);
155 CONVERT_ARG_HANDLE_CHECKED(Object, obj2, 1); 155 CONVERT_ARG_HANDLE_CHECKED(Object, obj2, 1);
156 isolate->counters()->string_add_runtime()->Increment(); 156 isolate->counters()->string_add_runtime()->Increment();
157 MaybeHandle<String> maybe_str1(Object::ToString(isolate, obj1)); 157 MaybeHandle<String> maybe_str1(Object::ToString(isolate, obj1));
158 MaybeHandle<String> maybe_str2(Object::ToString(isolate, obj2)); 158 MaybeHandle<String> maybe_str2(Object::ToString(isolate, obj2));
159 Handle<String> str1; 159 Handle<String> str1;
160 Handle<String> str2; 160 Handle<String> str2;
161 maybe_str1.ToHandle(&str1); 161 maybe_str1.ToHandle(&str1);
162 maybe_str2.ToHandle(&str2); 162 maybe_str2.ToHandle(&str2);
163 RETURN_RESULT_OR_FAILURE(isolate, 163 RETURN_RESULT_OR_FAILURE(isolate,
164 isolate->factory()->NewConsString(str1, str2)); 164 isolate->factory()->NewConsString(str1, str2));
165 } 165 }
166 166
167 167
168 RUNTIME_FUNCTION(Runtime_InternalizeString) { 168 RUNTIME_FUNCTION(Runtime_InternalizeString) {
169 HandleScope handles(isolate); 169 HandleScope handles(isolate);
170 DCHECK(args.length() == 1); 170 DCHECK_EQ(1, args.length());
171 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 171 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
172 return *isolate->factory()->InternalizeString(string); 172 return *isolate->factory()->InternalizeString(string);
173 } 173 }
174 174
175 175
176 RUNTIME_FUNCTION(Runtime_StringCharCodeAtRT) { 176 RUNTIME_FUNCTION(Runtime_StringCharCodeAtRT) {
177 HandleScope handle_scope(isolate); 177 HandleScope handle_scope(isolate);
178 DCHECK(args.length() == 2); 178 DCHECK_EQ(2, args.length());
179 179
180 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 180 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
181 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]); 181 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]);
182 182
183 // Flatten the string. If someone wants to get a char at an index 183 // Flatten the string. If someone wants to get a char at an index
184 // in a cons string, it is likely that more indices will be 184 // in a cons string, it is likely that more indices will be
185 // accessed. 185 // accessed.
186 subject = String::Flatten(subject); 186 subject = String::Flatten(subject);
187 187
188 if (i >= static_cast<uint32_t>(subject->length())) { 188 if (i >= static_cast<uint32_t>(subject->length())) {
(...skipping 20 matching lines...) Expand all
209 case ComparisonResult::kUndefined: 209 case ComparisonResult::kUndefined:
210 break; 210 break;
211 } 211 }
212 UNREACHABLE(); 212 UNREACHABLE();
213 return Smi::kZero; 213 return Smi::kZero;
214 } 214 }
215 215
216 216
217 RUNTIME_FUNCTION(Runtime_StringBuilderConcat) { 217 RUNTIME_FUNCTION(Runtime_StringBuilderConcat) {
218 HandleScope scope(isolate); 218 HandleScope scope(isolate);
219 DCHECK(args.length() == 3); 219 DCHECK_EQ(3, args.length());
220 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 220 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
221 int32_t array_length; 221 int32_t array_length;
222 if (!args[1]->ToInt32(&array_length)) { 222 if (!args[1]->ToInt32(&array_length)) {
223 THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewInvalidStringLengthError()); 223 THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewInvalidStringLengthError());
224 } 224 }
225 CONVERT_ARG_HANDLE_CHECKED(String, special, 2); 225 CONVERT_ARG_HANDLE_CHECKED(String, special, 2);
226 226
227 size_t actual_array_length = 0; 227 size_t actual_array_length = 0;
228 CHECK(TryNumberToSize(array->length(), &actual_array_length)); 228 CHECK(TryNumberToSize(array->length(), &actual_array_length));
229 CHECK(array_length >= 0); 229 CHECK(array_length >= 0);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 StringBuilderConcatHelper(*special, answer->GetChars(), 279 StringBuilderConcatHelper(*special, answer->GetChars(),
280 FixedArray::cast(array->elements()), 280 FixedArray::cast(array->elements()),
281 array_length); 281 array_length);
282 return *answer; 282 return *answer;
283 } 283 }
284 } 284 }
285 285
286 286
287 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) { 287 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) {
288 HandleScope scope(isolate); 288 HandleScope scope(isolate);
289 DCHECK(args.length() == 3); 289 DCHECK_EQ(3, args.length());
290 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 290 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
291 int32_t array_length; 291 int32_t array_length;
292 if (!args[1]->ToInt32(&array_length)) { 292 if (!args[1]->ToInt32(&array_length)) {
293 THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewInvalidStringLengthError()); 293 THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewInvalidStringLengthError());
294 } 294 }
295 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); 295 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2);
296 CHECK(array->HasFastObjectElements()); 296 CHECK(array->HasFastObjectElements());
297 CHECK(array_length >= 0); 297 CHECK(array_length >= 0);
298 298
299 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements())); 299 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements()));
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 DCHECK(array_length <= 0x7fffffff); // Is int32_t. 420 DCHECK(array_length <= 0x7fffffff); // Is int32_t.
421 int repeat = last_array_index - previous_separator_position; 421 int repeat = last_array_index - previous_separator_position;
422 WriteRepeatToFlat<Char>(separator, buffer, cursor, repeat, separator_length); 422 WriteRepeatToFlat<Char>(separator, buffer, cursor, repeat, separator_length);
423 cursor += repeat * separator_length; 423 cursor += repeat * separator_length;
424 DCHECK(cursor <= buffer.length()); 424 DCHECK(cursor <= buffer.length());
425 } 425 }
426 426
427 427
428 RUNTIME_FUNCTION(Runtime_SparseJoinWithSeparator) { 428 RUNTIME_FUNCTION(Runtime_SparseJoinWithSeparator) {
429 HandleScope scope(isolate); 429 HandleScope scope(isolate);
430 DCHECK(args.length() == 3); 430 DCHECK_EQ(3, args.length());
431 CONVERT_ARG_HANDLE_CHECKED(JSArray, elements_array, 0); 431 CONVERT_ARG_HANDLE_CHECKED(JSArray, elements_array, 0);
432 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); 432 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]);
433 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); 433 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2);
434 // elements_array is fast-mode JSarray of alternating positions 434 // elements_array is fast-mode JSarray of alternating positions
435 // (increasing order) and strings. 435 // (increasing order) and strings.
436 CHECK(elements_array->HasFastSmiOrObjectElements()); 436 CHECK(elements_array->HasFastSmiOrObjectElements());
437 // array_length is length of original array (used to add separators); 437 // array_length is length of original array (used to add separators);
438 // separator is string to put between elements. Assumed to be non-empty. 438 // separator is string to put between elements. Assumed to be non-empty.
439 CHECK(array_length > 0); 439 CHECK(array_length > 0);
440 440
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 538 }
539 #endif 539 #endif
540 return i; 540 return i;
541 } 541 }
542 542
543 543
544 // Converts a String to JSArray. 544 // Converts a String to JSArray.
545 // For example, "foo" => ["f", "o", "o"]. 545 // For example, "foo" => ["f", "o", "o"].
546 RUNTIME_FUNCTION(Runtime_StringToArray) { 546 RUNTIME_FUNCTION(Runtime_StringToArray) {
547 HandleScope scope(isolate); 547 HandleScope scope(isolate);
548 DCHECK(args.length() == 2); 548 DCHECK_EQ(2, args.length());
549 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); 549 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
550 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 550 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
551 551
552 s = String::Flatten(s); 552 s = String::Flatten(s);
553 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); 553 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit));
554 554
555 Handle<FixedArray> elements; 555 Handle<FixedArray> elements;
556 int position = 0; 556 int position = 0;
557 if (s->IsFlat() && s->IsOneByteRepresentation()) { 557 if (s->IsFlat() && s->IsOneByteRepresentation()) {
558 // Try using cached chars where possible. 558 // Try using cached chars where possible.
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 RUNTIME_FUNCTION(Runtime_StringNotEqual) { 848 RUNTIME_FUNCTION(Runtime_StringNotEqual) {
849 HandleScope handle_scope(isolate); 849 HandleScope handle_scope(isolate);
850 DCHECK_EQ(2, args.length()); 850 DCHECK_EQ(2, args.length());
851 CONVERT_ARG_HANDLE_CHECKED(String, x, 0); 851 CONVERT_ARG_HANDLE_CHECKED(String, x, 0);
852 CONVERT_ARG_HANDLE_CHECKED(String, y, 1); 852 CONVERT_ARG_HANDLE_CHECKED(String, y, 1);
853 return isolate->heap()->ToBoolean(!String::Equals(x, y)); 853 return isolate->heap()->ToBoolean(!String::Equals(x, y));
854 } 854 }
855 855
856 RUNTIME_FUNCTION(Runtime_FlattenString) { 856 RUNTIME_FUNCTION(Runtime_FlattenString) {
857 HandleScope scope(isolate); 857 HandleScope scope(isolate);
858 DCHECK(args.length() == 1); 858 DCHECK_EQ(1, args.length());
859 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); 859 CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
860 return *String::Flatten(str); 860 return *String::Flatten(str);
861 } 861 }
862 862
863 863
864 RUNTIME_FUNCTION(Runtime_StringCharFromCode) { 864 RUNTIME_FUNCTION(Runtime_StringCharFromCode) {
865 HandleScope handlescope(isolate); 865 HandleScope handlescope(isolate);
866 DCHECK_EQ(1, args.length()); 866 DCHECK_EQ(1, args.length());
867 if (args[0]->IsNumber()) { 867 if (args[0]->IsNumber()) {
868 CONVERT_NUMBER_CHECKED(uint32_t, code, Uint32, args[0]); 868 CONVERT_NUMBER_CHECKED(uint32_t, code, Uint32, args[0]);
869 code &= 0xffff; 869 code &= 0xffff;
870 return *isolate->factory()->LookupSingleCharacterStringFromCode(code); 870 return *isolate->factory()->LookupSingleCharacterStringFromCode(code);
871 } 871 }
872 return isolate->heap()->empty_string(); 872 return isolate->heap()->empty_string();
873 } 873 }
874 874
875 RUNTIME_FUNCTION(Runtime_ExternalStringGetChar) { 875 RUNTIME_FUNCTION(Runtime_ExternalStringGetChar) {
876 SealHandleScope shs(isolate); 876 SealHandleScope shs(isolate);
877 DCHECK_EQ(2, args.length()); 877 DCHECK_EQ(2, args.length());
878 CONVERT_ARG_CHECKED(ExternalString, string, 0); 878 CONVERT_ARG_CHECKED(ExternalString, string, 0);
879 CONVERT_INT32_ARG_CHECKED(index, 1); 879 CONVERT_INT32_ARG_CHECKED(index, 1);
880 return Smi::FromInt(string->Get(index)); 880 return Smi::FromInt(string->Get(index));
881 } 881 }
882 882
883 RUNTIME_FUNCTION(Runtime_StringCharCodeAt) { 883 RUNTIME_FUNCTION(Runtime_StringCharCodeAt) {
884 SealHandleScope shs(isolate); 884 SealHandleScope shs(isolate);
885 DCHECK(args.length() == 2); 885 DCHECK_EQ(2, args.length());
886 if (!args[0]->IsString()) return isolate->heap()->undefined_value(); 886 if (!args[0]->IsString()) return isolate->heap()->undefined_value();
887 if (!args[1]->IsNumber()) return isolate->heap()->undefined_value(); 887 if (!args[1]->IsNumber()) return isolate->heap()->undefined_value();
888 if (std::isinf(args.number_at(1))) return isolate->heap()->nan_value(); 888 if (std::isinf(args.number_at(1))) return isolate->heap()->nan_value();
889 return __RT_impl_Runtime_StringCharCodeAtRT(args, isolate); 889 return __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
890 } 890 }
891 891
892 } // namespace internal 892 } // namespace internal
893 } // namespace v8 893 } // namespace v8
OLDNEW
« no previous file with comments | « src/runtime/runtime-simd.cc ('k') | src/runtime/runtime-symbol.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698