| Index: src/bootstrapper.cc | 
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc | 
| index 8501cc39696f42335a200a4a91d8e75c9445e380..c72af5ce06b4b564ea8efcd4a0faa7a5ae469d36 100644 | 
| --- a/src/bootstrapper.cc | 
| +++ b/src/bootstrapper.cc | 
| @@ -387,30 +387,34 @@ void Genesis::SetFunctionInstanceDescriptor( | 
| Handle<Map> map, PrototypePropertyMode prototypeMode) { | 
| int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; | 
| Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size)); | 
| +  DescriptorArray::WhitenessWitness witness(*descriptors); | 
| + | 
| +  Handle<Foreign> length(factory()->NewForeign(&Accessors::FunctionLength)); | 
| +  Handle<Foreign> name(factory()->NewForeign(&Accessors::FunctionName)); | 
| +  Handle<Foreign> args(factory()->NewForeign(&Accessors::FunctionArguments)); | 
| +  Handle<Foreign> caller(factory()->NewForeign(&Accessors::FunctionCaller)); | 
| +  Handle<Foreign> prototype; | 
| +  if (prototypeMode != DONT_ADD_PROTOTYPE) { | 
| +    prototype = factory()->NewForeign(&Accessors::FunctionPrototype); | 
| +  } | 
| PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| - | 
| -  DescriptorArray::WhitenessWitness witness(*descriptors); | 
| map->set_instance_descriptors(*descriptors); | 
|  | 
| {  // Add length. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength)); | 
| -    CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->length_symbol(), *length, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add name. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName)); | 
| -    CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->name_symbol(), *name, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add arguments. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionArguments)); | 
| -    CallbacksDescriptor d(*factory()->arguments_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->arguments_symbol(), *args, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add caller. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionCaller)); | 
| -    CallbacksDescriptor d(*factory()->caller_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| if (prototypeMode != DONT_ADD_PROTOTYPE) { | 
| @@ -418,8 +422,7 @@ void Genesis::SetFunctionInstanceDescriptor( | 
| if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | 
| attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); | 
| } | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); | 
| -    CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->prototype_symbol(), *prototype, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| } | 
| @@ -525,40 +528,42 @@ void Genesis::SetStrictFunctionInstanceDescriptor( | 
| Handle<Map> map, PrototypePropertyMode prototypeMode) { | 
| int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; | 
| Handle<DescriptorArray> descriptors(factory()->NewDescriptorArray(size)); | 
| +  DescriptorArray::WhitenessWitness witness(*descriptors); | 
| + | 
| +  Handle<Foreign> length(factory()->NewForeign(&Accessors::FunctionLength)); | 
| +  Handle<Foreign> name(factory()->NewForeign(&Accessors::FunctionName)); | 
| +  Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | 
| +  Handle<AccessorPair> caller(factory()->NewAccessorPair()); | 
| +  Handle<Foreign> prototype; | 
| +  if (prototypeMode != DONT_ADD_PROTOTYPE) { | 
| +    prototype = factory()->NewForeign(&Accessors::FunctionPrototype); | 
| +  } | 
| PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| DONT_ENUM | DONT_DELETE); | 
| - | 
| -  DescriptorArray::WhitenessWitness witness(*descriptors); | 
| map->set_instance_descriptors(*descriptors); | 
|  | 
| {  // Add length. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength)); | 
| -    CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->length_symbol(), *length, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add name. | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName)); | 
| -    CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->name_symbol(), *name, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add arguments. | 
| -    Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | 
| CallbacksDescriptor d(*factory()->arguments_symbol(), *arguments, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| {  // Add caller. | 
| -    Handle<AccessorPair> caller(factory()->NewAccessorPair()); | 
| CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| - | 
| if (prototypeMode != DONT_ADD_PROTOTYPE) { | 
| // Add prototype. | 
| if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { | 
| attribs = static_cast<PropertyAttributes>(attribs | READ_ONLY); | 
| } | 
| -    Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); | 
| -    CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); | 
| +    CallbacksDescriptor d(*factory()->prototype_symbol(), *prototype, attribs); | 
| map->AppendDescriptor(&d, witness); | 
| } | 
| } | 
| @@ -858,21 +863,20 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, | 
| isolate->builtins()->builtin(Builtins::kArrayConstructCode)); | 
| array_function->shared()->DontAdaptArguments(); | 
|  | 
| - | 
| // This seems a bit hackish, but we need to make sure Array.length | 
| // is 1. | 
| array_function->shared()->set_length(1); | 
|  | 
| Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1)); | 
| +    DescriptorArray::WhitenessWitness witness(*array_descriptors); | 
| + | 
| +    Handle<Foreign> array_length(factory->NewForeign(&Accessors::ArrayLength)); | 
| PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| DONT_ENUM | DONT_DELETE); | 
| - | 
| -    DescriptorArray::WhitenessWitness witness(*array_descriptors); | 
| array_function->initial_map()->set_instance_descriptors(*array_descriptors); | 
|  | 
| {  // Add length. | 
| -      Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength)); | 
| -      CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); | 
| +      CallbacksDescriptor d(*factory->length_symbol(), *array_length, attribs); | 
| array_function->initial_map()->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| @@ -911,15 +915,16 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, | 
| Handle<Map> string_map = | 
| Handle<Map>(global_context()->string_function()->initial_map()); | 
| Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1)); | 
| +    DescriptorArray::WhitenessWitness witness(*string_descriptors); | 
| + | 
| +    Handle<Foreign> string_length( | 
| +        factory->NewForeign(&Accessors::StringLength)); | 
| PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| - | 
| -    DescriptorArray::WhitenessWitness witness(*string_descriptors); | 
| string_map->set_instance_descriptors(*string_descriptors); | 
|  | 
| {  // Add length. | 
| -      Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength)); | 
| -      CallbacksDescriptor d(*factory->length_symbol(), *f, attribs); | 
| +      CallbacksDescriptor d(*factory->length_symbol(), *string_length, attribs); | 
| string_map->AppendDescriptor(&d, witness); | 
| } | 
| } | 
| @@ -1473,112 +1478,128 @@ bool Genesis::InstallNatives() { | 
| SetPrototype(script_fun, prototype); | 
| global_context()->set_script_function(*script_fun); | 
|  | 
| -    PropertyAttributes attribs = | 
| -        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| - | 
| Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); | 
|  | 
| Handle<DescriptorArray> script_descriptors( | 
| factory()->NewDescriptorArray(13)); | 
| - | 
| DescriptorArray::WhitenessWitness witness(*script_descriptors); | 
| + | 
| +    Handle<Foreign> script_source( | 
| +        factory()->NewForeign(&Accessors::ScriptSource)); | 
| +    Handle<Foreign> script_name(factory()->NewForeign(&Accessors::ScriptName)); | 
| +    Handle<String> id_symbol(factory()->LookupAsciiSymbol("id")); | 
| +    Handle<Foreign> script_id(factory()->NewForeign(&Accessors::ScriptId)); | 
| +    Handle<String> line_offset_symbol( | 
| +        factory()->LookupAsciiSymbol("line_offset")); | 
| +    Handle<Foreign> script_line_offset( | 
| +        factory()->NewForeign(&Accessors::ScriptLineOffset)); | 
| +    Handle<String> column_offset_symbol( | 
| +        factory()->LookupAsciiSymbol("column_offset")); | 
| +    Handle<Foreign> script_column_offset( | 
| +        factory()->NewForeign(&Accessors::ScriptColumnOffset)); | 
| +    Handle<String> data_symbol(factory()->LookupAsciiSymbol("data")); | 
| +    Handle<Foreign> script_data(factory()->NewForeign(&Accessors::ScriptData)); | 
| +    Handle<String> type_symbol(factory()->LookupAsciiSymbol("type")); | 
| +    Handle<Foreign> script_type(factory()->NewForeign(&Accessors::ScriptType)); | 
| +    Handle<String> compilation_type_symbol( | 
| +        factory()->LookupAsciiSymbol("compilation_type")); | 
| +    Handle<Foreign> script_compilation_type( | 
| +        factory()->NewForeign(&Accessors::ScriptCompilationType)); | 
| +    Handle<String> line_ends_symbol(factory()->LookupAsciiSymbol("line_ends")); | 
| +    Handle<Foreign> script_line_ends( | 
| +        factory()->NewForeign(&Accessors::ScriptLineEnds)); | 
| +    Handle<String> context_data_symbol( | 
| +        factory()->LookupAsciiSymbol("context_data")); | 
| +    Handle<Foreign> script_context_data( | 
| +        factory()->NewForeign(&Accessors::ScriptContextData)); | 
| +    Handle<String> eval_from_script_symbol( | 
| +        factory()->LookupAsciiSymbol("eval_from_script")); | 
| +    Handle<Foreign> script_eval_from_script( | 
| +        factory()->NewForeign(&Accessors::ScriptEvalFromScript)); | 
| +    Handle<String> eval_from_script_position_symbol( | 
| +        factory()->LookupAsciiSymbol("eval_from_script_position")); | 
| +    Handle<Foreign> script_eval_from_script_position( | 
| +        factory()->NewForeign(&Accessors::ScriptEvalFromScriptPosition)); | 
| +    Handle<String> eval_from_function_name_symbol( | 
| +        factory()->LookupAsciiSymbol("eval_from_function_name")); | 
| +    Handle<Foreign> script_eval_from_function_name( | 
| +        factory()->NewForeign(&Accessors::ScriptEvalFromFunctionName)); | 
| +    PropertyAttributes attribs = | 
| +        static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| script_map->set_instance_descriptors(*script_descriptors); | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("source"), *f, attribs); | 
| +          *factory()->source_symbol(), *script_source, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("name"), *f, attribs); | 
| +      CallbacksDescriptor d(*factory()->name_symbol(), *script_name, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("id"), *f, attribs); | 
| +      CallbacksDescriptor d(*id_symbol, *script_id, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("line_offset"), *f, attribs); | 
| +      CallbacksDescriptor d(*line_offset_symbol, *script_line_offset, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("column_offset"), *f, attribs); | 
| +          *column_offset_symbol, *script_column_offset, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("data"), *f, attribs); | 
| +      CallbacksDescriptor d(*data_symbol, *script_data, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("type"), *f, attribs); | 
| +      CallbacksDescriptor d(*type_symbol, *script_type, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign( | 
| -          &Accessors::ScriptCompilationType)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs); | 
| +          *compilation_type_symbol, *script_compilation_type, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds)); | 
| -      CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("line_ends"), *f, attribs); | 
| +      CallbacksDescriptor d(*line_ends_symbol, *script_line_ends, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("context_data"), *f, attribs); | 
| +          *context_data_symbol, *script_context_data, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign( | 
| -          &Accessors::ScriptEvalFromScript)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs); | 
| +          *eval_from_script_symbol, *script_eval_from_script, attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign( | 
| -          &Accessors::ScriptEvalFromScriptPosition)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("eval_from_script_position"), | 
| -          *f, | 
| +          *eval_from_script_position_symbol, | 
| +          *script_eval_from_script_position, | 
| attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
|  | 
| { | 
| -      Handle<Foreign> f(factory()->NewForeign( | 
| -          &Accessors::ScriptEvalFromFunctionName)); | 
| CallbacksDescriptor d( | 
| -          *factory()->LookupAsciiSymbol("eval_from_function_name"), | 
| -          *f, | 
| +          *eval_from_function_name_symbol, | 
| +          *script_eval_from_function_name, | 
| attribs); | 
| script_map->AppendDescriptor(&d, witness); | 
| } | 
| @@ -1639,15 +1660,17 @@ bool Genesis::InstallNatives() { | 
|  | 
| // Make "length" magic on instances. | 
| Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1)); | 
| +    DescriptorArray::WhitenessWitness witness(*array_descriptors); | 
| + | 
| +    Handle<Foreign> array_length(factory()->NewForeign( | 
| +        &Accessors::ArrayLength)); | 
| PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| DONT_ENUM | DONT_DELETE); | 
| - | 
| -    DescriptorArray::WhitenessWitness witness(*array_descriptors); | 
| array_function->initial_map()->set_instance_descriptors(*array_descriptors); | 
|  | 
| {  // Add length. | 
| -      Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength)); | 
| -      CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs); | 
| +      CallbacksDescriptor d( | 
| +          *factory()->length_symbol(), *array_length, attribs); | 
| array_function->initial_map()->AppendDescriptor(&d, witness); | 
| } | 
|  | 
|  |