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. |