Chromium Code Reviews| Index: src/factory.cc |
| =================================================================== |
| --- src/factory.cc (revision 11527) |
| +++ src/factory.cc (working copy) |
| @@ -551,17 +551,45 @@ |
| result->set_context(*context); |
| if (!function_info->bound()) { |
| - int number_of_literals = function_info->num_literals(); |
| - Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure); |
| - if (number_of_literals > 0) { |
| - // Store the object, regexp and array functions in the literals |
| - // array prefix. These functions will be used when creating |
| - // object, regexp and array literals in this function. |
| - literals->set(JSFunction::kLiteralGlobalContextIndex, |
| - context->global_context()); |
| + int index = FLAG_cache_optimized_code |
| + ? function_info->SearchOptimizedCodeMap(context->global_context()) |
|
Michael Starzinger
2012/06/14 13:51:32
We need to do this search anyways, even if the fun
Florian Schneider
2012/06/14 14:02:41
Good point. Done.
|
| + : -1; |
| + if (index > 0) { |
| + FixedArray* code_map = |
| + FixedArray::cast(function_info->optimized_code_map()); |
| + FixedArray* cached_literals = FixedArray::cast(code_map->get(index + 1)); |
| + ASSERT(cached_literals != NULL); |
| + ASSERT(function_info->num_literals() == 0 || |
| + (code_map->get(index - 1) == |
| + cached_literals->get(JSFunction::kLiteralGlobalContextIndex))); |
| + result->set_literals(cached_literals); |
| + } else { |
| + int number_of_literals = function_info->num_literals(); |
| + Handle<FixedArray> literals = |
| + NewFixedArray(number_of_literals, pretenure); |
| + if (number_of_literals > 0) { |
| + // Store the object, regexp and array functions in the literals |
| + // array prefix. These functions will be used when creating |
| + // object, regexp and array literals in this function. |
| + literals->set(JSFunction::kLiteralGlobalContextIndex, |
| + context->global_context()); |
| + } |
| + result->set_literals(*literals); |
| } |
| - result->set_literals(*literals); |
| } |
| + |
| + if (FLAG_cache_optimized_code) { |
| + int index = |
| + function_info->SearchOptimizedCodeMap(context->global_context()); |
|
Michael Starzinger
2012/06/14 13:51:32
Drop this search and the outer flag check.
Florian Schneider
2012/06/14 14:02:41
Done.
|
| + if (index > 0) { |
| + Code* code = Code::cast( |
| + FixedArray::cast(function_info->optimized_code_map())->get(index)); |
| + ASSERT(code != NULL); |
| + result->ReplaceCode(code); |
| + return result; |
| + } |
| + } |
| + |
| if (V8::UseCrankshaft() && |
| FLAG_always_opt && |
| result->is_compiled() && |