Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 1431) |
+++ src/runtime.cc (working copy) |
@@ -99,9 +99,9 @@ |
static Handle<Map> ComputeObjectLiteralMap( |
- Handle<Context> context, |
- Handle<FixedArray> constant_properties, |
- bool* is_result_from_cache) { |
+ Handle<Context> context, |
+ Handle<FixedArray> constant_properties, |
+ bool* is_result_from_cache) { |
int number_of_properties = constant_properties->length() / 2; |
if (FLAG_canonicalize_object_literal_maps) { |
// First find prefix of consecutive symbol keys. |
@@ -131,14 +131,9 @@ |
} |
-static Object* Runtime_CreateObjectLiteralBoilerplate(Arguments args) { |
- HandleScope scope; |
- ASSERT(args.length() == 3); |
- // Copy the arguments. |
- Handle<FixedArray> literals = args.at<FixedArray>(0); |
- int literals_index = Smi::cast(args[1])->value(); |
- Handle<FixedArray> constant_properties = args.at<FixedArray>(2); |
- |
+static Handle<Object> CreateObjectLiteralBoilerplate( |
+ Handle<FixedArray> literals, |
+ Handle<FixedArray> constant_properties) { |
// 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 |
@@ -161,6 +156,12 @@ |
for (int index = 0; index < length; index +=2) { |
Handle<Object> key(constant_properties->get(index+0)); |
Handle<Object> value(constant_properties->get(index+1)); |
+ if (value->IsFixedArray()) { |
+ // The value contains the constant_properties of a |
+ // simple object literal. |
+ Handle<FixedArray> array = Handle<FixedArray>::cast(value); |
+ value = CreateObjectLiteralBoilerplate(literals, array); |
+ } |
Handle<Object> result; |
uint32_t element_index = 0; |
if (key->IsSymbol()) { |
@@ -185,14 +186,31 @@ |
// exception, the exception is converted to an empty handle in |
// the handle based operations. In that case, we need to |
// convert back to an exception. |
- if (result.is_null()) return Failure::Exception(); |
+ if (result.is_null()) return result; |
} |
} |
+ return boilerplate; |
+} |
+ |
+ |
+static Object* Runtime_CreateObjectLiteralBoilerplate(Arguments args) { |
+ HandleScope scope; |
+ ASSERT(args.length() == 3); |
+ // Copy the arguments. |
+ Handle<FixedArray> literals = args.at<FixedArray>(0); |
+ int literals_index = Smi::cast(args[1])->value(); |
+ Handle<FixedArray> constant_properties = args.at<FixedArray>(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, *boilerplate); |
+ literals->set(literals_index, *result);; |
- return *boilerplate; |
+ return *result; |
} |