Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 7bd0cea92f8eea5d28fcf0db59ead15c9ebd4671..0725a0a7d35f3148d17926c2e4d79ed2a499ed21 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -692,38 +692,40 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source, |
return result; |
} |
-FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info) { |
+FunctionLiteral* Parser::ParseLazy(CompilationInfo* info) { |
CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
HistogramTimerScope timer(&Counters::parse_lazy); |
Handle<String> source(String::cast(script_->source())); |
Counters::total_parse_size.Increment(source->length()); |
+ Handle<SharedFunctionInfo> shared_info = info->shared_info(); |
// Initialize parser state. |
source->TryFlatten(); |
if (source->IsExternalTwoByteString()) { |
ExternalTwoByteStringUC16CharacterStream stream( |
Handle<ExternalTwoByteString>::cast(source), |
- info->start_position(), |
- info->end_position()); |
+ shared_info->start_position(), |
+ shared_info->end_position()); |
FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); |
return result; |
} else { |
GenericStringUC16CharacterStream stream(source, |
- info->start_position(), |
- info->end_position()); |
+ shared_info->start_position(), |
+ shared_info->end_position()); |
FunctionLiteral* result = ParseLazy(info, &stream, &zone_scope); |
return result; |
} |
} |
-FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, |
+FunctionLiteral* Parser::ParseLazy(CompilationInfo* info, |
UC16CharacterStream* source, |
ZoneScope* zone_scope) { |
+ Handle<SharedFunctionInfo> shared_info = info->shared_info(); |
scanner_.Initialize(source); |
ASSERT(target_stack_ == NULL); |
- Handle<String> name(String::cast(info->name())); |
+ Handle<String> name(String::cast(shared_info->name())); |
fni_ = new FuncNameInferrer(); |
fni_->PushEnclosingName(name); |
@@ -735,18 +737,20 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, |
{ |
// Parse the function literal. |
Handle<String> no_name = Factory::empty_symbol(); |
- Scope* scope = |
- NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with()); |
+ Scope* scope = NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with()); |
+ if (!info->closure().is_null()) { |
+ scope = Scope::DeserializeScopeChain(info, scope); |
+ } |
LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, |
scope); |
TemporaryScope temp_scope(&this->temp_scope_); |
- if (info->strict_mode()) { |
+ if (shared_info->strict_mode()) { |
top_scope_->EnableStrictMode(); |
} |
FunctionLiteralType type = |
- info->is_expression() ? EXPRESSION : DECLARATION; |
+ shared_info->is_expression() ? EXPRESSION : DECLARATION; |
bool ok = true; |
result = ParseFunctionLiteral(name, |
false, // Strict mode name already checked. |
@@ -764,7 +768,7 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, |
zone_scope->DeleteOnExit(); |
if (stack_overflow_) Top::StackOverflow(); |
} else { |
- Handle<String> inferred_name(info->inferred_name()); |
+ Handle<String> inferred_name(shared_info->inferred_name()); |
result->set_inferred_name(inferred_name); |
} |
return result; |
@@ -5126,7 +5130,7 @@ bool ParserApi::Parse(CompilationInfo* info) { |
Handle<Script> script = info->script(); |
if (info->is_lazy()) { |
Parser parser(script, true, NULL, NULL); |
- result = parser.ParseLazy(info->shared_info()); |
+ result = parser.ParseLazy(info); |
} else { |
bool allow_natives_syntax = |
FLAG_allow_natives_syntax || Bootstrapper::IsActive(); |