diff --git a/binding-mruby/binding-util.h b/binding-mruby/binding-util.h index 6584026..d7c92da 100644 --- a/binding-mruby/binding-util.h +++ b/binding-mruby/binding-util.h @@ -22,6 +22,8 @@ #ifndef BINDINGUTIL_H #define BINDINGUTIL_H +#include "exception.h" + #include #include #include @@ -212,15 +214,16 @@ defineClass(mrb_state *mrb, const char *name) #define DEF_PROP_B(Klass, PropName) \ DEF_PROP(Klass, mrb_bool, PropName, "b", bool) -// FIXME: use initialize_copy -#define CLONE_FUN(Klass) \ - MRB_METHOD(Klass##Clone) \ +#define INITCOPY_FUN(Klass) \ + MRB_METHOD(Klass##InitializeCopy) \ { \ - Klass *k = getPrivateData(mrb, self); \ - mrb_value dupObj = mrb_obj_clone(mrb, self); \ - Klass *dupK = new Klass(*k); \ - setPrivateData(dupObj, dupK, Klass##Type); \ - return dupObj; \ + mrb_value origObj; \ + mrb_get_args(mrb, "o", &origObj); \ + Klass *orig = getPrivateData(mrb, origObj); \ + Klass *k = 0; \ + GUARD_EXC( k = new Klass(*orig); ) \ + setPrivateData(self, k, Klass##Type); \ + return self; \ } #define MARSH_LOAD_FUN(Klass) \ diff --git a/binding-mruby/bitmap-binding.cpp b/binding-mruby/bitmap-binding.cpp index f6dd714..57a4db9 100644 --- a/binding-mruby/bitmap-binding.cpp +++ b/binding-mruby/bitmap-binding.cpp @@ -297,7 +297,7 @@ MRB_METHOD(bitmapSetFont) return mrb_nil_value(); } -CLONE_FUN(Bitmap) +INITCOPY_FUN(Bitmap) void @@ -307,7 +307,8 @@ bitmapBindingInit(mrb_state *mrb) disposableBindingInit(mrb, klass); - mrb_define_method(mrb, klass, "initialize", bitmapInitialize, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1)); + mrb_define_method(mrb, klass, "initialize", bitmapInitialize, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1)); + mrb_define_method(mrb, klass, "initialize_copy", BitmapInitializeCopy, MRB_ARGS_REQ(1)); mrb_define_method(mrb, klass, "width", bitmapWidth, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "height", bitmapHeight, MRB_ARGS_NONE()); @@ -326,5 +327,4 @@ bitmapBindingInit(mrb_state *mrb) mrb_define_method(mrb, klass, "font=", bitmapSetFont, MRB_ARGS_REQ(1)); mrb_define_method(mrb, klass, "inspect", inspectObject, MRB_ARGS_NONE()); - mrb_define_method(mrb, klass, "clone", BitmapClone, MRB_ARGS_NONE()); } diff --git a/binding-mruby/etc-binding.cpp b/binding-mruby/etc-binding.cpp index bf571e8..82c303a 100644 --- a/binding-mruby/etc-binding.cpp +++ b/binding-mruby/etc-binding.cpp @@ -159,9 +159,9 @@ MARSH_LOAD_FUN(Color) MARSH_LOAD_FUN(Tone) MARSH_LOAD_FUN(Rect) -CLONE_FUN(Tone) -CLONE_FUN(Color) -CLONE_FUN(Rect) +INITCOPY_FUN(Tone) +INITCOPY_FUN(Color) +INITCOPY_FUN(Rect) #define MRB_ATTR_R(Class, Attr, sym) mrb_define_method(mrb, klass, sym, Class##Get##Attr, MRB_ARGS_NONE()) #define MRB_ATTR_W(Class, Attr, sym) mrb_define_method(mrb, klass, sym "=", Class##Set##Attr, MRB_ARGS_REQ(1)) @@ -173,8 +173,8 @@ CLONE_FUN(Rect) mrb_define_class_method(mrb, klass, "_load", Klass##Load, MRB_ARGS_REQ(1)); \ serializableBindingInit(mrb, klass); \ mrb_define_method(mrb, klass, "initialize", Klass##Initialize, MRB_ARGS_REQ(3) | MRB_ARGS_OPT(1)); \ + mrb_define_method(mrb, klass, "initialize_copy", Klass##InitializeCopy, MRB_ARGS_REQ(1)); \ mrb_define_method(mrb, klass, "set", Klass##Set, MRB_ARGS_REQ(3) | MRB_ARGS_OPT(1)); \ - mrb_define_method(mrb, klass, "clone", Klass##Clone, MRB_ARGS_NONE()); \ mrb_define_method(mrb, klass, "==", Klass##Equal, MRB_ARGS_REQ(1)); \ mrb_define_method(mrb, klass, "to_s", Klass##Stringify, MRB_ARGS_NONE()); \ mrb_define_method(mrb, klass, "inspect", Klass##Stringify, MRB_ARGS_NONE()); \ diff --git a/binding-mruby/font-binding.cpp b/binding-mruby/font-binding.cpp index 5d921d8..e06b882 100644 --- a/binding-mruby/font-binding.cpp +++ b/binding-mruby/font-binding.cpp @@ -59,6 +59,22 @@ MRB_METHOD(fontInitialize) return self; } +MRB_METHOD(fontInitializeCopy) +{ + mrb_value origObj; + mrb_get_args(mrb, "o", &origObj); + + Font *orig = getPrivateData(mrb, origObj); + Font *f = new Font(*orig); + setPrivateData(self, f, FontType); + + /* Wrap property objects */ + f->setColor(new Color(*f->getColor())); + wrapProperty(mrb, self, f->getColor(), CScolor, ColorType); + + return self; +} + MRB_METHOD(FontGetName) { Font *f = getPrivateData(mrb, self); @@ -157,7 +173,8 @@ fontBindingInit(mrb_state *mrb) INIT_KLASS_PROP_BIND(Font, DefaultItalic, "default_italic"); INIT_KLASS_PROP_BIND(Font, DefaultColor, "default_color"); - mrb_define_method(mrb, klass, "initialize", fontInitialize, MRB_ARGS_OPT(2)); + mrb_define_method(mrb, klass, "initialize", fontInitialize, MRB_ARGS_OPT(2)); + mrb_define_method(mrb, klass, "initialize_copy", fontInitializeCopy, MRB_ARGS_REQ(1)); INIT_PROP_BIND(Font, Name, "name"); INIT_PROP_BIND(Font, Size, "size"); diff --git a/binding-mruby/table-binding.cpp b/binding-mruby/table-binding.cpp index 4dd4e6a..699c41e 100644 --- a/binding-mruby/table-binding.cpp +++ b/binding-mruby/table-binding.cpp @@ -141,6 +141,7 @@ MRB_METHOD(tableSetAt) } MARSH_LOAD_FUN(Table) +INITCOPY_FUN(Table) void tableBindingInit(mrb_state *mrb) @@ -150,7 +151,9 @@ tableBindingInit(mrb_state *mrb) mrb_define_class_method(mrb, klass, "_load", TableLoad, MRB_ARGS_REQ(1)); serializableBindingInit(mrb, klass); - mrb_define_method(mrb, klass, "initialize", tableInitialize, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(2)); + mrb_define_method(mrb, klass, "initialize", tableInitialize, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(2)); + mrb_define_method(mrb, klass, "initialize_copy", TableInitializeCopy, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, klass, "resize", tableResize, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(2)); mrb_define_method(mrb, klass, "xsize", tableXSize, MRB_ARGS_NONE() ); mrb_define_method(mrb, klass, "ysize", tableYSize, MRB_ARGS_NONE() );