diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 5e9e4de..cb4233d 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -1007,14 +1007,6 @@ namespace chaiscript static bool function_less_than(const Proxy_Function &lhs, const Proxy_Function &rhs) { - const auto &lhsparamtypes = lhs->get_param_types(); - const auto &rhsparamtypes = rhs->get_param_types(); - - const auto lhssize = lhsparamtypes.size(); - const auto rhssize = rhsparamtypes.size(); - - CHAISCRIPT_CONSTEXPR auto boxed_type = user_type(); - CHAISCRIPT_CONSTEXPR auto boxed_pod_type = user_type(); auto dynamic_lhs(std::dynamic_pointer_cast(lhs)); auto dynamic_rhs(std::dynamic_pointer_cast(rhs)); @@ -1044,6 +1036,14 @@ namespace chaiscript return true; } + const auto &lhsparamtypes = lhs->get_param_types(); + const auto &rhsparamtypes = rhs->get_param_types(); + + const auto lhssize = lhsparamtypes.size(); + const auto rhssize = rhsparamtypes.size(); + + CHAISCRIPT_CONSTEXPR auto boxed_type = user_type(); + CHAISCRIPT_CONSTEXPR auto boxed_pod_type = user_type(); for (size_t i = 1; i < lhssize && i < rhssize; ++i) { diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index d03c33d..e65b203 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -529,12 +529,7 @@ namespace chaiscript virtual bool call_match(const std::vector &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE { - if (static_cast(vals.size()) != get_arity()) - { - return false; - } - - return compare_types(m_types, vals) || compare_types_with_cast(vals, t_conversions); + return static_cast(vals.size()) == get_arity() && (compare_types(m_types, vals) || compare_types_with_cast(vals, t_conversions)); } virtual bool compare_types_with_cast(const std::vector &vals, const Type_Conversions &t_conversions) const = 0; diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 9195fb2..82f3a52 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -499,7 +499,7 @@ namespace chaiscript struct Return_Value { Boxed_Value retval; - Return_Value(const Boxed_Value &t_return_value) : retval(t_return_value) { } + Return_Value(Boxed_Value t_return_value) : retval(std::move(t_return_value)) { } }; diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 06f2b13..0f7f63a 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -61,7 +61,7 @@ namespace chaiscript try { return t_node->eval(t_ss); } catch (detail::Return_Value &rv) { - return rv.retval; + return std::move(rv.retval); } } } @@ -707,13 +707,14 @@ namespace chaiscript fpp.save_params(params); - std::string fun_name; - if ((this->children[i]->identifier == AST_Node_Type::Fun_Call) || (this->children[i]->identifier == AST_Node_Type::Array_Call)) { - fun_name = this->children[i]->children[0]->text; - } - else { - fun_name = this->children[i]->text; - } + std::string fun_name = [&](){ + if ((this->children[i]->identifier == AST_Node_Type::Fun_Call) || (this->children[i]->identifier == AST_Node_Type::Array_Call)) { + return this->children[i]->children[0]->text; + } + else { + return this->children[i]->text; + } + }(); try { chaiscript::eval::detail::Stack_Push_Pop spp(t_ss); @@ -728,7 +729,7 @@ namespace chaiscript } } catch(detail::Return_Value &rv) { - retval = rv.retval; + retval = std::move(rv.retval); } if (this->children[i]->identifier == AST_Node_Type::Array_Call) { @@ -1171,14 +1172,11 @@ namespace chaiscript AST_Node(std::move(t_ast_node_text), AST_Node_Type::File, t_fname, t_start_line, t_start_col, t_end_line, t_end_col) { } virtual ~File_AST_Node() {} virtual Boxed_Value eval_internal(chaiscript::detail::Dispatch_Engine &t_ss) const CHAISCRIPT_OVERRIDE { - const size_t size = this->children.size(); - for (size_t i = 0; i < size; ++i) { - Boxed_Value retval(this->children[i]->eval(t_ss)); - if (i + 1 == size) { - return retval; - } + const auto num_children = children.size(); + for (size_t i = 0; i < num_children-1; ++i) { + children[i]->eval(t_ss); } - return Boxed_Value(); + return children.back()->eval(t_ss); } }; diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index e16c452..73a33e2 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -1118,8 +1118,8 @@ namespace chaiscript const auto prev_col = m_col; const auto prev_line = m_line; if (Char_(t_c)) { - std::string match(start, m_input_pos); - m_match_stack.push_back(std::make_shared(std::move(match), m_filename, prev_line, prev_col, m_line, m_col)); + m_match_stack.push_back( + std::make_shared(std::string(start, m_input_pos), m_filename, prev_line, prev_col, m_line, m_col)); return true; } else { return false; @@ -1163,8 +1163,8 @@ namespace chaiscript } if ( t_capture && retval ) { - std::string match(start, m_input_pos); - m_match_stack.push_back(std::make_shared(std::move(match), m_filename, prev_line, prev_col, m_line, m_col)); + m_match_stack.push_back(std::make_shared( + std::string(start, m_input_pos), m_filename, prev_line, prev_col, m_line, m_col)); } return retval; } @@ -1206,8 +1206,8 @@ namespace chaiscript } if ( t_capture && retval ) { - std::string match(start, m_input_pos); - m_match_stack.push_back(std::make_shared(std::move(match), m_filename, prev_line, prev_col, m_line, m_col)); + m_match_stack.push_back(std::make_shared( + std::string(start, m_input_pos), m_filename, prev_line, prev_col, m_line, m_col)); } return retval; @@ -1239,8 +1239,8 @@ namespace chaiscript const auto prev_col = m_col; const auto prev_line = m_line; if (Eol_()) { - std::string match(start, m_input_pos); - m_match_stack.push_back(std::make_shared(std::move(match), m_filename, prev_line, prev_col, m_line, m_col)); + m_match_stack.push_back(std::make_shared( + std::string(start, m_input_pos), m_filename, prev_line, prev_col, m_line, m_col)); return true; } else { return false;