MRuby-Binding: Bind #initialize_copy for clonable classes
Port of b7a2ba830c.
			
			
This commit is contained in:
		
							parent
							
								
									1cc1541377
								
							
						
					
					
						commit
						3b35fb219c
					
				
					 5 changed files with 40 additions and 17 deletions
				
			
		| 
						 | 
					@ -22,6 +22,8 @@
 | 
				
			||||||
#ifndef BINDINGUTIL_H
 | 
					#ifndef BINDINGUTIL_H
 | 
				
			||||||
#define BINDINGUTIL_H
 | 
					#define BINDINGUTIL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "exception.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <mruby.h>
 | 
					#include <mruby.h>
 | 
				
			||||||
#include <mruby/data.h>
 | 
					#include <mruby/data.h>
 | 
				
			||||||
#include <mruby/variable.h>
 | 
					#include <mruby/variable.h>
 | 
				
			||||||
| 
						 | 
					@ -212,15 +214,16 @@ defineClass(mrb_state *mrb, const char *name)
 | 
				
			||||||
#define DEF_PROP_B(Klass, PropName) \
 | 
					#define DEF_PROP_B(Klass, PropName) \
 | 
				
			||||||
	DEF_PROP(Klass, mrb_bool, PropName, "b", bool)
 | 
						DEF_PROP(Klass, mrb_bool, PropName, "b", bool)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FIXME: use initialize_copy
 | 
					#define INITCOPY_FUN(Klass) \
 | 
				
			||||||
