From d35dba30ed34182ee37d7960cb499f96b79e50fd Mon Sep 17 00:00:00 2001 From: Jason Dellaluce Date: Thu, 25 Aug 2022 09:26:51 +0000 Subject: [PATCH] update(userspace/engine): sync ast structs to new libs definitions Signed-off-by: Jason Dellaluce --- userspace/engine/filter_macro_resolver.cpp | 62 ++++++++++------------ userspace/engine/filter_macro_resolver.h | 3 +- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/userspace/engine/filter_macro_resolver.cpp b/userspace/engine/filter_macro_resolver.cpp index 7e98499a..bc1d2982 100644 --- a/userspace/engine/filter_macro_resolver.cpp +++ b/userspace/engine/filter_macro_resolver.cpp @@ -27,13 +27,12 @@ bool filter_macro_resolver::run(libsinsp::filter::ast::expr*& filter) v.m_unknown_macros = &m_unknown_macros; v.m_resolved_macros = &m_resolved_macros; v.m_macros = &m_macros; - v.m_last_node_changed = false; - v.m_last_node = filter; + v.m_node_substitute = nullptr; filter->accept(&v); - if (v.m_last_node_changed) + if (v.m_node_substitute) { delete filter; - filter = v.m_last_node; + filter = v.m_node_substitute.release(); } return !m_resolved_macros.empty(); } @@ -46,12 +45,11 @@ bool filter_macro_resolver::run(std::shared_ptr& fi v.m_unknown_macros = &m_unknown_macros; v.m_resolved_macros = &m_resolved_macros; v.m_macros = &m_macros; - v.m_last_node_changed = false; - v.m_last_node = filter.get(); + v.m_node_substitute = nullptr; 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(); } @@ -78,14 +76,12 @@ void filter_macro_resolver::visitor::visit(ast::and_expr* e) for (size_t i = 0; i < e->children.size(); i++) { e->children[i]->accept(this); - if (m_last_node_changed) + if (m_node_substitute) { - delete e->children[i]; - e->children[i] = m_last_node; + e->children[i] = std::move(m_node_substitute); } } - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } 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++) { e->children[i]->accept(this); - if (m_last_node_changed) + if (m_node_substitute) { - delete e->children[i]; - e->children[i] = m_last_node; + e->children[i] = std::move(m_node_substitute); } } - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } void filter_macro_resolver::visitor::visit(ast::not_expr* e) { e->child->accept(this); - if (m_last_node_changed) + if (m_node_substitute) { - delete e->child; - e->child = m_last_node; + e->child = std::move(m_node_substitute); } - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } void filter_macro_resolver::visitor::visit(ast::list_expr* e) { - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } void filter_macro_resolver::visitor::visit(ast::binary_check_expr* e) { // avoid exploring checks, so that we can be sure that each // value_expr* node visited is a macro identifier - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } void filter_macro_resolver::visitor::visit(ast::unary_check_expr* e) { - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; } 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); if (macro != m_macros->end() && macro->second) // skip null-ptr macros { - ast::expr* new_node = ast::clone(macro->second.get()); - new_node->accept(this); // this sets m_last_node - m_last_node_changed = true; + m_node_substitute = nullptr; + auto new_node = ast::clone(macro->second.get()); + 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); } else { - m_last_node = e; - m_last_node_changed = false; + m_node_substitute = nullptr; m_unknown_macros->insert(e->value); } } diff --git a/userspace/engine/filter_macro_resolver.h b/userspace/engine/filter_macro_resolver.h index 5076e40d..359f876f 100644 --- a/userspace/engine/filter_macro_resolver.h +++ b/userspace/engine/filter_macro_resolver.h @@ -81,8 +81,7 @@ class filter_macro_resolver struct visitor : public libsinsp::filter::ast::expr_visitor { - bool m_last_node_changed; - libsinsp::filter::ast::expr* m_last_node; + std::unique_ptr m_node_substitute; std::set* m_unknown_macros; std::set* m_resolved_macros; macro_defs* m_macros;