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

Unified Diff: src/builtins/builtins-string.cc

Issue 2348493003: [builtins] move String.prototype[@@iterator] to C++ builtin (Closed)
Patch Set: V5 (try to make gcmole happy) 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « src/builtins/builtins-iterator.cc ('k') | src/compiler/types.cc » ('j') | src/factory.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698