Reduce use of Param_List_Builder by providing call_function implementations for 0,1,2 arity

This commit is contained in:
Jason Turner 2009-12-06 01:31:58 +00:00
parent 37b2ac2056
commit e601de9d18
2 changed files with 47 additions and 47 deletions

View File

@ -526,7 +526,27 @@ namespace chaiscript
std::pair<std::multimap<std::string, Proxy_Function >::const_iterator, std::multimap<std::string, Proxy_Function >::const_iterator> range std::pair<std::multimap<std::string, Proxy_Function >::const_iterator, std::multimap<std::string, Proxy_Function >::const_iterator> range
= functions.equal_range(t_name); = functions.equal_range(t_name);
return dispatch(range.first, range.second, params); return dispatch(range.first, range.second, params);
}
Boxed_Value call_function(const std::string &t_name) const
{
return call_function(t_name, std::vector<Boxed_Value>());
}
Boxed_Value call_function(const std::string &t_name, const Boxed_Value &p1) const
{
std::vector<Boxed_Value> params;
params.push_back(p1);
return call_function(t_name, params);
}
Boxed_Value call_function(const std::string &t_name, const Boxed_Value &p1, const Boxed_Value &p2) const
{
std::vector<Boxed_Value> params;
params.push_back(p1);
params.push_back(p2);
return call_function(t_name, params);
} }
/** /**

View File

@ -176,13 +176,11 @@ namespace chaiscript
try { try {
if (lhs.is_undef()) if (lhs.is_undef())
{ {
retval = ss.call_function("clone", Param_List_Builder() << retval); retval = ss.call_function("clone", retval);
} }
Param_List_Builder plb;
plb << lhs;
plb << retval;
try { try {
retval = ss.call_function(node->children[i+1]->text, plb); retval = ss.call_function(node->children[i+1]->text, lhs, retval);
} }
catch(const dispatch_error &){ catch(const dispatch_error &){
throw Eval_Error(std::string("Mismatched types in equation") + (lhs.is_const()?", lhs is const.":"."), node->children[i+1]); throw Eval_Error(std::string("Mismatched types in equation") + (lhs.is_const()?", lhs is const.":"."), node->children[i+1]);
@ -202,11 +200,8 @@ namespace chaiscript
} }
} }
else { else {
Param_List_Builder plb;
plb << eval_token(ss, node->children[i]);
plb << retval;
try { try {
retval = ss.call_function(node->children[i+1]->text, plb); retval = ss.call_function(node->children[i+1]->text, eval_token(ss, node->children[i]), retval);
} }
catch(const dispatch_error &){ catch(const dispatch_error &){
throw Eval_Error("Can not find appropriate '" + node->children[i+1]->text + "'", node->children[i+1]); throw Eval_Error("Can not find appropriate '" + node->children[i+1]->text + "'", node->children[i+1]);
@ -293,18 +288,12 @@ namespace chaiscript
unsigned int i; unsigned int i;
Boxed_Value retval = eval_token(ss, node->children[0]); Boxed_Value retval = eval_token(ss, node->children[0]);
if (node->children.size() > 1) { for (i = 1; i < node->children.size(); i += 2) {
for (i = 1; i < node->children.size(); i += 2) { try {
Param_List_Builder plb; retval = ss.call_function(node->children[i]->text, retval, eval_token(ss, node->children[i + 1]));
plb << retval; }
plb << eval_token(ss, node->children[i + 1]); catch(const dispatch_error &){
throw Eval_Error("Can not find appropriate '" + node->children[i]->text + "'", node->children[i]);
try {
retval = ss.call_function(node->children[i]->text, plb);
}
catch(const dispatch_error &){
throw Eval_Error("Can not find appropriate '" + node->children[i]->text + "'", node->children[i]);
}
} }
} }
@ -320,11 +309,8 @@ namespace chaiscript
Boxed_Value retval = eval_token(ss, node->children[0]); Boxed_Value retval = eval_token(ss, node->children[0]);
for (i = 1; i < node->children.size(); ++i) { for (i = 1; i < node->children.size(); ++i) {
Param_List_Builder plb;
plb << retval;
plb << eval_token(ss, node->children[i]);
try { try {
retval = ss.call_function("[]", plb); retval = ss.call_function("[]", retval, eval_token(ss, node->children[i]));
} }
catch(std::out_of_range &) { catch(std::out_of_range &) {
throw Eval_Error("Out of bounds exception", node); throw Eval_Error("Out of bounds exception", node);
@ -342,11 +328,8 @@ namespace chaiscript
*/ */
template <typename Eval_System> template <typename Eval_System>
Boxed_Value eval_prefix(Eval_System &ss, const TokenPtr &node) { Boxed_Value eval_prefix(Eval_System &ss, const TokenPtr &node) {
Param_List_Builder plb;
plb << eval_token(ss, node->children[1]);
try { try {
return ss.call_function(node->children[0]->text, plb); return ss.call_function(node->children[0]->text, eval_token(ss, node->children[1]));
} }
catch(std::exception &){ catch(std::exception &){
throw Eval_Error("Can not find appropriate unary '" + node->children[0]->text + "'", node->children[0]); throw Eval_Error("Can not find appropriate unary '" + node->children[0]->text + "'", node->children[0]);
@ -361,16 +344,13 @@ namespace chaiscript
unsigned int i; unsigned int i;
try { try {
Boxed_Value retval = ss.call_function("Vector", Param_List_Builder()); Boxed_Value retval = ss.call_function("Vector");
if (node->children.size() > 0) { for (i = 0; i < node->children[0]->children.size(); ++i) {
for (i = 0; i < node->children[0]->children.size(); ++i) { try {
try { ss.call_function("push_back", retval, eval_token(ss, node->children[0]->children[i]));
Boxed_Value tmp = eval_token(ss, node->children[0]->children[i]); }
ss.call_function("push_back", Param_List_Builder() << retval << tmp); catch (const dispatch_error &) {
} throw Eval_Error("Can not find appropriate 'push_back'", node->children[0]->children[i]);
catch (const dispatch_error &) {
throw Eval_Error("Can not find appropriate 'push_back'", node->children[0]->children[i]);
}
} }
} }
@ -388,9 +368,9 @@ namespace chaiscript
template <typename Eval_System> template <typename Eval_System>
Boxed_Value eval_inline_range(Eval_System &ss, const TokenPtr &node) { Boxed_Value eval_inline_range(Eval_System &ss, const TokenPtr &node) {
try { try {
return ss.call_function("generate_range", Param_List_Builder() return ss.call_function("generate_range",
<< eval_token(ss, node->children[0]->children[0]->children[0]) eval_token(ss, node->children[0]->children[0]->children[0]),
<< eval_token(ss, node->children[0]->children[0]->children[1])); eval_token(ss, node->children[0]->children[0]->children[1]));
} }
catch (const dispatch_error &) { catch (const dispatch_error &) {
throw Eval_Error("Unable to generate range vector", node); throw Eval_Error("Unable to generate range vector", node);
@ -405,12 +385,12 @@ namespace chaiscript
unsigned int i; unsigned int i;
try { try {
Boxed_Value retval = ss.call_function("Map", Param_List_Builder()); Boxed_Value retval = ss.call_function("Map");
for (i = 0; i < node->children[0]->children.size(); ++i) { for (i = 0; i < node->children[0]->children.size(); ++i) {
try { try {
Boxed_Value key = eval_token(ss, node->children[0]->children[i]->children[0]); Boxed_Value slot
Boxed_Value slot = ss.call_function("[]", Param_List_Builder() << retval << key); = ss.call_function("[]", retval, eval_token(ss, node->children[0]->children[i]->children[0]));
ss.call_function("=", Param_List_Builder() << slot << eval_token(ss, node->children[0]->children[i]->children[1])); ss.call_function("=", slot, eval_token(ss, node->children[0]->children[i]->children[1]));
} }
catch (const dispatch_error &) { catch (const dispatch_error &) {
throw Eval_Error("Can not find appropriate '=' for map init", node->children[0]->children[i]); throw Eval_Error("Can not find appropriate '=' for map init", node->children[0]->children[i]);