From a0758aa493fe1718607fa220c7019228957c2abb Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 14 Aug 2024 06:54:43 +0200 Subject: [PATCH] WIP --- src/tl/tl/tlExpression.cc | 25 +++++++++++++++++++++++-- src/tl/tl/tlExpression.h | 12 ++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/tl/tl/tlExpression.cc b/src/tl/tl/tlExpression.cc index 9da470c35..6853a5729 100644 --- a/src/tl/tl/tlExpression.cc +++ b/src/tl/tl/tlExpression.cc @@ -3156,6 +3156,10 @@ Expression::execute () const void Expression::execute (EvalTarget &v) const { + if (! mp_eval.get ()) { + throw tl::Exception (tl::to_string (tr ("Context was destroyed"))); + } + mp_eval->check (); if (m_root.get ()) { m_root->execute (v); } @@ -3167,13 +3171,13 @@ Expression::execute (EvalTarget &v) const Eval Eval::m_global (0, 0, false); Eval::Eval (Eval *parent, bool sloppy) - : mp_parent (parent), mp_global (&Eval::m_global), m_sloppy (sloppy), mp_ctx_handler (0) + : mp_parent (parent), m_has_parent (parent != 0), mp_global (&Eval::m_global), m_has_global (false), m_sloppy (sloppy), mp_ctx_handler (0) { // .. nothing yet .. } Eval::Eval (Eval *global, Eval *parent, bool sloppy) - : mp_parent (parent), mp_global (global), m_sloppy (sloppy), mp_ctx_handler (0) + : mp_parent (parent), m_has_parent (parent != 0), mp_global (global), m_has_global (global != 0), m_sloppy (sloppy), mp_ctx_handler (0) { // .. nothing yet .. } @@ -3186,6 +3190,23 @@ Eval::~Eval () m_local_functions.clear (); } +void +Eval::check () +{ + if (m_has_parent) { + if (! mp_parent.get ()) { + throw tl::Exception (tl::to_string (tr ("Parent context was destroyed"))); + } + mp_parent->check (); + } + if (m_has_global) { + if (! mp_global.get ()) { + throw tl::Exception (tl::to_string (tr ("Global context was destroyed"))); + } + mp_global->check (); + } +} + void Eval::set_var (const std::string &name, const tl::Variant &var) { diff --git a/src/tl/tl/tlExpression.h b/src/tl/tl/tlExpression.h index b1a6d5f6a..ffef940e9 100644 --- a/src/tl/tl/tlExpression.h +++ b/src/tl/tl/tlExpression.h @@ -356,7 +356,7 @@ private: const char *mp_text; std::string m_local_text; std::unique_ptr m_root; - Eval *mp_eval; + tl::weak_ptr mp_eval; friend class Eval; @@ -580,10 +580,18 @@ public: return mp_parent.get (); } + /** + * @brief Checks the contexts and throws an exception if one of them got lost + */ + void check (); + private: friend class Expression; - tl::weak_ptr mp_parent, mp_global; + tl::weak_ptr mp_parent; + bool m_has_parent; + tl::weak_ptr mp_global; + bool m_has_global; std::map m_local_vars; std::map m_local_functions; bool m_sloppy;