| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 603b6c8a33cc78ddbd753511bf0661fe29536845..8cc02b4da358e84883a4a9141856545aab729dcc 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -857,6 +857,31 @@ Parser::Parser(ParseInfo* info)
|
| }
|
| }
|
|
|
| +void Parser::DeserializeScopeChain(
|
| + ParseInfo* info, Handle<Context> context,
|
| + Scope::DeserializationMode deserialization_mode) {
|
| + // TODO(wingo): Add an outer SCRIPT_SCOPE corresponding to the native
|
| + // context, which will have the "this" binding for script scopes.
|
| + Scope* scope = NewScriptScope();
|
| + info->set_script_scope(scope);
|
| + if (!context.is_null() && !context->IsNativeContext()) {
|
| + scope =
|
| + Scope::DeserializeScopeChain(info->isolate(), zone(), *context, scope,
|
| + ast_value_factory(), deserialization_mode);
|
| + if (info->context().is_null()) {
|
| + DCHECK(deserialization_mode ==
|
| + Scope::DeserializationMode::kDeserializeOffHeap);
|
| + } else {
|
| + // The Scope is backed up by ScopeInfo (which is in the V8 heap); this
|
| + // means the Parser cannot operate independent of the V8 heap. Tell the
|
| + // string table to internalize strings and values right after they're
|
| + // created. This kind of parsing can only be done in the main thread.
|
| + DCHECK(parsing_on_main_thread_);
|
| + ast_value_factory()->Internalize(info->isolate());
|
| + }
|
| + }
|
| + original_scope_ = scope;
|
| +}
|
|
|
| FunctionLiteral* Parser::ParseProgram(Isolate* isolate, ParseInfo* info) {
|
| // TODO(bmeurer): We temporarily need to pass allow_nesting = true here,
|
| @@ -886,6 +911,9 @@ FunctionLiteral* Parser::ParseProgram(Isolate* isolate, ParseInfo* info) {
|
| cached_parse_data_->Initialize();
|
| }
|
|
|
| + DeserializeScopeChain(info, info->context(),
|
| + Scope::DeserializationMode::kKeepScopeInfo);
|
| +
|
| source = String::Flatten(source);
|
| FunctionLiteral* result;
|
|
|
| @@ -942,22 +970,8 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
|
|
|
| FunctionLiteral* result = NULL;
|
| {
|
| - // TODO(wingo): Add an outer SCRIPT_SCOPE corresponding to the native
|
| - // context, which will have the "this" binding for script scopes.
|
| - Scope* scope = NewScriptScope();
|
| - info->set_script_scope(scope);
|
| - if (!info->context().is_null() && !info->context()->IsNativeContext()) {
|
| - scope = Scope::DeserializeScopeChain(info->isolate(), zone(),
|
| - *info->context(), scope,
|
| - ast_value_factory());
|
| - // The Scope is backed up by ScopeInfo (which is in the V8 heap); this
|
| - // means the Parser cannot operate independent of the V8 heap. Tell the
|
| - // string table to internalize strings and values right after they're
|
| - // created. This kind of parsing can only be done in the main thread.
|
| - DCHECK(parsing_on_main_thread_);
|
| - ast_value_factory()->Internalize(info->isolate());
|
| - }
|
| - original_scope_ = scope;
|
| + Scope* scope = original_scope_;
|
| + DCHECK(scope);
|
| if (info->is_eval()) {
|
| if (!scope->is_script_scope() || is_strict(info->language_mode())) {
|
| parsing_mode = PARSE_EAGERLY;
|
| @@ -1048,6 +1062,8 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info) {
|
| timer.Start();
|
| }
|
| Handle<SharedFunctionInfo> shared_info = info->shared_info();
|
| + DeserializeScopeChain(info, info->context(),
|
| + Scope::DeserializationMode::kKeepScopeInfo);
|
|
|
| // Initialize parser state.
|
| source = String::Flatten(source);
|
| @@ -1110,16 +1126,8 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info,
|
|
|
| {
|
| // Parse the function literal.
|
| - Scope* scope = NewScriptScope();
|
| - info->set_script_scope(scope);
|
| - if (!info->context().is_null()) {
|
| - // Ok to use Isolate here, since lazy function parsing is only done in the
|
| - // main thread.
|
| - DCHECK(parsing_on_main_thread_);
|
| - scope = Scope::DeserializeScopeChain(isolate, zone(), *info->context(),
|
| - scope, ast_value_factory());
|
| - }
|
| - original_scope_ = scope;
|
| + Scope* scope = original_scope_;
|
| + DCHECK(scope);
|
| FunctionState function_state(&function_state_, &scope_state_, scope,
|
| shared_info->kind());
|
| DCHECK(is_sloppy(scope->language_mode()) ||
|
| @@ -5469,6 +5477,8 @@ void Parser::ParseOnBackground(ParseInfo* info) {
|
| scanner_.Initialize(stream_ptr);
|
| DCHECK(info->context().is_null() || info->context()->IsNativeContext());
|
|
|
| + DCHECK(original_scope_);
|
| +
|
| // When streaming, we don't know the length of the source until we have parsed
|
| // it. The raw data can be UTF-8, so we wouldn't know the source length until
|
| // we have decoded it anyway even if we knew the raw data length (which we
|
|
|