Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index b5cdc1e5e66fd0aaeddbcbf74f008a2c70696e05..89864e049ba49fdad495cd2172abf3a347e1fc19 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -141,6 +141,15 @@ void CompilationInfo::Initialize(Isolate* isolate, |
SetLanguageMode(shared_info_->language_mode()); |
} |
set_bailout_reason(kUnknown); |
+ |
+ if (!shared_info().is_null()) { |
+ FixedArray* info_feedback_vector = shared_info()->feedback_vector(); |
+ if (info_feedback_vector->length() > 0) { |
+ // We should initialize the CompilationInfo feedback vector from the |
+ // passed in shared info, rather than creating a new one. |
+ feedback_vector_ = Handle<FixedArray>(info_feedback_vector, isolate); |
+ } |
+ } |
} |
@@ -250,6 +259,20 @@ void CompilationInfo::PrepareForCompilation(Scope* scope) { |
ASSERT(scope_ == NULL); |
scope_ = scope; |
function()->ProcessFeedbackSlots(isolate_); |
+ int length = function()->slot_count(); |
+ if (feedback_vector_.is_null()) { |
+ // Allocate the feedback vector too. |
+ feedback_vector_ = isolate()->factory()->NewFixedArray(length, TENURED); |
+ // Ensure we can skip the write barrier |
+ ASSERT_EQ(isolate()->heap()->uninitialized_symbol(), |
+ *TypeFeedbackInfo::UninitializedSentinel(isolate())); |
+ for (int i = 0; i < length; i++) { |
+ feedback_vector_->set(i, |
+ *TypeFeedbackInfo::UninitializedSentinel(isolate()), |
+ SKIP_WRITE_BARRIER); |
+ } |
+ } |
+ ASSERT(feedback_vector_->length() == length); |
} |
@@ -571,6 +594,8 @@ static void UpdateSharedFunctionInfo(CompilationInfo* info) { |
shared->ReplaceCode(*code); |
if (shared->optimization_disabled()) code->set_optimizable(false); |
+ shared->set_feedback_vector(*info->feedback_vector()); |
+ |
// Set the expected number of properties for instances. |
FunctionLiteral* lit = info->function(); |
int expected = lit->expected_property_count(); |
@@ -826,7 +851,8 @@ static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { |
lit->materialized_literal_count(), |
lit->is_generator(), |
info->code(), |
- ScopeInfo::Create(info->scope(), info->zone())); |
+ ScopeInfo::Create(info->scope(), info->zone()), |
+ info->feedback_vector()); |
ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position()); |
SetFunctionInfo(result, lit, true, script); |
@@ -1033,7 +1059,8 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal, |
literal->materialized_literal_count(), |
literal->is_generator(), |
info.code(), |
- scope_info); |
+ scope_info, |
+ info.feedback_vector()); |
SetFunctionInfo(result, literal, false, script); |
RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); |
result->set_allows_lazy_compilation(allow_lazy); |