#define CLONE_FUN(Klass) \
 | 
						MRB_METHOD(Klass##InitializeCopy) \
 | 
				
			||||||
	MRB_METHOD(Klass##Clone) \
 | 
					 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		Klass *k = getPrivateData<Klass>(mrb, self); \
 | 
							mrb_value origObj; \
 | 
				
			||||||
		mrb_value dupObj = mrb_obj_clone(mrb, self); \
 | 
							mrb_get_args(mrb, "o", &origObj); \
 | 
				
			||||||
		Klass *dupK = new Klass(*k); \
 | 
							Klass *orig = getPrivateData<Klass>(mrb, origObj); \
 | 
				
			||||||
		setPrivateData(dupObj, dupK, Klass##Type); \
 | 
							Klass *k = 0; \
 | 
				
			||||||
		return dupObj; \
 | 
							GUARD_EXC( k = new Klass(*orig); ) \
 | 
				
			||||||
 | 
							setPrivateData(self, k, Klass##Type); \
 | 
				
			||||||
 | 
							return self; \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MARSH_LOAD_FUN(Klass) \
 | 
					#define MARSH_LOAD_FUN(Klass) \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -297,7 +297,7 @@ MRB_METHOD(bitmapSetFont)
 | 
				
			||||||
	return mrb_nil_value();
 | 
						return mrb_nil_value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CLONE_FUN(Bitmap)
 | 
					INITCOPY_FUN(Bitmap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -307,7 +307,8 @@ bitmapBindingInit(mrb_state *mrb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	disposableBindingInit<Bitmap>(mrb, klass);
 | 
						disposableBindingInit<Bitmap>(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, "width",       bitmapWidth,      MRB_ARGS_NONE());
 | 
				
			||||||
	mrb_define_method(mrb, klass, "height",      bitmapHeight,     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, "font=",       bitmapSetFont,    MRB_ARGS_REQ(1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mrb_define_method(mrb, klass, "inspect",     inspectObject,    MRB_ARGS_NONE());
 | 
						mrb_define_method(mrb, klass, "inspect",     inspectObject,    MRB_ARGS_NONE());
 | 
				
			||||||
	mrb_define_method(mrb, klass, "clone",       BitmapClone,      MRB_ARGS_NONE());
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,9 +159,9 @@ MARSH_LOAD_FUN(Color)
 | 
				
			||||||
MARSH_LOAD_FUN(Tone)
 | 
					MARSH_LOAD_FUN(Tone)
 | 
				
			||||||
MARSH_LOAD_FUN(Rect)
 | 
					MARSH_LOAD_FUN(Rect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CLONE_FUN(Tone)
 | 
					INITCOPY_FUN(Tone)
 | 
				
			||||||
CLONE_FUN(Color)
 | 
					INITCOPY_FUN(Color)
 | 
				
			||||||
CLONE_FUN(Rect)
 | 
					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_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))
 | 
					#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)); \
 | 
						mrb_define_class_method(mrb, klass, "_load", Klass##Load, MRB_ARGS_REQ(1)); \
 | 
				
			||||||
	serializableBindingInit<Klass>(mrb, klass); \
 | 
						serializableBindingInit<Klass>(mrb, klass); \
 | 
				
			||||||
	mrb_define_method(mrb, klass, "initialize", Klass##Initialize, MRB_ARGS_REQ(3) | MRB_ARGS_OPT(1)); \
 | 
						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, "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, "==", Klass##Equal, MRB_ARGS_REQ(1)); \
 | 
				
			||||||
	mrb_define_method(mrb, klass, "to_s", Klass##Stringify, MRB_ARGS_NONE()); \
 | 
						mrb_define_method(mrb, klass, "to_s", Klass##Stringify, MRB_ARGS_NONE()); \
 | 
				
			||||||
	mrb_define_method(mrb, klass, "inspect", Klass##Stringify, MRB_ARGS_NONE()); \
 | 
						mrb_define_method(mrb, klass, "inspect", Klass##Stringify, MRB_ARGS_NONE()); \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,22 @@ MRB_METHOD(fontInitialize)
 | 
				
			||||||
	return self;
 | 
						return self;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MRB_METHOD(fontInitializeCopy)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						mrb_value origObj;
 | 
				
			||||||
 | 
						mrb_get_args(mrb, "o", &origObj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Font *orig = getPrivateData<Font>(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)
 | 
					MRB_METHOD(FontGetName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Font *f = getPrivateData<Font>(mrb, self);
 | 
						Font *f = getPrivateData<Font>(mrb, self);
 | 
				
			||||||
| 
						 | 
					@ -157,7 +173,8 @@ fontBindingInit(mrb_state *mrb)
 | 
				
			||||||
	INIT_KLASS_PROP_BIND(Font, DefaultItalic, "default_italic");
 | 
						INIT_KLASS_PROP_BIND(Font, DefaultItalic, "default_italic");
 | 
				
			||||||
	INIT_KLASS_PROP_BIND(Font, DefaultColor, "default_color");
 | 
						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, Name, "name");
 | 
				
			||||||
	INIT_PROP_BIND(Font, Size, "size");
 | 
						INIT_PROP_BIND(Font, Size, "size");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +141,7 @@ MRB_METHOD(tableSetAt)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MARSH_LOAD_FUN(Table)
 | 
					MARSH_LOAD_FUN(Table)
 | 
				
			||||||
 | 
					INITCOPY_FUN(Table)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
tableBindingInit(mrb_state *mrb)
 | 
					tableBindingInit(mrb_state *mrb)
 | 
				
			||||||
| 
						 | 
					@ -150,7 +151,9 @@ tableBindingInit(mrb_state *mrb)
 | 
				
			||||||
	mrb_define_class_method(mrb, klass, "_load", TableLoad, MRB_ARGS_REQ(1));
 | 
						mrb_define_class_method(mrb, klass, "_load", TableLoad, MRB_ARGS_REQ(1));
 | 
				
			||||||
	serializableBindingInit<Table>(mrb, klass);
 | 
						serializableBindingInit<Table>(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, "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, "xsize",      tableXSize,      MRB_ARGS_NONE()                  );
 | 
				
			||||||
	mrb_define_method(mrb, klass, "ysize",      tableYSize,      MRB_ARGS_NONE()                  );
 | 
						mrb_define_method(mrb, klass, "ysize",      tableYSize,      MRB_ARGS_NONE()                  );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue