Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 0cf7459053f4ab35407785071e431653eec68e49..2d0cf06cbd0a8572b2192a2a284ac0d023652729 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -460,29 +460,12 @@ |
return true; |
} |
-void EnsureSharedFunctionInfosArrayOnScript(ParseInfo* info) { |
- DCHECK(info->is_toplevel()); |
- DCHECK(!info->script().is_null()); |
- if (info->script()->shared_function_infos()->length() > 0) { |
- DCHECK_EQ(info->script()->shared_function_infos()->length(), |
- info->max_function_literal_id() + 1); |
- return; |
- } |
- Isolate* isolate = info->isolate(); |
- Handle<FixedArray> infos( |
- isolate->factory()->NewFixedArray(info->max_function_literal_id() + 1)); |
- info->script()->set_shared_function_infos(*infos); |
-} |
- |
MUST_USE_RESULT MaybeHandle<Code> GetUnoptimizedCode(CompilationInfo* info) { |
VMState<COMPILER> state(info->isolate()); |
PostponeInterruptsScope postpone(info->isolate()); |
// Parse and update CompilationInfo with the results. |
if (!parsing::ParseAny(info->parse_info())) return MaybeHandle<Code>(); |
- if (info->parse_info()->is_toplevel()) { |
- EnsureSharedFunctionInfosArrayOnScript(info->parse_info()); |
- } |
DCHECK_EQ(info->shared_info()->language_mode(), |
info->literal()->language_mode()); |
@@ -987,8 +970,6 @@ |
return Handle<SharedFunctionInfo>::null(); |
} |
- EnsureSharedFunctionInfosArrayOnScript(parse_info); |
- |
FunctionLiteral* lit = parse_info->literal(); |
// Measure how long it takes to do the compilation; only take the |
@@ -1051,7 +1032,6 @@ |
bool Compiler::ParseAndAnalyze(ParseInfo* info) { |
if (!parsing::ParseAny(info)) return false; |
- if (info->is_toplevel()) EnsureSharedFunctionInfosArrayOnScript(info); |
if (!Compiler::Analyze(info)) return false; |
DCHECK_NOT_NULL(info->literal()); |
DCHECK_NOT_NULL(info->scope()); |
@@ -1172,9 +1152,8 @@ |
// In order to ensure that live edit function info collection finds the newly |
// generated shared function infos, clear the script's list temporarily |
// and restore it at the end of this method. |
- Handle<FixedArray> old_function_infos(script->shared_function_infos(), |
- isolate); |
- script->set_shared_function_infos(isolate->heap()->empty_fixed_array()); |
+ Handle<Object> old_function_infos(script->shared_function_infos(), isolate); |
+ script->set_shared_function_infos(Smi::kZero); |
// Start a compilation. |
Zone zone(isolate->allocator(), ZONE_NAME); |
@@ -1559,7 +1538,15 @@ |
MaybeHandle<SharedFunctionInfo> maybe_existing; |
// Find any previously allocated shared function info for the given literal. |
- maybe_existing = script->FindSharedFunctionInfo(isolate, literal); |
+ if (outer_info->shared_info()->never_compiled()) { |
+ // On the first compile, there are no existing shared function info for |
+ // inner functions yet, so do not try to find them. All bets are off for |
+ // live edit though. |
+ SLOW_DCHECK(script->FindSharedFunctionInfo(literal).is_null() || |
+ isolate->debug()->live_edit_enabled()); |
+ } else { |
+ maybe_existing = script->FindSharedFunctionInfo(literal); |
+ } |
// We found an existing shared function info. If it has any sort of code |
// attached, don't worry about compiling and simply return it. Otherwise, |
@@ -1582,6 +1569,11 @@ |
result = |
isolate->factory()->NewSharedFunctionInfoForLiteral(literal, script); |
result->set_is_toplevel(false); |
+ |
+ // If the outer function has been compiled before, we cannot be sure that |
+ // shared function info for this function literal has been created for the |
+ // first time. It may have already been compiled previously. |
+ result->set_never_compiled(outer_info->shared_info()->never_compiled()); |
} |
Zone zone(isolate->allocator(), ZONE_NAME); |