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

Side by Side Diff: src/bootstrapper.cc

Issue 2348493003: [builtins] move String.prototype[@@iterator] to C++ builtin (Closed)
Patch Set: 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 unified diff | Download patch
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/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/base/ieee754.h" 9 #include "src/base/ieee754.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 SimpleInstallFunction(prototype, "toString", 1399 SimpleInstallFunction(prototype, "toString",
1400 Builtins::kStringPrototypeToString, 0, true); 1400 Builtins::kStringPrototypeToString, 0, true);
1401 SimpleInstallFunction(prototype, "trim", Builtins::kStringPrototypeTrim, 0, 1401 SimpleInstallFunction(prototype, "trim", Builtins::kStringPrototypeTrim, 0,
1402 false); 1402 false);
1403 SimpleInstallFunction(prototype, "trimLeft", 1403 SimpleInstallFunction(prototype, "trimLeft",
1404 Builtins::kStringPrototypeTrimLeft, 0, false); 1404 Builtins::kStringPrototypeTrimLeft, 0, false);
1405 SimpleInstallFunction(prototype, "trimRight", 1405 SimpleInstallFunction(prototype, "trimRight",
1406 Builtins::kStringPrototypeTrimRight, 0, false); 1406 Builtins::kStringPrototypeTrimRight, 0, false);
1407 SimpleInstallFunction(prototype, "valueOf", 1407 SimpleInstallFunction(prototype, "valueOf",
1408 Builtins::kStringPrototypeValueOf, 0, true); 1408 Builtins::kStringPrototypeValueOf, 0, true);
1409
1410 Handle<JSFunction> iterator = CreateFunction(
1411 isolate, factory->NewStringFromAsciiChecked("[Symbol.iterator]"),
1412 JS_OBJECT_TYPE, JSObject::kHeaderSize, MaybeHandle<JSObject>(),
1413 Builtins::kStringCreateIterator, true);
1414 iterator->shared()->set_internal_formal_parameter_count(0);
1415 iterator->shared()->set_length(0);
1416 iterator->shared()->set_language_mode(STRICT);
Benedikt Meurer 2016/09/15 17:34:33 Why do you need to set the language mode on a C++
caitp 2016/09/15 19:02:39 I guess the other builtins just use set_native(tru
Benedikt Meurer 2016/09/16 03:16:37 Yes, we really need a version that can deal with n
1417 iterator->map()->set_is_constructor(false);
Benedikt Meurer 2016/09/15 17:34:33 This mutates the map inplace, which is not what yo
1418
1419 JSObject::AddProperty(prototype, factory->iterator_symbol(), iterator,
1420 static_cast<PropertyAttributes>(DONT_ENUM));
1409 } 1421 }
1410 1422
1411 { 1423 {
1412 // --- S y m b o l --- 1424 // --- S y m b o l ---
1413 Handle<JSObject> prototype = 1425 Handle<JSObject> prototype =
1414 factory->NewJSObject(isolate->object_function(), TENURED); 1426 factory->NewJSObject(isolate->object_function(), TENURED);
1415 Handle<JSFunction> symbol_fun = 1427 Handle<JSFunction> symbol_fun =
1416 InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, 1428 InstallFunction(global, "Symbol", JS_VALUE_TYPE, JSValue::kSize,
1417 prototype, Builtins::kSymbolConstructor); 1429 prototype, Builtins::kSymbolConstructor);
1418 symbol_fun->shared()->SetConstructStub( 1430 symbol_fun->shared()->SetConstructStub(
(...skipping 1956 matching lines...) Expand 10 before | Expand all | Expand 10 after
3375 } 3387 }
3376 { 3388 {
3377 AccessorConstantDescriptor d(factory()->iterator_symbol(), 3389 AccessorConstantDescriptor d(factory()->iterator_symbol(),
3378 arguments_iterator, attribs); 3390 arguments_iterator, attribs);
3379 Handle<Map> map(native_context()->strict_arguments_map()); 3391 Handle<Map> map(native_context()->strict_arguments_map());
3380 Map::EnsureDescriptorSlack(map, 1); 3392 Map::EnsureDescriptorSlack(map, 1);
3381 map->AppendDescriptor(&d); 3393 map->AppendDescriptor(&d);
3382 } 3394 }
3383 } 3395 }
3384 3396
3397 { // StringIterator
3398 PrototypeIterator iter(native_context()->generator_object_prototype_map());
Benedikt Meurer 2016/09/15 17:34:33 Can we make this more robust? I.e. have the iterat
caitp 2016/09/15 19:02:39 Ok. I assume it wasn't done originally to avoid g
3399 iter.Advance(); // Advance to the prototype of generator_object_prototype.
3400 Handle<JSObject> iterator_prototype =
3401 Handle<JSObject>(iter.GetCurrent<JSObject>());
3402
3403 Handle<JSObject> string_iterator_prototype =
3404 factory()->NewJSObject(isolate()->object_function(), TENURED);
3405 JSObject::ForceSetPrototype(string_iterator_prototype, iterator_prototype);
Benedikt Meurer 2016/09/15 17:34:33 Not sure about this ForceSetPrototype. We seem to
caitp 2016/09/15 19:02:39 was copy/pasted from one of the Map or Set iterato
3406
3407 JSObject::AddProperty(
3408 string_iterator_prototype, factory()->to_string_tag_symbol(),
3409 factory()->NewStringFromAsciiChecked("String Iterator"),
3410 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3411
3412 InstallFunction(string_iterator_prototype, "next", JS_OBJECT_TYPE,
3413 JSObject::kHeaderSize, MaybeHandle<JSObject>(),
3414 Builtins::kStringIteratorNext);
3415
3416 Handle<JSFunction> string_iterator_function = CreateFunction(
3417 isolate(), factory()->NewStringFromAsciiChecked("StringIterator"),
3418 JS_STRING_ITERATOR_TYPE, JSStringIterator::kSize,
3419 string_iterator_prototype, Builtins::kIllegal);
3420 native_context()->set_string_iterator_map(
3421 string_iterator_function->initial_map());
3422 }
3423
3385 return true; 3424 return true;
3386 } 3425 }
3387 3426
3388 3427
3389 bool Genesis::InstallExperimentalNatives() { 3428 bool Genesis::InstallExperimentalNatives() {
3390 static const char* harmony_explicit_tailcalls_natives[] = {nullptr}; 3429 static const char* harmony_explicit_tailcalls_natives[] = {nullptr};
3391 static const char* harmony_tailcalls_natives[] = {nullptr}; 3430 static const char* harmony_tailcalls_natives[] = {nullptr};
3392 static const char* harmony_sharedarraybuffer_natives[] = { 3431 static const char* harmony_sharedarraybuffer_natives[] = {
3393 "native harmony-atomics.js", NULL}; 3432 "native harmony-atomics.js", NULL};
3394 static const char* harmony_simd_natives[] = {"native harmony-simd.js", 3433 static const char* harmony_simd_natives[] = {"native harmony-simd.js",
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after
4144 } 4183 }
4145 4184
4146 4185
4147 // Called when the top-level V8 mutex is destroyed. 4186 // Called when the top-level V8 mutex is destroyed.
4148 void Bootstrapper::FreeThreadResources() { 4187 void Bootstrapper::FreeThreadResources() {
4149 DCHECK(!IsActive()); 4188 DCHECK(!IsActive());
4150 } 4189 }
4151 4190
4152 } // namespace internal 4191 } // namespace internal
4153 } // namespace v8 4192 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/ast-types.cc ('k') | src/builtins/builtins.h » ('j') | src/builtins/builtins.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698