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); |
} |