Revision: 12133
Author: [email protected]
Date: Wed Jul 18 07:00:58 2012
Log: Removed CopyAppendForeignDescriptor.
Use descriptor array preallocation + appending instead.
Review URL: https://chromiumcodereview.appspot.com/10782033
http://code.google.com/p/v8/source/detail?r=12133
Modified:
/branches/bleeding_edge/src/bootstrapper.cc
/branches/bleeding_edge/src/factory.cc
/branches/bleeding_edge/src/factory.h
/branches/bleeding_edge/test/cctest/test-alloc.cc
=======================================
--- /branches/bleeding_edge/src/bootstrapper.cc Wed Jul 18 05:27:29 2012
+++ /branches/bleeding_edge/src/bootstrapper.cc Wed Jul 18 07:00:58 2012
@@ -868,15 +868,22 @@
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
@@ -910,15 +917,18 @@
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());
@@ -1474,112 +1484,114 @@
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);
@@ -1639,12 +1651,17 @@
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);
=======================================
--- /branches/bleeding_edge/src/factory.cc Tue Jul 17 06:50:19 2012
+++ /branches/bleeding_edge/src/factory.cc Wed Jul 18 07:00:58 2012
@@ -884,29 +884,6 @@
isolate()->heap()->CopyCode(*code, reloc_info),
Code);
}
-
-
-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) {
=======================================
--- /branches/bleeding_edge/src/factory.h Tue Jul 17 06:50:19 2012
+++ /branches/bleeding_edge/src/factory.h Wed Jul 18 07:00:58 2012
@@ -385,12 +385,6 @@
Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name,
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> Uint32ToString(uint32_t value);
=======================================
--- /branches/bleeding_edge/test/cctest/test-alloc.cc Fri Jun 22 02:29:49
2012
+++ /branches/bleeding_edge/test/cctest/test-alloc.cc Wed Jul 18 07:00:58
2012
@@ -151,12 +151,22 @@
Handle<Map> map(function->initial_map());
Handle<DescriptorArray>
instance_descriptors(map->instance_descriptors());
Handle<Foreign> foreign = FACTORY->NewForeign(&kDescriptor);
- instance_descriptors = FACTORY->CopyAppendForeignDescriptor(
- instance_descriptors,
- FACTORY->NewStringFromAscii(Vector<const char>("get", 3)),
- foreign,
- static_cast<PropertyAttributes>(0));
- map->set_instance_descriptors(*instance_descriptors);
+ Handle<String> name =
+ FACTORY->NewStringFromAscii(Vector<const char>("get", 3));
+ ASSERT(instance_descriptors->IsEmpty());
+
+ Handle<DescriptorArray> new_descriptors = FACTORY->NewDescriptorArray(1);
+
+ 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.
env->Global()->Set(v8::String::New("Foo"), v8::Utils::ToLocal(function));
// Call the accessor through JavaScript.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev