From 25575564c007047f726c489536b2c38709448360 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 23 Apr 2016 15:47:39 -0600 Subject: [PATCH] Make module load error much more explicit --- .../chaiscript/language/chaiscript_common.hpp | 18 ++++++++ .../chaiscript/language/chaiscript_engine.hpp | 41 +++++++++++-------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 2519021c..073e2862 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -107,8 +107,26 @@ namespace chaiscript { } + load_module_error(const std::string &t_name, const std::vector &t_errors) + : std::runtime_error(format_error(t_name, t_errors)) + { + } + load_module_error(const load_module_error &) = default; virtual ~load_module_error() noexcept = default; + + static std::string format_error(const std::string &t_name, const std::vector &t_errors) + { + std::stringstream ss; + ss << "Error loading module '" << t_name << "'\n" + << " The following locations were searched:\n"; + + for (const auto &err : t_errors) { + ss << " " << err.what() << "\n"; + } + + return ss.str(); + } }; diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 95c8165c..aa079842 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -180,7 +180,8 @@ namespace chaiscript m_engine.add(fun([this](const std::string &t_str){ return internal_eval(t_str); }), "eval"); m_engine.add(fun([this](const AST_NodePtr &t_ast){ return eval(t_ast); }), "eval"); - m_engine.add(fun(&parse), "parse"); + m_engine.add(fun([](const std::string &t_str, const bool t_dump){ return parse(t_str, t_dump); }), "parse"); + m_engine.add(fun([](const std::string &t_str){ return parse(t_str); }), "parse"); m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ add_global_const(t_bv, t_name); }), "add_global_const"); @@ -291,8 +292,21 @@ namespace chaiscript #endif - // attempt to load the stdlib - load_module("chaiscript_stdlib-" + Build_Info::version()); + try { + // attempt to load the stdlib + load_module("chaiscript_stdlib-" + Build_Info::version()); + } catch (const exception::load_module_error &t_err) { + std::cout << "An error occured while trying to load the chaiscript standard library.\n" + << "\n" + << "You must either provide a standard library, or compile it in.\n" + << "For an example of compiling the standard library in,\n" + << "see: https://gist.github.com/lefticus/9456197\n" + << "Compiling the stdlib in is the recommended and MOST SUPPORTED method.\n" + << "\n" + << "\n" + << t_err.what(); + throw; + } build_eval_system(ModulePtr()); } @@ -307,11 +321,14 @@ namespace chaiscript } } - static AST_NodePtr parse(const std::string &t_input) + static AST_NodePtr parse(const std::string &t_input, const bool t_debug_print = false) { parser::ChaiScript_Parser parser; if (parser.parse(t_input, "PARSE")) { - //parser.show_match_stack(); + const auto ast = parser.optimized_ast(); + if (t_debug_print) { + parser.debug_print(ast); + } return parser.optimized_ast(); } else { throw chaiscript::exception::eval_error("Unknown error while parsing"); @@ -563,19 +580,7 @@ namespace chaiscript } } - std::string errstring; - - for (const auto &err : errors) - { - if (!errstring.empty()) - { - errstring += "; "; - } - - errstring += err.what(); - } - - throw chaiscript::exception::load_module_error("Unable to find module: " + t_module_name + " Errors: " + errstring); + throw chaiscript::exception::load_module_error(t_module_name, errors); } /// \brief Load a binary module from a dynamic library. Works on platforms that support