From 8931346230e7da276b02a36b89309d89a4abfd4a Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 1 Aug 2015 13:47:25 -0600 Subject: [PATCH] Eradicate internal exceptions during object clone --- include/chaiscript/dispatchkit/bootstrap.hpp | 8 +++++++- include/chaiscript/dispatchkit/proxy_functions.hpp | 9 +++------ include/chaiscript/language/chaiscript_prelude.chai | 12 +++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 1624e02..0f57528 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -450,7 +450,13 @@ namespace chaiscript m->add(fun(static_cast(&dispatch::Dynamic_Object::get_attr)), "[]"); m->add(fun(static_cast(&dispatch::Dynamic_Object::get_attr)), "[]"); - m->eval("def Dynamic_Object::clone() { auto &new_o = Dynamic_Object(this.get_type_name()); for_each(this.get_attrs(), bind(fun(new_o, x) { new_o.get_attr(x.first) = x.second; }, new_o, _) ); return new_o; }"); + m->eval(R""( + def Dynamic_Object::clone() { + auto &new_o = Dynamic_Object(this.get_type_name()); + for_each(this.get_attrs(), fun[new_o](x) { new_o.get_attr(x.first) = x.second; } ); + new_o; + } + )""); m->add(fun(&has_guard), "has_guard"); m->add(fun(&get_guard), "get_guard"); diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index 1eee060..156831f 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -248,7 +248,7 @@ namespace chaiscript } - static bool compare_types(const std::vector &tis, const std::vector &bvs) + static bool compare_types(const std::vector &tis, const std::vector &bvs, const Type_Conversions &t_conversions) { if (tis.size() - 1 != bvs.size()) { @@ -257,10 +257,7 @@ namespace chaiscript const size_t size = bvs.size(); for (size_t i = 0; i < size; ++i) { - if (!(tis[i+1].bare_equal(bvs[i].get_type_info()) && tis[i+1].is_const() >= bvs[i].get_type_info().is_const() )) - { - return false; - } + if (!compare_type_to_param(tis[i + 1], bvs[i], t_conversions)) { return false; } } } return true; @@ -578,7 +575,7 @@ namespace chaiscript virtual bool call_match(const std::vector &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE { - return static_cast(vals.size()) == get_arity() && (compare_types(m_types, vals) || compare_types_with_cast(vals, t_conversions)); + return static_cast(vals.size()) == get_arity() && (compare_types(m_types, vals, t_conversions) && 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_prelude.chai b/include/chaiscript/language/chaiscript_prelude.chai index 0fe2a5a..acb8407 100644 --- a/include/chaiscript/language/chaiscript_prelude.chai +++ b/include/chaiscript/language/chaiscript_prelude.chai @@ -145,11 +145,6 @@ def reverse(container) { retval; } -# Return a range from a range -def range(r) : call_exists(empty, r) && call_exists(pop_front, r) && call_exists(pop_back, r) && call_exists(back, r) && call_exists(front, r) -{ - clone(r); -} def range(r) : call_exists(range_internal, r) { @@ -158,6 +153,13 @@ def range(r) : call_exists(range_internal, r) ri; } +# Return a range from a range +def range(r) : call_exists(empty, r) && call_exists(pop_front, r) && call_exists(pop_back, r) && call_exists(back, r) && call_exists(front, r) +{ + clone(r); +} + + # The retro attribute that contains the underlying range attr retro::m_range;