Merge branch 'master' into 2011-09-09-CxScript
Conflicts: include/chaiscript/language/chaiscript_engine.hpp
This commit is contained in:
commit
13a049cf54
@ -279,7 +279,11 @@ namespace chaiscript
|
|||||||
|
|
||||||
const Boxed_Value internal_eval_ast(const AST_NodePtr &t_ast)
|
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
|
* Evaluates the given string, used during eval() inside of a script
|
||||||
*/
|
*/
|
||||||
const Boxed_Value internal_eval(const std::string &t_e) {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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)
|
Operators::Opers t_oper, const std::string &t_oper_string, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
chaiscript::eval::detail::Function_Push_Pop fpp(t_ss);
|
||||||
|
std::vector<Boxed_Value> 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 (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
|
// If it's an arithmetic operation we want to short circuit dispatch
|
||||||
@ -65,6 +71,7 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
chaiscript::eval::detail::Stack_Push_Pop spp(t_ss);
|
||||||
return t_ss.call_function(t_oper_string, t_lhs, t_rhs);
|
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) { }
|
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 ~Array_Call_AST_Node() {}
|
||||||
virtual Boxed_Value eval_internal(chaiscript::detail::Dispatch_Engine &t_ss){
|
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);
|
Boxed_Value retval = this->children[0]->eval(t_ss);
|
||||||
|
std::vector<Boxed_Value> params;
|
||||||
|
params.push_back(retval);
|
||||||
|
|
||||||
for (size_t i = 1; i < this->children.size(); ++i) {
|
for (size_t i = 1; i < this->children.size(); ++i) {
|
||||||
try {
|
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 &) {
|
catch(std::out_of_range &) {
|
||||||
throw exception::eval_error("Out of bounds exception");
|
throw exception::eval_error("Out of bounds exception");
|
||||||
@ -988,6 +1004,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
virtual ~Prefix_AST_Node() {}
|
virtual ~Prefix_AST_Node() {}
|
||||||
virtual Boxed_Value eval_internal(chaiscript::detail::Dispatch_Engine &t_ss){
|
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));
|
Boxed_Value bv(this->children[1]->eval(t_ss));
|
||||||
|
|
||||||
Operators::Opers oper = Operators::to_operator(children[0]->text, true);
|
Operators::Opers oper = Operators::to_operator(children[0]->text, true);
|
||||||
@ -996,6 +1013,10 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
return Boxed_Number::do_oper(oper, bv);
|
return Boxed_Number::do_oper(oper, bv);
|
||||||
} else {
|
} else {
|
||||||
|
chaiscript::eval::detail::Stack_Push_Pop spp(t_ss);
|
||||||
|
std::vector<Boxed_Value> params;
|
||||||
|
params.push_back(bv);
|
||||||
|
fpp.save_params(params);
|
||||||
return t_ss.call_function(this->children[0]->text, bv);
|
return t_ss.call_function(this->children[0]->text, bv);
|
||||||
}
|
}
|
||||||
} catch (const exception::dispatch_error &e) {
|
} catch (const exception::dispatch_error &e) {
|
||||||
|
@ -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
|
Changes since 3.0.0
|
||||||
* Numeric operations performance increased approximately 10x
|
* Numeric operations performance increased approximately 10x
|
||||||
* Looping operations performance increased up to 2x
|
* Looping operations performance increased up to 2x
|
||||||
|
@ -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(&has_parse_tree), "has_parse_tree");
|
||||||
m->add(chaiscript::fun(&get_parse_tree), "get_parse_tree");
|
m->add(chaiscript::fun(&get_parse_tree), "get_parse_tree");
|
||||||
|
|
||||||
|
m->add(chaiscript::base_class<std::exception, chaiscript::exception::eval_error>());
|
||||||
|
|
||||||
chaiscript::bootstrap::standard_library::vector_type<std::vector<std::shared_ptr<chaiscript::AST_Node> > >("AST_NodeVector", m);
|
chaiscript::bootstrap::standard_library::vector_type<std::vector<std::shared_ptr<chaiscript::AST_Node> > >("AST_NodeVector", m);
|
||||||
|
|
||||||
|
@ -1,14 +1,8 @@
|
|||||||
def `+`(x, y)
|
load_module("reflection")
|
||||||
{
|
|
||||||
print(i);
|
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);
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ def assert_equal(x, y)
|
|||||||
// Passes
|
// Passes
|
||||||
} else {
|
} else {
|
||||||
// Fails
|
// 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);
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user