Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index ae9d3f262556a431ebda83a927e5ace4b8480eb6..354542d56e3f44ff14420659726a56a493499aee 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -130,8 +130,8 @@ |
if (shared_info()->is_compiled()) { |
// We should initialize the CompilationInfo feedback vector from the |
// passed in shared info, rather than creating a new one. |
- feedback_metadata_ = Handle<TypeFeedbackMetadata>( |
- shared_info()->feedback_metadata(), parse_info->isolate()); |
+ feedback_vector_ = Handle<TypeFeedbackVector>( |
+ shared_info()->feedback_vector(), parse_info->isolate()); |
} |
if (shared_info()->never_compiled()) MarkAsFirstCompile(); |
} |
@@ -205,16 +205,18 @@ |
(!has_shared_info() || !shared_info()->optimization_disabled()); |
} |
-void CompilationInfo::EnsureFeedbackMetadata() { |
- if (feedback_metadata_.is_null()) { |
- feedback_metadata_ = |
+ |
+void CompilationInfo::EnsureFeedbackVector() { |
+ if (feedback_vector_.is_null()) { |
+ Handle<TypeFeedbackMetadata> feedback_metadata = |
TypeFeedbackMetadata::New(isolate(), literal()->feedback_vector_spec()); |
+ feedback_vector_ = TypeFeedbackVector::New(isolate(), feedback_metadata); |
} |
// It's very important that recompiles do not alter the structure of the |
// type feedback vector. |
- CHECK( |
- !feedback_metadata_->SpecDiffersFrom(literal()->feedback_vector_spec())); |
+ CHECK(!feedback_vector_->metadata()->SpecDiffersFrom( |
+ literal()->feedback_vector_spec())); |
} |
@@ -380,11 +382,6 @@ |
DCHECK(info()->shared_info()->has_deoptimization_support()); |
DCHECK(!info()->is_first_compile()); |
- |
- // If we have a closure make sure it has the literals array at this point. |
- if (!info()->closure().is_null()) { |
- JSFunction::EnsureLiterals(info()->closure()); |
- } |
bool optimization_disabled = info()->shared_info()->optimization_disabled(); |
bool dont_crankshaft = info()->shared_info()->dont_crankshaft(); |
@@ -815,7 +812,6 @@ |
Handle<SharedFunctionInfo> shared = info->shared_info(); |
FunctionLiteral* lit = info->literal(); |
DCHECK_EQ(shared->language_mode(), lit->language_mode()); |
- shared->set_num_literals(lit->materialized_literal_count()); |
SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); |
MaybeDisableOptimization(shared, lit->dont_optimize_reason()); |
@@ -833,7 +829,7 @@ |
// Update the code and feedback vector for the shared function info. |
shared->ReplaceCode(*info->code()); |
- shared->set_feedback_metadata(*info->feedback_metadata()); |
+ shared->set_feedback_vector(*info->feedback_vector()); |
if (info->has_bytecode_array()) { |
DCHECK(shared->function_data()->IsUndefined()); |
shared->set_function_data(*info->bytecode_array()); |
@@ -1047,7 +1043,6 @@ |
if (FLAG_always_opt) { |
Handle<Code> opt_code; |
- JSFunction::EnsureLiterals(function); |
if (Compiler::GetOptimizedCode(function, Compiler::NOT_CONCURRENT) |
.ToHandle(&opt_code)) { |
result = opt_code; |
@@ -1062,16 +1057,14 @@ |
if (function->is_compiled()) return true; |
MaybeHandle<Code> maybe_code = Compiler::GetLazyCode(function); |
Handle<Code> code; |
- Isolate* isolate = function->GetIsolate(); |
if (!maybe_code.ToHandle(&code)) { |
if (flag == CLEAR_EXCEPTION) { |
- isolate->clear_pending_exception(); |
+ function->GetIsolate()->clear_pending_exception(); |
} |
return false; |
} |
function->ReplaceCode(*code); |
DCHECK(function->is_compiled()); |
- JSFunction::EnsureLiterals(function); |
return true; |
} |
@@ -1102,7 +1095,7 @@ |
if (!FullCodeGenerator::MakeCode(&unoptimized)) return false; |
shared->EnableDeoptimizationSupport(*unoptimized.code()); |
- shared->set_feedback_metadata(*unoptimized.feedback_metadata()); |
+ shared->set_feedback_vector(*unoptimized.feedback_vector()); |
info->MarkAsCompiled(); |
@@ -1178,15 +1171,12 @@ |
bool Compiler::CompileDebugCode(Handle<JSFunction> function) { |
Handle<SharedFunctionInfo> shared(function->shared()); |
- bool result; |
if (IsEvalToplevel(shared)) { |
- result = CompileEvalForDebugging(function, shared); |
+ return CompileEvalForDebugging(function, shared); |
} else { |
CompilationInfoWithZone info(function); |
- result = CompileForDebugging(&info); |
- } |
- JSFunction::EnsureLiterals(function); |
- return result; |
+ return CompileForDebugging(&info); |
+ } |
} |
@@ -1298,7 +1288,7 @@ |
lit->name(), lit->materialized_literal_count(), lit->kind(), |
info->code(), |
ScopeInfo::Create(info->isolate(), info->zone(), info->scope()), |
- info->feedback_metadata()); |
+ info->feedback_vector()); |
if (info->has_bytecode_array()) { |
DCHECK(result->function_data()->IsUndefined()); |
result->set_function_data(*info->bytecode_array()); |
@@ -1625,10 +1615,14 @@ |
if (lazy) { |
Handle<Code> code = isolate->builtins()->CompileLazy(); |
info.SetCode(code); |
- // There's no need in theory for a lazy-compiled function to have type |
- // feedback metadata, but some parts of the system expect all |
- // SharedFunctionInfo instances to have one. |
- info.EnsureFeedbackMetadata(); |
+ // There's no need in theory for a lazy-compiled function to have a type |
+ // feedback vector, but some parts of the system expect all |
+ // SharedFunctionInfo instances to have one. The size of the vector depends |
+ // on how many feedback-needing nodes are in the tree, and when lazily |
+ // parsing we might not know that, if this function was never parsed before. |
+ // In that case the vector will be replaced the next time MakeCode is |
+ // called. |
+ info.EnsureFeedbackVector(); |
scope_info = Handle<ScopeInfo>(ScopeInfo::Empty(isolate)); |
} else if (Renumber(info.parse_info()) && GenerateBaselineCode(&info)) { |
// Code generation will ensure that the feedback vector is present and |
@@ -1648,7 +1642,7 @@ |
Handle<SharedFunctionInfo> result = |
isolate->factory()->NewSharedFunctionInfo( |
literal->name(), literal->materialized_literal_count(), |
- literal->kind(), info.code(), scope_info, info.feedback_metadata()); |
+ literal->kind(), info.code(), scope_info, info.feedback_vector()); |
if (info.has_bytecode_array()) { |
DCHECK(result->function_data()->IsUndefined()); |
result->set_function_data(*info.bytecode_array()); |
@@ -1677,7 +1671,7 @@ |
DCHECK(!existing->HasDebugCode()); |
existing->ReplaceCode(*info.code()); |
existing->set_scope_info(*scope_info); |
- existing->set_feedback_metadata(*info.feedback_metadata()); |
+ existing->set_feedback_vector(*info.feedback_vector()); |
} |
return existing; |
} |
@@ -1703,7 +1697,7 @@ |
Handle<SharedFunctionInfo> shared = isolate->factory()->NewSharedFunctionInfo( |
name, literals, FunctionKind::kNormalFunction, code, |
Handle<ScopeInfo>(fun->shared()->scope_info()), |
- Handle<TypeFeedbackMetadata>(fun->shared()->feedback_metadata())); |
+ Handle<TypeFeedbackVector>(fun->shared()->feedback_vector())); |
shared->set_construct_stub(*construct_stub); |
// Copy the function data to the shared function info. |
@@ -1750,10 +1744,6 @@ |
} |
shared->ReplaceCode(*current_code); |
} |
- |
- // At this point we know we've compiled the function, so make sure the closure |
- // points to valid literals and type-feedback-vector. |
- JSFunction::EnsureLiterals(function); |
current_code->set_profiler_ticks(0); |