| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index 726670aae54a01cffe1890fd36a9dbadb988d66d..ceec7207de060cc555064255bf65d711237cc62f 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -866,15 +866,22 @@ 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->CopyAppendForeignDescriptor(
|
| - factory->empty_descriptor_array(),
|
| - factory->length_symbol(),
|
| - factory->NewForeign(&Accessors::ArrayLength),
|
| - static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE));
|
| +
|
| + Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1));
|
| + PropertyAttributes attribs = static_cast<PropertyAttributes>(
|
| + DONT_ENUM | DONT_DELETE);
|
| +
|
| + DescriptorArray::WhitenessWitness witness(*array_descriptors);
|
| +
|
| + { // Add length.
|
| + Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength));
|
| + CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
|
| + array_descriptors->Append(&d, witness);
|
| + }
|
|
|
| // array_function is used internally. JS code creating array object should
|
| // search for the 'Array' property on the global object and use that one
|
| @@ -908,15 +915,18 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
|
| string_fun->shared()->set_construct_stub(
|
| isolate->builtins()->builtin(Builtins::kStringConstructCode));
|
| global_context()->set_string_function(*string_fun);
|
| - // Add 'length' property to strings.
|
| - Handle<DescriptorArray> string_descriptors =
|
| - factory->CopyAppendForeignDescriptor(
|
| - factory->empty_descriptor_array(),
|
| - factory->length_symbol(),
|
| - factory->NewForeign(&Accessors::StringLength),
|
| - static_cast<PropertyAttributes>(DONT_ENUM |
|
| - DONT_DELETE |
|
| - READ_ONLY));
|
| +
|
| + Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1));
|
| + PropertyAttributes attribs = static_cast<PropertyAttributes>(
|
| + DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| +
|
| + DescriptorArray::WhitenessWitness witness(*string_descriptors);
|
| +
|
| + { // Add length.
|
| + Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength));
|
| + CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
|
| + string_descriptors->Append(&d, witness);
|
| + }
|
|
|
| Handle<Map> string_map =
|
| Handle<Map>(global_context()->string_function()->initial_map());
|
| @@ -1472,112 +1482,114 @@ bool Genesis::InstallNatives() {
|
| SetPrototype(script_fun, prototype);
|
| global_context()->set_script_function(*script_fun);
|
|
|
| - // Add 'source' and 'data' property to scripts.
|
| - PropertyAttributes common_attributes =
|
| + PropertyAttributes attribs =
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| - Handle<Foreign> foreign_source =
|
| - factory()->NewForeign(&Accessors::ScriptSource);
|
| - Handle<DescriptorArray> script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - factory()->empty_descriptor_array(),
|
| - factory()->LookupAsciiSymbol("source"),
|
| - foreign_source,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_name =
|
| - factory()->NewForeign(&Accessors::ScriptName);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("name"),
|
| - foreign_name,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_id = factory()->NewForeign(&Accessors::ScriptId);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("id"),
|
| - foreign_id,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_line_offset =
|
| - factory()->NewForeign(&Accessors::ScriptLineOffset);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("line_offset"),
|
| - foreign_line_offset,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_column_offset =
|
| - factory()->NewForeign(&Accessors::ScriptColumnOffset);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("column_offset"),
|
| - foreign_column_offset,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_data =
|
| - factory()->NewForeign(&Accessors::ScriptData);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("data"),
|
| - foreign_data,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_type =
|
| - factory()->NewForeign(&Accessors::ScriptType);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("type"),
|
| - foreign_type,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_compilation_type =
|
| - factory()->NewForeign(&Accessors::ScriptCompilationType);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("compilation_type"),
|
| - foreign_compilation_type,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_line_ends =
|
| - factory()->NewForeign(&Accessors::ScriptLineEnds);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("line_ends"),
|
| - foreign_line_ends,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_context_data =
|
| - factory()->NewForeign(&Accessors::ScriptContextData);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("context_data"),
|
| - foreign_context_data,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_eval_from_script =
|
| - factory()->NewForeign(&Accessors::ScriptEvalFromScript);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("eval_from_script"),
|
| - foreign_eval_from_script,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_eval_from_script_position =
|
| - factory()->NewForeign(&Accessors::ScriptEvalFromScriptPosition);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("eval_from_script_position"),
|
| - foreign_eval_from_script_position,
|
| - common_attributes);
|
| - Handle<Foreign> foreign_eval_from_function_name =
|
| - factory()->NewForeign(&Accessors::ScriptEvalFromFunctionName);
|
| - script_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - script_descriptors,
|
| - factory()->LookupAsciiSymbol("eval_from_function_name"),
|
| - foreign_eval_from_function_name,
|
| - common_attributes);
|
| +
|
| + Handle<DescriptorArray> script_descriptors(
|
| + factory()->NewDescriptorArray(13));
|
| +
|
| + DescriptorArray::WhitenessWitness witness(*script_descriptors);
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("source"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("name"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("id"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("line_offset"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("column_offset"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("data"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("type"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(
|
| + &Accessors::ScriptCompilationType));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("line_ends"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("context_data"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(
|
| + &Accessors::ScriptEvalFromScript));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(
|
| + &Accessors::ScriptEvalFromScriptPosition));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("eval_from_script_position"),
|
| + *f,
|
| + attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + {
|
| + Handle<Foreign> f(factory()->NewForeign(
|
| + &Accessors::ScriptEvalFromFunctionName));
|
| + CallbacksDescriptor d(
|
| + *factory()->LookupAsciiSymbol("eval_from_function_name"),
|
| + *f,
|
| + attribs);
|
| + script_descriptors->Append(&d, witness);
|
| + }
|
| +
|
| + script_descriptors->Sort(witness);
|
|
|
| Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
|
| script_map->set_instance_descriptors(*script_descriptors);
|
| @@ -1637,12 +1649,17 @@ bool Genesis::InstallNatives() {
|
| array_function->set_initial_map(new_map);
|
|
|
| // Make "length" magic on instances.
|
| - Handle<DescriptorArray> array_descriptors =
|
| - factory()->CopyAppendForeignDescriptor(
|
| - factory()->empty_descriptor_array(),
|
| - factory()->length_symbol(),
|
| - factory()->NewForeign(&Accessors::ArrayLength),
|
| - static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE));
|
| + Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1));
|
| + PropertyAttributes attribs = static_cast<PropertyAttributes>(
|
| + DONT_ENUM | DONT_DELETE);
|
| +
|
| + DescriptorArray::WhitenessWitness witness(*array_descriptors);
|
| +
|
| + { // Add length.
|
| + Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength));
|
| + CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
|
| + array_descriptors->Append(&d, witness);
|
| + }
|
|
|
| array_function->initial_map()->set_instance_descriptors(
|
| *array_descriptors);
|
|
|