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