From 65830dd7058b3a0fbb5dbcd67d235b5ada722b09 Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sat, 18 Dec 2021 02:37:41 +0000 Subject: [PATCH] replace the global contextTask with a Context field --- src/Context.h | 1 + src/Eval.cpp | 18 +++++++++++------- src/Filter.cpp | 10 +++------- src/Task.cpp | 4 +--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/Context.h b/src/Context.h index 06159f6d2..4475f9dc7 100644 --- a/src/Context.h +++ b/src/Context.h @@ -129,6 +129,7 @@ public: // CurrentTask resets Context::currentTask to NULL on destruction; this ensures // that this context value is not a dangling pointer. class CurrentTask { +public: ~CurrentTask(); private: diff --git a/src/Eval.cpp b/src/Eval.cpp index 40045bafb..5319a0804 100644 --- a/src/Eval.cpp +++ b/src/Eval.cpp @@ -35,8 +35,6 @@ #include #include -extern Task* contextTask; - //////////////////////////////////////////////////////////////////////////////// // Supported operators, borrowed from C++, particularly the precedence. // Note: table is sorted by length of operator string, so searches match @@ -106,7 +104,7 @@ static bool namedConstants (const std::string& name, Variant& value) // Support for evaluating DOM references (add with `e.AddSource(domSource)`) bool domSource (const std::string& identifier, Variant& value) { - if (getDOM (identifier, contextTask, value)) + if (getDOM (identifier, Context::getContext ().currentTask, value)) { value.source (identifier); return true; @@ -292,6 +290,8 @@ void Eval::evaluatePostfixStack ( Variant left = values.back (); values.pop_back (); + auto contextTask = Context::getContext ().currentTask; + // Ordering these by anticipation frequency of use is a good idea. Variant result; if (token.first == "and") result = left && right; @@ -313,10 +313,14 @@ void Eval::evaluatePostfixStack ( else if (token.first == "^") result = left ^ right; else if (token.first == "%") result = left % right; else if (token.first == "xor") result = left.operator_xor (right); - else if (token.first == "~") result = left.operator_match (right, *contextTask); - else if (token.first == "!~") result = left.operator_nomatch (right, *contextTask); - else if (token.first == "_hastag_") result = left.operator_hastag (right, *contextTask); - else if (token.first == "_notag_") result = left.operator_notag (right, *contextTask); + else if (contextTask) { + if (token.first == "~") result = left.operator_match (right, *contextTask); + else if (token.first == "!~") result = left.operator_nomatch (right, *contextTask); + else if (token.first == "_hastag_") result = left.operator_hastag (right, *contextTask); + else if (token.first == "_notag_") result = left.operator_notag (right, *contextTask); + else + throw format ("Unsupported operator '{1}'.", token.first); + } else throw format ("Unsupported operator '{1}'.", token.first); diff --git a/src/Filter.cpp b/src/Filter.cpp index 7fb1f963e..15efac912 100644 --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -35,10 +35,6 @@ #include #include -//////////////////////////////////////////////////////////////////////////////// -// Context for DOM evaluations -const Task* contextTask = NULL; - //////////////////////////////////////////////////////////////////////////////// // Take an input set of tasks and filter into a subset. void Filter::subset (const std::vector & input, std::vector & output) @@ -66,7 +62,7 @@ void Filter::subset (const std::vector & input, std::vector & output for (auto& task : input) { // Set up context for any DOM references. - contextTask = &task; + auto currentTask = Context::getContext ().withCurrentTask(&task); Variant var; eval.evaluateCompiledExpression (var); @@ -118,7 +114,7 @@ void Filter::subset (std::vector & output) for (auto& task : pending) { // Set up context for any DOM references. - contextTask = &task; + auto currentTask = Context::getContext ().withCurrentTask(&task); Variant var; eval.evaluateCompiledExpression (var); @@ -137,7 +133,7 @@ void Filter::subset (std::vector & output) for (auto& task : completed) { // Set up context for any DOM references. - contextTask = &task; + auto currentTask = Context::getContext ().withCurrentTask(&task); Variant var; eval.evaluateCompiledExpression (var); diff --git a/src/Task.cpp b/src/Task.cpp index ec81251de..de1507302 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -60,8 +60,6 @@ #define APPROACHING_INFINITY 1000 // Close enough. This isn't rocket surgery. -extern Task* contextTask; - static const float epsilon = 0.000001; #endif @@ -2273,7 +2271,7 @@ void Task::modify (modType type, bool text_required /* = false */) // while reading the parse tree, consider DOM references in the context of // this task - contextTask = this; + auto currentTask = Context::getContext ().withCurrentTask(this); // Need this for later comparison. auto originalStatus = getStatus ();