ReplaceBody now deletes a body if the replacement is nil

This commit is contained in:
Vern Paxson 2021-06-04 16:56:29 -07:00
parent 2ec2e1e7d7
commit 98f549d65d
2 changed files with 27 additions and 11 deletions

View file

@ -332,8 +332,11 @@ ScriptFunc::ScriptFunc(std::string _name, FuncTypePtr ft,
sort(bodies.begin(), bodies.end()); sort(bodies.begin(), bodies.end());
current_body = bodies[0].stmts; if ( bodies.size() > 0 )
current_priority = bodies[0].priority; {
current_body = bodies[0].stmts;
current_priority = bodies[0].priority;
}
} }
ScriptFunc::~ScriptFunc() ScriptFunc::~ScriptFunc()
@ -579,15 +582,22 @@ void ScriptFunc::ReplaceBody(const StmtPtr& old_body, StmtPtr new_body)
{ {
bool found_it = false; bool found_it = false;
for ( auto& body : bodies ) for ( auto body = bodies.begin(); body != bodies.end(); ++body )
if ( body.stmts.get() == old_body.get() ) if ( body->stmts.get() == old_body.get() )
{ {
body.stmts = new_body; if ( new_body )
current_priority = body.priority; {
body->stmts = new_body;
current_priority = body->priority;
}
else
bodies.erase(body);
found_it = true; found_it = true;
break;
} }
ASSERT(found_it); // ASSERT(found_it);
current_body = new_body; current_body = new_body;
} }

View file

@ -237,10 +237,16 @@ public:
const std::vector<IDPtr>& new_inits, const std::vector<IDPtr>& new_inits,
size_t new_frame_size, int priority) override; size_t new_frame_size, int priority) override;
// Replace the given current instance of a function body with /**
// a new one. * Replaces the given current instance of a function body with
* a new one. If new_body is nil then the current instance is
* deleted with no replacement.
*
* @param old_body Body to replace.
* @param new_body New body to use; can be nil.
*/
void ReplaceBody(const detail::StmtPtr& old_body, void ReplaceBody(const detail::StmtPtr& old_body,
detail::StmtPtr new_body); detail::StmtPtr new_body);
StmtPtr CurrentBody() const { return current_body; } StmtPtr CurrentBody() const { return current_body; }
int CurrentPriority() const { return current_priority; } int CurrentPriority() const { return current_priority; }
@ -316,7 +322,7 @@ private:
StmtPtr current_body; StmtPtr current_body;
// ... and its priority. // ... and its priority.
int current_priority; int current_priority = 0;
}; };
using built_in_func = BifReturnVal (*)(Frame* frame, const Args* args); using built_in_func = BifReturnVal (*)(Frame* frame, const Args* args);