update(userspace/engine): sync ast structs to new libs definitions

Signed-off-by: Jason Dellaluce <jasondellaluce@gmail.com>
This commit is contained in:
Jason Dellaluce 2022-08-25 09:26:51 +00:00 committed by poiana
parent 8872f256f6
commit d35dba30ed
2 changed files with 29 additions and 36 deletions

View File

@ -27,13 +27,12 @@ bool filter_macro_resolver::run(libsinsp::filter::ast::expr*& filter)
v.m_unknown_macros = &m_unknown_macros; v.m_unknown_macros = &m_unknown_macros;
v.m_resolved_macros = &m_resolved_macros; v.m_resolved_macros = &m_resolved_macros;
v.m_macros = &m_macros; v.m_macros = &m_macros;
v.m_last_node_changed = false; v.m_node_substitute = nullptr;
v.m_last_node = filter;
filter->accept(&v); filter->accept(&v);
if (v.m_last_node_changed) if (v.m_node_substitute)
{ {
delete filter; delete filter;
filter = v.m_last_node; filter = v.m_node_substitute.release();
} }
return !m_resolved_macros.empty(); return !m_resolved_macros.empty();
} }
@ -46,12 +45,11 @@ bool filter_macro_resolver::run(std::shared_ptr<libsinsp::filter::ast::expr>& fi
v.m_unknown_macros = &m_unknown_macros; v.m_unknown_macros = &m_unknown_macros;
v.m_resolved_macros = &m_resolved_macros; v.m_resolved_macros = &m_resolved_macros;
v.m_macros = &m_macros; v.m_macros = &m_macros;
v.m_last_node_changed = false; v.m_node_substitute = nullptr;
v.m_last_node = filter.get();
filter->accept(&v); filter->accept(&v);
if (v.m_last_node_changed) if (v.m_node_substitute)
{ {
filter.reset(v.m_last_node); filter = std::move(v.m_node_substitute);
} }
return !m_resolved_macros.empty(); return !m_resolved_macros.empty();
} }
@ -78,14 +76,12 @@ void filter_macro_resolver::visitor::visit(ast::and_expr* e)
for (size_t i = 0; i < e->children.size(); i++) for (size_t i = 0; i < e->children.size(); i++)
{ {
e->children[i]->accept(this); e->children[i]->accept(this);
if (m_last_node_changed) if (m_node_substitute)
{ {
delete e->children[i]; e->children[i] = std::move(m_node_substitute);
e->children[i] = m_last_node;
} }
} }
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::or_expr* e) void filter_macro_resolver::visitor::visit(ast::or_expr* e)
@ -93,46 +89,39 @@ void filter_macro_resolver::visitor::visit(ast::or_expr* e)
for (size_t i = 0; i < e->children.size(); i++) for (size_t i = 0; i < e->children.size(); i++)
{ {
e->children[i]->accept(this); e->children[i]->accept(this);
if (m_last_node_changed) if (m_node_substitute)
{ {
delete e->children[i]; e->children[i] = std::move(m_node_substitute);
e->children[i] = m_last_node;
} }
} }
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::not_expr* e) void filter_macro_resolver::visitor::visit(ast::not_expr* e)
{ {
e->child->accept(this); e->child->accept(this);
if (m_last_node_changed) if (m_node_substitute)
{ {
delete e->child; e->child = std::move(m_node_substitute);
e->child = m_last_node;
} }
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::list_expr* e) void filter_macro_resolver::visitor::visit(ast::list_expr* e)
{ {
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::binary_check_expr* e) void filter_macro_resolver::visitor::visit(ast::binary_check_expr* e)
{ {
// avoid exploring checks, so that we can be sure that each // avoid exploring checks, so that we can be sure that each
// value_expr* node visited is a macro identifier // value_expr* node visited is a macro identifier
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::unary_check_expr* e) void filter_macro_resolver::visitor::visit(ast::unary_check_expr* e)
{ {
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
} }
void filter_macro_resolver::visitor::visit(ast::value_expr* e) void filter_macro_resolver::visitor::visit(ast::value_expr* e)
@ -143,15 +132,20 @@ void filter_macro_resolver::visitor::visit(ast::value_expr* e)
auto macro = m_macros->find(e->value); auto macro = m_macros->find(e->value);
if (macro != m_macros->end() && macro->second) // skip null-ptr macros if (macro != m_macros->end() && macro->second) // skip null-ptr macros
{ {
ast::expr* new_node = ast::clone(macro->second.get()); m_node_substitute = nullptr;
new_node->accept(this); // this sets m_last_node auto new_node = ast::clone(macro->second.get());
m_last_node_changed = true; new_node->accept(this);
// new_node might already have set a non-NULL m_node_substitute.
// if not, the right substituted is the newly-cloned node.
if (!m_node_substitute)
{
m_node_substitute = std::move(new_node);
}
m_resolved_macros->insert(e->value); m_resolved_macros->insert(e->value);
} }
else else
{ {
m_last_node = e; m_node_substitute = nullptr;
m_last_node_changed = false;
m_unknown_macros->insert(e->value); m_unknown_macros->insert(e->value);
} }
} }

View File

@ -81,8 +81,7 @@ class filter_macro_resolver
struct visitor : public libsinsp::filter::ast::expr_visitor struct visitor : public libsinsp::filter::ast::expr_visitor
{ {
bool m_last_node_changed; std::unique_ptr<libsinsp::filter::ast::expr> m_node_substitute;
libsinsp::filter::ast::expr* m_last_node;
std::set<std::string>* m_unknown_macros; std::set<std::string>* m_unknown_macros;
std::set<std::string>* m_resolved_macros; std::set<std::string>* m_resolved_macros;
macro_defs* m_macros; macro_defs* m_macros;