Merge branch 'master' of github.com:ChaiScript/ChaiScript
This commit is contained in:
@@ -213,6 +213,29 @@ namespace chaiscript
|
||||
|
||||
chaiscript::detail::Dispatch_Engine &m_de;
|
||||
};
|
||||
|
||||
/// Creates a new scope then pops it on destruction
|
||||
struct Stack_Push_Pop
|
||||
{
|
||||
Stack_Push_Pop(chaiscript::detail::Dispatch_Engine &t_de)
|
||||
: m_de(t_de)
|
||||
{
|
||||
m_de.new_stack();
|
||||
}
|
||||
|
||||
~Stack_Push_Pop()
|
||||
{
|
||||
m_de.pop_stack();
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
// explicitly unimplemented copy and assignment
|
||||
Stack_Push_Pop(const Scope_Push_Pop &);
|
||||
Stack_Push_Pop& operator=(const Scope_Push_Pop &);
|
||||
|
||||
chaiscript::detail::Dispatch_Engine &m_de;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -322,6 +322,8 @@ namespace chaiscript
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::is_type, boost::ref(m_engine)), "is_type");
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::type_name, boost::ref(m_engine)), "type_name");
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::function_exists, boost::ref(m_engine)), "function_exists");
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_function_objects, boost::ref(m_engine)), "get_functions");
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_scripting_objects, boost::ref(m_engine)), "get_objects");
|
||||
|
||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_type_name, boost::ref(m_engine)), "name");
|
||||
|
||||
|
@@ -190,36 +190,19 @@ namespace chaiscript
|
||||
}
|
||||
}
|
||||
|
||||
chaiscript::detail::Dispatch_Engine::Stack prev_stack = t_ss.get_stack();
|
||||
chaiscript::detail::Dispatch_Engine::Stack new_stack = t_ss.new_stack();
|
||||
Boxed_Value fn = this->children[0]->eval(t_ss);
|
||||
|
||||
try {
|
||||
Boxed_Value fn = this->children[0]->eval(t_ss);
|
||||
|
||||
try {
|
||||
t_ss.set_stack(new_stack);
|
||||
const Boxed_Value &retval = (*boxed_cast<const Const_Proxy_Function &>(fn))(plb);
|
||||
t_ss.set_stack(prev_stack);
|
||||
return retval;
|
||||
}
|
||||
catch(const exception::dispatch_error &e){
|
||||
t_ss.set_stack(prev_stack);
|
||||
throw exception::eval_error(std::string(e.what()) + " with function '" + this->children[0]->text + "'");
|
||||
}
|
||||
catch(detail::Return_Value &rv) {
|
||||
t_ss.set_stack(prev_stack);
|
||||
return rv.retval;
|
||||
}
|
||||
catch(...) {
|
||||
t_ss.set_stack(prev_stack);
|
||||
throw;
|
||||
}
|
||||
chaiscript::eval::detail::Stack_Push_Pop spp(t_ss);
|
||||
const Boxed_Value &retval = (*boxed_cast<const Const_Proxy_Function &>(fn))(plb);
|
||||
return retval;
|
||||
}
|
||||
catch(exception::eval_error &) {
|
||||
t_ss.set_stack(prev_stack);
|
||||
throw;
|
||||
catch(const exception::dispatch_error &e){
|
||||
throw exception::eval_error(std::string(e.what()) + " with function '" + this->children[0]->text + "'");
|
||||
}
|
||||
catch(detail::Return_Value &rv) {
|
||||
return rv.retval;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
@@ -466,26 +449,17 @@ namespace chaiscript
|
||||
fun_name = this->children[i]->text;
|
||||
}
|
||||
|
||||
chaiscript::detail::Dispatch_Engine::Stack prev_stack = t_ss.get_stack();
|
||||
chaiscript::detail::Dispatch_Engine::Stack new_stack = t_ss.new_stack();
|
||||
|
||||
try {
|
||||
t_ss.set_stack(new_stack);
|
||||
chaiscript::eval::detail::Stack_Push_Pop spp(t_ss);
|
||||
retval = t_ss.call_function(fun_name, plb);
|
||||
t_ss.set_stack(prev_stack);
|
||||
}
|
||||
catch(const exception::dispatch_error &e){
|
||||
t_ss.set_stack(prev_stack);
|
||||
throw exception::eval_error(std::string(e.what()) + " for function: " + fun_name);
|
||||
}
|
||||
catch(detail::Return_Value &rv) {
|
||||
t_ss.set_stack(prev_stack);
|
||||
retval = rv.retval;
|
||||
}
|
||||
catch(...) {
|
||||
t_ss.set_stack(prev_stack);
|
||||
throw;
|
||||
}
|
||||
|
||||
if (this->children[i]->identifier == AST_Node_Type::Array_Call) {
|
||||
for (size_t j = 1; j < this->children[i]->children.size(); ++j) {
|
||||
try {
|
||||
|
@@ -1465,12 +1465,9 @@ namespace chaiscript
|
||||
* Reads a switch statement from input
|
||||
*/
|
||||
bool Switch() {
|
||||
bool retval = false;
|
||||
|
||||
size_t prev_stack_top = m_match_stack.size();
|
||||
|
||||
if (Keyword("switch")) {
|
||||
retval = true;
|
||||
|
||||
if (!Char('(')) {
|
||||
throw exception::eval_error("Incomplete 'switch' expression", File_Position(m_line, m_col), *m_filename);
|
||||
@@ -1483,8 +1480,6 @@ namespace chaiscript
|
||||
while (Eol()) {}
|
||||
|
||||
if (Char('{')) {
|
||||
retval = true;
|
||||
|
||||
while (Eol()) {}
|
||||
|
||||
while (Case()) {
|
||||
@@ -1502,9 +1497,12 @@ namespace chaiscript
|
||||
}
|
||||
|
||||
build_match(AST_NodePtr(new eval::Switch_AST_Node()), prev_stack_top);
|
||||
return true;
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1994,7 +1992,6 @@ namespace chaiscript
|
||||
bool saw_eol = true;
|
||||
|
||||
while (has_more) {
|
||||
has_more = false;
|
||||
int prev_line = m_line;
|
||||
int prev_col = m_col;
|
||||
if (Def()) {
|
||||
|
Reference in New Issue
Block a user