Chromium Code Reviews| Index: src/builtins/builtins-string.cc |
| diff --git a/src/builtins/builtins-string.cc b/src/builtins/builtins-string.cc |
| index f7413fc30ff6681293e0c8157c4fdc7b5f03e0c8..791c52060d1f74d810cf24042e957d1e715e5f9e 100644 |
| --- a/src/builtins/builtins-string.cc |
| +++ b/src/builtins/builtins-string.cc |
| @@ -607,5 +607,63 @@ void Builtins::Generate_StringPrototypeValueOf(CodeStubAssembler* assembler) { |
| assembler->Return(result); |
| } |
| +BUILTIN(StringPrototypeIterator) { |
| + HandleScope scope(isolate); |
| + TO_THIS_STRING(object, "String.prototype[Symbol.iterator]"); |
| + |
| + Handle<String> string; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, string, |
| + Object::ToString(isolate, object)); |
| + |
| + return *isolate->factory()->NewJSStringIterator(string); |
| +} |
| + |
| +BUILTIN(StringIteratorPrototypeNext) { |
| + HandleScope scope(isolate); |
| + |
| + if (!args.receiver()->IsJSStringIterator()) { |
| + Handle<String> reason = isolate->factory()->NewStringFromAsciiChecked( |
| + "String Iterator.prototype.next"); |
| + THROW_NEW_ERROR_RETURN_FAILURE( |
| + isolate, |
| + NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, reason)); |
| + } |
| + Handle<JSStringIterator> iterator = |
| + Handle<JSStringIterator>::cast(args.receiver()); |
| + Handle<String> string(iterator->string()); |
| + |
| + if (*string != isolate->heap()->empty_string()) { |
|
Benedikt Meurer
2016/09/19 04:05:18
You don't need this check, as the empty string wil
caitp
2016/09/19 16:03:04
Done.
|
| + int position = iterator->index(); |
| + int length = string->length(); |
| + |
| + do { |
| + if (position >= length) break; |
| + |
| + uint16_t lead = string->Get(position); |
| + if (lead >= 0xD800 && lead <= 0xDBFF && position + 1 < length) { |
| + uint16_t trail = string->Get(position + 1); |
| + if (V8_LIKELY(trail >= 0xDC00 && trail <= 0xDFFF)) { |
| + // Return combined code units |
| + iterator->set_index(position + 2); |
| + Handle<String> value = isolate->factory()->NewProperSubString( |
|
Benedikt Meurer
2016/09/19 04:05:18
I'd prefer to not use NewProperSubString here, as
caitp
2016/09/19 16:03:05
Done --- Should the new factory method try to look
Benedikt Meurer
2016/09/20 04:57:53
Nope, that doesn't make sense. Especially since th
caitp
2016/09/20 13:28:14
Acknowledged.
|
| + string, position, position + 2); |
| + return *isolate->factory()->NewJSIteratorResult(value, false); |
| + } |
| + } |
| + |
| + // Return single code unit |
| + iterator->set_index(position + 1); |
| + Handle<String> value = isolate->factory()->NewProperSubString( |
| + string, position, position + 1); |
|
Benedikt Meurer
2016/09/19 04:05:18
Please use LookupSingleCharacterStringFromCode dir
caitp
2016/09/19 16:03:04
Done.
|
| + return *isolate->factory()->NewJSIteratorResult(value, false); |
| + } while (false); |
| + |
| + iterator->set_string(isolate->heap()->empty_string()); |
| + } |
| + |
| + return *isolate->factory()->NewJSIteratorResult( |
| + isolate->factory()->undefined_value(), true); |
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |