diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 659014d0..a582dc27 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -307,6 +307,10 @@ namespace chaiscript } } + parser::ChaiScript_Parser_Base &get_parser() + { + return *m_parser; + } const Boxed_Value eval(const AST_NodePtr &t_ast) { diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index 3859c29b..9eafa031 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -355,6 +355,16 @@ namespace chaiscript m_match_stack.reserve(2); } + Tracer &get_tracer() + { + return m_tracer; + } + + Optimizer &get_optimizer() + { + return m_optimizer; + } + ChaiScript_Parser(const ChaiScript_Parser &) = default; ChaiScript_Parser &operator=(const ChaiScript_Parser &) = delete; ChaiScript_Parser(ChaiScript_Parser &&) = default; diff --git a/include/chaiscript/language/chaiscript_tracer.hpp b/include/chaiscript/language/chaiscript_tracer.hpp index 938b6670..76d31472 100644 --- a/include/chaiscript/language/chaiscript_tracer.hpp +++ b/include/chaiscript/language/chaiscript_tracer.hpp @@ -10,10 +10,11 @@ namespace chaiscript { namespace eval { - struct Noop_Tracer + + struct Noop_Tracer_Detail { template - static void trace(const chaiscript::detail::Dispatch_State &, const AST_Node_Impl *) + void trace(const chaiscript::detail::Dispatch_State &, const AST_Node_Impl *) { } }; @@ -28,7 +29,7 @@ namespace chaiscript { } void do_trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl> *node) { - (void)std::initializer_list{ (T::trace(ds, node), 0)... }; + (void)std::initializer_list{ (static_cast(*this).trace(ds, node), 0)... }; } static void trace(const chaiscript::detail::Dispatch_State &ds, const AST_Node_Impl> *node) { @@ -36,6 +37,8 @@ namespace chaiscript { } }; + typedef Tracer Noop_Tracer; + } } diff --git a/unittests/compiled_tests.cpp b/unittests/compiled_tests.cpp index a3f7220c..b86c55be 100644 --- a/unittests/compiled_tests.cpp +++ b/unittests/compiled_tests.cpp @@ -988,6 +988,34 @@ TEST_CASE("Make sure ChaiScript object still compiles / executes") chaiscript::ChaiScript chai; } +struct Count_Tracer +{ + int count = 0; + template + void trace(const chaiscript::detail::Dispatch_State &, const chaiscript::eval::AST_Node_Impl *) + { + ++count; + } +}; + + +TEST_CASE("Test count tracer") +{ + typedef chaiscript::parser::ChaiScript_Parser< chaiscript::eval::Tracer, chaiscript::optimizer::Optimizer_Default > Parser_Type; + + chaiscript::ChaiScript_Basic chai(chaiscript::Std_Lib::library(), + std::make_unique()); + + Parser_Type &parser = dynamic_cast(chai.get_parser()); + + const auto count = parser.get_tracer().count; + + chai.eval(""); + + CHECK(parser.get_tracer().count > count); +} + + TEST_CASE("Test stdlib options") { const auto test_has_external_scripts = [](chaiscript::ChaiScript_Basic &chai) {