// See the file "COPYING" in the main distribution directory for copyright. #ifndef func_h #define func_h #include "BroList.h" #include "Obj.h" #include "Debug.h" class Val; class ListExpr; class FuncType; class Stmt; class Frame; class ID; class CallExpr; class Func : public BroObj { public: enum Kind { BRO_FUNC, BUILTIN_FUNC }; Func(Kind arg_kind); virtual ~Func(); virtual int IsPure() const = 0; function_flavor Flavor() const { return FType()->Flavor(); } struct Body { Stmt* stmts; int priority; bool operator<(const Body& other) const { return priority > other.priority; } // reverse sort }; const vector
& GetBodies() const { return bodies; } bool HasBodies() const { return bodies.size(); } // virtual Val* Call(ListExpr* args) const = 0; virtual Val* Call(val_list* args, Frame* parent = 0) const = 0; // Add a new event handler to an existing function (event). virtual void AddBody(Stmt* new_body, id_list* new_inits, int new_frame_size, int priority = 0); virtual void SetScope(Scope* newscope) { scope = newscope; } virtual Scope* GetScope() const { return scope; } virtual FuncType* FType() const { return type->AsFuncType(); } Kind GetKind() const { return kind; } const char* Name() const { return name.c_str(); } virtual void Describe(ODesc* d) const = 0; virtual void DescribeDebug(ODesc* d, const val_list* args) const; // This (un-)serializes only a single body (as given in SerialInfo). bool Serialize(SerialInfo* info) const; static Func* Unserialize(UnserialInfo* info); virtual TraversalCode Traverse(TraversalCallback* cb) const; uint32 GetUniqueFuncID() const { return unique_id; } static Func* GetFuncPtrByID(uint32 id) { return id >= unique_ids.size() ? 0 : unique_ids[id]; } protected: Func(); DECLARE_ABSTRACT_SERIAL(Func); vector bodies; Scope* scope; Kind kind; BroType* type; string name; uint32 unique_id; static vector