| Index: src/compiler.cc | 
| =================================================================== | 
| --- src/compiler.cc	(revision 11812) | 
| +++ src/compiler.cc	(working copy) | 
| @@ -616,6 +616,25 @@ | 
| int compiled_size = shared->end_position() - shared->start_position(); | 
| isolate->counters()->total_compile_size()->Increment(compiled_size); | 
|  | 
| +  if (FLAG_cache_optimized_code && info->IsOptimizing()) { | 
| +    Handle<JSFunction> function = info->closure(); | 
| +    ASSERT(!function.is_null()); | 
| +    Handle<Context> global_context(function->context()->global_context()); | 
| +    int index = function->shared()->SearchOptimizedCodeMap(*global_context); | 
| +    if (index > 0) { | 
| +      if (FLAG_trace_opt) { | 
| +        PrintF("  [Found optimized code for"); | 
| +        function->PrintName(); | 
| +        PrintF("\n"); | 
| +      } | 
| +      Code* code = Code::cast( | 
| +          FixedArray::cast(shared->optimized_code_map())->get(index)); | 
| +      ASSERT(code != NULL); | 
| +      function->ReplaceCode(code); | 
| +      return true; | 
| +    } | 
| +  } | 
| + | 
| // Generate the AST for the lazily compiled function. | 
| if (ParserApi::Parse(info, kNoParsingFlags)) { | 
| // Measure how long it takes to do the lazy compilation; only take the | 
| @@ -647,6 +666,26 @@ | 
| if (info->IsOptimizing()) { | 
| ASSERT(shared->scope_info() != ScopeInfo::Empty()); | 
| function->ReplaceCode(*code); | 
| +        if (FLAG_cache_optimized_code && | 
| +            code->kind() == Code::OPTIMIZED_FUNCTION) { | 
| +          Handle<SharedFunctionInfo> shared(function->shared()); | 
| +          Handle<Context> global_context(function->context()->global_context()); | 
| + | 
| +          // Create literals array that will be shared for this global context. | 
| +          int number_of_literals = shared->num_literals(); | 
| +          Handle<FixedArray> literals = | 
| +              isolate->factory()->NewFixedArray(number_of_literals); | 
| +          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, | 
| +                          function->context()->global_context()); | 
| +          } | 
| + | 
| +          SharedFunctionInfo::AddToOptimizedCodeMap( | 
| +              shared, global_context, code, literals); | 
| +        } | 
| } else { | 
| // Update the shared function info with the compiled code and the | 
| // scope info.  Please note, that the order of the shared function | 
|  |