Index: src/factory.cc |
=================================================================== |
--- src/factory.cc (revision 11812) |
+++ src/factory.cc (working copy) |
@@ -554,18 +554,44 @@ |
} |
result->set_context(*context); |
+ |
+ int index = FLAG_cache_optimized_code |
+ ? function_info->SearchOptimizedCodeMap(context->global_context()) |
+ : -1; |
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()); |
+ 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 (index > 0) { |
+ // Caching of optimized code enabled and optimized code found. |
+ 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() && |