// See the file "COPYING" in the main distribution directory for copyright. #pragma once #include #include #include #include #include "Obj.h" #include "BroList.h" #include "IntrusivePtr.h" #include "TraverseTypes.h" template class IntrusivePtr; class ID; class BroType; class ListVal; class Scope : public BroObj { public: explicit Scope(IntrusivePtr id, attr_list* al); ~Scope() override; const IntrusivePtr& Find(std::string_view name) const; template [[deprecated("Remove in v4.1. Use Find().")]] ID* Lookup(N&& name) const { return Find(name).get(); } template void Insert(N&& name, I&& id) { local[std::forward(name)] = std::forward(id); } IntrusivePtr Remove(std::string_view name); ID* ScopeID() const { return scope_id.get(); } attr_list* Attrs() const { return attrs; } BroType* ReturnType() const { return return_type.get(); } size_t Length() const { return local.size(); } const auto& Vars() { return local; } ID* GenerateTemporary(const char* name); // Returns the list of variables needing initialization, and // removes it from this Scope. id_list* GetInits(); // Adds a variable to the list. void AddInit(IntrusivePtr id) { inits->push_back(id.release()); } void Describe(ODesc* d) const override; TraversalCode Traverse(TraversalCallback* cb) const; protected: IntrusivePtr scope_id; attr_list* attrs; IntrusivePtr return_type; std::map, std::less<>> local; id_list* inits; }; extern bool in_debug; // If no_global is true, don't search in the default "global" namespace. extern const IntrusivePtr& lookup_ID(const char* name, const char* module, bool no_global = false, bool same_module_only = false, bool check_export = true); extern IntrusivePtr install_ID(const char* name, const char* module_name, bool is_global, bool is_export); extern void push_scope(IntrusivePtr id, attr_list* attrs); extern void push_existing_scope(Scope* scope); // Returns the one popped off. extern IntrusivePtr pop_scope(); extern Scope* current_scope(); extern Scope* global_scope(); // Current module (identified by its name). extern std::string current_module;