Eradicate internal exceptions during object clone
This commit is contained in:
parent
8bdd2deb19
commit
8931346230
@ -450,7 +450,13 @@ namespace chaiscript
|
|||||||
m->add(fun(static_cast<Boxed_Value & (dispatch::Dynamic_Object::*)(const std::string &)>(&dispatch::Dynamic_Object::get_attr)), "[]");
|
m->add(fun(static_cast<Boxed_Value & (dispatch::Dynamic_Object::*)(const std::string &)>(&dispatch::Dynamic_Object::get_attr)), "[]");
|
||||||
m->add(fun(static_cast<const Boxed_Value & (dispatch::Dynamic_Object::*)(const std::string &) const>(&dispatch::Dynamic_Object::get_attr)), "[]");
|
m->add(fun(static_cast<const Boxed_Value & (dispatch::Dynamic_Object::*)(const std::string &) const>(&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(&has_guard), "has_guard");
|
||||||
m->add(fun(&get_guard), "get_guard");
|
m->add(fun(&get_guard), "get_guard");
|
||||||
|
@ -248,7 +248,7 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool compare_types(const std::vector<Type_Info> &tis, const std::vector<Boxed_Value> &bvs)
|
static bool compare_types(const std::vector<Type_Info> &tis, const std::vector<Boxed_Value> &bvs, const Type_Conversions &t_conversions)
|
||||||
{
|
{
|
||||||
if (tis.size() - 1 != bvs.size())
|
if (tis.size() - 1 != bvs.size())
|
||||||
{
|
{
|
||||||
@ -257,10 +257,7 @@ namespace chaiscript
|
|||||||
const size_t size = bvs.size();
|
const size_t size = bvs.size();
|
||||||
for (size_t i = 0; i < size; ++i)
|
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() ))
|
if (!compare_type_to_param(tis[i + 1], bvs[i], t_conversions)) { return false; }
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -578,7 +575,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
virtual bool call_match(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE
|
virtual bool call_match(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE
|
||||||
{
|
{
|
||||||
return static_cast<int>(vals.size()) == get_arity() && (compare_types(m_types, vals) || compare_types_with_cast(vals, t_conversions));
|
return static_cast<int>(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<Boxed_Value> &vals, const Type_Conversions &t_conversions) const = 0;
|
virtual bool compare_types_with_cast(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const = 0;
|
||||||
|
@ -145,11 +145,6 @@ def reverse(container) {
|
|||||||
retval;
|
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)
|
def range(r) : call_exists(range_internal, r)
|
||||||
{
|
{
|
||||||
@ -158,6 +153,13 @@ def range(r) : call_exists(range_internal, r)
|
|||||||
ri;
|
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
|
# The retro attribute that contains the underlying range
|
||||||
attr retro::m_range;
|
attr retro::m_range;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user