Chromium Code Reviews| 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); |