RemoveGlobal() method for Scope class + simplifying interfaces

This commit is contained in:
Vern Paxson 2023-05-19 12:41:32 -07:00
parent 222f604452
commit 9aff0287f0
2 changed files with 19 additions and 3 deletions

View file

@ -46,6 +46,19 @@ const IDPtr& Scope::Find(std::string_view name) const
return ID::nil; return ID::nil;
} }
void Scope::RemoveGlobal(std::string name, IDPtr /* gid */)
{
ASSERT(this == global_scope());
local.erase(name);
// We could remove the identifier from ordered_vars, but for now
// we skip doing so because (1) the only removals we do are for global
// scope (per the method name), and the only use of ordered_vars is
// for traversing function parameters (i.e., non-global scope), and
// (2) it would be a pain to do so given the current data structure.
}
IDPtr Scope::GenerateTemporary(const char* name) IDPtr Scope::GenerateTemporary(const char* name)
{ {
return make_intrusive<ID>(name, SCOPE_FUNCTION, false); return make_intrusive<ID>(name, SCOPE_FUNCTION, false);

View file

@ -37,12 +37,15 @@ public:
const IDPtr& Find(std::string_view name) const; const IDPtr& Find(std::string_view name) const;
template <typename N, typename I> void Insert(N&& name, I&& id) void Insert(std::string name, IDPtr id)
{ {
local[std::forward<N>(name)] = std::forward<I>(id); local[name] = id;
ordered_vars.push_back(std::forward<I>(id)); ordered_vars.push_back(id);
} }
// Must only be called for the global scope.
void RemoveGlobal(std::string name, IDPtr gid);
const IDPtr& GetID() const { return scope_id; } const IDPtr& GetID() const { return scope_id; }
const std::unique_ptr<std::vector<AttrPtr>>& Attrs() const { return attrs; } const std::unique_ptr<std::vector<AttrPtr>>& Attrs() const { return attrs; }