| OLD | NEW |
| 1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 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-string-gen.h" | 5 #include "src/builtins/builtins-string-gen.h" |
| 6 | 6 |
| 7 #include "src/builtins/builtins-regexp-gen.h" | 7 #include "src/builtins/builtins-regexp-gen.h" |
| 8 #include "src/builtins/builtins-utils-gen.h" | 8 #include "src/builtins/builtins-utils-gen.h" |
| 9 #include "src/builtins/builtins.h" | 9 #include "src/builtins/builtins.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 | 1137 |
| 1138 RequireObjectCoercible(context, receiver, "String.prototype.replace"); | 1138 RequireObjectCoercible(context, receiver, "String.prototype.replace"); |
| 1139 | 1139 |
| 1140 // Redirect to replacer method if {search[@@replace]} is not undefined. | 1140 // Redirect to replacer method if {search[@@replace]} is not undefined. |
| 1141 | 1141 |
| 1142 MaybeCallFunctionAtSymbol( | 1142 MaybeCallFunctionAtSymbol( |
| 1143 context, search, isolate()->factory()->replace_symbol(), | 1143 context, search, isolate()->factory()->replace_symbol(), |
| 1144 [=]() { | 1144 [=]() { |
| 1145 Node* const subject_string = ToString_Inline(context, receiver); | 1145 Node* const subject_string = ToString_Inline(context, receiver); |
| 1146 | 1146 |
| 1147 Callable replace_callable = CodeFactory::RegExpReplace(isolate()); | 1147 return CallBuiltin(Builtins::kRegExpReplace, context, search, |
| 1148 return CallStub(replace_callable, context, search, subject_string, | 1148 subject_string, replace); |
| 1149 replace); | |
| 1150 }, | 1149 }, |
| 1151 [=](Node* fn) { | 1150 [=](Node* fn) { |
| 1152 Callable call_callable = CodeFactory::Call(isolate()); | 1151 Callable call_callable = CodeFactory::Call(isolate()); |
| 1153 return CallJS(call_callable, context, fn, search, receiver, replace); | 1152 return CallJS(call_callable, context, fn, search, receiver, replace); |
| 1154 }); | 1153 }); |
| 1155 | 1154 |
| 1156 // Convert {receiver} and {search} to strings. | 1155 // Convert {receiver} and {search} to strings. |
| 1157 | 1156 |
| 1158 Callable indexof_callable = CodeFactory::StringIndexOf(isolate()); | 1157 Callable indexof_callable = CodeFactory::StringIndexOf(isolate()); |
| 1159 | 1158 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1298 args.GetOptionalArgumentValue(kStart, UndefinedConstant()); | 1297 args.GetOptionalArgumentValue(kStart, UndefinedConstant()); |
| 1299 Node* const end = args.GetOptionalArgumentValue(kEnd, UndefinedConstant()); | 1298 Node* const end = args.GetOptionalArgumentValue(kEnd, UndefinedConstant()); |
| 1300 Node* const context = Parameter(BuiltinDescriptor::kContext); | 1299 Node* const context = Parameter(BuiltinDescriptor::kContext); |
| 1301 | 1300 |
| 1302 Node* const smi_zero = SmiConstant(0); | 1301 Node* const smi_zero = SmiConstant(0); |
| 1303 | 1302 |
| 1304 // 1. Let O be ? RequireObjectCoercible(this value). | 1303 // 1. Let O be ? RequireObjectCoercible(this value). |
| 1305 RequireObjectCoercible(context, receiver, "String.prototype.slice"); | 1304 RequireObjectCoercible(context, receiver, "String.prototype.slice"); |
| 1306 | 1305 |
| 1307 // 2. Let S be ? ToString(O). | 1306 // 2. Let S be ? ToString(O). |
| 1308 Callable tostring_callable = CodeFactory::ToString(isolate()); | 1307 Node* const subject_string = |
| 1309 Node* const subject_string = CallStub(tostring_callable, context, receiver); | 1308 CallBuiltin(Builtins::kToString, context, receiver); |
| 1310 | 1309 |
| 1311 // 3. Let len be the number of elements in S. | 1310 // 3. Let len be the number of elements in S. |
| 1312 Node* const length = LoadStringLength(subject_string); | 1311 Node* const length = LoadStringLength(subject_string); |
| 1313 | 1312 |
| 1314 // Conversions and bounds-checks for {start}. | 1313 // Conversions and bounds-checks for {start}. |
| 1315 ConvertAndBoundsCheckStartArgument(context, &var_start, start, length); | 1314 ConvertAndBoundsCheckStartArgument(context, &var_start, start, length); |
| 1316 | 1315 |
| 1317 // 5. If end is undefined, let intEnd be len; | 1316 // 5. If end is undefined, let intEnd be len; |
| 1318 var_end.Bind(length); | 1317 var_end.Bind(length); |
| 1319 GotoIf(WordEqual(end, UndefinedConstant()), &out); | 1318 GotoIf(WordEqual(end, UndefinedConstant()), &out); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1378 | 1377 |
| 1379 RequireObjectCoercible(context, receiver, "String.prototype.split"); | 1378 RequireObjectCoercible(context, receiver, "String.prototype.split"); |
| 1380 | 1379 |
| 1381 // Redirect to splitter method if {separator[@@split]} is not undefined. | 1380 // Redirect to splitter method if {separator[@@split]} is not undefined. |
| 1382 | 1381 |
| 1383 MaybeCallFunctionAtSymbol( | 1382 MaybeCallFunctionAtSymbol( |
| 1384 context, separator, isolate()->factory()->split_symbol(), | 1383 context, separator, isolate()->factory()->split_symbol(), |
| 1385 [=]() { | 1384 [=]() { |
| 1386 Node* const subject_string = ToString_Inline(context, receiver); | 1385 Node* const subject_string = ToString_Inline(context, receiver); |
| 1387 | 1386 |
| 1388 Callable split_callable = CodeFactory::RegExpSplit(isolate()); | 1387 return CallBuiltin(Builtins::kRegExpSplit, context, separator, |
| 1389 return CallStub(split_callable, context, separator, subject_string, | 1388 subject_string, limit); |
| 1390 limit); | |
| 1391 }, | 1389 }, |
| 1392 [=](Node* fn) { | 1390 [=](Node* fn) { |
| 1393 Callable call_callable = CodeFactory::Call(isolate()); | 1391 Callable call_callable = CodeFactory::Call(isolate()); |
| 1394 return CallJS(call_callable, context, fn, separator, receiver, limit); | 1392 return CallJS(call_callable, context, fn, separator, receiver, limit); |
| 1395 }); | 1393 }); |
| 1396 | 1394 |
| 1397 // String and integer conversions. | 1395 // String and integer conversions. |
| 1398 // TODO(jgruber): The old implementation used Uint32Max instead of SmiMax - | 1396 // TODO(jgruber): The old implementation used Uint32Max instead of SmiMax - |
| 1399 // but AFAIK there should not be a difference since arrays are capped at Smi | 1397 // but AFAIK there should not be a difference since arrays are capped at Smi |
| 1400 // lengths. | 1398 // lengths. |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1821 CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, context, | 1819 CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, context, |
| 1822 HeapConstant(factory()->NewStringFromAsciiChecked( | 1820 HeapConstant(factory()->NewStringFromAsciiChecked( |
| 1823 "String Iterator.prototype.next", TENURED)), | 1821 "String Iterator.prototype.next", TENURED)), |
| 1824 iterator); | 1822 iterator); |
| 1825 Unreachable(); | 1823 Unreachable(); |
| 1826 } | 1824 } |
| 1827 } | 1825 } |
| 1828 | 1826 |
| 1829 } // namespace internal | 1827 } // namespace internal |
| 1830 } // namespace v8 | 1828 } // namespace v8 |
| OLD | NEW |