From dc8f487baee519ac8bfb35efc759c260fe4d8ddb Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Tue, 8 Mar 2022 18:06:14 +0000 Subject: [PATCH] [vm] Cleanup unused SourceLabel and NameReference TEST=ci Change-Id: Iffe90eca5b84f76ec2a1d22a31939b51f726909b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235862 Reviewed-by: Ryan Macnak Commit-Queue: Alexander Markov --- runtime/vm/parser.h | 9 --- runtime/vm/scopes.cc | 145 +------------------------------------- runtime/vm/scopes.h | 105 --------------------------- runtime/vm/scopes_test.cc | 5 -- 4 files changed, 1 insertion(+), 263 deletions(-) diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h index 0916e2a52f5..2a6d1b85baf 100644 --- a/runtime/vm/parser.h +++ b/runtime/vm/parser.h @@ -35,19 +35,10 @@ class Isolate; class LocalScope; class LocalVariable; struct RegExpCompileData; -class SourceLabel; template class GrowableArray; class Parser; -struct CatchParamDesc; -class ClassDesc; -struct MemberDesc; -struct ParamList; -struct QualIdent; -class TopLevel; -class RecursionChecker; - // The class ParsedFunction holds the result of parsing a function. class ParsedFunction : public ZoneAllocated { public: diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc index 7a966aced37..b155a46db5e 100644 --- a/runtime/vm/scopes.cc +++ b/runtime/vm/scopes.cc @@ -21,11 +21,6 @@ DEFINE_FLAG(bool, "enclosing scope (up to innermost loop) and spare the allocation " "of a local context."); -int SourceLabel::FunctionLevel() const { - ASSERT(owner() != NULL); - return owner()->function_level(); -} - LocalScope::LocalScope(LocalScope* parent, int function_level, int loop_level) : parent_(parent), child_(NULL), @@ -36,11 +31,9 @@ LocalScope::LocalScope(LocalScope* parent, int function_level, int loop_level) begin_token_pos_(TokenPosition::kNoSource), end_token_pos_(TokenPosition::kNoSource), variables_(), - labels_(), context_variables_(), context_slots_(new (Thread::Current()->zone()) - ZoneGrowableArray()), - referenced_() { + ZoneGrowableArray()) { // Hook this node into the children of the parent, unless the parent has a // different function_level, since the local scope of a nested function can // be discarded after it has been parsed. @@ -87,66 +80,6 @@ bool LocalScope::InsertParameterAt(intptr_t pos, LocalVariable* parameter) { return true; } -bool LocalScope::AddLabel(SourceLabel* label) { - if (LocalLookupLabel(label->name()) != NULL) { - return false; - } - labels_.Add(label); - if (label->owner() == NULL) { - // Labels must be added to their owner scope first. Subsequent calls - // to 'add' treat the label as an alias. - label->set_owner(this); - } - return true; -} - -void LocalScope::MoveLabel(SourceLabel* label) { - ASSERT(LocalLookupLabel(label->name()) == NULL); - ASSERT(label->kind() == SourceLabel::kForward); - labels_.Add(label); - label->set_owner(this); -} - -NameReference* LocalScope::FindReference(const String& name) const { - ASSERT(name.IsSymbol()); - intptr_t num_references = referenced_.length(); - for (intptr_t i = 0; i < num_references; i++) { - if (name.ptr() == referenced_[i]->name().ptr()) { - return referenced_[i]; - } - } - return NULL; -} - -void LocalScope::AddReferencedName(TokenPosition token_pos, - const String& name) { - if (LocalLookupVariable(name) != NULL) { - return; - } - NameReference* ref = FindReference(name); - if (ref != NULL) { - ref->set_token_pos(token_pos); - return; - } - ref = new NameReference(token_pos, name); - referenced_.Add(ref); - // Add name reference in innermost enclosing scopes that do not - // define a local variable with this name. - LocalScope* scope = this->parent(); - while (scope != NULL && (scope->LocalLookupVariable(name) == NULL)) { - scope->referenced_.Add(ref); - scope = scope->parent(); - } -} - -TokenPosition LocalScope::PreviousReferencePos(const String& name) const { - NameReference* ref = FindReference(name); - if (ref != NULL) { - return ref->token_pos(); - } - return TokenPosition::kNoSource; -} - void LocalScope::AllocateContextVariable(LocalVariable* variable, LocalScope** context_owner) { ASSERT(variable->is_captured()); @@ -464,17 +397,6 @@ void LocalScope::CollectLocalVariables(LocalVarDescriptorsBuilder* vars, } } -SourceLabel* LocalScope::LocalLookupLabel(const String& name) const { - ASSERT(name.IsSymbol()); - for (intptr_t i = 0; i < labels_.length(); i++) { - SourceLabel* label = labels_[i]; - if (label->name().ptr() == name.ptr()) { - return label; - } - } - return NULL; -} - LocalVariable* LocalScope::LocalLookupVariable(const String& name) const { ASSERT(name.IsSymbol()); for (intptr_t i = 0; i < variables_.length(); i++) { @@ -529,71 +451,6 @@ void LocalScope::CaptureVariable(LocalVariable* variable) { } } -SourceLabel* LocalScope::LookupLabel(const String& name) { - LocalScope* current_scope = this; - while (current_scope != NULL) { - SourceLabel* label = current_scope->LocalLookupLabel(name); - if (label != NULL) { - return label; - } - current_scope = current_scope->parent(); - } - return NULL; -} - -SourceLabel* LocalScope::LookupInnermostLabel(Token::Kind jump_kind) { - ASSERT((jump_kind == Token::kCONTINUE) || (jump_kind == Token::kBREAK)); - LocalScope* current_scope = this; - while (current_scope != NULL) { - for (intptr_t i = 0; i < current_scope->labels_.length(); i++) { - SourceLabel* label = current_scope->labels_[i]; - if ((label->kind() == SourceLabel::kWhile) || - (label->kind() == SourceLabel::kFor) || - (label->kind() == SourceLabel::kDoWhile) || - ((jump_kind == Token::kBREAK) && - (label->kind() == SourceLabel::kSwitch))) { - return label; - } - } - current_scope = current_scope->parent(); - } - return NULL; -} - -LocalScope* LocalScope::LookupSwitchScope() { - LocalScope* current_scope = this->parent(); - int this_level = this->function_level(); - while (current_scope != NULL && - current_scope->function_level() == this_level) { - for (int i = 0; i < current_scope->labels_.length(); i++) { - SourceLabel* label = current_scope->labels_[i]; - if (label->kind() == SourceLabel::kSwitch) { - // This scope contains a label that is bound to a switch statement, - // so it is the scope of the a statement body. - return current_scope; - } - } - current_scope = current_scope->parent(); - } - // We did not find a switch statement scope at the same function level. - return NULL; -} - -SourceLabel* LocalScope::CheckUnresolvedLabels() { - for (int i = 0; i < this->labels_.length(); i++) { - SourceLabel* label = this->labels_[i]; - if (label->kind() == SourceLabel::kForward) { - LocalScope* outer_switch = LookupSwitchScope(); - if (outer_switch == NULL) { - return label; - } else { - outer_switch->MoveLabel(label); - } - } - } - return NULL; -} - int LocalScope::NumCapturedVariables() const { // It is not necessary to traverse parent scopes, since we are only interested // in the captured variables referenced in this scope. If this scope is the diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h index ff80167d61c..3751aab901a 100644 --- a/runtime/vm/scopes.h +++ b/runtime/vm/scopes.h @@ -276,71 +276,6 @@ class LocalVarDescriptorsBuilder : public ValueObject { GrowableArray vars_; }; -class NameReference : public ZoneAllocated { - public: - NameReference(TokenPosition token_pos, const String& name) - : token_pos_(token_pos), name_(name) { - ASSERT(name.IsSymbol()); - } - const String& name() const { return name_; } - TokenPosition token_pos() const { return token_pos_; } - void set_token_pos(TokenPosition value) { token_pos_ = value; } - - private: - TokenPosition token_pos_; - const String& name_; -}; - -class SourceLabel : public ZoneAllocated { - public: - enum Kind { - kFor, - kWhile, - kDoWhile, - kSwitch, - kCase, - kTry, - kCatch, - kForward, - kStatement // Any statement other than the above - }; - - SourceLabel(TokenPosition token_pos, const String& name, Kind kind) - : token_pos_(token_pos), name_(name), owner_(NULL), kind_(kind) { - ASSERT(name.IsSymbol()); - } - - static SourceLabel* New(TokenPosition token_pos, String* name, Kind kind) { - if (name != NULL) { - return new SourceLabel(token_pos, *name, kind); - } else { - return new SourceLabel(token_pos, Symbols::DefaultLabel(), kind); - } - } - - TokenPosition token_pos() const { return token_pos_; } - const String& name() const { return name_; } - LocalScope* owner() const { return owner_; } - void set_owner(LocalScope* owner) { owner_ = owner; } - - Kind kind() const { return kind_; } - - // Returns the function level of the scope in which the label is defined. - int FunctionLevel() const; - - bool IsUnresolved() { return kind_ == kForward; } - void ResolveForwardReference() { kind_ = kCase; } - - private: - const TokenPosition token_pos_; - const String& name_; - LocalScope* owner_; // Local scope declaring this label. - - Kind kind_; - - DISALLOW_COPY_AND_ASSIGN(SourceLabel); -}; - class LocalScope : public ZoneAllocated { public: LocalScope(LocalScope* parent, int function_level, int loop_level); @@ -403,19 +338,9 @@ class LocalScope : public ZoneAllocated { // Returns false if a variable with the same name is already present. bool InsertParameterAt(intptr_t pos, LocalVariable* parameter); - // Add a label to the scope. Returns false if a label with the same name - // is already present. - bool AddLabel(SourceLabel* label); - - // Move an unresolved label of a switch case label to an outer switch. - void MoveLabel(SourceLabel* label); - // Lookup a variable in this scope only. LocalVariable* LocalLookupVariable(const String& name) const; - // Lookup a label in this scope only. - SourceLabel* LocalLookupLabel(const String& name) const; - // Lookup a variable in this scope and its parents. If the variable // is found in a parent scope and 'test_only' is not true, we insert // aliases of the variable in the current and intermediate scopes up to @@ -423,26 +348,9 @@ class LocalScope : public ZoneAllocated { // We mark a variable as 'captured' when applicable. LocalVariable* LookupVariable(const String& name, bool test_only); - // Lookup a label in this scope and its parents. - SourceLabel* LookupLabel(const String& name); - - // Lookup the "innermost" label that labels a for, while, do, or switch - // statement. - SourceLabel* LookupInnermostLabel(Token::Kind jump_kind); - - // Lookup scope of outer switch statement at same function level. - // Returns NULL if this scope is not embedded in a switch. - LocalScope* LookupSwitchScope(); - // Mark this variable as captured by this scope. void CaptureVariable(LocalVariable* variable); - // Look for unresolved forward references to labels in this scope. - // If there are any, propagate the forward reference to the next - // outer scope of a switch statement. If there is no outer switch - // statement, return the first unresolved label found. - SourceLabel* CheckUnresolvedLabels(); - // Accessing the variables in the scope. intptr_t num_variables() const { return variables_.length(); } LocalVariable* VariableAt(intptr_t index) const { @@ -454,12 +362,6 @@ class LocalScope : public ZoneAllocated { // this local scope. int NumCapturedVariables() const; - // Add a reference to the given name into this scope and the enclosing - // scopes that do not have a local variable declaration for this name - // already. - void AddReferencedName(TokenPosition token_pos, const String& name); - TokenPosition PreviousReferencePos(const String& name) const; - // Allocate both captured and non-captured variables declared in this scope // and in its children scopes of the same function level. Allocating means // assigning a frame slot index or a context slot index. @@ -512,8 +414,6 @@ class LocalScope : public ZoneAllocated { void CollectLocalVariables(LocalVarDescriptorsBuilder* vars, int16_t* scope_id); - NameReference* FindReference(const String& name) const; - static const int kUninitializedContextLevel = INT_MIN; LocalScope* parent_; LocalScope* child_; @@ -524,17 +424,12 @@ class LocalScope : public ZoneAllocated { TokenPosition begin_token_pos_; // Token index of beginning of scope. TokenPosition end_token_pos_; // Token index of end of scope. GrowableArray variables_; - GrowableArray labels_; // List of variables allocated into the context which is owned by this scope, // and their corresponding Slots. GrowableArray context_variables_; ZoneGrowableArray* context_slots_; - // List of names referenced in this scope and its children that - // are not resolved to local variables. - GrowableArray referenced_; - DISALLOW_COPY_AND_ASSIGN(LocalScope); }; diff --git a/runtime/vm/scopes_test.cc b/runtime/vm/scopes_test.cc index 1005d4c2dd3..e54d49eabed 100644 --- a/runtime/vm/scopes_test.cc +++ b/runtime/vm/scopes_test.cc @@ -22,9 +22,6 @@ ISOLATE_UNIT_TEST_CASE(LocalScope) { const String& c = String::ZoneHandle(Symbols::New(thread, "c")); LocalVariable* var_c = new LocalVariable( TokenPosition::kNoSource, TokenPosition::kNoSource, c, dynamic_type); - const String& L = String::ZoneHandle(Symbols::New(thread, "L")); - SourceLabel* label_L = - new SourceLabel(TokenPosition::kNoSource, L, SourceLabel::kFor); LocalScope* outer_scope = new LocalScope(NULL, 0, 0); LocalScope* inner_scope1 = new LocalScope(outer_scope, 0, 0); @@ -51,13 +48,11 @@ ISOLATE_UNIT_TEST_CASE(LocalScope) { EXPECT(outer_scope->AddVariable(var_a)); EXPECT(inner_scope1->AddVariable(var_b)); EXPECT(inner_scope2->AddVariable(var_c)); - EXPECT(inner_scope2->AddLabel(label_L)); EXPECT(!outer_scope->AddVariable(var_a)); // Check the simple layout above. EXPECT_EQ(var_a, outer_scope->LocalLookupVariable(a)); EXPECT_EQ(var_a, inner_scope1->LookupVariable(a, true)); - EXPECT_EQ(label_L, inner_scope2->LookupLabel(L)); EXPECT(outer_scope->LocalLookupVariable(b) == NULL); EXPECT(inner_scope1->LocalLookupVariable(c) == NULL);