Clean up unnecessary Boxed_Value copies in eval
This commit is contained in:
parent
599a21d377
commit
7c7e437b10
@ -2,13 +2,13 @@ cmake_minimum_required(VERSION 2.6)
|
|||||||
|
|
||||||
project(chaiscript)
|
project(chaiscript)
|
||||||
|
|
||||||
SET (CMAKE_BUILD_TYPE gdb)
|
#SET (CMAKE_BUILD_TYPE gdb)
|
||||||
SET (CMAKE_C_FLAGS_GDB " -Wall -ggdb")
|
#SET (CMAKE_C_FLAGS_GDB " -Wall -ggdb")
|
||||||
SET (CMAKE_CXX_FLAGS_GDB " -Wall -ggdb")
|
#SET (CMAKE_CXX_FLAGS_GDB " -Wall -ggdb")
|
||||||
|
|
||||||
#SET (CMAKE_BUILD_TYPE rel)
|
SET (CMAKE_BUILD_TYPE rel)
|
||||||
#SET (CMAKE_C_FLAGS_REL " -Wall -O3")
|
SET (CMAKE_C_FLAGS_REL " -Wall -O3")
|
||||||
#SET (CMAKE_CXX_FLAGS_REL " -Wall -O3")
|
SET (CMAKE_CXX_FLAGS_REL " -Wall -O3")
|
||||||
|
|
||||||
include_directories(include)
|
include_directories(include)
|
||||||
|
|
||||||
|
@ -550,12 +550,9 @@ namespace chaiscript
|
|||||||
*/
|
*/
|
||||||
template <typename Eval_System>
|
template <typename Eval_System>
|
||||||
dispatchkit::Boxed_Value eval_while(Eval_System &ss, TokenPtr node) {
|
dispatchkit::Boxed_Value eval_while(Eval_System &ss, TokenPtr node) {
|
||||||
dispatchkit::Boxed_Value retval;
|
|
||||||
|
|
||||||
retval = eval_token(ss, node->children[0]);
|
|
||||||
bool cond;
|
bool cond;
|
||||||
try {
|
try {
|
||||||
cond = dispatchkit::boxed_cast<bool &>(retval);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[0]));
|
||||||
}
|
}
|
||||||
catch (const dispatchkit::bad_boxed_cast &) {
|
catch (const dispatchkit::bad_boxed_cast &) {
|
||||||
throw Eval_Error("While condition not boolean", node->children[0]);
|
throw Eval_Error("While condition not boolean", node->children[0]);
|
||||||
@ -563,9 +560,8 @@ namespace chaiscript
|
|||||||
while (cond) {
|
while (cond) {
|
||||||
try {
|
try {
|
||||||
eval_token(ss, node->children[1]);
|
eval_token(ss, node->children[1]);
|
||||||
retval = eval_token(ss, node->children[0]);
|
|
||||||
try {
|
try {
|
||||||
cond = dispatchkit::boxed_cast<bool &>(retval);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[0]));
|
||||||
}
|
}
|
||||||
catch (const dispatchkit::bad_boxed_cast &) {
|
catch (const dispatchkit::bad_boxed_cast &) {
|
||||||
throw Eval_Error("While condition not boolean", node->children[0]);
|
throw Eval_Error("While condition not boolean", node->children[0]);
|
||||||
@ -583,20 +579,16 @@ namespace chaiscript
|
|||||||
*/
|
*/
|
||||||
template <typename Eval_System>
|
template <typename Eval_System>
|
||||||
dispatchkit::Boxed_Value eval_for(Eval_System &ss, TokenPtr node) {
|
dispatchkit::Boxed_Value eval_for(Eval_System &ss, TokenPtr node) {
|
||||||
dispatchkit::Boxed_Value retval;
|
|
||||||
|
|
||||||
dispatchkit::Boxed_Value condition;
|
|
||||||
bool cond;
|
bool cond;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (node->children.size() == 4) {
|
if (node->children.size() == 4) {
|
||||||
eval_token(ss, node->children[0]);
|
eval_token(ss, node->children[0]);
|
||||||
condition = eval_token(ss, node->children[1]);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[1]));
|
||||||
}
|
}
|
||||||
else if (node->children.size() == 3){
|
else {
|
||||||
condition = eval_token(ss, node->children[0]);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[0]));
|
||||||
}
|
}
|
||||||
cond = dispatchkit::boxed_cast<bool &>(condition);
|
|
||||||
}
|
}
|
||||||
catch (const dispatchkit::bad_boxed_cast &) {
|
catch (const dispatchkit::bad_boxed_cast &) {
|
||||||
throw Eval_Error("For condition not boolean", node);
|
throw Eval_Error("For condition not boolean", node);
|
||||||
@ -606,15 +598,13 @@ namespace chaiscript
|
|||||||
if (node->children.size() == 4) {
|
if (node->children.size() == 4) {
|
||||||
eval_token(ss, node->children[3]);
|
eval_token(ss, node->children[3]);
|
||||||
eval_token(ss, node->children[2]);
|
eval_token(ss, node->children[2]);
|
||||||
condition = eval_token(ss, node->children[1]);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[1]));
|
||||||
}
|
}
|
||||||
else if (node->children.size() == 3) {
|
else {
|
||||||
eval_token(ss, node->children[2]);
|
eval_token(ss, node->children[2]);
|
||||||
eval_token(ss, node->children[1]);
|
eval_token(ss, node->children[1]);
|
||||||
condition = eval_token(ss, node->children[0]);
|
cond = dispatchkit::boxed_cast<bool &>(eval_token(ss, node->children[0]));
|
||||||
}
|
}
|
||||||
cond = dispatchkit::boxed_cast<bool &>(condition);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (const dispatchkit::bad_boxed_cast &) {
|
catch (const dispatchkit::bad_boxed_cast &) {
|
||||||
throw Eval_Error("For condition not boolean", node);
|
throw Eval_Error("For condition not boolean", node);
|
||||||
@ -760,121 +750,120 @@ namespace chaiscript
|
|||||||
*/
|
*/
|
||||||
template <typename Eval_System>
|
template <typename Eval_System>
|
||||||
dispatchkit::Boxed_Value eval_token(Eval_System &ss, TokenPtr node) {
|
dispatchkit::Boxed_Value eval_token(Eval_System &ss, TokenPtr node) {
|
||||||
dispatchkit::Boxed_Value retval;
|
|
||||||
|
|
||||||
switch (node->identifier) {
|
switch (node->identifier) {
|
||||||
case (Token_Type::File) :
|
case (Token_Type::File) :
|
||||||
retval = eval_file(ss, node);
|
return eval_file(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Id) :
|
case (Token_Type::Id) :
|
||||||
retval = eval_id(ss, node);
|
return eval_id(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Float) :
|
case (Token_Type::Float) :
|
||||||
retval = eval_float(ss, node);
|
return eval_float(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Int) :
|
case (Token_Type::Int) :
|
||||||
retval = eval_int(ss, node);
|
return eval_int(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Quoted_String) :
|
case (Token_Type::Quoted_String) :
|
||||||
retval = eval_quoted_string(ss, node);
|
return eval_quoted_string(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Single_Quoted_String) :
|
case (Token_Type::Single_Quoted_String) :
|
||||||
retval = eval_single_quoted_string(ss, node);
|
return eval_single_quoted_string(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Equation) :
|
case (Token_Type::Equation) :
|
||||||
retval = eval_equation(ss, node);
|
return eval_equation(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Var_Decl) :
|
case (Token_Type::Var_Decl) :
|
||||||
retval = eval_var_decl(ss, node);
|
return eval_var_decl(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Expression) :
|
case (Token_Type::Expression) :
|
||||||
retval = eval_expression(ss, node);
|
return eval_expression(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Comparison) :
|
case (Token_Type::Comparison) :
|
||||||
case (Token_Type::Additive) :
|
case (Token_Type::Additive) :
|
||||||
case (Token_Type::Multiplicative) :
|
case (Token_Type::Multiplicative) :
|
||||||
retval = eval_comp_add_mul(ss, node);
|
return eval_comp_add_mul(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Array_Call) :
|
case (Token_Type::Array_Call) :
|
||||||
retval = eval_array_call(ss, node);
|
return eval_array_call(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Negate) :
|
case (Token_Type::Negate) :
|
||||||
retval = eval_negate(ss, node);
|
return eval_negate(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Not) :
|
case (Token_Type::Not) :
|
||||||
retval = eval_not(ss, node);
|
return eval_not(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Prefix) :
|
case (Token_Type::Prefix) :
|
||||||
retval = eval_prefix(ss, node);
|
return eval_prefix(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Inline_Array) :
|
case (Token_Type::Inline_Array) :
|
||||||
retval = eval_inline_array(ss, node);
|
return eval_inline_array(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Inline_Range) :
|
case (Token_Type::Inline_Range) :
|
||||||
retval = eval_inline_range(ss, node);
|
return eval_inline_range(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Inline_Map) :
|
case (Token_Type::Inline_Map) :
|
||||||
retval = eval_inline_map(ss, node);
|
return eval_inline_map(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Fun_Call) :
|
case (Token_Type::Fun_Call) :
|
||||||
retval = eval_fun_call(ss, node);
|
return eval_fun_call(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Dot_Access) :
|
case (Token_Type::Dot_Access) :
|
||||||
retval = eval_dot_access(ss, node);
|
return eval_dot_access(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case(Token_Type::If) :
|
case(Token_Type::If) :
|
||||||
retval = eval_if(ss, node);
|
return eval_if(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case(Token_Type::While) :
|
case(Token_Type::While) :
|
||||||
retval = eval_while(ss, node);
|
return eval_while(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case(Token_Type::For) :
|
case(Token_Type::For) :
|
||||||
retval = eval_for(ss, node);
|
return eval_for(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Def) :
|
case (Token_Type::Def) :
|
||||||
retval = eval_def(ss, node);
|
return eval_def(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Lambda) :
|
case (Token_Type::Lambda) :
|
||||||
retval = eval_lambda(ss, node);
|
return eval_lambda(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Block) :
|
case (Token_Type::Block) :
|
||||||
retval = eval_block(ss, node);
|
return eval_block(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Return) :
|
case (Token_Type::Return) :
|
||||||
retval = eval_return(ss, node);
|
return eval_return(ss, node);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (Token_Type::Break) :
|
case (Token_Type::Break) :
|
||||||
retval = eval_break(ss, node);
|
return eval_break(ss, node);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
default :
|
||||||
|
return dispatchkit::Boxed_Value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* CHAISCRIPT_EVAL_HPP_ */
|
#endif /* CHAISCRIPT_EVAL_HPP_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user