| Index: src/bootstrapper.cc
|
| ===================================================================
|
| --- src/bootstrapper.cc (revision 9808)
|
| +++ src/bootstrapper.cc (working copy)
|
| @@ -38,6 +38,7 @@
|
| #include "macro-assembler.h"
|
| #include "natives.h"
|
| #include "objects-visiting.h"
|
| +#include "platform.h"
|
| #include "snapshot.h"
|
| #include "extensions/externalize-string-extension.h"
|
| #include "extensions/gc-extension.h"
|
| @@ -362,6 +363,7 @@
|
| if (is_ecma_native) {
|
| function->shared()->set_instance_class_name(*symbol);
|
| }
|
| + function->shared()->set_native(true);
|
| return function;
|
| }
|
|
|
| @@ -375,26 +377,28 @@
|
| PropertyAttributes attributes =
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
|
|
| + DescriptorArray::WhitenessWitness witness(*descriptors);
|
| +
|
| { // Add length.
|
| Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength);
|
| CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes);
|
| - descriptors->Set(0, &d);
|
| + descriptors->Set(0, &d, witness);
|
| }
|
| { // Add name.
|
| Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName);
|
| CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes);
|
| - descriptors->Set(1, &d);
|
| + descriptors->Set(1, &d, witness);
|
| }
|
| { // Add arguments.
|
| Handle<Foreign> foreign =
|
| factory()->NewForeign(&Accessors::FunctionArguments);
|
| CallbacksDescriptor d(*factory()->arguments_symbol(), *foreign, attributes);
|
| - descriptors->Set(2, &d);
|
| + descriptors->Set(2, &d, witness);
|
| }
|
| { // Add caller.
|
| Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionCaller);
|
| CallbacksDescriptor d(*factory()->caller_symbol(), *foreign, attributes);
|
| - descriptors->Set(3, &d);
|
| + descriptors->Set(3, &d, witness);
|
| }
|
| if (prototypeMode != DONT_ADD_PROTOTYPE) {
|
| // Add prototype.
|
| @@ -404,9 +408,9 @@
|
| Handle<Foreign> foreign =
|
| factory()->NewForeign(&Accessors::FunctionPrototype);
|
| CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes);
|
| - descriptors->Set(4, &d);
|
| + descriptors->Set(4, &d, witness);
|
| }
|
| - descriptors->Sort();
|
| + descriptors->Sort(witness);
|
| return descriptors;
|
| }
|
|
|
| @@ -522,41 +526,43 @@
|
| ? 4
|
| : 5);
|
| PropertyAttributes attributes = static_cast<PropertyAttributes>(
|
| - DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| + DONT_ENUM | DONT_DELETE);
|
|
|
| + DescriptorArray::WhitenessWitness witness(*descriptors);
|
| +
|
| { // length
|
| Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength);
|
| CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes);
|
| - descriptors->Set(0, &d);
|
| + descriptors->Set(0, &d, witness);
|
| }
|
| { // name
|
| Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName);
|
| CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes);
|
| - descriptors->Set(1, &d);
|
| + descriptors->Set(1, &d, witness);
|
| }
|
| { // arguments
|
| CallbacksDescriptor d(*factory()->arguments_symbol(),
|
| *arguments,
|
| attributes);
|
| - descriptors->Set(2, &d);
|
| + descriptors->Set(2, &d, witness);
|
| }
|
| { // caller
|
| CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes);
|
| - descriptors->Set(3, &d);
|
| + descriptors->Set(3, &d, witness);
|
| }
|
|
|
| // prototype
|
| if (prototypeMode != DONT_ADD_PROTOTYPE) {
|
| - if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) {
|
| - attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY);
|
| + if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) {
|
| + attributes = static_cast<PropertyAttributes>(attributes | READ_ONLY);
|
| }
|
| Handle<Foreign> foreign =
|
| factory()->NewForeign(&Accessors::FunctionPrototype);
|
| CallbacksDescriptor d(*factory()->prototype_symbol(), *foreign, attributes);
|
| - descriptors->Set(4, &d);
|
| + descriptors->Set(4, &d, witness);
|
| }
|
|
|
| - descriptors->Sort();
|
| + descriptors->Sort(witness);
|
| return descriptors;
|
| }
|
|
|
| @@ -941,6 +947,7 @@
|
| ASSERT_EQ(0, initial_map->inobject_properties());
|
|
|
| Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5);
|
| + DescriptorArray::WhitenessWitness witness(*descriptors);
|
| PropertyAttributes final =
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| int enum_index = 0;
|
| @@ -950,7 +957,7 @@
|
| JSRegExp::kSourceFieldIndex,
|
| final,
|
| enum_index++);
|
| - descriptors->Set(0, &field);
|
| + descriptors->Set(0, &field, witness);
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.2.
|
| @@ -958,7 +965,7 @@
|
| JSRegExp::kGlobalFieldIndex,
|
| final,
|
| enum_index++);
|
| - descriptors->Set(1, &field);
|
| + descriptors->Set(1, &field, witness);
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.3.
|
| @@ -966,7 +973,7 @@
|
| JSRegExp::kIgnoreCaseFieldIndex,
|
| final,
|
| enum_index++);
|
| - descriptors->Set(2, &field);
|
| + descriptors->Set(2, &field, witness);
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.4.
|
| @@ -974,7 +981,7 @@
|
| JSRegExp::kMultilineFieldIndex,
|
| final,
|
| enum_index++);
|
| - descriptors->Set(3, &field);
|
| + descriptors->Set(3, &field, witness);
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.5.
|
| @@ -984,10 +991,10 @@
|
| JSRegExp::kLastIndexFieldIndex,
|
| writable,
|
| enum_index++);
|
| - descriptors->Set(4, &field);
|
| + descriptors->Set(4, &field, witness);
|
| }
|
| descriptors->SetNextEnumerationIndex(enum_index);
|
| - descriptors->Sort();
|
| + descriptors->Sort(witness);
|
|
|
| initial_map->set_inobject_properties(5);
|
| initial_map->set_pre_allocated_property_fields(5);
|
| @@ -1065,7 +1072,7 @@
|
| DONT_ENUM);
|
|
|
| #ifdef DEBUG
|
| - LookupResult lookup;
|
| + LookupResult lookup(isolate);
|
| result->LocalLookup(heap->callee_symbol(), &lookup);
|
| ASSERT(lookup.IsProperty() && (lookup.type() == FIELD));
|
| ASSERT(lookup.GetFieldIndex() == Heap::kArgumentsCalleeIndex);
|
| @@ -1084,11 +1091,6 @@
|
| }
|
|
|
| { // --- aliased_arguments_boilerplate_
|
| - Handle<Map> old_map(global_context()->arguments_boilerplate()->map());
|
| - Handle<Map> new_map = factory->CopyMapDropTransitions(old_map);
|
| - new_map->set_pre_allocated_property_fields(2);
|
| - Handle<JSObject> result = factory->NewJSObjectFromMap(new_map);
|
| - new_map->set_elements_kind(NON_STRICT_ARGUMENTS_ELEMENTS);
|
| // Set up a well-formed parameter map to make assertions happy.
|
| Handle<FixedArray> elements = factory->NewFixedArray(2);
|
| elements->set_map(heap->non_strict_arguments_elements_map());
|
| @@ -1097,12 +1099,16 @@
|
| elements->set(0, *array);
|
| array = factory->NewFixedArray(0);
|
| elements->set(1, *array);
|
| - Handle<Map> non_strict_arguments_elements_map =
|
| - factory->GetElementsTransitionMap(result,
|
| - NON_STRICT_ARGUMENTS_ELEMENTS);
|
| - result->set_map(*non_strict_arguments_elements_map);
|
| +
|
| + Handle<Map> old_map(global_context()->arguments_boilerplate()->map());
|
| + Handle<Map> new_map = factory->CopyMapDropTransitions(old_map);
|
| + new_map->set_pre_allocated_property_fields(2);
|
| + Handle<JSObject> result = factory->NewJSObjectFromMap(new_map);
|
| + // Set elements kind after allocating the object because
|
| + // NewJSObjectFromMap assumes a fast elements map.
|
| + new_map->set_elements_kind(NON_STRICT_ARGUMENTS_ELEMENTS);
|
| + result->set_elements(*elements);
|
| ASSERT(result->HasNonStrictArgumentsElements());
|
| - result->set_elements(*elements);
|
| global_context()->set_aliased_arguments_boilerplate(*result);
|
| }
|
|
|
| @@ -1125,19 +1131,20 @@
|
|
|
| // Create the descriptor array for the arguments object.
|
| Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3);
|
| + DescriptorArray::WhitenessWitness witness(*descriptors);
|
| { // length
|
| FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM);
|
| - descriptors->Set(0, &d);
|
| + descriptors->Set(0, &d, witness);
|
| }
|
| { // callee
|
| CallbacksDescriptor d(*factory->callee_symbol(), *callee, attributes);
|
| - descriptors->Set(1, &d);
|
| + descriptors->Set(1, &d, witness);
|
| }
|
| { // caller
|
| CallbacksDescriptor d(*factory->caller_symbol(), *caller, attributes);
|
| - descriptors->Set(2, &d);
|
| + descriptors->Set(2, &d, witness);
|
| }
|
| - descriptors->Sort();
|
| + descriptors->Sort(witness);
|
|
|
| // Create the map. Allocate one in-object field for length.
|
| Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE,
|
| @@ -1162,7 +1169,7 @@
|
| DONT_ENUM);
|
|
|
| #ifdef DEBUG
|
| - LookupResult lookup;
|
| + LookupResult lookup(isolate);
|
| result->LocalLookup(heap->length_symbol(), &lookup);
|
| ASSERT(lookup.IsProperty() && (lookup.type() == FIELD));
|
| ASSERT(lookup.GetFieldIndex() == Heap::kArgumentsLengthIndex);
|
| @@ -1221,6 +1228,14 @@
|
|
|
| // Initialize the data slot.
|
| global_context()->set_data(heap->undefined_value());
|
| +
|
| + {
|
| + // Initialize the random seed slot.
|
| + Handle<ByteArray> zeroed_byte_array(
|
| + factory->NewByteArray(kRandomStateSize));
|
| + global_context()->set_random_seed(*zeroed_byte_array);
|
| + memset(zeroed_byte_array->GetDataStartAddress(), 0, kRandomStateSize);
|
| + }
|
| }
|
|
|
|
|
| @@ -1228,12 +1243,26 @@
|
| Handle<JSObject> global = Handle<JSObject>(global_context()->global());
|
|
|
| // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no
|
| - // longer need to live behind a flag, so WeakMap gets added to the snapshot.
|
| - if (FLAG_harmony_weakmaps) { // -- W e a k M a p
|
| - Handle<JSObject> prototype =
|
| - factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| - InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
|
| - prototype, Builtins::kIllegal, true);
|
| + // longer need to live behind a flag, so functions get added to the snapshot.
|
| + if (FLAG_harmony_collections) {
|
| + { // -- S e t
|
| + Handle<JSObject> prototype =
|
| + factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| + InstallFunction(global, "Set", JS_SET_TYPE, JSSet::kSize,
|
| + prototype, Builtins::kIllegal, true);
|
| + }
|
| + { // -- M a p
|
| + Handle<JSObject> prototype =
|
| + factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| + InstallFunction(global, "Map", JS_MAP_TYPE, JSMap::kSize,
|
| + prototype, Builtins::kIllegal, true);
|
| + }
|
| + { // -- W e a k M a p
|
| + Handle<JSObject> prototype =
|
| + factory()->NewJSObject(isolate()->object_function(), TENURED);
|
| + InstallFunction(global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize,
|
| + prototype, Builtins::kIllegal, true);
|
| + }
|
| }
|
| }
|
|
|
| @@ -1362,6 +1391,7 @@
|
| INSTALL_NATIVE(JSFunction, "DerivedHasTrap", derived_has_trap);
|
| INSTALL_NATIVE(JSFunction, "DerivedGetTrap", derived_get_trap);
|
| INSTALL_NATIVE(JSFunction, "DerivedSetTrap", derived_set_trap);
|
| + INSTALL_NATIVE(JSFunction, "ProxyEnumerate", proxy_enumerate);
|
| }
|
| }
|
|
|
| @@ -1696,15 +1726,17 @@
|
| Handle<DescriptorArray> reresult_descriptors =
|
| factory()->NewDescriptorArray(3);
|
|
|
| - reresult_descriptors->CopyFrom(0, *array_descriptors, 0);
|
| + DescriptorArray::WhitenessWitness witness(*reresult_descriptors);
|
|
|
| + reresult_descriptors->CopyFrom(0, *array_descriptors, 0, witness);
|
| +
|
| int enum_index = 0;
|
| {
|
| FieldDescriptor index_field(heap()->index_symbol(),
|
| JSRegExpResult::kIndexIndex,
|
| NONE,
|
| enum_index++);
|
| - reresult_descriptors->Set(1, &index_field);
|
| + reresult_descriptors->Set(1, &index_field, witness);
|
| }
|
|
|
| {
|
| @@ -1712,9 +1744,9 @@
|
| JSRegExpResult::kInputIndex,
|
| NONE,
|
| enum_index++);
|
| - reresult_descriptors->Set(2, &input_field);
|
| + reresult_descriptors->Set(2, &input_field, witness);
|
| }
|
| - reresult_descriptors->Sort();
|
| + reresult_descriptors->Sort(witness);
|
|
|
| initial_map->set_inobject_properties(2);
|
| initial_map->set_pre_allocated_property_fields(2);
|
| @@ -1741,9 +1773,9 @@
|
| "native proxy.js") == 0) {
|
| if (!CompileExperimentalBuiltin(isolate(), i)) return false;
|
| }
|
| - if (FLAG_harmony_weakmaps &&
|
| + if (FLAG_harmony_collections &&
|
| strcmp(ExperimentalNatives::GetScriptName(i).start(),
|
| - "native weakmap.js") == 0) {
|
| + "native collection.js") == 0) {
|
| if (!CompileExperimentalBuiltin(isolate(), i)) return false;
|
| }
|
| }
|
| @@ -1989,6 +2021,12 @@
|
| false);
|
| ASSERT(isolate->has_pending_exception() != result);
|
| if (!result) {
|
| + // We print out the name of the extension that fail to install.
|
| + // When an error is thrown during bootstrapping we automatically print
|
| + // the line number at which this happened to the console in the isolate
|
| + // error throwing functionality.
|
| + OS::PrintError("Error installing extension '%s'.\n",
|
| + current->extension()->name());
|
| isolate->clear_pending_exception();
|
| }
|
| current->set_state(v8::INSTALLED);
|
| @@ -2008,7 +2046,9 @@
|
| builtins->set_javascript_builtin(id, *function);
|
| Handle<SharedFunctionInfo> shared
|
| = Handle<SharedFunctionInfo>(function->shared());
|
| - if (!EnsureCompiled(shared, CLEAR_EXCEPTION)) return false;
|
| + if (!SharedFunctionInfo::EnsureCompiled(shared, CLEAR_EXCEPTION)) {
|
| + return false;
|
| + }
|
| // Set the code object on the function object.
|
| function->ReplaceCode(function->shared()->code());
|
| builtins->set_javascript_builtin_code(id, shared->code());
|
| @@ -2088,7 +2128,7 @@
|
| break;
|
| }
|
| case CALLBACKS: {
|
| - LookupResult result;
|
| + LookupResult result(isolate());
|
| to->LocalLookup(descs->GetKey(i), &result);
|
| // If the property is already there we skip it
|
| if (result.IsProperty()) continue;
|
| @@ -2126,7 +2166,7 @@
|
| if (properties->IsKey(raw_key)) {
|
| ASSERT(raw_key->IsString());
|
| // If the property is already there we skip it.
|
| - LookupResult result;
|
| + LookupResult result(isolate());
|
| to->LocalLookup(String::cast(raw_key), &result);
|
| if (result.IsProperty()) continue;
|
| // Set the property.
|
|
|