Commit cd98b0c8 authored by verwaest@chromium.org's avatar verwaest@chromium.org

Removed CopyAppendForeignDescriptor.

Use descriptor array preallocation + appending instead.

Review URL: https://chromiumcodereview.appspot.com/10782033

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12133 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 25d4eeaf
...@@ -868,15 +868,22 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, ...@@ -868,15 +868,22 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
isolate->builtins()->builtin(Builtins::kArrayConstructCode)); isolate->builtins()->builtin(Builtins::kArrayConstructCode));
array_function->shared()->DontAdaptArguments(); array_function->shared()->DontAdaptArguments();
// This seems a bit hackish, but we need to make sure Array.length // This seems a bit hackish, but we need to make sure Array.length
// is 1. // is 1.
array_function->shared()->set_length(1); array_function->shared()->set_length(1);
Handle<DescriptorArray> array_descriptors =
factory->CopyAppendForeignDescriptor( Handle<DescriptorArray> array_descriptors(factory->NewDescriptorArray(1));
factory->empty_descriptor_array(), PropertyAttributes attribs = static_cast<PropertyAttributes>(
factory->length_symbol(), DONT_ENUM | DONT_DELETE);
factory->NewForeign(&Accessors::ArrayLength),
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 // array_function is used internally. JS code creating array object should
// search for the 'Array' property on the global object and use that one // search for the 'Array' property on the global object and use that one
...@@ -910,15 +917,18 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, ...@@ -910,15 +917,18 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global,
string_fun->shared()->set_construct_stub( string_fun->shared()->set_construct_stub(
isolate->builtins()->builtin(Builtins::kStringConstructCode)); isolate->builtins()->builtin(Builtins::kStringConstructCode));
global_context()->set_string_function(*string_fun); global_context()->set_string_function(*string_fun);
// Add 'length' property to strings.
Handle<DescriptorArray> string_descriptors = Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1));
factory->CopyAppendForeignDescriptor( PropertyAttributes attribs = static_cast<PropertyAttributes>(
factory->empty_descriptor_array(), DONT_ENUM | DONT_DELETE | READ_ONLY);
factory->length_symbol(),
factory->NewForeign(&Accessors::StringLength), DescriptorArray::WhitenessWitness witness(*string_descriptors);
static_cast<PropertyAttributes>(DONT_ENUM |
DONT_DELETE | { // Add length.
READ_ONLY)); 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> string_map =
Handle<Map>(global_context()->string_function()->initial_map()); Handle<Map>(global_context()->string_function()->initial_map());
...@@ -1474,112 +1484,114 @@ bool Genesis::InstallNatives() { ...@@ -1474,112 +1484,114 @@ bool Genesis::InstallNatives() {
SetPrototype(script_fun, prototype); SetPrototype(script_fun, prototype);
global_context()->set_script_function(*script_fun); global_context()->set_script_function(*script_fun);
// Add 'source' and 'data' property to scripts. PropertyAttributes attribs =
PropertyAttributes common_attributes =
static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
Handle<Foreign> foreign_source =
factory()->NewForeign(&Accessors::ScriptSource); Handle<DescriptorArray> script_descriptors(
Handle<DescriptorArray> script_descriptors = factory()->NewDescriptorArray(13));
factory()->CopyAppendForeignDescriptor(
factory()->empty_descriptor_array(), DescriptorArray::WhitenessWitness witness(*script_descriptors);
factory()->LookupAsciiSymbol("source"),
foreign_source, {
common_attributes); Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource));
Handle<Foreign> foreign_name = CallbacksDescriptor d(
factory()->NewForeign(&Accessors::ScriptName); *factory()->LookupAsciiSymbol("source"), *f, attribs);
script_descriptors = script_descriptors->Append(&d, witness);
factory()->CopyAppendForeignDescriptor( }
script_descriptors,
factory()->LookupAsciiSymbol("name"), {
foreign_name, Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName));
common_attributes); CallbacksDescriptor d(
Handle<Foreign> foreign_id = factory()->NewForeign(&Accessors::ScriptId); *factory()->LookupAsciiSymbol("name"), *f, attribs);
script_descriptors = script_descriptors->Append(&d, witness);
factory()->CopyAppendForeignDescriptor( }
script_descriptors,
factory()->LookupAsciiSymbol("id"), {
foreign_id, Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId));
common_attributes); CallbacksDescriptor d(
Handle<Foreign> foreign_line_offset = *factory()->LookupAsciiSymbol("id"), *f, attribs);
factory()->NewForeign(&Accessors::ScriptLineOffset); script_descriptors->Append(&d, witness);
script_descriptors = }
factory()->CopyAppendForeignDescriptor(
script_descriptors, {
factory()->LookupAsciiSymbol("line_offset"), Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset));
foreign_line_offset, CallbacksDescriptor d(
common_attributes); *factory()->LookupAsciiSymbol("line_offset"), *f, attribs);
Handle<Foreign> foreign_column_offset = script_descriptors->Append(&d, witness);
factory()->NewForeign(&Accessors::ScriptColumnOffset); }
script_descriptors =
factory()->CopyAppendForeignDescriptor( {
script_descriptors, Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset));
factory()->LookupAsciiSymbol("column_offset"), CallbacksDescriptor d(
foreign_column_offset, *factory()->LookupAsciiSymbol("column_offset"), *f, attribs);
common_attributes); script_descriptors->Append(&d, witness);
Handle<Foreign> foreign_data = }
factory()->NewForeign(&Accessors::ScriptData);
script_descriptors = {
factory()->CopyAppendForeignDescriptor( Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData));
script_descriptors, CallbacksDescriptor d(
factory()->LookupAsciiSymbol("data"), *factory()->LookupAsciiSymbol("data"), *f, attribs);
foreign_data, script_descriptors->Append(&d, witness);
common_attributes); }
Handle<Foreign> foreign_type =
factory()->NewForeign(&Accessors::ScriptType); {
script_descriptors = Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType));
factory()->CopyAppendForeignDescriptor( CallbacksDescriptor d(
script_descriptors, *factory()->LookupAsciiSymbol("type"), *f, attribs);
factory()->LookupAsciiSymbol("type"), script_descriptors->Append(&d, witness);
foreign_type, }
common_attributes);
Handle<Foreign> foreign_compilation_type = {
factory()->NewForeign(&Accessors::ScriptCompilationType); Handle<Foreign> f(factory()->NewForeign(
script_descriptors = &Accessors::ScriptCompilationType));
factory()->CopyAppendForeignDescriptor( CallbacksDescriptor d(
script_descriptors, *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs);
factory()->LookupAsciiSymbol("compilation_type"), script_descriptors->Append(&d, witness);
foreign_compilation_type, }
common_attributes);
Handle<Foreign> foreign_line_ends = {
factory()->NewForeign(&Accessors::ScriptLineEnds); Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds));
script_descriptors = CallbacksDescriptor d(
factory()->CopyAppendForeignDescriptor( *factory()->LookupAsciiSymbol("line_ends"), *f, attribs);
script_descriptors, script_descriptors->Append(&d, witness);
factory()->LookupAsciiSymbol("line_ends"), }
foreign_line_ends,
common_attributes); {
Handle<Foreign> foreign_context_data = Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData));
factory()->NewForeign(&Accessors::ScriptContextData); CallbacksDescriptor d(
script_descriptors = *factory()->LookupAsciiSymbol("context_data"), *f, attribs);
factory()->CopyAppendForeignDescriptor( script_descriptors->Append(&d, witness);
script_descriptors, }
factory()->LookupAsciiSymbol("context_data"),
foreign_context_data, {
common_attributes); Handle<Foreign> f(factory()->NewForeign(
Handle<Foreign> foreign_eval_from_script = &Accessors::ScriptEvalFromScript));
factory()->NewForeign(&Accessors::ScriptEvalFromScript); CallbacksDescriptor d(
script_descriptors = *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs);
factory()->CopyAppendForeignDescriptor( script_descriptors->Append(&d, witness);
script_descriptors, }
factory()->LookupAsciiSymbol("eval_from_script"),
foreign_eval_from_script, {
common_attributes); Handle<Foreign> f(factory()->NewForeign(
Handle<Foreign> foreign_eval_from_script_position = &Accessors::ScriptEvalFromScriptPosition));
factory()->NewForeign(&Accessors::ScriptEvalFromScriptPosition); CallbacksDescriptor d(
script_descriptors = *factory()->LookupAsciiSymbol("eval_from_script_position"),
factory()->CopyAppendForeignDescriptor( *f,
script_descriptors, attribs);
factory()->LookupAsciiSymbol("eval_from_script_position"), script_descriptors->Append(&d, witness);
foreign_eval_from_script_position, }
common_attributes);
Handle<Foreign> foreign_eval_from_function_name = {
factory()->NewForeign(&Accessors::ScriptEvalFromFunctionName); Handle<Foreign> f(factory()->NewForeign(
script_descriptors = &Accessors::ScriptEvalFromFunctionName));
factory()->CopyAppendForeignDescriptor( CallbacksDescriptor d(
script_descriptors, *factory()->LookupAsciiSymbol("eval_from_function_name"),
factory()->LookupAsciiSymbol("eval_from_function_name"), *f,
foreign_eval_from_function_name, attribs);
common_attributes); script_descriptors->Append(&d, witness);
}
script_descriptors->Sort(witness);
Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
script_map->set_instance_descriptors(*script_descriptors); script_map->set_instance_descriptors(*script_descriptors);
...@@ -1639,12 +1651,17 @@ bool Genesis::InstallNatives() { ...@@ -1639,12 +1651,17 @@ bool Genesis::InstallNatives() {
array_function->set_initial_map(new_map); array_function->set_initial_map(new_map);
// Make "length" magic on instances. // Make "length" magic on instances.
Handle<DescriptorArray> array_descriptors = Handle<DescriptorArray> array_descriptors(factory()->NewDescriptorArray(1));
factory()->CopyAppendForeignDescriptor( PropertyAttributes attribs = static_cast<PropertyAttributes>(
factory()->empty_descriptor_array(), DONT_ENUM | DONT_DELETE);
factory()->length_symbol(),
factory()->NewForeign(&Accessors::ArrayLength), DescriptorArray::WhitenessWitness witness(*array_descriptors);
static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE));
{ // 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_function->initial_map()->set_instance_descriptors(
*array_descriptors); *array_descriptors);
......
...@@ -886,29 +886,6 @@ Handle<Code> Factory::CopyCode(Handle<Code> code, Vector<byte> reloc_info) { ...@@ -886,29 +886,6 @@ Handle<Code> Factory::CopyCode(Handle<Code> code, Vector<byte> reloc_info) {
} }
MUST_USE_RESULT static inline MaybeObject* DoCopyAdd(
DescriptorArray* array,
String* key,
Object* value,
PropertyAttributes attributes) {
CallbacksDescriptor desc(key, value, attributes);
MaybeObject* obj = array->CopyAdd(&desc);
return obj;
}
// Allocate the new array.
Handle<DescriptorArray> Factory::CopyAppendForeignDescriptor(
Handle<DescriptorArray> array,
Handle<String> key,
Handle<Object> value,
PropertyAttributes attributes) {
CALL_HEAP_FUNCTION(isolate(),
DoCopyAdd(*array, *key, *value, attributes),
DescriptorArray);
}
Handle<String> Factory::SymbolFromString(Handle<String> value) { Handle<String> Factory::SymbolFromString(Handle<String> value) {
CALL_HEAP_FUNCTION(isolate(), CALL_HEAP_FUNCTION(isolate(),
isolate()->heap()->LookupSymbol(*value), String); isolate()->heap()->LookupSymbol(*value), String);
......
...@@ -385,12 +385,6 @@ class Factory { ...@@ -385,12 +385,6 @@ class Factory {
Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name, Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name,
Handle<Code> code); Handle<Code> code);
Handle<DescriptorArray> CopyAppendForeignDescriptor(
Handle<DescriptorArray> array,
Handle<String> key,
Handle<Object> value,
PropertyAttributes attributes);
Handle<String> NumberToString(Handle<Object> number); Handle<String> NumberToString(Handle<Object> number);
Handle<String> Uint32ToString(uint32_t value); Handle<String> Uint32ToString(uint32_t value);
......
...@@ -151,12 +151,22 @@ TEST(StressJS) { ...@@ -151,12 +151,22 @@ TEST(StressJS) {
Handle<Map> map(function->initial_map()); Handle<Map> map(function->initial_map());
Handle<DescriptorArray> instance_descriptors(map->instance_descriptors()); Handle<DescriptorArray> instance_descriptors(map->instance_descriptors());
Handle<Foreign> foreign = FACTORY->NewForeign(&kDescriptor); Handle<Foreign> foreign = FACTORY->NewForeign(&kDescriptor);
instance_descriptors = FACTORY->CopyAppendForeignDescriptor( Handle<String> name =
instance_descriptors, FACTORY->NewStringFromAscii(Vector<const char>("get", 3));
FACTORY->NewStringFromAscii(Vector<const char>("get", 3)), ASSERT(instance_descriptors->IsEmpty());
foreign,
static_cast<PropertyAttributes>(0)); Handle<DescriptorArray> new_descriptors = FACTORY->NewDescriptorArray(1);
map->set_instance_descriptors(*instance_descriptors);
v8::internal::DescriptorArray::WhitenessWitness witness(*new_descriptors);
CallbacksDescriptor d(*name,
*foreign,
static_cast<PropertyAttributes>(0),
v8::internal::PropertyDetails::kInitialIndex);
new_descriptors->Set(0, &d, witness);
new_descriptors->SetLastAdded(0);
map->set_instance_descriptors(*new_descriptors);
// Add the Foo constructor the global object. // Add the Foo constructor the global object.
env->Global()->Set(v8::String::New("Foo"), v8::Utils::ToLocal(function)); env->Global()->Set(v8::String::New("Foo"), v8::Utils::ToLocal(function));
// Call the accessor through JavaScript. // Call the accessor through JavaScript.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment