Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 4088) |
+++ src/runtime.cc (working copy) |
@@ -247,7 +247,8 @@ |
static Handle<Object> CreateObjectLiteralBoilerplate( |
Handle<FixedArray> literals, |
- Handle<FixedArray> constant_properties) { |
+ Handle<FixedArray> constant_properties, |
+ bool should_have_fast_elements) { |
// Get the global context from the literals array. This is the |
// context in which the function was created and we use the object |
// function from this context to create the object literal. We do |
@@ -263,6 +264,10 @@ |
&is_result_from_cache); |
Handle<JSObject> boilerplate = Factory::NewJSObjectFromMap(map); |
+ |
+ // Normalize the elements of the boilerplate to save space if needed. |
+ if (!should_have_fast_elements) NormalizeElements(boilerplate); |
+ |
{ // Add the constant properties to the boilerplate. |
int length = constant_properties->length(); |
OptimizedObjectForAddingMultipleProperties opt(boilerplate, |
@@ -344,8 +349,10 @@ |
Handle<FixedArray> array) { |
Handle<FixedArray> elements = CompileTimeValue::GetElements(array); |
switch (CompileTimeValue::GetType(array)) { |
- case CompileTimeValue::OBJECT_LITERAL: |
- return CreateObjectLiteralBoilerplate(literals, elements); |
+ case CompileTimeValue::OBJECT_LITERAL_FAST_ELEMENTS: |
+ return CreateObjectLiteralBoilerplate(literals, elements, true); |
+ case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: |
+ return CreateObjectLiteralBoilerplate(literals, elements, false); |
case CompileTimeValue::ARRAY_LITERAL: |
return CreateArrayLiteralBoilerplate(literals, elements); |
default: |
@@ -355,26 +362,6 @@ |
} |
-static Object* Runtime_CreateObjectLiteralBoilerplate(Arguments args) { |
- HandleScope scope; |
- ASSERT(args.length() == 3); |
- // Copy the arguments. |
- CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
- CONVERT_SMI_CHECKED(literals_index, args[1]); |
- CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); |
- |
- Handle<Object> result = |
- CreateObjectLiteralBoilerplate(literals, constant_properties); |
- |
- if (result.is_null()) return Failure::Exception(); |
- |
- // Update the functions literal and return the boilerplate. |
- literals->set(literals_index, *result); |
- |
- return *result; |
-} |
- |
- |
static Object* Runtime_CreateArrayLiteralBoilerplate(Arguments args) { |
// Takes a FixedArray of elements containing the literal elements of |
// the array literal and produces JSArray with those elements. |
@@ -398,15 +385,19 @@ |
static Object* Runtime_CreateObjectLiteral(Arguments args) { |
HandleScope scope; |
- ASSERT(args.length() == 3); |
+ ASSERT(args.length() == 4); |
CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
CONVERT_SMI_CHECKED(literals_index, args[1]); |
CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); |
+ CONVERT_SMI_CHECKED(fast_elements, args[3]); |
Søren Thygesen Gjesse
2010/03/11 08:28:59
Why is this argument not a Boolean object? To save
|
+ bool should_have_fast_elements = fast_elements == 1; |
// Check if boilerplate exists. If not, create it first. |
Handle<Object> boilerplate(literals->get(literals_index)); |
if (*boilerplate == Heap::undefined_value()) { |
- boilerplate = CreateObjectLiteralBoilerplate(literals, constant_properties); |
+ boilerplate = CreateObjectLiteralBoilerplate(literals, |
+ constant_properties, |
+ should_have_fast_elements); |
if (boilerplate.is_null()) return Failure::Exception(); |
// Update the functions literal and return the boilerplate. |
literals->set(literals_index, *boilerplate); |
@@ -417,15 +408,19 @@ |
static Object* Runtime_CreateObjectLiteralShallow(Arguments args) { |
HandleScope scope; |
- ASSERT(args.length() == 3); |
+ ASSERT(args.length() == 4); |
CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
CONVERT_SMI_CHECKED(literals_index, args[1]); |
CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); |
+ CONVERT_SMI_CHECKED(fast_elements, args[3]); |
+ bool should_have_fast_elements = fast_elements == 1; |
// Check if boilerplate exists. If not, create it first. |
Handle<Object> boilerplate(literals->get(literals_index)); |
if (*boilerplate == Heap::undefined_value()) { |
- boilerplate = CreateObjectLiteralBoilerplate(literals, constant_properties); |
+ boilerplate = CreateObjectLiteralBoilerplate(literals, |
+ constant_properties, |
+ should_have_fast_elements); |
if (boilerplate.is_null()) return Failure::Exception(); |
// Update the functions literal and return the boilerplate. |
literals->set(literals_index, *boilerplate); |