diff options
Diffstat (limited to 'deps/v8/src/parsing/preparse-data.cc')
-rw-r--r-- | deps/v8/src/parsing/preparse-data.cc | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/deps/v8/src/parsing/preparse-data.cc b/deps/v8/src/parsing/preparse-data.cc index 8743732ea2..460ae65a30 100644 --- a/deps/v8/src/parsing/preparse-data.cc +++ b/deps/v8/src/parsing/preparse-data.cc @@ -24,6 +24,10 @@ namespace { using ScopeSloppyEvalCanExtendVarsField = BitField8<bool, 0, 1>; using InnerScopeCallsEvalField = ScopeSloppyEvalCanExtendVarsField::Next<bool, 1>; +using NeedsPrivateNameContextChainRecalcField = + InnerScopeCallsEvalField::Next<bool, 1>; +using ShouldSaveClassVariableIndexField = + NeedsPrivateNameContextChainRecalcField::Next<bool, 1>; using VariableMaybeAssignedField = BitField8<bool, 0, 1>; using VariableContextAllocatedField = VariableMaybeAssignedField::Next<bool, 1>; @@ -322,7 +326,7 @@ void PreparseDataBuilder::SaveScopeAllocationData(DeclarationScope* scope, if (SaveDataForSkippableFunction(builder)) num_inner_with_data_++; } - // Don't save imcoplete scope information when bailed out. + // Don't save incomplete scope information when bailed out. if (!bailed_out_) { #ifdef DEBUG // function data items, kSkippableMinFunctionDataSize each. @@ -352,13 +356,20 @@ void PreparseDataBuilder::SaveDataForScope(Scope* scope) { byte_data_.WriteUint8(scope->scope_type()); #endif - uint8_t eval = + uint8_t eval_and_private_recalc = ScopeSloppyEvalCanExtendVarsField::encode( scope->is_declaration_scope() && scope->AsDeclarationScope()->sloppy_eval_can_extend_vars()) | - InnerScopeCallsEvalField::encode(scope->inner_scope_calls_eval()); + InnerScopeCallsEvalField::encode(scope->inner_scope_calls_eval()) | + NeedsPrivateNameContextChainRecalcField::encode( + scope->is_function_scope() && + scope->AsDeclarationScope() + ->needs_private_name_context_chain_recalc()) | + ShouldSaveClassVariableIndexField::encode( + scope->is_class_scope() && + scope->AsClassScope()->should_save_class_variable_index()); byte_data_.Reserve(kUint8Size); - byte_data_.WriteUint8(eval); + byte_data_.WriteUint8(eval_and_private_recalc); if (scope->is_function_scope()) { Variable* function = scope->AsDeclarationScope()->function_var(); @@ -562,7 +573,7 @@ BaseConsumedPreparseData<Data>::GetDataForSkippableFunction( template <class Data> void BaseConsumedPreparseData<Data>::RestoreScopeAllocationData( - DeclarationScope* scope) { + DeclarationScope* scope, AstValueFactory* ast_value_factory) { DCHECK_EQ(scope->scope_type(), ScopeType::FUNCTION_SCOPE); typename ByteData::ReadingScope reading_scope(this); @@ -577,14 +588,15 @@ void BaseConsumedPreparseData<Data>::RestoreScopeAllocationData( DCHECK_EQ(end_position_from_data, scope->end_position()); #endif - RestoreDataForScope(scope); + RestoreDataForScope(scope, ast_value_factory); // Check that we consumed all scope data. DCHECK_EQ(scope_data_->RemainingBytes(), 0); } template <typename Data> -void BaseConsumedPreparseData<Data>::RestoreDataForScope(Scope* scope) { +void BaseConsumedPreparseData<Data>::RestoreDataForScope( + Scope* scope, AstValueFactory* ast_value_factory) { if (scope->is_declaration_scope() && scope->AsDeclarationScope()->is_skipped_function()) { return; @@ -599,20 +611,48 @@ void BaseConsumedPreparseData<Data>::RestoreDataForScope(Scope* scope) { DCHECK_EQ(scope_data_->ReadUint8(), scope->scope_type()); CHECK(scope_data_->HasRemainingBytes(ByteData::kUint8Size)); - uint32_t eval = scope_data_->ReadUint8(); - if (ScopeSloppyEvalCanExtendVarsField::decode(eval)) scope->RecordEvalCall(); - if (InnerScopeCallsEvalField::decode(eval)) scope->RecordInnerScopeEvalCall(); + uint32_t scope_data_flags = scope_data_->ReadUint8(); + if (ScopeSloppyEvalCanExtendVarsField::decode(scope_data_flags)) { + scope->RecordEvalCall(); + } + if (InnerScopeCallsEvalField::decode(scope_data_flags)) { + scope->RecordInnerScopeEvalCall(); + } + if (NeedsPrivateNameContextChainRecalcField::decode(scope_data_flags)) { + scope->AsDeclarationScope()->RecordNeedsPrivateNameContextChainRecalc(); + } + if (ShouldSaveClassVariableIndexField::decode(scope_data_flags)) { + Variable* var; + // An anonymous class whose class variable needs to be saved do not + // have the class variable created during reparse since we skip parsing + // the inner scopes that contain potential access to static private + // methods. So create it now. + if (scope->AsClassScope()->is_anonymous_class()) { + var = scope->AsClassScope()->DeclareClassVariable( + ast_value_factory, nullptr, kNoSourcePosition); + AstNodeFactory factory(ast_value_factory, ast_value_factory->zone()); + Declaration* declaration = + factory.NewVariableDeclaration(kNoSourcePosition); + scope->declarations()->Add(declaration); + declaration->set_var(var); + } else { + var = scope->AsClassScope()->class_variable(); + DCHECK_NOT_NULL(var); + } + var->set_is_used(); + var->ForceContextAllocation(); + scope->AsClassScope()->set_should_save_class_variable_index(); + } if (scope->is_function_scope()) { Variable* function = scope->AsDeclarationScope()->function_var(); if (function != nullptr) RestoreDataForVariable(function); } - for (Variable* var : *scope->locals()) { if (IsSerializableVariableMode(var->mode())) RestoreDataForVariable(var); } - RestoreDataForInnerScopes(scope); + RestoreDataForInnerScopes(scope, ast_value_factory); } template <typename Data> @@ -651,10 +691,11 @@ void BaseConsumedPreparseData<Data>::RestoreDataForVariable(Variable* var) { } template <typename Data> -void BaseConsumedPreparseData<Data>::RestoreDataForInnerScopes(Scope* scope) { +void BaseConsumedPreparseData<Data>::RestoreDataForInnerScopes( + Scope* scope, AstValueFactory* ast_value_factory) { for (Scope* inner = scope->inner_scope(); inner != nullptr; inner = inner->sibling()) { - RestoreDataForScope(inner); + RestoreDataForScope(inner, ast_value_factory); } } @@ -731,13 +772,13 @@ ProducedPreparseData* ZoneConsumedPreparseData::GetChildData(Zone* zone, std::unique_ptr<ConsumedPreparseData> ConsumedPreparseData::For( Isolate* isolate, Handle<PreparseData> data) { DCHECK(!data.is_null()); - return base::make_unique<OnHeapConsumedPreparseData>(isolate, data); + return std::make_unique<OnHeapConsumedPreparseData>(isolate, data); } std::unique_ptr<ConsumedPreparseData> ConsumedPreparseData::For( Zone* zone, ZonePreparseData* data) { if (data == nullptr) return {}; - return base::make_unique<ZoneConsumedPreparseData>(zone, data); + return std::make_unique<ZoneConsumedPreparseData>(zone, data); } } // namespace internal |