diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 921b6eb..c9dd0bd 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -279,7 +279,11 @@ namespace chaiscript const Boxed_Value internal_eval_ast(const AST_NodePtr &t_ast) { - return t_ast->eval(m_engine); + try { + return t_ast->eval(m_engine); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } } @@ -287,7 +291,11 @@ namespace chaiscript * Evaluates the given string, used during eval() inside of a script */ const Boxed_Value internal_eval(const std::string &t_e) { - return do_eval(t_e, "__EVAL__", true); + try { + return do_eval(t_e, "__EVAL__", true); + } catch (const exception::eval_error &t_ee) { + throw Boxed_Value(t_ee); + } } /** diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 2b48b5d..217e7c5 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -55,6 +55,12 @@ namespace chaiscript Operators::Opers t_oper, const std::string &t_oper_string, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs) { try { + chaiscript::eval::detail::Function_Push_Pop fpp(t_ss); + std::vector params(2); + params.push_back(t_lhs); + params.push_back(t_rhs); + fpp.save_params(params); + if (t_oper != Operators::invalid && t_lhs.get_type_info().is_arithmetic() && t_rhs.get_type_info().is_arithmetic()) { // If it's an arithmetic operation we want to short circuit dispatch @@ -65,6 +71,7 @@ namespace chaiscript } } else { + chaiscript::eval::detail::Stack_Push_Pop spp(t_ss); return t_ss.call_function(t_oper_string, t_lhs, t_rhs); } } @@ -434,11 +441,20 @@ namespace chaiscript AST_Node(t_ast_node_text, t_id, t_fname, t_start_line, t_start_col, t_end_line, t_end_col) { } virtual ~Array_Call_AST_Node() {} virtual Boxed_Value eval_internal(chaiscript::detail::Dispatch_Engine &t_ss){ + chaiscript::eval::detail::Function_Push_Pop fpp(t_ss); Boxed_Value retval = this->children[0]->eval(t_ss); + std::vector params; + params.push_back(retval); for (size_t i = 1; i < this->children.size(); ++i) { try { - retval = t_ss.call_function("[]", retval, this->children[i]->eval(t_ss)); + Boxed_Value p1(this->children[i]->eval(t_ss)); + + chaiscript::eval::detail::Stack_Push_Pop spp(t_ss); + params.push_back(p1); + fpp.save_params(params); + params.clear(); + retval = t_ss.call_function("[]", retval, p1); } catch(std::out_of_range &) { throw exception::eval_error("Out of bounds exception"); @@ -988,6 +1004,7 @@ namespace chaiscript virtual ~Prefix_AST_Node() {} virtual Boxed_Value eval_internal(chaiscript::detail::Dispatch_Engine &t_ss){ + chaiscript::eval::detail::Function_Push_Pop fpp(t_ss); Boxed_Value bv(this->children[1]->eval(t_ss)); Operators::Opers oper = Operators::to_operator(children[0]->text, true); @@ -996,6 +1013,10 @@ namespace chaiscript { return Boxed_Number::do_oper(oper, bv); } else { + chaiscript::eval::detail::Stack_Push_Pop spp(t_ss); + std::vector params; + params.push_back(bv); + fpp.save_params(params); return t_ss.call_function(this->children[0]->text, bv); } } catch (const exception::dispatch_error &e) { diff --git a/releasenotes.txt b/releasenotes.txt index 8da2511..4a52301 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -1,3 +1,22 @@ +Changes since 3.1.0 +* svenstaro: Unused variables and CMake consistency fixes +* Added support for returning pointers from functions (#13) +* Compile with -pedantic (#9) +* Fix issues with multiple ChaiScript object types having the same attribute name (#15) +* Prevent variable redeclaration in same scope (#22) +* mgee: Boxed_Number improvements (#27) +* Support switch statements (#34) +* Fix uint16 comparions (#26) +* Add ability to add const_var globals in Module objects (#14) +* Add support for ternary operators ?: +* Add headers to CMakeLists so they show up in IDEs +* Add ability to get vector of defined objects and vector of defined functions +* Fix memory leak in cyclical references +* Clean up static analysis issues discovered +* Fix vector construction to be consistent with map construction +* Increased unit tests to 161 +* Performance enhancements + Changes since 3.0.0 * Numeric operations performance increased approximately 10x * Looping operations performance increased up to 2x diff --git a/src/reflection.cpp b/src/reflection.cpp index 80ee906..40e9efe 100644 --- a/src/reflection.cpp +++ b/src/reflection.cpp @@ -51,6 +51,7 @@ CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_reflect m->add(chaiscript::fun(&has_parse_tree), "has_parse_tree"); m->add(chaiscript::fun(&get_parse_tree), "get_parse_tree"); + m->add(chaiscript::base_class()); chaiscript::bootstrap::standard_library::vector_type > >("AST_NodeVector", m); diff --git a/unittests/operator_scoping.chai b/unittests/operator_scoping.chai index e6f9272..5718bd5 100644 --- a/unittests/operator_scoping.chai +++ b/unittests/operator_scoping.chai @@ -1,14 +1,8 @@ -def `+`(x, y) -{ - print(i); +load_module("reflection") + +try { + eval("def `+`(x, y) \n { \n print(i); \n } \n \n var i = 10; \n \"1\" + 1;\n") + assert_false(true); // we should never get here +} catch (e) { + assert_equal("Error: \"Can not find object: i\" ", e.what()); } - -auto i = 10; - - -// It should fail because `+` should not be able to see the i - -"1" + 1; -assert_false(true); - - diff --git a/unittests/unit_test.inc b/unittests/unit_test.inc index 9d2fb91..681c519 100644 --- a/unittests/unit_test.inc +++ b/unittests/unit_test.inc @@ -5,7 +5,7 @@ def assert_equal(x, y) // Passes } else { // Fails - print("assert_equal failure: got " + to_string(y) + " expected " + to_string(x)); + print("assert_equal failure: got '" + to_string(y) + "' expected '" + to_string(x) + "'"); exit(-1); } }