From f465d2cecaab97b3e765e0072596ea8e136254fb Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 20 Jul 2017 06:10:31 -0600 Subject: [PATCH] Make sure to not deref null parse node --- include/chaiscript/dispatchkit/proxy_functions.hpp | 11 ++++++++++- include/chaiscript/language/chaiscript_common.hpp | 6 ++++-- include/chaiscript/language/chaiscript_eval.hpp | 4 +++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index 2afda8dd..0c60315f 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -354,6 +354,7 @@ namespace chaiscript m_param_types(std::move(t_param_types)), m_guard(std::move(t_guard)), m_parsenode(std::move(t_parsenode)) { + // assert(t_parsenode); } @@ -379,9 +380,17 @@ namespace chaiscript return m_guard; } + bool has_parse_tree() const { + return static_cast(m_parsenode); + } + const AST_Node &get_parse_tree() const { - return *m_parsenode; + if (m_parsenode) { + return *m_parsenode; + } else { + throw std::runtime_error("Dynamic_Proxy_Function does not have parse_tree"); + } } diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 5fe377c4..b157cac2 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -262,6 +262,7 @@ namespace chaiscript bool t_dot_notation, const chaiscript::detail::Dispatch_Engine &t_ss) { + assert(t_func); int arity = t_func->get_arity(); std::vector types = t_func->get_param_types(); @@ -310,14 +311,14 @@ namespace chaiscript std::shared_ptr dynfun = std::dynamic_pointer_cast(t_func); - if (dynfun) + if (dynfun && dynfun->has_parse_tree()) { Proxy_Function f = dynfun->get_guard(); if (f) { auto dynfunguard = std::dynamic_pointer_cast(f); - if (dynfunguard) + if (dynfunguard && dynfunguard->has_parse_tree()) { retval += " : " + format_guard(dynfunguard->get_parse_tree()); } @@ -350,6 +351,7 @@ namespace chaiscript std::stringstream ss; if (t_functions.size() == 1) { + assert(t_functions[0]); ss << " Expected: " << format_types(t_functions[0], t_dot_notation, t_ss) << '\n'; } else { ss << " " << t_functions.size() << " overloads available:\n"; diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 3b9c7837..a9819440 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -288,7 +288,9 @@ namespace chaiscript template struct Fun_Call_AST_Node : AST_Node_Impl { Fun_Call_AST_Node(std::string t_ast_node_text, Parse_Location t_loc, std::vector> t_children) : - AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Fun_Call, std::move(t_loc), std::move(t_children)) { } + AST_Node_Impl(std::move(t_ast_node_text), AST_Node_Type::Fun_Call, std::move(t_loc), std::move(t_children)) { + assert(!this->children.empty()); + } template Boxed_Value do_eval_internal(const chaiscript::detail::Dispatch_State &t_ss) const