summaryrefslogtreecommitdiff
path: root/deps/v8/src/parsing/preparse-data.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/parsing/preparse-data.cc')
-rw-r--r--deps/v8/src/parsing/preparse-data.cc73
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