Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 07f842a119b06e9c83fb3ad647e990a1d1cedb0c..188500d66a0b8b7ad3e0bb86bd3dfa423fc26f8d 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -4206,10 +4206,40 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
} |
} |
if (!is_lazily_parsed) { |
+ // Determine whether the function body can be discarded after parsing. |
+ // The preconditions are: |
+ // - Lazy compilation has to be enabled. |
+ // - Neither V8 natives nor native function declarations can be allowed, |
+ // since parsing one would retroactively force the function to be |
+ // eagerly compiled. |
+ // - The invoker of this parser can't depend on the AST being eagerly |
+ // built (either because the function is about to be compiled, or |
+ // because the AST is going to be inspected for some reason). |
+ // - Because of the above, we can't be attempting to parse a |
+ // FunctionExpression; even without enclosing parentheses it might be |
+ // immediately invoked. |
+ // - The function literal shouldn't be hinted to eagerly compile. |
+ bool can_use_temp_zone = |
+ FLAG_lazy && !allow_natives() && extension_ == NULL && allow_lazy() && |
+ function_type == FunctionLiteral::DECLARATION && |
+ eager_compile_hint != FunctionLiteral::kShouldEagerCompile; |
+ Zone* outer_zone = factory()->zone(); |
+ Zone temp_zone; |
+ if (can_use_temp_zone) { |
+ // For the purpose of scope analysis, some HeapObjects allocated by the |
+ // factory must persist after the function body is thrown away and |
+ // temp_zone is deallocated. These objects are instead allocated in a |
+ // parser-persistent zone (see parser_zone_ in AstNodeFactory). |
+ factory()->set_zone(&temp_zone); |
+ } |
body = ParseEagerFunctionBody(function_name, pos, formals, kind, |
function_type, CHECK_OK); |
materialized_literal_count = function_state.materialized_literal_count(); |
expected_property_count = function_state.expected_property_count(); |
+ if (can_use_temp_zone) { |
+ body = NULL; |
+ factory()->set_zone(outer_zone); |
Michael Starzinger
2015/09/10 12:16:54
Suggestion as discsussed offline: This explicit re
conradw
2015/09/10 13:12:40
Sounds good! Done.
|
+ } |
} |
// Parsing the body may change the language mode in our scope. |