mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 09:38:19 +00:00
Merge branch 'master' into topic/vern/script-xform
This commit is contained in:
commit
ee4c259cd4
45 changed files with 1259 additions and 306 deletions
63
src/Func.h
63
src/Func.h
|
@ -164,7 +164,39 @@ public:
|
|||
ValPtr Invoke(zeek::Args* args, Frame* parent) const override;
|
||||
|
||||
/**
|
||||
* Adds adds a closure to the function. Closures are cloned and
|
||||
* Creates a separate frame for captures and initializes its
|
||||
* elements. The list of captures comes from the ScriptFunc's
|
||||
* type, so doesn't need to be passed in, just the frame to
|
||||
* use in evaluating the identifiers.
|
||||
*
|
||||
* @param f the frame used for evaluating the captured identifiers
|
||||
*/
|
||||
void CreateCaptures(Frame* f);
|
||||
|
||||
/**
|
||||
* Returns the frame associated with this function for tracking
|
||||
* captures, or nil if there isn't one.
|
||||
*
|
||||
* @return internal frame kept by the function for persisting captures
|
||||
*/
|
||||
Frame* GetCapturesFrame() const { return captures_frame; }
|
||||
|
||||
// Same definition as in Frame.h.
|
||||
using OffsetMap = std::unordered_map<std::string, int>;
|
||||
|
||||
/**
|
||||
* Returns the mapping of captures to slots in the captures frame.
|
||||
*
|
||||
* @return pointer to mapping of captures to slots
|
||||
*/
|
||||
const OffsetMap* GetCapturesOffsetMap() const
|
||||
{ return captures_offset_mapping; }
|
||||
|
||||
// The following "Closure" methods implement the deprecated
|
||||
// capture-by-reference functionality.
|
||||
|
||||
/**
|
||||
* Adds a closure to the function. Closures are cloned and
|
||||
* future calls to ScriptFunc methods will not modify *f*.
|
||||
*
|
||||
* @param ids IDs that are captured by the closure.
|
||||
|
@ -186,12 +218,19 @@ public:
|
|||
bool StrengthenClosureReference(Frame* f);
|
||||
|
||||
/**
|
||||
* Serializes this function's closure.
|
||||
* Serializes this function's closure or capture frame.
|
||||
*
|
||||
* @return a serialized version of the function's closure.
|
||||
* @return a serialized version of the function's closure/capture frame.
|
||||
*/
|
||||
broker::expected<broker::data> SerializeClosure() const;
|
||||
|
||||
/**
|
||||
* Sets the captures frame to one built from *data*.
|
||||
*
|
||||
* @param data a serialized frame
|
||||
*/
|
||||
bool DeserializeCaptures(const broker::vector& data);
|
||||
|
||||
void AddBody(StmtPtr new_body,
|
||||
const std::vector<IDPtr>& new_inits,
|
||||
size_t new_frame_size, int priority) override;
|
||||
|
@ -242,15 +281,33 @@ protected:
|
|||
*/
|
||||
void SetClosureFrame(Frame* f);
|
||||
|
||||
/**
|
||||
* Uses the given frame for captures, and generates the
|
||||
* mapping from captured variables to offsets in the frame.
|
||||
*
|
||||
* @param f the frame holding the values of capture variables
|
||||
*/
|
||||
void SetCaptures(Frame* f);
|
||||
|
||||
private:
|
||||
size_t frame_size;
|
||||
|
||||
// List of the outer IDs used in the function.
|
||||
IDPList outer_ids;
|
||||
|
||||
// The following is used for deprecated capture-by-reference
|
||||
// closures:
|
||||
// The frame the ScriptFunc was initialized in.
|
||||
Frame* closure = nullptr;
|
||||
bool weak_closure_ref = false;
|
||||
|
||||
// Used for capture-by-copy closures. These persist over the
|
||||
// function's lifetime, providing quasi-globals that maintain
|
||||
// state across individual calls to the function.
|
||||
Frame* captures_frame = nullptr;
|
||||
|
||||
OffsetMap* captures_offset_mapping = nullptr;
|
||||
|
||||
// The most recently added/updated body.
|
||||
StmtPtr current_body;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue