| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index dbf6e0e9c11d1288ca81e48af32ab9270dba3d20..c2112526d865e85822c85faca6dbc1a3d9a053ca 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -126,7 +126,7 @@ char* Bootstrapper::AllocateAutoDeletedArray(int bytes) {
|
| void Bootstrapper::TearDown() {
|
| if (delete_these_non_arrays_on_tear_down_ != NULL) {
|
| int len = delete_these_non_arrays_on_tear_down_->length();
|
| - DCHECK(len < 27); // Don't use this mechanism for unbounded allocations.
|
| + DCHECK(len < 28); // Don't use this mechanism for unbounded allocations.
|
| for (int i = 0; i < len; i++) {
|
| delete delete_these_non_arrays_on_tear_down_->at(i);
|
| delete_these_non_arrays_on_tear_down_->at(i) = NULL;
|
| @@ -203,7 +203,6 @@ class Genesis BASE_EMBEDDED {
|
| // New context initialization. Used for creating a context from scratch.
|
| void InitializeGlobal(Handle<GlobalObject> global_object,
|
| Handle<JSFunction> empty_function);
|
| - void InitializeExperimentalGlobal();
|
| // Installs the contents of the native .js files on the global objects.
|
| // Used for creating a context from scratch.
|
| void InstallNativeFunctions();
|
| @@ -1352,74 +1351,6 @@ void Genesis::InstallTypedArray(
|
| }
|
|
|
|
|
| -void Genesis::InitializeExperimentalGlobal() {
|
| - // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no
|
| - // longer need to live behind flags, so functions get added to the snapshot.
|
| -
|
| - if (FLAG_harmony_generators) {
|
| - // Create generator meta-objects and install them on the builtins object.
|
| - Handle<JSObject> builtins(native_context()->builtins());
|
| - Handle<JSObject> generator_object_prototype =
|
| - factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| - Handle<JSFunction> generator_function_prototype = InstallFunction(
|
| - builtins, "GeneratorFunctionPrototype", JS_FUNCTION_TYPE,
|
| - JSFunction::kHeaderSize, generator_object_prototype,
|
| - Builtins::kIllegal);
|
| - InstallFunction(builtins, "GeneratorFunction",
|
| - JS_FUNCTION_TYPE, JSFunction::kSize,
|
| - generator_function_prototype, Builtins::kIllegal);
|
| -
|
| - // Create maps for generator functions and their prototypes. Store those
|
| - // maps in the native context.
|
| - Handle<Map> sloppy_function_map(native_context()->sloppy_function_map());
|
| - Handle<Map> generator_function_map = Map::Copy(sloppy_function_map);
|
| - generator_function_map->set_prototype(*generator_function_prototype);
|
| - native_context()->set_sloppy_generator_function_map(
|
| - *generator_function_map);
|
| -
|
| - // The "arguments" and "caller" instance properties aren't specified, so
|
| - // technically we could leave them out. They make even less sense for
|
| - // generators than for functions. Still, the same argument that it makes
|
| - // sense to keep them around but poisoned in strict mode applies to
|
| - // generators as well. With poisoned accessors, naive callers can still
|
| - // iterate over the properties without accessing them.
|
| - //
|
| - // We can't use PoisonArgumentsAndCaller because that mutates accessor pairs
|
| - // in place, and the initial state of the generator function map shares the
|
| - // accessor pair with sloppy functions. Also the error message should be
|
| - // different. Also unhappily, we can't use the API accessors to implement
|
| - // poisoning, because API accessors present themselves as data properties,
|
| - // not accessor properties, and so getOwnPropertyDescriptor raises an
|
| - // exception as it tries to get the values. Sadness.
|
| - Handle<AccessorPair> poison_pair(factory()->NewAccessorPair());
|
| - PropertyAttributes rw_attribs =
|
| - static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
|
| - Handle<JSFunction> poison_function = GetGeneratorPoisonFunction();
|
| - poison_pair->set_getter(*poison_function);
|
| - poison_pair->set_setter(*poison_function);
|
| - ReplaceAccessors(generator_function_map, factory()->arguments_string(),
|
| - rw_attribs, poison_pair);
|
| - ReplaceAccessors(generator_function_map, factory()->caller_string(),
|
| - rw_attribs, poison_pair);
|
| -
|
| - Handle<Map> strict_function_map(native_context()->strict_function_map());
|
| - Handle<Map> strict_generator_function_map = Map::Copy(strict_function_map);
|
| - // "arguments" and "caller" already poisoned.
|
| - strict_generator_function_map->set_prototype(*generator_function_prototype);
|
| - native_context()->set_strict_generator_function_map(
|
| - *strict_generator_function_map);
|
| -
|
| - Handle<JSFunction> object_function(native_context()->object_function());
|
| - Handle<Map> generator_object_prototype_map = Map::Create(
|
| - object_function, 0);
|
| - generator_object_prototype_map->set_prototype(
|
| - *generator_object_prototype);
|
| - native_context()->set_generator_object_prototype_map(
|
| - *generator_object_prototype_map);
|
| - }
|
| -}
|
| -
|
| -
|
| bool Genesis::CompileBuiltin(Isolate* isolate, int index) {
|
| Vector<const char> name = Natives::GetScriptName(index);
|
| Handle<String> source_code =
|
| @@ -1923,6 +1854,67 @@ bool Genesis::InstallNatives() {
|
| map_iterator_function->initial_map());
|
| }
|
|
|
| + {
|
| + // Create generator meta-objects and install them on the builtins object.
|
| + Handle<JSObject> builtins(native_context()->builtins());
|
| + Handle<JSObject> generator_object_prototype =
|
| + factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| + Handle<JSFunction> generator_function_prototype =
|
| + InstallFunction(builtins, "GeneratorFunctionPrototype",
|
| + JS_FUNCTION_TYPE, JSFunction::kHeaderSize,
|
| + generator_object_prototype, Builtins::kIllegal);
|
| + InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
|
| + JSFunction::kSize, generator_function_prototype,
|
| + Builtins::kIllegal);
|
| +
|
| + // Create maps for generator functions and their prototypes. Store those
|
| + // maps in the native context.
|
| + Handle<Map> generator_function_map =
|
| + Map::Copy(sloppy_function_map_writable_prototype_);
|
| + generator_function_map->set_prototype(*generator_function_prototype);
|
| + native_context()->set_sloppy_generator_function_map(
|
| + *generator_function_map);
|
| +
|
| + // The "arguments" and "caller" instance properties aren't specified, so
|
| + // technically we could leave them out. They make even less sense for
|
| + // generators than for functions. Still, the same argument that it makes
|
| + // sense to keep them around but poisoned in strict mode applies to
|
| + // generators as well. With poisoned accessors, naive callers can still
|
| + // iterate over the properties without accessing them.
|
| + //
|
| + // We can't use PoisonArgumentsAndCaller because that mutates accessor pairs
|
| + // in place, and the initial state of the generator function map shares the
|
| + // accessor pair with sloppy functions. Also the error message should be
|
| + // different. Also unhappily, we can't use the API accessors to implement
|
| + // poisoning, because API accessors present themselves as data properties,
|
| + // not accessor properties, and so getOwnPropertyDescriptor raises an
|
| + // exception as it tries to get the values. Sadness.
|
| + Handle<AccessorPair> poison_pair(factory()->NewAccessorPair());
|
| + PropertyAttributes rw_attribs =
|
| + static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
|
| + Handle<JSFunction> poison_function = GetGeneratorPoisonFunction();
|
| + poison_pair->set_getter(*poison_function);
|
| + poison_pair->set_setter(*poison_function);
|
| + ReplaceAccessors(generator_function_map, factory()->arguments_string(),
|
| + rw_attribs, poison_pair);
|
| + ReplaceAccessors(generator_function_map, factory()->caller_string(),
|
| + rw_attribs, poison_pair);
|
| +
|
| + Handle<Map> strict_function_map(native_context()->strict_function_map());
|
| + Handle<Map> strict_generator_function_map = Map::Copy(strict_function_map);
|
| + // "arguments" and "caller" already poisoned.
|
| + strict_generator_function_map->set_prototype(*generator_function_prototype);
|
| + native_context()->set_strict_generator_function_map(
|
| + *strict_generator_function_map);
|
| +
|
| + Handle<JSFunction> object_function(native_context()->object_function());
|
| + Handle<Map> generator_object_prototype_map =
|
| + Map::Create(object_function, 0);
|
| + generator_object_prototype_map->set_prototype(*generator_object_prototype);
|
| + native_context()->set_generator_object_prototype_map(
|
| + *generator_object_prototype_map);
|
| + }
|
| +
|
| if (FLAG_disable_native_files) {
|
| PrintF("Warning: Running without installed natives!\n");
|
| return true;
|
| @@ -2096,7 +2088,6 @@ bool Genesis::InstallExperimentalNatives() {
|
| i < ExperimentalNatives::GetBuiltinsCount();
|
| i++) {
|
| INSTALL_EXPERIMENTAL_NATIVE(i, proxies, "proxy.js")
|
| - INSTALL_EXPERIMENTAL_NATIVE(i, generators, "generator.js")
|
| INSTALL_EXPERIMENTAL_NATIVE(i, strings, "harmony-string.js")
|
| INSTALL_EXPERIMENTAL_NATIVE(i, arrays, "harmony-array.js")
|
| INSTALL_EXPERIMENTAL_NATIVE(i, classes, "harmony-classes.js")
|
| @@ -2657,8 +2648,7 @@ Genesis::Genesis(Isolate* isolate,
|
| isolate->counters()->contexts_created_from_scratch()->Increment();
|
| }
|
|
|
| - // Initialize experimental globals and install experimental natives.
|
| - InitializeExperimentalGlobal();
|
| + // Install experimental natives.
|
| if (!InstallExperimentalNatives()) return;
|
|
|
| // We can't (de-)serialize typed arrays currently, but we are lucky: The state
|
|
|