Add support for cloning of dynamic objects
This commit is contained in:
@@ -689,8 +689,10 @@ namespace chaiscript
|
|||||||
m->add(fun(boost::function<std::string (const std::runtime_error &)>(&what)), "what");
|
m->add(fun(boost::function<std::string (const std::runtime_error &)>(&what)), "what");
|
||||||
|
|
||||||
m->add(user_type<Dynamic_Object>(), "Dynamic_Object");
|
m->add(user_type<Dynamic_Object>(), "Dynamic_Object");
|
||||||
copy_constructor<Dynamic_Object>("Dynamic_Object", m);
|
m->add(constructor<Dynamic_Object (const std::string &)>(), "Dynamic_Object");
|
||||||
|
m->add(fun(&Dynamic_Object::get_type_name), "get_type_name");
|
||||||
|
m->add(fun(&Dynamic_Object::get_attrs), "get_attrs");
|
||||||
|
m->add(fun(&Dynamic_Object::get_attr), "get_attr");
|
||||||
|
|
||||||
|
|
||||||
basic_constructors<bool>("bool", m);
|
basic_constructors<bool>("bool", m);
|
||||||
|
@@ -21,6 +21,11 @@ namespace chaiscript
|
|||||||
return m_attrs[t_attr_name];
|
return m_attrs[t_attr_name];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<std::string, Boxed_Value> get_attrs()
|
||||||
|
{
|
||||||
|
return m_attrs;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_type_name;
|
std::string m_type_name;
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#define chaiscript_prelude CODE_STRING(\
|
#define chaiscript_prelude CODE_STRING(\
|
||||||
def new(x) { eval(type_name(x))(); } \n\
|
def new(x) { eval(type_name(x))(); } \n\
|
||||||
|
def clone(o) : is_type(o, "Dynamic_Object") { var new_o := Dynamic_Object(o.get_type_name()); for_each(o.get_attrs(), bind(fun(new_o, x) { new_o.get_attr(x.first) = x.second; }, new_o, _) ); return new_o; } \n\
|
||||||
def clone(x) : function_exists(type_name(x)) { eval(type_name(x))(x); } \n\
|
def clone(x) : function_exists(type_name(x)) { eval(type_name(x))(x); } \n\
|
||||||
# to_string for Pair()\n\
|
# to_string for Pair()\n\
|
||||||
def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\
|
def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\
|
||||||
|
11
unittests/object_clone.chai
Normal file
11
unittests/object_clone.chai
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
attr bob::z
|
||||||
|
def bob::bob() { }
|
||||||
|
|
||||||
|
var x = bob();
|
||||||
|
x.z = 10;
|
||||||
|
|
||||||
|
var y = clone(x);
|
||||||
|
y.z = 20;
|
||||||
|
|
||||||
|
print(x.z);
|
||||||
|
print(y.z);
|
2
unittests/object_clone.txt
Normal file
2
unittests/object_clone.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
10
|
||||||
|
20
|
Reference in New Issue
Block a user