From b270a198dc0bf5b10eef9dab3cad22a420bf94b4 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 2 Jul 2015 22:10:09 -0600 Subject: [PATCH] Don't clone return values into vector/map --- include/chaiscript/language/chaiscript_eval.hpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 3c84eaa..9d5d8c9 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -1047,7 +1047,12 @@ namespace chaiscript std::vector vec; if (!children.empty()) { for (const auto &child : children[0]->children) { - vec.push_back(t_ss.call_function("clone", child->eval(t_ss))); + auto obj = child->eval(t_ss); + if (!obj.is_return_value()) { + vec.push_back(t_ss.call_function("clone", obj)); + } else { + vec.push_back(std::move(obj)); + } } } return const_var(std::move(vec)); @@ -1073,8 +1078,12 @@ namespace chaiscript std::map retval; for (const auto &child : children[0]->children) { - Boxed_Value bv = t_ss.call_function("clone", child->children[1]->eval(t_ss)); - retval[t_ss.boxed_cast(child->children[0]->eval(t_ss))] = std::move(bv); + auto obj = child->children[1]->eval(t_ss); + if (!obj.is_return_value()) { + obj = t_ss.call_function("clone", obj); + } + + retval[t_ss.boxed_cast(child->children[0]->eval(t_ss))] = std::move(obj); } return const_var(std::move(retval));