From 719d138ad807df154b54282627b5c1f75278e729 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 30 Mar 2013 09:06:08 +0900 Subject: [PATCH 001/103] Rename to define_class, fix method argument comment --- codegen/binder.rb | 2 +- codegen/gen_template.rb | 4 ++-- mrubybind.cc | 1 + mrubybind.dat | 6 +++--- mrubybind.h | 5 ++++- mrubybind.inc | 24 ++++++++++++------------ 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 5359a3b..d922fc0 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -8,7 +8,7 @@ def MrubyBind.define_function(binder, name, f) end end - def MrubyBind.create_class(binder, klass, f) + def MrubyBind.define_class(binder, klass, f) k = Kernel.const_set(klass, Class.new) k.class_eval do define_method(:initialize) do |*args| diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 38e9018..b293535 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -34,7 +34,7 @@ EOD METHOD_TMPL = < struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -46,7 +46,7 @@ } }; -// class C { R f(P0) }; +// class C { R f(%PARAMS%) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { diff --git a/mrubybind.cc b/mrubybind.cc index 3915ed5..7ac024a 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -2,6 +2,7 @@ #include #include #include +#include #include namespace mrubybind { diff --git a/mrubybind.dat b/mrubybind.dat index ed7fe61..187bbe0 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,5 +1,5 @@ const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xde,0x82,0x00,0x00,0x03,0x76,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x53,0x46,0x00,0x00,0x03,0x76,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x58,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -10,8 +10,8 @@ const uint8_t binder[] = { 0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80,0xc0, 0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69, -0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63, -0x72,0x65,0x61,0x74,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x13,0x64,0x65,0x66, +0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x64, +0x65,0x66,0x69,0x6e,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x13,0x64,0x65,0x66, 0x69,0x6e,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, 0x00,0x00,0x00,0x4d,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26, 0x02,0x80,0x00,0x11,0x03,0x00,0x01,0x04,0x03,0x80,0x80,0x01,0x04,0x00,0x03,0x40, diff --git a/mrubybind.h b/mrubybind.h index 8c5310f..e305e9f 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,6 +1,9 @@ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ +#include +#include +#include #include "mrubybind_types.h" namespace mrubybind { @@ -24,7 +27,7 @@ class MrubyBind { mrb_value binder = mrb_voidp_value((void*)Binder::call); mrb_value cn = mrb_str_new_cstr(mrb, class_name); mrb_value fp = mrb_voidp_value((void*)f); - mrb_funcall(mrb, mod_mrubybind, "create_class", 3, binder, cn, fp); + mrb_funcall(mrb, mod_mrubybind, "define_class", 3, binder, cn, fp); } // Bind class method. diff --git a/mrubybind.inc b/mrubybind.inc index d930896..aa68bcd 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -24,7 +24,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(void) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -36,7 +36,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(void) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -116,7 +116,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(P0, P1) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -128,7 +128,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(P0, P1) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -162,7 +162,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(P0, P1, P2) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -174,7 +174,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(P0, P1, P2) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -208,7 +208,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(P0, P1, P2, P3) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -220,7 +220,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(P0, P1, P2, P3) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -254,7 +254,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(P0, P1, P2, P3, P4) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -266,7 +266,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(P0, P1, P2, P3, P4) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -300,7 +300,7 @@ struct Binder { } }; -// class C { void f(P0) }; +// class C { void f(P0, P1, P2, P3, P4, P5) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { @@ -312,7 +312,7 @@ struct Binder { } }; -// class C { R f(P0) }; +// class C { R f(P0, P1, P2, P3, P4, P5) }; template struct Binder { static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { From 9399ba12db8ca53bc6638c0b480a2f1015675141 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 30 Mar 2013 11:09:12 +0900 Subject: [PATCH 002/103] Use DATA type for imported class to call dectructor --- codegen/binder.rb | 11 +-- codegen/gen_template.rb | 30 ++++-- examples/main.cc | 17 ++-- mrubybind.cc | 21 +++- mrubybind.dat | 85 ++++++++-------- mrubybind.h | 17 ++-- mrubybind.inc | 210 +++++++++++++++++++++++++++++----------- mrubybind_types.h | 13 +++ 8 files changed, 272 insertions(+), 132 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index d922fc0..4aed17b 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -8,19 +8,18 @@ def MrubyBind.define_function(binder, name, f) end end - def MrubyBind.define_class(binder, klass, f) - k = Kernel.const_set(klass, Class.new) - k.class_eval do + def MrubyBind.bind_class(binder, klass, ctor) + Kernel.const_get(klass).class_eval do define_method(:initialize) do |*args| - @instance = MrubyBind::call_cfunc(binder, f, *args) + MrubyBind::call_ctorfunc(binder, self, ctor, *args) end end end - def MrubyBind.define_class_method(binder, klass, func, f) + def MrubyBind.bind_class_method(binder, klass, func, f) Kernel.const_get(klass).class_eval do define_method(func) do |*args| - MrubyBind::call_cmethod(binder, @instance, f, *args) + MrubyBind::call_cmethod(binder, self, f, *args) end end end diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index b293535..90e630e 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -31,29 +31,43 @@ } }; +// C* ctor(%PARAMS%); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == %NPARAM%); %ASSERTS% + C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))p; + C* instance = ctor(%ARGS%); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + EOD METHOD_TMPL = < -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%);%ASSERTS% + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(%PARAMS%); - M method = *(M*)p; - (((C*)o)->*method)(%ARGS%); + M method = *(M*)pp; + (instance->*method)(%ARGS%); return mrb_nil_value(); } }; // class C { R f(%PARAMS%) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%);%ASSERTS% + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(%PARAMS%); - M method = *(M*)p; - R result = (((C*)o)->*method)(%ARGS%); + M method = *(M*)pp; + R result = (instance->*method)(%ARGS%); return Type::ret(mrb, result); } }; diff --git a/examples/main.cc b/examples/main.cc index cb5919a..ededb61 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -33,10 +33,10 @@ void test(bool t) { class Hoge { public: Hoge(int x) : x_(x) { - cout << "Hoge::ctor(" << x << ")" << endl; + cout << "Hoge::ctor(" << x << "), " << this << endl; } virtual ~Hoge() { - cout << "Hoge::dtor()" << endl; + cout << "Hoge::dtor(), " << this << endl; } int hoge(int y) { return x_ + y; @@ -46,8 +46,8 @@ class Hoge { int x_; }; -void* new_hoge(int x) { - return (void*)new Hoge(x); +Hoge* new_hoge(int x) { + return new Hoge(x); } @@ -78,12 +78,13 @@ int main() { { mrubybind::MrubyBind b(mrb); - b.define_class("Hoge", new_hoge); - b.define_class_method("Hoge", "hoge", &Hoge::hoge); + b.bind_class("Hoge", new_hoge); + b.bind_class_method("Hoge", "hoge", &Hoge::hoge); } mrb_load_string(mrb, - "h = Hoge.new(111)\n" - "p h.hoge(567)\n" + "hoge = Hoge.new(123)\n" + "p hoge\n" + "p hoge.hoge(567)\n" ); if (mrb->exc) { diff --git a/mrubybind.cc b/mrubybind.cc index 7ac024a..7100067 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -21,16 +21,29 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value self) { return binderp(mrb, mrb_voidp(p), args, narg); } -static mrb_value call_cmethod(mrb_state *mrb, mrb_value self) { +static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { mrb_value binder; mrb_value o; mrb_value p; mrb_value* args; int narg; mrb_get_args(mrb, "ooo*", &binder, &o, &p, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, void*, void*, mrb_value*, int); + typedef void (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); BindFunc binderp = (BindFunc)mrb_voidp(binder); - return binderp(mrb, mrb_voidp(o), RSTRING_PTR(p), args, narg); + binderp(mrb, o, mrb_voidp(p), args, narg); + return self; +} + +static mrb_value call_cmethod(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value o; + mrb_value p; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooS*", &binder, &o, &p, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = (BindFunc)mrb_voidp(binder); + return binderp(mrb, o, RSTRING_PTR(p), args, narg); } MrubyBind::MrubyBind(mrb_state* mrb) { @@ -43,6 +56,8 @@ MrubyBind::MrubyBind(mrb_state* mrb) { this->mod_mrubybind = mrb_obj_value(mrubybind); mrb_define_module_function(mrb, mrubybind, "call_cfunc", call_cfunc, ARGS_REQ(2) | ARGS_REST()); + mrb_define_module_function(mrb, mrubybind, "call_ctorfunc", call_ctorfunc, + ARGS_REQ(3) | ARGS_REST()); mrb_define_module_function(mrb, mrubybind, "call_cmethod", call_cmethod, ARGS_REQ(3) | ARGS_REST()); int n = mrb_read_irep(mrb, binder); diff --git a/mrubybind.dat b/mrubybind.dat index 187bbe0..40c2a88 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,58 +1,55 @@ const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x53,0x46,0x00,0x00,0x03,0x76,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x58,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xdd,0x9f,0x00,0x00,0x03,0x43,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x25,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x8b,0x00,0x01,0x00,0x02,0x00,0x00,0x00, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x87,0x00,0x01,0x00,0x02,0x00,0x00,0x00, 0x0e,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80,0x00, 0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80,0x80, 0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80,0xc0, 0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69, -0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x64, -0x65,0x66,0x69,0x6e,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x13,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x4d,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26, -0x02,0x80,0x00,0x11,0x03,0x00,0x01,0x04,0x03,0x80,0x80,0x01,0x04,0x00,0x03,0x40, -0x02,0x80,0x41,0x21,0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x0d, -0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, -0x4f,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x08,0x00,0x26,0x01,0x80,0x00, -0x11,0x02,0x00,0x40,0x15,0x02,0x80,0xc0,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, -0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, -0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x6b, -0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x0b,0x06,0x00,0x00,0x26,0x03,0x00,0x00,0x11, -0x03,0x80,0x80,0x01,0x04,0x00,0x01,0x11,0x04,0x00,0xc0,0x20,0x03,0x00,0x41,0x20, -0x02,0x81,0x80,0x01,0x03,0x01,0x40,0x01,0x03,0x80,0x03,0x40,0x03,0x01,0x00,0x21, -0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x06,0x4b,0x65, -0x72,0x6e,0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x73,0x65,0x74,0x00, -0x05,0x43,0x6c,0x61,0x73,0x73,0x00,0x03,0x6e,0x65,0x77,0x00,0x0a,0x63,0x6c,0x61, +0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a,0x62, +0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x11,0x62,0x69,0x6e,0x64,0x5f, +0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x4d, +0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26,0x02,0x80,0x00,0x11, +0x03,0x00,0x01,0x04,0x03,0x80,0x80,0x01,0x04,0x00,0x03,0x40,0x02,0x80,0x41,0x21, +0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65, +0x72,0x6e,0x65,0x6c,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x4f,0x00,0x03,0x00, +0x06,0x00,0x00,0x00,0x09,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00,0x40, +0x15,0x02,0x80,0xc0,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00,0x05,0x00,0x07, +0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26,0x02,0x80,0x00,0x11,0x03,0x00,0x80,0x01, +0x02,0x80,0x40,0xa0,0x03,0x00,0x03,0x40,0x02,0x80,0x80,0x21,0x02,0x80,0x00,0x29, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c, +0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a,0x63,0x6c,0x61, 0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x43,0x00,0x01,0x00,0x04,0x00, 0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03,0x40,0x00, 0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x0a, -0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x5e,0x00,0x03, -0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00, -0x40,0x95,0x02,0x80,0xc0,0x95,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01, -0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x01,0x0e,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e, -0x64,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x09,0x40, -0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x00,0x00,0x00,0x4f,0x00,0x06,0x00,0x08, -0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11,0x03,0x80,0x80,0x01, -0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40,0x03,0x00,0x80,0x21,0x03,0x00,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c, -0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a,0x63,0x6c,0x61, -0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x04,0x00, -0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15,0x01,0x80,0x03,0x40,0x00, -0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, -0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00, -0x00,0x60,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80, -0x00,0x11,0x02,0x00,0x40,0x95,0x02,0x80,0x01,0x0d,0x03,0x01,0x00,0x95,0x02,0x01, -0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x09,0x40,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x45,0x4e, -0x44,0x00,0x00,0x00,0x00,0x08, +0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x56,0x00,0x03, +0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00, +0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7,0x02,0x80, +0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e, +0x64,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63, +0x00,0x00,0x00,0x4f,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26, +0x03,0x00,0x00,0x11,0x03,0x80,0x80,0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40, +0x03,0x00,0x80,0x21,0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, +0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f, +0x67,0x65,0x74,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x37,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, +0x00,0xc0,0x15,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, +0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x07,0x00,0x00, +0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00,0x40,0x95,0x02,0x80, +0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01, +0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63, +0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x45,0x4e,0x44,0x00,0x00, +0x00,0x00,0x08, }; diff --git a/mrubybind.h b/mrubybind.h index e305e9f..1097d3c 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -23,21 +23,24 @@ class MrubyBind { // Bind class. template - void define_class(const char* class_name, Func f) { - mrb_value binder = mrb_voidp_value((void*)Binder::call); + void bind_class(const char* class_name, Func ctor) { + struct RClass *tc = mrb_define_class(mrb, class_name, mrb->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + + mrb_value binder = mrb_voidp_value((void*)ClassBinder::ctor); mrb_value cn = mrb_str_new_cstr(mrb, class_name); - mrb_value fp = mrb_voidp_value((void*)f); - mrb_funcall(mrb, mod_mrubybind, "define_class", 3, binder, cn, fp); + mrb_value fp = mrb_voidp_value((void*)ctor); + mrb_funcall(mrb, mod_mrubybind, "bind_class", 3, binder, cn, fp); } // Bind class method. template - void define_class_method(const char* class_name, const char* method_name, Method m) { - mrb_value binder = mrb_voidp_value((void*)Binder::call); + void bind_class_method(const char* class_name, const char* method_name, Method m) { + mrb_value binder = mrb_voidp_value((void*)ClassBinder::call); mrb_value cn = mrb_str_new_cstr(mrb, class_name); mrb_value mn = mrb_str_new_cstr(mrb, method_name); mrb_value mp = mrb_str_new(mrb, (char*)&m, sizeof(m)); - mrb_funcall(mrb, mod_mrubybind, "define_class_method", 4, binder, cn, mn, mp); + mrb_funcall(mrb, mod_mrubybind, "bind_class_method", 4, binder, cn, mn, mp); } private: diff --git a/mrubybind.inc b/mrubybind.inc index aa68bcd..64de861 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -24,26 +24,40 @@ struct Binder { } }; +// C* ctor(void); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 0); + C* (*ctor)(void) = (C* (*)(void))p; + C* instance = ctor(); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(void) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 0); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(void); - M method = *(M*)p; - (((C*)o)->*method)(); + M method = *(M*)pp; + (instance->*method)(); return mrb_nil_value(); } }; // class C { R f(void) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 0); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(void); - M method = *(M*)p; - R result = (((C*)o)->*method)(); + M method = *(M*)pp; + R result = (instance->*method)(); return Type::ret(mrb, result); } }; @@ -70,26 +84,40 @@ struct Binder { } }; +// C* ctor(P0); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 1); ASSERT(CHECK(0)); + C* (*ctor)(P0) = (C* (*)(P0))p; + C* instance = ctor(ARG(0)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 1);ASSERT(CHECK(0)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0)); + M method = *(M*)pp; + (instance->*method)(ARG(0)); return mrb_nil_value(); } }; // class C { R f(P0) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 1);ASSERT(CHECK(0)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0)); return Type::ret(mrb, result); } }; @@ -116,26 +144,40 @@ struct Binder { } }; +// C* ctor(P0, P1); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 2); ASSERT(CHECK(0)); ASSERT(CHECK(1)); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))p; + C* instance = ctor(ARG(0), ARG(1)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0, P1) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0), ARG(1)); + M method = *(M*)pp; + (instance->*method)(ARG(0), ARG(1)); return mrb_nil_value(); } }; // class C { R f(P0, P1) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0), ARG(1)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0), ARG(1)); return Type::ret(mrb, result); } }; @@ -162,26 +204,40 @@ struct Binder { } }; +// C* ctor(P0, P1, P2); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 3); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))p; + C* instance = ctor(ARG(0), ARG(1), ARG(2)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0, P1, P2) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0), ARG(1), ARG(2)); + M method = *(M*)pp; + (instance->*method)(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } }; // class C { R f(P0, P1, P2) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0), ARG(1), ARG(2)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } }; @@ -208,26 +264,40 @@ struct Binder { } }; +// C* ctor(P0, P1, P2, P3); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 4); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))p; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0, P1, P2, P3) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); + M method = *(M*)pp; + (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } }; // class C { R f(P0, P1, P2, P3) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } }; @@ -254,26 +324,40 @@ struct Binder { } }; +// C* ctor(P0, P1, P2, P3, P4); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 5); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))p; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0, P1, P2, P3, P4) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M method = *(M*)pp; + (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } }; // class C { R f(P0, P1, P2, P3, P4) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } }; @@ -300,26 +384,40 @@ struct Binder { } }; +// C* ctor(P0, P1, P2, P3, P4, P5); +template +struct ClassBinder { + static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + ASSERT(narg == 6); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))p; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = instance; + } +}; + // class C { void f(P0, P1, P2, P3, P4, P5) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M method = *(M*)p; - (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M method = *(M*)pp; + (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } }; // class C { R f(P0, P1, P2, P3, P4, P5) }; template -struct Binder { - static mrb_value call(mrb_state* mrb, void* o, void* p, mrb_value* args, int narg) { +struct ClassBinder { + static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M method = *(M*)p; - R result = (((C*)o)->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M method = *(M*)pp; + R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } }; diff --git a/mrubybind_types.h b/mrubybind_types.h index 4b6f255..9529757 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -99,6 +99,19 @@ struct Binder { //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; }; +// Template class for Binder. +// Binder template class is specialized with type. +template +struct ClassBinder { + static struct mrb_data_type type_info; + static void dtor(mrb_state*, void* p) { + C* instance = static_cast(p); + delete instance; + } +}; +template +mrb_data_type ClassBinder::type_info = { "???", dtor }; + // Includes generated template specialization. #include "mrubybind.inc" From b07537ef4a0c683099a4da50494ca0784a08fe3e Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 30 Mar 2013 11:23:39 +0900 Subject: [PATCH 003/103] Add readme --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ examples/main.cc | 61 +++++++++++------------------------------------ 2 files changed, 76 insertions(+), 47 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..fca086c --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +mrubybind - Binding library for mruby/C++ +========================================= + +## Usage + +### Bind C function and call it from mruby + + // C function + int square(int x) { + return x * x; + } + + // C++ + #include "mrubybind.h" + + void install_square(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + + // mruby + puts square(1111) #=> 1234321 + +### Bind C++ class and method and call it from mruby + + // C++ class + class Foo { + public: + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << "), " << this << endl; + } + virtual ~Foo() { + cout << "Foo::dtor(), " << this << endl; + } + int bar(int y) { + return x_ + y; + } + + private: + int x_; + }; + + // Bind + Foo* new_foo(int x) { + return new Foo(x); + } + + void install_foo_class(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind_class("Foo", new_foo); + b.bind_class_method("Foo", "bar", &Foo::bar); + } + + // mruby + foo = Foo.new(123) + p foo + p foo.bar(567) + + +# License + +MIT license. diff --git a/examples/main.cc b/examples/main.cc index ededb61..9c32ab0 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -5,40 +5,19 @@ #include using namespace std; -void hoge() { - cout << "hoge called" << endl; -} - -void fuga(const char* str) { - cout << "fuga called: " << str << endl; -} - -std::string piyo(const std::string& s) { - return s + s; -} - int square(int x) { return x * x; } -double add(double x, double y) { - return x + y; -} - -void test(bool t) { - cout << t << endl; -} - - -class Hoge { +class Foo { public: - Hoge(int x) : x_(x) { - cout << "Hoge::ctor(" << x << "), " << this << endl; + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << "), " << this << endl; } - virtual ~Hoge() { - cout << "Hoge::dtor(), " << this << endl; + virtual ~Foo() { + cout << "Foo::dtor(), " << this << endl; } - int hoge(int y) { + int bar(int y) { return x_ + y; } @@ -46,31 +25,19 @@ class Hoge { int x_; }; -Hoge* new_hoge(int x) { - return new Hoge(x); +Foo* new_foo(int x) { + return new Foo(x); } - - int main() { mrb_state* mrb = mrb_open(); { mrubybind::MrubyBind b(mrb); - b.bind("hoge", hoge); - b.bind("fuga", fuga); - b.bind("piyo", piyo); b.bind("square", square); - b.bind("add", add); - b.bind("test", test); } mrb_load_string(mrb, - "hoge()\n" - "fuga('piyo')\n" - "p piyo('abc')\n" - "p test('')\n" - "p square(1111)\n" - "p add(1.23, 9.87)\n" + "puts square(1111)\n" ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); @@ -78,13 +45,13 @@ int main() { { mrubybind::MrubyBind b(mrb); - b.bind_class("Hoge", new_hoge); - b.bind_class_method("Hoge", "hoge", &Hoge::hoge); + b.bind_class("Foo", new_foo); + b.bind_class_method("Foo", "bar", &Foo::bar); } mrb_load_string(mrb, - "hoge = Hoge.new(123)\n" - "p hoge\n" - "p hoge.hoge(567)\n" + "foo = Foo.new(123)\n" + "p foo\n" + "p foo.bar(567)\n" ); if (mrb->exc) { From 6d4899558a2e8bdbba4e713f8c8a7f52a2777955 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 30 Mar 2013 11:34:44 +0900 Subject: [PATCH 004/103] Update README.md --- README.md | 102 +++++++++++++++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index fca086c..eaf20b9 100644 --- a/README.md +++ b/README.md @@ -5,56 +5,64 @@ mrubybind - Binding library for mruby/C++ ### Bind C function and call it from mruby - // C function - int square(int x) { - return x * x; - } - - // C++ - #include "mrubybind.h" - - void install_square(mrb_state* mrb) { - mrubybind::MrubyBind b(mrb); - b.bind("square", square); - } - - // mruby - puts square(1111) #=> 1234321 +1. C function (Any type you want): + + int square(int x) { + return x * x; + } + +2. Bind it using mrubybind: + + #include "mrubybind.h" + + void install_square_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + +3. Call it from mruby: + + puts square(1111) + #=> 1234321 ### Bind C++ class and method and call it from mruby - // C++ class - class Foo { - public: - Foo(int x) : x_(x) { - cout << "Foo::ctor(" << x << "), " << this << endl; - } - virtual ~Foo() { - cout << "Foo::dtor(), " << this << endl; - } - int bar(int y) { - return x_ + y; - } - - private: - int x_; - }; - - // Bind - Foo* new_foo(int x) { - return new Foo(x); - } - - void install_foo_class(mrb_state* mrb) { - mrubybind::MrubyBind b(mrb); - b.bind_class("Foo", new_foo); - b.bind_class_method("Foo", "bar", &Foo::bar); - } - - // mruby - foo = Foo.new(123) - p foo - p foo.bar(567) +1. C++ class: + + class Foo { + public: + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << "), " << this << endl; + } + virtual ~Foo() { + cout << "Foo::dtor(), " << this << endl; + } + int bar(int y) { + return x_ + y; + } + + private: + int x_; + }; + +2. Bind C++ class using mrubybind: + + // Helper function for constructor. + Foo* new_foo(int x) { + return new Foo(x); + } + + void install_foo_class(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind_class("Foo", new_foo); + b.bind_class_method("Foo", "bar", &Foo::bar); + } + +3. Call it from mruby: + + foo = Foo.new(123) + p foo + p foo.bar(567) # License From 6f8f2ef34ef46d69fee74f3de94229411eaa2bbc Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 30 Mar 2013 11:38:30 +0900 Subject: [PATCH 005/103] Update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index eaf20b9..b9798d9 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,7 @@ mrubybind - Binding library for mruby/C++ 3. Call it from mruby: - puts square(1111) - #=> 1234321 + puts square(1111) #=> 1234321 ### Bind C++ class and method and call it from mruby @@ -47,6 +46,8 @@ mrubybind - Binding library for mruby/C++ 2. Bind C++ class using mrubybind: + #include "mrubybind.h" + // Helper function for constructor. Foo* new_foo(int x) { return new Foo(x); @@ -60,10 +61,10 @@ mrubybind - Binding library for mruby/C++ 3. Call it from mruby: - foo = Foo.new(123) - p foo - p foo.bar(567) - + foo = Foo.new(123) #=> Foo::ctor(123), 0x104516780 + p foo #=> # + p foo.bar(567) #=> 690 + #=> Foo::dtor(), 0x104516780 # License From 525ede167c515c7c28282d20ab32afc76958a842 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 31 Mar 2013 09:27:13 +0900 Subject: [PATCH 006/103] Rename variable name to clarify --- codegen/binder.rb | 20 ++--- codegen/gen_template.rb | 24 +++--- examples/main.cc | 7 ++ mrubybind.cc | 53 ++++++------- mrubybind.h | 39 ++++++---- mrubybind.inc | 168 ++++++++++++++++++++-------------------- mrubybind_types.h | 4 + 7 files changed, 166 insertions(+), 149 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 4aed17b..af0f5db 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,24 +2,24 @@ # and included into C code. module MrubyBind - def MrubyBind.define_function(binder, name, f) - Kernel.send(:define_method, name) do |*args| - MrubyBind::call_cfunc(binder, f, *args) + def MrubyBind.define_function(binder, func_name, func_ptr) + Kernel.send(:define_method, func_name) do |*args| + MrubyBind::call_cfunc(binder, func_ptr, *args) end end - def MrubyBind.bind_class(binder, klass, ctor) - Kernel.const_get(klass).class_eval do + def MrubyBind.bind_class(binder, class_name, new_func_ptr) + Kernel.const_get(class_name).class_eval do define_method(:initialize) do |*args| - MrubyBind::call_ctorfunc(binder, self, ctor, *args) + MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *args) end end end - def MrubyBind.bind_class_method(binder, klass, func, f) - Kernel.const_get(klass).class_eval do - define_method(func) do |*args| - MrubyBind::call_cmethod(binder, self, f, *args) + def MrubyBind.bind_class_method(binder, class_name, method_name, method_ptr) + Kernel.const_get(class_name).class_eval do + define_method(method_name) do |*args| + MrubyBind::call_cmethod(binder, self, method_ptr, *args) end end end diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 90e630e..3224aeb 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -12,9 +12,9 @@ // void f(%PARAMS%); template<%CLASSES0%> struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%);%ASSERTS% - void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))p; + void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))func_ptr; fp(%ARGS%); return mrb_nil_value(); } @@ -23,9 +23,9 @@ // R f(%PARAMS%); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%); %ASSERTS% - R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))p; + R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))func_ptr; R result = fp(%ARGS%); return Type::ret(mrb, result); } @@ -34,9 +34,9 @@ // C* ctor(%PARAMS%); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%); %ASSERTS% - C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))p; + C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))new_func_ptr; C* instance = ctor(%ARGS%); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -49,12 +49,12 @@ // class C { void f(%PARAMS%) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%);%ASSERTS% C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(%PARAMS%); - M method = *(M*)pp; - (instance->*method)(%ARGS%); + M mp = *(M*)method_pptr; + (instance->*mp)(%ARGS%); return mrb_nil_value(); } }; @@ -62,12 +62,12 @@ // class C { R f(%PARAMS%) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == %NPARAM%);%ASSERTS% C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(%PARAMS%); - M method = *(M*)pp; - R result = (instance->*method)(%ARGS%); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(%ARGS%); return Type::ret(mrb, result); } }; diff --git a/examples/main.cc b/examples/main.cc index 9c32ab0..f7bab89 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -3,12 +3,17 @@ #include "mrubybind.h" #include +#include using namespace std; int square(int x) { return x * x; } +string emphasize(const char* str) { + return "* " + string(str) + " *"; +} + class Foo { public: Foo(int x) : x_(x) { @@ -35,9 +40,11 @@ int main() { { mrubybind::MrubyBind b(mrb); b.bind("square", square); + b.bind("emphasize", emphasize); } mrb_load_string(mrb, "puts square(1111)\n" + "puts emphasize('Hello, mruby!')\n" ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); diff --git a/mrubybind.cc b/mrubybind.cc index 7100067..d260a84 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -12,57 +12,58 @@ static static mrb_value call_cfunc(mrb_state *mrb, mrb_value self) { mrb_value binder; - mrb_value p; + mrb_value func_ptr_v; mrb_value* args; int narg; - mrb_get_args(mrb, "oo*", &binder, &p, &args, &narg); + mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); - BindFunc binderp = (BindFunc)mrb_voidp(binder); - return binderp(mrb, mrb_voidp(p), args, narg); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { mrb_value binder; - mrb_value o; - mrb_value p; + mrb_value self_v; + mrb_value new_func_ptr_v; mrb_value* args; int narg; - mrb_get_args(mrb, "ooo*", &binder, &o, &p, &args, &narg); + mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); typedef void (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = (BindFunc)mrb_voidp(binder); - binderp(mrb, o, mrb_voidp(p), args, narg); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); return self; } static mrb_value call_cmethod(mrb_state *mrb, mrb_value self) { mrb_value binder; - mrb_value o; - mrb_value p; + mrb_value self_v; + mrb_value method_pptr_v; mrb_value* args; int narg; - mrb_get_args(mrb, "ooS*", &binder, &o, &p, &args, &narg); + mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = (BindFunc)mrb_voidp(binder); - return binderp(mrb, o, RSTRING_PTR(p), args, narg); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); } -MrubyBind::MrubyBind(mrb_state* mrb) { - this->mrb = mrb; - mrb_sym sym_mrubybind = mrb_intern(mrb, "MrubyBind"); - if (mrb_const_defined(mrb, mrb_obj_value(mrb->kernel_module), sym_mrubybind)) { - this->mod_mrubybind = mrb_const_get(mrb, mrb_obj_value(mrb->kernel_module), sym_mrubybind); +MrubyBind::MrubyBind(mrb_state* mrbxx) : mrb_(mrbxx) { + mrb_sym sym_mrubybind = mrb_intern(mrb_, "MrubyBind"); + if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind)) { + mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind); } else { - RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); - this->mod_mrubybind = mrb_obj_value(mrubybind); - mrb_define_module_function(mrb, mrubybind, "call_cfunc", call_cfunc, + RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); + mod_mrubybind_ = mrb_obj_value(mrubybind); + mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, ARGS_REQ(2) | ARGS_REST()); - mrb_define_module_function(mrb, mrubybind, "call_ctorfunc", call_ctorfunc, + mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb, mrubybind, "call_cmethod", call_cmethod, + mrb_define_module_function(mrb_, mrubybind, "call_cmethod", call_cmethod, ARGS_REQ(3) | ARGS_REST()); - int n = mrb_read_irep(mrb, binder); + int n = mrb_read_irep(mrb_, binder); if (n >= 0) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + mrb_run(mrb_, mrb_proc_new(mrb_, mrb_->irep[n]), mrb_top_self(mrb_)); } } } diff --git a/mrubybind.h b/mrubybind.h index 1097d3c..eb5f03c 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -14,38 +14,43 @@ class MrubyBind { // Bind function. template - void bind(const char* name, Func f) { + void bind(const char* func_name, Func func_ptr) { mrb_value binder = mrb_voidp_value((void*)Binder::call); - mrb_value fn = mrb_str_new_cstr(mrb, name); - mrb_value fp = mrb_voidp_value((void*)f); - mrb_funcall(mrb, mod_mrubybind, "define_function", 3, binder, fn, fp); + mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); + mrb_value func_ptr_v = mrb_voidp_value(reinterpret_cast(func_ptr)); + mrb_funcall(mrb_, mod_mrubybind_, "define_function", 3, binder, func_name_v, + func_ptr_v); } // Bind class. template - void bind_class(const char* class_name, Func ctor) { - struct RClass *tc = mrb_define_class(mrb, class_name, mrb->object_class); + void bind_class(const char* class_name, Func new_func_ptr) { + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_value binder = mrb_voidp_value((void*)ClassBinder::ctor); - mrb_value cn = mrb_str_new_cstr(mrb, class_name); - mrb_value fp = mrb_voidp_value((void*)ctor); - mrb_funcall(mrb, mod_mrubybind, "bind_class", 3, binder, cn, fp); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value new_func_ptr_v = mrb_voidp_value((void*)new_func_ptr); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 3, binder, class_name_v, + new_func_ptr_v); } // Bind class method. template - void bind_class_method(const char* class_name, const char* method_name, Method m) { + void bind_class_method(const char* class_name, const char* method_name, + Method method_ptr) { mrb_value binder = mrb_voidp_value((void*)ClassBinder::call); - mrb_value cn = mrb_str_new_cstr(mrb, class_name); - mrb_value mn = mrb_str_new_cstr(mrb, method_name); - mrb_value mp = mrb_str_new(mrb, (char*)&m, sizeof(m)); - mrb_funcall(mrb, mod_mrubybind, "bind_class_method", 4, binder, cn, mn, mp); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value method_pptr_v = mrb_str_new(mrb_, + reinterpret_cast(&method_ptr), + sizeof(method_ptr)); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 4, binder, + class_name_v, method_name_v, method_pptr_v); } private: - mrb_state* mrb; - mrb_value mod_mrubybind; + mrb_state* mrb_; + mrb_value mod_mrubybind_; }; } // namespace mrubybind diff --git a/mrubybind.inc b/mrubybind.inc index 64de861..84fcf13 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -5,9 +5,9 @@ // void f(void); template<> struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 0); - void (*fp)(void) = (void (*)(void))p; + void (*fp)(void) = (void (*)(void))func_ptr; fp(); return mrb_nil_value(); } @@ -16,9 +16,9 @@ struct Binder { // R f(void); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 0); - R (*fp)(void) = (R (*)(void))p; + R (*fp)(void) = (R (*)(void))func_ptr; R result = fp(); return Type::ret(mrb, result); } @@ -27,9 +27,9 @@ struct Binder { // C* ctor(void); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 0); - C* (*ctor)(void) = (C* (*)(void))p; + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -39,12 +39,12 @@ struct ClassBinder { // class C { void f(void) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(void); - M method = *(M*)pp; - (instance->*method)(); + M mp = *(M*)method_pptr; + (instance->*mp)(); return mrb_nil_value(); } }; @@ -52,12 +52,12 @@ struct ClassBinder { // class C { R f(void) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(void); - M method = *(M*)pp; - R result = (instance->*method)(); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(); return Type::ret(mrb, result); } }; @@ -65,9 +65,9 @@ struct ClassBinder { // void f(P0); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 1);ASSERT(CHECK(0)); - void (*fp)(P0) = (void (*)(P0))p; + void (*fp)(P0) = (void (*)(P0))func_ptr; fp(ARG(0)); return mrb_nil_value(); } @@ -76,9 +76,9 @@ struct Binder { // R f(P0); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 1); ASSERT(CHECK(0)); - R (*fp)(P0) = (R (*)(P0))p; + R (*fp)(P0) = (R (*)(P0))func_ptr; R result = fp(ARG(0)); return Type::ret(mrb, result); } @@ -87,9 +87,9 @@ struct Binder { // C* ctor(P0); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 1); ASSERT(CHECK(0)); - C* (*ctor)(P0) = (C* (*)(P0))p; + C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; C* instance = ctor(ARG(0)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -99,12 +99,12 @@ struct ClassBinder { // class C { void f(P0) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 1);ASSERT(CHECK(0)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); - M method = *(M*)pp; - (instance->*method)(ARG(0)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0)); return mrb_nil_value(); } }; @@ -112,12 +112,12 @@ struct ClassBinder { // class C { R f(P0) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 1);ASSERT(CHECK(0)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0)); return Type::ret(mrb, result); } }; @@ -125,9 +125,9 @@ struct ClassBinder { // void f(P0, P1); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); - void (*fp)(P0, P1) = (void (*)(P0, P1))p; + void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; fp(ARG(0), ARG(1)); return mrb_nil_value(); } @@ -136,9 +136,9 @@ struct Binder { // R f(P0, P1); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 2); ASSERT(CHECK(0)); ASSERT(CHECK(1)); - R (*fp)(P0, P1) = (R (*)(P0, P1))p; + R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); } @@ -147,9 +147,9 @@ struct Binder { // C* ctor(P0, P1); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 2); ASSERT(CHECK(0)); ASSERT(CHECK(1)); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))p; + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; C* instance = ctor(ARG(0), ARG(1)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -159,12 +159,12 @@ struct ClassBinder { // class C { void f(P0, P1) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); - M method = *(M*)pp; - (instance->*method)(ARG(0), ARG(1)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1)); return mrb_nil_value(); } }; @@ -172,12 +172,12 @@ struct ClassBinder { // class C { R f(P0, P1) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0), ARG(1)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1)); return Type::ret(mrb, result); } }; @@ -185,9 +185,9 @@ struct ClassBinder { // void f(P0, P1, P2); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))p; + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } @@ -196,9 +196,9 @@ struct Binder { // R f(P0, P1, P2); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 3); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))p; + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } @@ -207,9 +207,9 @@ struct Binder { // C* ctor(P0, P1, P2); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 3); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))p; + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -219,12 +219,12 @@ struct ClassBinder { // class C { void f(P0, P1, P2) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); - M method = *(M*)pp; - (instance->*method)(ARG(0), ARG(1), ARG(2)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } }; @@ -232,12 +232,12 @@ struct ClassBinder { // class C { R f(P0, P1, P2) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0), ARG(1), ARG(2)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } }; @@ -245,9 +245,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))p; + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } @@ -256,9 +256,9 @@ struct Binder { // R f(P0, P1, P2, P3); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 4); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))p; + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } @@ -267,9 +267,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 4); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))p; + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -279,12 +279,12 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); - M method = *(M*)pp; - (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } }; @@ -292,12 +292,12 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } }; @@ -305,9 +305,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3, P4); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))p; + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } @@ -316,9 +316,9 @@ struct Binder { // R f(P0, P1, P2, P3, P4); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 5); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))p; + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } @@ -327,9 +327,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3, P4); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 5); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))p; + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -339,12 +339,12 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3, P4) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); - M method = *(M*)pp; - (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } }; @@ -352,12 +352,12 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3, P4) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } }; @@ -365,9 +365,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3, P4, P5); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))p; + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } @@ -376,9 +376,9 @@ struct Binder { // R f(P0, P1, P2, P3, P4, P5); template struct Binder { - static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { ASSERT(narg == 6); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))p; + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } @@ -387,9 +387,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3, P4, P5); template struct ClassBinder { - static void ctor(mrb_state* mrb, mrb_value self, void* p, mrb_value* args, int narg) { + static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { ASSERT(narg == 6); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))p; + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; @@ -399,12 +399,12 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3, P4, P5) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M method = *(M*)pp; - (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } }; @@ -412,12 +412,12 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3, P4, P5) }; template struct ClassBinder { - static mrb_value call(mrb_state* mrb, mrb_value self, void* pp, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M method = *(M*)pp; - R result = (instance->*method)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } }; diff --git a/mrubybind_types.h b/mrubybind_types.h index 9529757..5c8bcc4 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -96,6 +96,7 @@ struct Type { // Binder template class is specialized with type. template struct Binder { + // Template specialization. //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; }; @@ -108,6 +109,9 @@ struct ClassBinder { C* instance = static_cast(p); delete instance; } + + // Template specialization. + //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { }; template mrb_data_type ClassBinder::type_info = { "???", dtor }; From cfbe6b770a9e5c7dc89205146a58422e41339203 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 31 Mar 2013 09:27:32 +0900 Subject: [PATCH 007/103] Rename variable name to clarify --- examples/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/main.cc b/examples/main.cc index f7bab89..7c5495c 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -43,7 +43,7 @@ int main() { b.bind("emphasize", emphasize); } mrb_load_string(mrb, - "puts square(1111)\n" + "puts square(1111, 2)\n" "puts emphasize('Hello, mruby!')\n" ); if (mrb->exc) { From 36fc0a6552793ca1bf2bdda679a83b3bbb17eeae Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 31 Mar 2013 10:16:36 +0900 Subject: [PATCH 008/103] Check argument count in mruby --- codegen/binder.rb | 15 ++++-- codegen/gen_template.rb | 15 ++++-- examples/main.cc | 2 +- mrubybind.dat | 112 ++++++++++++++++++++++++++-------------- mrubybind.h | 15 +++--- mrubybind.inc | 105 ++++++++++++++++++++++++------------- 6 files changed, 174 insertions(+), 90 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index af0f5db..eb7ed76 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,23 +2,32 @@ # and included into C code. module MrubyBind - def MrubyBind.define_function(binder, func_name, func_ptr) + def MrubyBind.define_function(binder, func_name, func_ptr, nparam) Kernel.send(:define_method, func_name) do |*args| + if args.size != nparam + raise ArgumentError.new("`#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + end MrubyBind::call_cfunc(binder, func_ptr, *args) end end - def MrubyBind.bind_class(binder, class_name, new_func_ptr) + def MrubyBind.bind_class(binder, class_name, new_func_ptr, nparam) Kernel.const_get(class_name).class_eval do define_method(:initialize) do |*args| + if args.size != nparam + raise ArgumentError.new("`initialize': wrong number of arguments (#{args.size} for #{nparam})") + end MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *args) end end end - def MrubyBind.bind_class_method(binder, class_name, method_name, method_ptr) + def MrubyBind.bind_class_method(binder, class_name, method_name, method_ptr, nparam) Kernel.const_get(class_name).class_eval do define_method(method_name) do |*args| + if args.size != nparam + raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + end MrubyBind::call_cmethod(binder, self, method_ptr, *args) end end diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 3224aeb..fad7045 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -12,8 +12,9 @@ // void f(%PARAMS%); template<%CLASSES0%> struct Binder { + static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == %NPARAM%);%ASSERTS% + %ASSERTS% void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))func_ptr; fp(%ARGS%); return mrb_nil_value(); @@ -23,8 +24,9 @@ // R f(%PARAMS%); template struct Binder { + static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == %NPARAM%); %ASSERTS% + %ASSERTS% R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))func_ptr; R result = fp(%ARGS%); return Type::ret(mrb, result); @@ -34,8 +36,9 @@ // C* ctor(%PARAMS%); template struct ClassBinder { + static const int NPARAM = %NPARAM%; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == %NPARAM%); %ASSERTS% + %ASSERTS% C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))new_func_ptr; C* instance = ctor(%ARGS%); DATA_TYPE(self) = &ClassBinder::type_info; @@ -49,8 +52,9 @@ // class C { void f(%PARAMS%) }; template struct ClassBinder { + static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == %NPARAM%);%ASSERTS% + %ASSERTS% C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; @@ -62,8 +66,9 @@ // class C { R f(%PARAMS%) }; template struct ClassBinder { + static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == %NPARAM%);%ASSERTS% + %ASSERTS% C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; diff --git a/examples/main.cc b/examples/main.cc index 7c5495c..f7bab89 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -43,7 +43,7 @@ int main() { b.bind("emphasize", emphasize); } mrb_load_string(mrb, - "puts square(1111, 2)\n" + "puts square(1111)\n" "puts emphasize('Hello, mruby!')\n" ); if (mrb->exc) { diff --git a/mrubybind.dat b/mrubybind.dat index 40c2a88..a8d9b9b 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xdd,0x9f,0x00,0x00,0x03,0x43,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x25,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x78,0x99,0x00,0x00,0x05,0x50,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x32,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, @@ -13,43 +13,75 @@ const uint8_t binder[] = { 0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a,0x62, 0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x11,0x62,0x69,0x6e,0x64,0x5f, 0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x4d, -0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26,0x02,0x80,0x00,0x11, -0x03,0x00,0x01,0x04,0x03,0x80,0x80,0x01,0x04,0x00,0x03,0x40,0x02,0x80,0x41,0x21, -0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65, +0x00,0x06,0x00,0x0a,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11, +0x03,0x80,0x01,0x04,0x04,0x00,0x80,0x01,0x04,0x80,0x03,0x40,0x03,0x00,0x41,0x21, +0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65, 0x72,0x6e,0x65,0x6c,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x4f,0x00,0x03,0x00, -0x06,0x00,0x00,0x00,0x09,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00,0x40, -0x15,0x02,0x80,0xc0,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00,0x05,0x00,0x07, -0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x26,0x02,0x80,0x00,0x11,0x03,0x00,0x80,0x01, -0x02,0x80,0x40,0xa0,0x03,0x00,0x03,0x40,0x02,0x80,0x80,0x21,0x02,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c, -0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a,0x63,0x6c,0x61, -0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x43,0x00,0x01,0x00,0x04,0x00, -0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03,0x40,0x00, -0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, -0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x0a, -0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x56,0x00,0x03, -0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00, -0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7,0x02,0x80, -0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e, -0x64,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63, -0x00,0x00,0x00,0x4f,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26, -0x03,0x00,0x00,0x11,0x03,0x80,0x80,0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40, -0x03,0x00,0x80,0x21,0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f, -0x67,0x65,0x74,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x37,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, -0x00,0xc0,0x15,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, -0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x07,0x00,0x00, -0x00,0x0a,0x00,0x08,0x00,0x26,0x01,0x80,0x00,0x11,0x02,0x00,0x40,0x95,0x02,0x80, -0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01, -0x40,0x38,0x01,0x80,0x7f,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63, -0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x45,0x4e,0x44,0x00,0x00, -0x00,0x00,0x08, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x01,0x01,0x00,0x03,0x00, +0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x00,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x80,0x15,0x02,0x81,0x80, +0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x00, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x15,0x02,0x80,0xc0, +0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf, +0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e, +0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, +0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00, +0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04, +0x73,0x69,0x7a,0x65,0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00, +0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03, +0x6e,0x65,0x77,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a, +0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00,0x06, +0x00,0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11,0x03,0x80, +0x80,0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40,0x03,0x00,0x80,0x21,0x03,0x00, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e, +0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a,0x63, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x43,0x00,0x01,0x00, +0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03, +0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0xff, +0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01, +0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19, +0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01, +0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, +0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e, +0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95, +0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01, +0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03, +0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a, +0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, +0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20, +0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69, +0x7a,0x65,0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03,0x6e,0x65, +0x77,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0d,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00, +0x07,0x00,0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, +0x00,0x80,0x01,0x03,0x80,0x40,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x80,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, +0x6e,0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a, +0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x37,0x00,0x01, +0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15,0x01,0x80, +0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f, +0x64,0x00,0x00,0x01,0x07,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00, +0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40, +0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00, +0x3d,0x03,0x00,0xc0,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, +0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02, +0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01, +0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00, +0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77, +0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f, +0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65, +0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x0d,0x41,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03,0x6e,0x65,0x77,0x00, +0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63,0x61,0x6c,0x6c, +0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, }; diff --git a/mrubybind.h b/mrubybind.h index eb5f03c..448ddd7 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -18,8 +18,9 @@ class MrubyBind { mrb_value binder = mrb_voidp_value((void*)Binder::call); mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); mrb_value func_ptr_v = mrb_voidp_value(reinterpret_cast(func_ptr)); - mrb_funcall(mrb_, mod_mrubybind_, "define_function", 3, binder, func_name_v, - func_ptr_v); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "define_function", 4, binder, func_name_v, + func_ptr_v, nparam_v); } // Bind class. @@ -30,8 +31,9 @@ class MrubyBind { mrb_value binder = mrb_voidp_value((void*)ClassBinder::ctor); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value new_func_ptr_v = mrb_voidp_value((void*)new_func_ptr); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 3, binder, class_name_v, - new_func_ptr_v); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 4, binder, class_name_v, + new_func_ptr_v, nparam_v); } // Bind class method. @@ -44,8 +46,9 @@ class MrubyBind { mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 4, binder, - class_name_v, method_name_v, method_pptr_v); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 5, binder, + class_name_v, method_name_v, method_pptr_v, nparam_v); } private: diff --git a/mrubybind.inc b/mrubybind.inc index 84fcf13..ff92273 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -5,8 +5,9 @@ // void f(void); template<> struct Binder { + static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 0); + void (*fp)(void) = (void (*)(void))func_ptr; fp(); return mrb_nil_value(); @@ -16,8 +17,9 @@ struct Binder { // R f(void); template struct Binder { + static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 0); + R (*fp)(void) = (R (*)(void))func_ptr; R result = fp(); return Type::ret(mrb, result); @@ -27,8 +29,9 @@ struct Binder { // C* ctor(void); template struct ClassBinder { + static const int NPARAM = 0; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 0); + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); DATA_TYPE(self) = &ClassBinder::type_info; @@ -39,8 +42,9 @@ struct ClassBinder { // class C { void f(void) }; template struct ClassBinder { + static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 0); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(void); M mp = *(M*)method_pptr; @@ -52,8 +56,9 @@ struct ClassBinder { // class C { R f(void) }; template struct ClassBinder { + static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 0); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(void); M mp = *(M*)method_pptr; @@ -65,8 +70,9 @@ struct ClassBinder { // void f(P0); template struct Binder { + static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 1);ASSERT(CHECK(0)); + ASSERT(CHECK(0)); void (*fp)(P0) = (void (*)(P0))func_ptr; fp(ARG(0)); return mrb_nil_value(); @@ -76,8 +82,9 @@ struct Binder { // R f(P0); template struct Binder { + static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 1); ASSERT(CHECK(0)); + ASSERT(CHECK(0)); R (*fp)(P0) = (R (*)(P0))func_ptr; R result = fp(ARG(0)); return Type::ret(mrb, result); @@ -87,8 +94,9 @@ struct Binder { // C* ctor(P0); template struct ClassBinder { + static const int NPARAM = 1; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 1); ASSERT(CHECK(0)); + ASSERT(CHECK(0)); C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; C* instance = ctor(ARG(0)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -99,8 +107,9 @@ struct ClassBinder { // class C { void f(P0) }; template struct ClassBinder { + static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 1);ASSERT(CHECK(0)); + ASSERT(CHECK(0)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; @@ -112,8 +121,9 @@ struct ClassBinder { // class C { R f(P0) }; template struct ClassBinder { + static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 1);ASSERT(CHECK(0)); + ASSERT(CHECK(0)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; @@ -125,8 +135,9 @@ struct ClassBinder { // void f(P0, P1); template struct Binder { + static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; fp(ARG(0), ARG(1)); return mrb_nil_value(); @@ -136,8 +147,9 @@ struct Binder { // R f(P0, P1); template struct Binder { + static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 2); ASSERT(CHECK(0)); ASSERT(CHECK(1)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); @@ -147,8 +159,9 @@ struct Binder { // C* ctor(P0, P1); template struct ClassBinder { + static const int NPARAM = 2; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 2); ASSERT(CHECK(0)); ASSERT(CHECK(1)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; C* instance = ctor(ARG(0), ARG(1)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -159,8 +172,9 @@ struct ClassBinder { // class C { void f(P0, P1) }; template struct ClassBinder { + static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -172,8 +186,9 @@ struct ClassBinder { // class C { R f(P0, P1) }; template struct ClassBinder { + static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 2);ASSERT(CHECK(0)); ASSERT(CHECK(1)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -185,8 +200,9 @@ struct ClassBinder { // void f(P0, P1, P2); template struct Binder { + static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); @@ -196,8 +212,9 @@ struct Binder { // R f(P0, P1, P2); template struct Binder { + static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 3); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); @@ -207,8 +224,9 @@ struct Binder { // C* ctor(P0, P1, P2); template struct ClassBinder { + static const int NPARAM = 3; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 3); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -219,8 +237,9 @@ struct ClassBinder { // class C { void f(P0, P1, P2) }; template struct ClassBinder { + static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -232,8 +251,9 @@ struct ClassBinder { // class C { R f(P0, P1, P2) }; template struct ClassBinder { + static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 3);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -245,8 +265,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3); template struct Binder { + static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); @@ -256,8 +277,9 @@ struct Binder { // R f(P0, P1, P2, P3); template struct Binder { + static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 4); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); @@ -267,8 +289,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3); template struct ClassBinder { + static const int NPARAM = 4; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 4); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -279,8 +302,9 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3) }; template struct ClassBinder { + static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -292,8 +316,9 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3) }; template struct ClassBinder { + static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 4);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -305,8 +330,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3, P4); template struct Binder { + static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); @@ -316,8 +342,9 @@ struct Binder { // R f(P0, P1, P2, P3, P4); template struct Binder { + static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 5); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); @@ -327,8 +354,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3, P4); template struct ClassBinder { + static const int NPARAM = 5; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 5); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -339,8 +367,9 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3, P4) }; template struct ClassBinder { + static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -352,8 +381,9 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3, P4) }; template struct ClassBinder { + static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 5);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -365,8 +395,9 @@ struct ClassBinder { // void f(P0, P1, P2, P3, P4, P5); template struct Binder { + static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); @@ -376,8 +407,9 @@ struct Binder { // R f(P0, P1, P2, P3, P4, P5); template struct Binder { + static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 6); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); @@ -387,8 +419,9 @@ struct Binder { // C* ctor(P0, P1, P2, P3, P4, P5); template struct ClassBinder { + static const int NPARAM = 6; static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(narg == 6); ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_TYPE(self) = &ClassBinder::type_info; @@ -399,8 +432,9 @@ struct ClassBinder { // class C { void f(P0, P1, P2, P3, P4, P5) }; template struct ClassBinder { + static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -412,8 +446,9 @@ struct ClassBinder { // class C { R f(P0, P1, P2, P3, P4, P5) }; template struct ClassBinder { + static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(narg == 6);ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; From a40905784ddaf23a18d6ac0add2d50e662896cf5 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 31 Mar 2013 11:14:15 +0900 Subject: [PATCH 009/103] Rase TypeError --- codegen/gen_template.rb | 11 +++-- mrubybind.cc | 22 ++++++++- mrubybind.inc | 105 +++++++++++++++++++++++----------------- mrubybind_types.h | 14 +++++- 4 files changed, 101 insertions(+), 51 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index fad7045..1516255 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -4,7 +4,8 @@ HEADER = <::get(args[i]) -\#define CHECK(i) Type::check(args[i]) +\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) EOD @@ -37,12 +38,14 @@ template struct ClassBinder { static const int NPARAM = %NPARAM%; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; %ASSERTS% C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))new_func_ptr; C* instance = ctor(%ARGS%); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -94,7 +97,7 @@ def embed_template(str, nparam) params = (0...nparam).map {|i| "P#{i}"}.join(', ') args = (0...nparam).map {|i| "ARG(#{i})"}.join(', ') classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') - asserts = (0...nparam).map {|i| "ASSERT(CHECK(#{i}));"}.join(' ') + asserts = (0...nparam).map {|i| "CHECK(#{i});"}.join(' ') end table = { diff --git a/mrubybind.cc b/mrubybind.cc index d260a84..b3a2b9e 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -10,6 +10,26 @@ namespace mrubybind { static #include "mrubybind.dat" +const char Type::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "Bool"; +const char Type::TYPE_NAME[] = "Voidp"; + +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value) { + const char * argument_class_name = mrb_obj_classname(mrb, value); + mrb_raisef(mrb, E_TYPE_ERROR, "Illegal type %S, %S required, but %S(%S)", + mrb_fixnum_value(parameter_index), + mrb_str_new_cstr(mrb, required_type_name), + mrb_str_new_cstr(mrb, argument_class_name), value); + return mrb_nil_value(); +} + static mrb_value call_cfunc(mrb_state *mrb, mrb_value self) { mrb_value binder; mrb_value func_ptr_v; @@ -28,7 +48,7 @@ static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { mrb_value* args; int narg; mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); - typedef void (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); return self; diff --git a/mrubybind.inc b/mrubybind.inc index ff92273..af8d78d 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -1,6 +1,7 @@ // This file is generated from gen_template.rb #define ARG(i) Type::get(args[i]) -#define CHECK(i) Type::check(args[i]) +#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) // void f(void); template<> @@ -30,12 +31,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 0; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -72,7 +75,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); + CHECK(0); void (*fp)(P0) = (void (*)(P0))func_ptr; fp(ARG(0)); return mrb_nil_value(); @@ -84,7 +87,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); + CHECK(0); R (*fp)(P0) = (R (*)(P0))func_ptr; R result = fp(ARG(0)); return Type::ret(mrb, result); @@ -95,12 +98,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 1; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; C* instance = ctor(ARG(0)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -109,7 +114,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); + CHECK(0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; @@ -123,7 +128,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); + CHECK(0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; @@ -137,7 +142,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); + CHECK(0); CHECK(1); void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; fp(ARG(0), ARG(1)); return mrb_nil_value(); @@ -149,7 +154,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); + CHECK(0); CHECK(1); R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); @@ -160,12 +165,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 2; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); CHECK(1); C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; C* instance = ctor(ARG(0), ARG(1)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -174,7 +181,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); + CHECK(0); CHECK(1); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -188,7 +195,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); + CHECK(0); CHECK(1); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -202,7 +209,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + CHECK(0); CHECK(1); CHECK(2); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); @@ -214,7 +221,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + CHECK(0); CHECK(1); CHECK(2); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); @@ -225,12 +232,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 3; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); CHECK(1); CHECK(2); C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -239,7 +248,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -253,7 +262,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); + CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -267,7 +276,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); @@ -279,7 +288,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); @@ -290,12 +299,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 4; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -304,7 +315,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -318,7 +329,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -332,7 +343,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); @@ -344,7 +355,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); @@ -355,12 +366,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 5; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -369,7 +382,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -383,7 +396,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -397,7 +410,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); @@ -409,7 +422,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); @@ -420,12 +433,14 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 6; - static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = instance; + return self; } }; @@ -434,7 +449,7 @@ template struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -448,7 +463,7 @@ template { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - ASSERT(CHECK(0)); ASSERT(CHECK(1)); ASSERT(CHECK(2)); ASSERT(CHECK(3)); ASSERT(CHECK(4)); ASSERT(CHECK(5)); + CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; diff --git a/mrubybind_types.h b/mrubybind_types.h index 5c8bcc4..58697dc 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -23,6 +23,7 @@ struct Type { // Fixnum template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_fixnum_p(v); } static int get(mrb_value v) { return mrb_fixnum(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } @@ -31,6 +32,7 @@ struct Type { // float template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v); } static float get(mrb_value v) { return mrb_float(v); } static mrb_value ret(mrb_state*, float f) { return mrb_float_value(f); } @@ -38,7 +40,8 @@ struct Type { // double template<> -struct Type { +struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v); } static double get(mrb_value v) { return mrb_float(v); } static mrb_value ret(mrb_state*, double f) { return mrb_float_value(f); } @@ -47,6 +50,7 @@ struct Type { // String template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } static const char* get(mrb_value v) { return RSTRING_PTR(v); } static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } @@ -54,6 +58,7 @@ struct Type { template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } @@ -61,6 +66,7 @@ struct Type { template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } @@ -68,6 +74,7 @@ struct Type { template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } @@ -76,6 +83,7 @@ struct Type { // Boolean template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return 1; } static bool get(mrb_value v) { return mrb_test(v); } static mrb_value ret(mrb_state* mrb, bool b) { return b ? mrb_true_value() : mrb_false_value(); } @@ -84,6 +92,7 @@ struct Type { // Raw pointer template<> struct Type { + static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_voidp_p(v); } static void* get(mrb_value v) { return mrb_voidp(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(p); } @@ -116,6 +125,9 @@ struct ClassBinder { template mrb_data_type ClassBinder::type_info = { "???", dtor }; +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value); + // Includes generated template specialization. #include "mrubybind.inc" From fa0917f9697742032e55e33c5f2107cace615bd5 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Mon, 1 Apr 2013 08:16:54 +0900 Subject: [PATCH 010/103] Update --- mrubybind.dat | 163 +++++++++++++++++++++++++------------------------- 1 file changed, 83 insertions(+), 80 deletions(-) diff --git a/mrubybind.dat b/mrubybind.dat index a8d9b9b..9302c27 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,87 +1,90 @@ const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x78,0x99,0x00,0x00,0x05,0x50,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x32,0x30,0x30, -0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x01,0x00,0x02,0x00,0x00, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xc4,0xeb,0x00,0x00,0x05,0x76,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x58,0x30,0x30, +0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x87,0x00,0x01,0x00,0x02,0x00,0x00,0x00, -0x0e,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80,0x00, -0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80,0x80, -0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80,0xc0, -0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69, -0x6f,0x6e,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a,0x62, -0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x11,0x62,0x69,0x6e,0x64,0x5f, -0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x4d, -0x00,0x06,0x00,0x0a,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11, -0x03,0x80,0x01,0x04,0x04,0x00,0x80,0x01,0x04,0x80,0x03,0x40,0x03,0x00,0x41,0x21, -0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65, -0x72,0x6e,0x65,0x6c,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x01,0x01,0x00,0x03,0x00, -0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x00,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x80,0x15,0x02,0x81,0x80, -0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x00, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x15,0x02,0x80,0xc0, -0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf, -0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e, -0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, -0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00, -0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04, -0x73,0x69,0x7a,0x65,0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00, -0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03, -0x6e,0x65,0x77,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0a, -0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00,0x06, -0x00,0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11,0x03,0x80, -0x80,0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40,0x03,0x00,0x80,0x21,0x03,0x00, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e, -0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x43,0x00,0x01,0x00, -0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03, -0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0xff, -0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01, -0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19, -0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01, -0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, -0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e, -0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95, -0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01, -0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03, -0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a, -0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, -0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20, -0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69, -0x7a,0x65,0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03,0x6e,0x65, -0x77,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0d,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x4f,0x00, -0x07,0x00,0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, -0x00,0x80,0x01,0x03,0x80,0x40,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x80,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, -0x6e,0x65,0x6c,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x0a, -0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x37,0x00,0x01, -0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15,0x01,0x80, -0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f, -0x64,0x00,0x00,0x01,0x07,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00, -0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x8b,0x00,0x01,0x00,0x02,0x00,0x00, +0x00,0x0e,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, +0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, +0xc0,0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, +0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x11,0x62, +0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x00,0x50,0x00,0x06,0x00,0x0a,0x00,0x00,0x00,0x07,0x08,0x00,0x00, +0x26,0x03,0x00,0x00,0x11,0x03,0x80,0x01,0x04,0x04,0x00,0x80,0x01,0x04,0x80,0x03, +0x40,0x03,0x00,0x41,0x21,0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64, +0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00, +0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x15,0x01,0x80,0x40, 0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00, -0x3d,0x03,0x00,0xc0,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, +0x3d,0x03,0x00,0x80,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, 0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x00,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, 0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02, -0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01, -0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00, -0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77, -0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f, -0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65, -0x00,0x02,0x21,0x3d,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x0d,0x41,0x72,0x67, -0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x03,0x6e,0x65,0x77,0x00, -0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x0c,0x63,0x61,0x6c,0x6c, -0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x91,0x02,0x00,0x40,0x15,0x02,0x80,0xc0,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, +0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, +0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67, +0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d, +0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00, +0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x52,0x00,0x06,0x00, +0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11,0x03,0x80,0x80, +0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40,0x03,0x00,0x80,0x21,0x03,0x00,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65, +0x6c,0x00,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, +0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x45,0x00, +0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01, +0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68, +0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00, +0x00,0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26, +0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x95,0x01,0x80,0x40,0xa0, +0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, +0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd, +0x02,0x81,0x80,0x3e,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, +0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, +0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7, +0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29, +0x00,0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69, +0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28, +0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07, +0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61, +0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72, +0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f, +0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00,0x09,0x00,0x00, +0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x80,0x01,0x03,0x80, +0x40,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x80,0x21,0x03,0x80,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00, +0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61, +0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0x00,0x04, +0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15,0x01,0x80,0x03,0x40, +0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, +0x00,0x00,0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00,0x26, +0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0, +0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, +0x03,0x00,0xc0,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, +0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, +0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd, +0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, +0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7, +0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29, +0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72, +0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72, +0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, +0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, +0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, +0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x45,0x4e, +0x44,0x00,0x00,0x00,0x00,0x08, }; From a2dabed9dcf0e462a5df6de8a59ebb49bfe82635 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 7 Apr 2013 13:52:15 +0900 Subject: [PATCH 011/103] Update --- mrubybind.dat | 1 + 1 file changed, 1 insertion(+) diff --git a/mrubybind.dat b/mrubybind.dat index 9302c27..09b3f0e 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,3 +1,4 @@ +#include const uint8_t binder[] = { 0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xc4,0xeb,0x00,0x00,0x05,0x76,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x58,0x30,0x30, From 36c5b077c98eb04bb657bbc64f7a61fcae84cf8f Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 11 May 2013 10:34:40 +0900 Subject: [PATCH 012/103] Suppress warning, add binding constant value function --- codegen/gen_template.rb | 6 +- examples/Makefile | 2 +- mrubybind.cc | 5 +- mrubybind.h | 10 +- mrubybind.inc | 338 +++++++++++++++++++++++++++++++++++----- mrubybind_types.h | 14 +- 6 files changed, 329 insertions(+), 46 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 1516255..f274c59 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -1,5 +1,5 @@ -MAX_PARAM = 6 +MAX_PARAM = 10 HEADER = <::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Float"; const char Type::TYPE_NAME[] = "Float"; const char Type::TYPE_NAME[] = "String"; @@ -30,7 +31,7 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } -static mrb_value call_cfunc(mrb_state *mrb, mrb_value self) { +static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { mrb_value binder; mrb_value func_ptr_v; mrb_value* args; @@ -54,7 +55,7 @@ static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { return self; } -static mrb_value call_cmethod(mrb_state *mrb, mrb_value self) { +static mrb_value call_cmethod(mrb_state *mrb, mrb_value /*self*/) { mrb_value binder; mrb_value self_v; mrb_value method_pptr_v; diff --git a/mrubybind.h b/mrubybind.h index 448ddd7..aba11a1 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -9,9 +9,15 @@ namespace mrubybind { class MrubyBind { - public: +public: MrubyBind(mrb_state* mrb); + // Bind constant value. + template + void bind_const(const char* name, T v) { + mrb_define_const(mrb_, mrb_->kernel_module, name, Type::ret(mrb_, v)); + } + // Bind function. template void bind(const char* func_name, Func func_ptr) { @@ -51,7 +57,7 @@ class MrubyBind { class_name_v, method_name_v, method_pptr_v, nparam_v); } - private: +private: mrb_state* mrb_; mrb_value mod_mrubybind_; }; diff --git a/mrubybind.inc b/mrubybind.inc index af8d78d..883c326 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -8,7 +8,7 @@ template<> struct Binder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - + (void)(mrb);(void)(args);(void)(narg); void (*fp)(void) = (void (*)(void))func_ptr; fp(); return mrb_nil_value(); @@ -20,7 +20,7 @@ template struct Binder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - + (void)(mrb);(void)(args);(void)(narg); R (*fp)(void) = (R (*)(void))func_ptr; R result = fp(); return Type::ret(mrb, result); @@ -34,7 +34,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - + (void)(mrb);(void)(args);(void)(narg); C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); DATA_PTR(self) = instance; @@ -47,7 +47,7 @@ template struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - + (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(void); M mp = *(M*)method_pptr; @@ -61,7 +61,7 @@ template struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - + (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(void); M mp = *(M*)method_pptr; @@ -75,7 +75,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); + (void)(narg); CHECK(0); void (*fp)(P0) = (void (*)(P0))func_ptr; fp(ARG(0)); return mrb_nil_value(); @@ -87,7 +87,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); + (void)(narg); CHECK(0); R (*fp)(P0) = (R (*)(P0))func_ptr; R result = fp(ARG(0)); return Type::ret(mrb, result); @@ -101,7 +101,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); + (void)(narg); CHECK(0); C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; C* instance = ctor(ARG(0)); DATA_PTR(self) = instance; @@ -114,7 +114,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); + (void)(narg); CHECK(0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; @@ -128,7 +128,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); + (void)(narg); CHECK(0); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; @@ -142,7 +142,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; fp(ARG(0), ARG(1)); return mrb_nil_value(); @@ -154,7 +154,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); @@ -168,7 +168,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); CHECK(1); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; C* instance = ctor(ARG(0), ARG(1)); DATA_PTR(self) = instance; @@ -181,7 +181,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -195,7 +195,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -209,7 +209,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); @@ -221,7 +221,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); @@ -235,7 +235,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); CHECK(1); CHECK(2); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_PTR(self) = instance; @@ -248,7 +248,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -262,7 +262,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -276,7 +276,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); @@ -288,7 +288,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); @@ -302,7 +302,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); CHECK(1); CHECK(2); CHECK(3); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_PTR(self) = instance; @@ -315,7 +315,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -329,7 +329,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -343,7 +343,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); @@ -355,7 +355,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); @@ -369,7 +369,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_PTR(self) = instance; @@ -382,7 +382,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -396,7 +396,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -410,7 +410,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); @@ -422,7 +422,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); @@ -436,7 +436,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_PTR(self) = instance; @@ -449,7 +449,7 @@ template struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -463,7 +463,7 @@ template { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -472,5 +472,273 @@ struct ClassBinder { } }; +// void f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6); +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return Type::ret(mrb, result); + } +}; + #undef ARG #undef CHECK diff --git a/mrubybind_types.h b/mrubybind_types.h index 58697dc..d64e972 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -29,6 +29,14 @@ struct Type { static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_fixnum_p(v); } + static unsigned int get(mrb_value v) { return mrb_fixnum(v); } + static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } +}; + // float template<> struct Type { @@ -84,9 +92,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return 1; } + static int check(mrb_value /*v*/) { return 1; } static bool get(mrb_value v) { return mrb_test(v); } - static mrb_value ret(mrb_state* mrb, bool b) { return b ? mrb_true_value() : mrb_false_value(); } + static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } }; // Raw pointer @@ -95,7 +103,7 @@ struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_voidp_p(v); } static void* get(mrb_value v) { return mrb_voidp(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(p); } + static mrb_value ret(mrb_state* /*mrb*/, void* p) { return mrb_voidp_value(p); } }; //=========================================================================== From 3f97f1debab744714dbcc040405268e368635a65 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 11 May 2013 12:11:13 +0900 Subject: [PATCH 013/103] Automatic conversion between fixnum and float --- mrubybind_types.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mrubybind_types.h b/mrubybind_types.h index d64e972..474b5b8 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -24,16 +24,16 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v); } - static int get(mrb_value v) { return mrb_fixnum(v); } + static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v); } - static unsigned int get(mrb_value v) { return mrb_fixnum(v); } + static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static unsigned int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } }; @@ -41,8 +41,8 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v); } - static float get(mrb_value v) { return mrb_float(v); } + static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static float get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state*, float f) { return mrb_float_value(f); } }; @@ -50,8 +50,8 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v); } - static double get(mrb_value v) { return mrb_float(v); } + static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static double get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state*, double f) { return mrb_float_value(f); } }; From f132c272068340485b7a0f8cbd89bd8baf578a84 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 15 May 2013 10:05:58 +0900 Subject: [PATCH 014/103] Bind functions under arbitrary module --- codegen/Makefile | 6 ++++-- codegen/binder.rb | 2 +- mrubybind.cc | 10 +++++++++- mrubybind.dat | 16 ++++++++-------- mrubybind.h | 9 +++++++-- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/codegen/Makefile b/codegen/Makefile index ded187f..9f19e94 100644 --- a/codegen/Makefile +++ b/codegen/Makefile @@ -1,8 +1,10 @@ -all: ../mrubybind.dat ../mrubybind.inc +TARGET= ../mrubybind.dat ../mrubybind.inc + +all: $(TARGET) clean: - echo '' + rm -rf $(TARGET) ../mrubybind.dat: binder.rb ${MRUBY}/bin/mrbc -Bbinder binder.rb diff --git a/codegen/binder.rb b/codegen/binder.rb index eb7ed76..a136054 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,7 +2,7 @@ # and included into C code. module MrubyBind - def MrubyBind.define_function(binder, func_name, func_ptr, nparam) + def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) Kernel.send(:define_method, func_name) do |*args| if args.size != nparam raise ArgumentError.new("`#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") diff --git a/mrubybind.cc b/mrubybind.cc index 79eb9bc..758e8d2 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -67,7 +67,15 @@ static mrb_value call_cmethod(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); } -MrubyBind::MrubyBind(mrb_state* mrbxx) : mrb_(mrbxx) { +MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { + Initialize(); +} + +MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { + Initialize(); +} + +void MrubyBind::Initialize() { mrb_sym sym_mrubybind = mrb_intern(mrb_, "MrubyBind"); if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind)) { diff --git a/mrubybind.dat b/mrubybind.dat index 09b3f0e..e3a2ec5 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xc4,0xeb,0x00,0x00,0x05,0x76,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xa8,0x11,0x00,0x00,0x05,0x76,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x58,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -14,19 +14,19 @@ const uint8_t binder[] = { 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x11,0x62, 0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x00,0x50,0x00,0x06,0x00,0x0a,0x00,0x00,0x00,0x07,0x08,0x00,0x00, -0x26,0x03,0x00,0x00,0x11,0x03,0x80,0x01,0x04,0x04,0x00,0x80,0x01,0x04,0x80,0x03, -0x40,0x03,0x00,0x41,0x21,0x03,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x50,0x00,0x07,0x00,0x0b,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, +0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x03, +0x40,0x03,0x80,0x41,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64, 0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, 0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00, -0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x15,0x01,0x80,0x40, +0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40, 0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00, -0x3d,0x03,0x00,0x80,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, +0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, 0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x00,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, 0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02, -0x91,0x02,0x00,0x40,0x15,0x02,0x80,0xc0,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, +0x91,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, 0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, 0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67, 0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d, diff --git a/mrubybind.h b/mrubybind.h index aba11a1..265e8ac 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -11,21 +11,23 @@ namespace mrubybind { class MrubyBind { public: MrubyBind(mrb_state* mrb); + MrubyBind(mrb_state* mrb, RClass* mod); // Bind constant value. template void bind_const(const char* name, T v) { - mrb_define_const(mrb_, mrb_->kernel_module, name, Type::ret(mrb_, v)); + mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } // Bind function. template void bind(const char* func_name, Func func_ptr) { + mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value((void*)Binder::call); mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); mrb_value func_ptr_v = mrb_voidp_value(reinterpret_cast(func_ptr)); mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "define_function", 4, binder, func_name_v, + mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); } @@ -58,8 +60,11 @@ class MrubyBind { } private: + void Initialize(); + mrb_state* mrb_; mrb_value mod_mrubybind_; + RClass* mod_; }; } // namespace mrubybind From ec62c22d05427da0e1c69c898d60ef8304c52a9d Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 25 May 2013 10:01:34 +0900 Subject: [PATCH 015/103] Save/restore arena index --- examples/main.cc | 69 ++++++++++++++++++++++++++++++++++++++---------- mrubybind.cc | 5 ++++ mrubybind.h | 2 ++ 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/examples/main.cc b/examples/main.cc index f7bab89..09670e1 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -6,6 +6,9 @@ #include using namespace std; +//============================================================================= +// Simple usage for binding function. + int square(int x) { return x * x; } @@ -14,6 +17,25 @@ string emphasize(const char* str) { return "* " + string(str) + " *"; } +void BindFunctionTest(mrb_state* mrb) { + { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + b.bind("emphasize", emphasize); + } + + mrb_load_string(mrb, + "puts square(1111)\n" + "puts emphasize('Hello, mruby!')\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + +//============================================================================= +// Simple usage for binding C++ class. + class Foo { public: Foo(int x) : x_(x) { @@ -34,36 +56,55 @@ Foo* new_foo(int x) { return new Foo(x); } -int main() { - mrb_state* mrb = mrb_open(); - +void BindClassTest(mrb_state* mrb) { { mrubybind::MrubyBind b(mrb); - b.bind("square", square); - b.bind("emphasize", emphasize); + b.bind_class("Foo", new_foo); + b.bind_class_method("Foo", "bar", &Foo::bar); } + mrb_load_string(mrb, - "puts square(1111)\n" - "puts emphasize('Hello, mruby!')\n" + "foo = Foo.new(123)\n" + "p foo\n" + "p foo.bar(567)\n" + "foo = nil\n" ); + if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } +} + +//============================================================================= +// Simple usage for binding function under some module. +void modfunc(int v) { + printf("modfunc called: %d\n", v); +} + +void UseModuleTest(mrb_state* mrb) { { - mrubybind::MrubyBind b(mrb); - b.bind_class("Foo", new_foo); - b.bind_class_method("Foo", "bar", &Foo::bar); + RClass* mod = mrb_define_module(mrb, "Mod"); + mrubybind::MrubyBind b(mrb, mod); + b.bind("modfunc", modfunc); + b.bind_const("FOO_VALUE", 1234); } + mrb_load_string(mrb, - "foo = Foo.new(123)\n" - "p foo\n" - "p foo.bar(567)\n" + "Mod.modfunc(Mod::FOO_VALUE)\n" ); - if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } +} + +//============================================================================= +int main() { + mrb_state* mrb = mrb_open(); + + BindFunctionTest(mrb); + BindClassTest(mrb); + UseModuleTest(mrb); mrb_close(mrb); return 0; diff --git a/mrubybind.cc b/mrubybind.cc index 758e8d2..468dd77 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -75,7 +75,12 @@ MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { Initialize(); } +MrubyBind::~MrubyBind() { + mrb_gc_arena_restore(mrb_, arena_index_); +} + void MrubyBind::Initialize() { + arena_index_ = mrb_gc_arena_save(mrb_); mrb_sym sym_mrubybind = mrb_intern(mrb_, "MrubyBind"); if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind)) { diff --git a/mrubybind.h b/mrubybind.h index 265e8ac..1c63209 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -12,6 +12,7 @@ class MrubyBind { public: MrubyBind(mrb_state* mrb); MrubyBind(mrb_state* mrb, RClass* mod); + ~MrubyBind(); // Bind constant value. template @@ -65,6 +66,7 @@ class MrubyBind { mrb_state* mrb_; mrb_value mod_mrubybind_; RClass* mod_; + int arena_index_; }; } // namespace mrubybind From 047db3b022133db065da03bde26f9e76c316ebfb Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 4 Jun 2013 11:24:47 +0900 Subject: [PATCH 016/103] Update function call according to mruby update --- mrubybind.h | 10 +++++----- mrubybind_types.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mrubybind.h b/mrubybind.h index 1c63209..2bebb54 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -24,9 +24,9 @@ class MrubyBind { template void bind(const char* func_name, Func func_ptr) { mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value((void*)Binder::call); + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - mrb_value func_ptr_v = mrb_voidp_value(reinterpret_cast(func_ptr)); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); @@ -37,9 +37,9 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_value binder = mrb_voidp_value((void*)ClassBinder::ctor); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_voidp_value((void*)new_func_ptr); + mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 4, binder, class_name_v, new_func_ptr_v, nparam_v); @@ -49,7 +49,7 @@ class MrubyBind { template void bind_class_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value binder = mrb_voidp_value((void*)ClassBinder::call); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, diff --git a/mrubybind_types.h b/mrubybind_types.h index 474b5b8..e649fc3 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -43,7 +43,7 @@ struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static float get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state*, float f) { return mrb_float_value(f); } + static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } }; // double @@ -52,7 +52,7 @@ struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static double get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state*, double f) { return mrb_float_value(f); } + static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } }; // String @@ -103,7 +103,7 @@ struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_voidp_p(v); } static void* get(mrb_value v) { return mrb_voidp(v); } - static mrb_value ret(mrb_state* /*mrb*/, void* p) { return mrb_voidp_value(p); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } }; //=========================================================================== From 60488051b0b6c55b7d089ed58bc85d771fc4fc3a Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Mon, 10 Jun 2013 08:35:28 +0900 Subject: [PATCH 017/103] Stop handling warning as error, because of mruby has warning --- examples/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Makefile b/examples/Makefile index 3668e8c..f3535ed 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -8,6 +8,6 @@ clean: rm -rf *.o a.out a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind_types.h ../mrubybind.inc ../mrubybind.dat - g++ -o a.out -Wall -Wextra -Werror main.cc ../mrubybind.cc $(INC) $(LIB) + g++ -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) # From 925f323cc5b61659bf0d43e435e9fe36aec6d888 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 20 Aug 2013 22:51:15 +0900 Subject: [PATCH 018/103] Updated --- mrubybind.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mrubybind.dat b/mrubybind.dat index e3a2ec5..48cc823 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0xa8,0x11,0x00,0x00,0x05,0x76,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x4a,0xc2,0x00,0x00,0x05,0x76,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x58,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -9,7 +9,7 @@ const uint8_t binder[] = { 0x00,0x0e,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0xc0,0x46,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x11,0x62, From d80337ea412813de3c338536311e55adcbc9b694 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 18 Sep 2013 11:07:50 +0900 Subject: [PATCH 019/103] Enables binding class under arbitrary module, not only under Kernel --- codegen/binder.rb | 8 ++-- mrubybind.cc | 10 ++--- mrubybind.dat | 109 +++++++++++++++++++++++----------------------- mrubybind.h | 14 +++--- mrubybind_types.h | 4 +- 5 files changed, 72 insertions(+), 73 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index a136054..9294a80 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -11,8 +11,8 @@ def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) end end - def MrubyBind.bind_class(binder, class_name, new_func_ptr, nparam) - Kernel.const_get(class_name).class_eval do + def MrubyBind.bind_class(binder, mod, class_name, new_func_ptr, nparam) + mod.const_get(class_name).class_eval do define_method(:initialize) do |*args| if args.size != nparam raise ArgumentError.new("`initialize': wrong number of arguments (#{args.size} for #{nparam})") @@ -22,8 +22,8 @@ def MrubyBind.bind_class(binder, class_name, new_func_ptr, nparam) end end - def MrubyBind.bind_class_method(binder, class_name, method_name, method_ptr, nparam) - Kernel.const_get(class_name).class_eval do + def MrubyBind.bind_class_method(binder, mod, class_name, method_name, method_ptr, nparam) + mod.const_get(class_name).class_eval do define_method(method_name) do |*args| if args.size != nparam raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") diff --git a/mrubybind.cc b/mrubybind.cc index 468dd77..4232600 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -1,9 +1,9 @@ #include "mrubybind.h" -#include -#include -#include -#include -#include +#include "mruby/compile.h" +#include "mruby/dump.h" +#include "mruby/proc.h" +#include "mruby/string.h" +#include "mruby/variable.h" namespace mrubybind { diff --git a/mrubybind.dat b/mrubybind.dat index 48cc823..a4df545 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,7 +1,7 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x4a,0xc2,0x00,0x00,0x05,0x76,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x58,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x4c,0x2e,0x00,0x00,0x05,0x64,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x46,0x30,0x30, 0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, @@ -35,57 +35,56 @@ const uint8_t binder[] = { 0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, 0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, 0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x52,0x00,0x06,0x00, -0x08,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x26,0x03,0x00,0x00,0x11,0x03,0x80,0x80, -0x01,0x03,0x00,0x40,0xa0,0x03,0x80,0x03,0x40,0x03,0x00,0x80,0x21,0x03,0x00,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65, -0x6c,0x00,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, -0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x45,0x00, -0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01, -0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68, -0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00, -0x00,0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26, -0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x00,0x95,0x01,0x80,0x40,0xa0, -0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, -0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd, -0x02,0x81,0x80,0x3e,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, -0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, -0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x00,0xc0,0x95,0x02,0x01,0x01,0xb7, -0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69, -0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65, -0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28, -0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07, -0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61, -0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72, -0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f, -0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00,0x09,0x00,0x00, -0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x80,0x01,0x03,0x80, -0x40,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x80,0x21,0x03,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00, -0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61, -0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0x00,0x04, -0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0xc0,0x15,0x01,0x80,0x03,0x40, -0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, -0x00,0x00,0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00,0x26, -0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0, -0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, -0x03,0x00,0xc0,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, -0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, -0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd, -0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, -0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7, -0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29, -0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72, -0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72, -0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, -0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, -0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x45,0x4e, -0x44,0x00,0x00,0x00,0x00,0x08, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x49,0x00,0x07,0x00, +0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x80,0x01,0x04,0x00,0xc0, +0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74, +0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61, +0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02, +0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02, +0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02, +0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02, +0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01, +0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03, +0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01, +0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69, +0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, +0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10, +0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02, +0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, +0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63, +0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00, +0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x80, +0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x03,0x40,0x04,0x00,0x40, +0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63, +0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73, +0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0x00,0x04,0x00,0x00, +0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x03,0x40,0x00,0x80, +0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d, +0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, +0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80, +0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0, +0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01, +0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00, +0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81, +0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81, +0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00, +0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80, +0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, +0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, +0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10, +0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02, +0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, +0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63, +0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x45,0x4e,0x44,0x00, +0x00,0x00,0x00,0x08, }; diff --git a/mrubybind.h b/mrubybind.h index 2bebb54..4a48ac0 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,9 +1,9 @@ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ -#include -#include -#include +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" #include "mrubybind_types.h" namespace mrubybind { @@ -41,8 +41,8 @@ class MrubyBind { mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 4, binder, class_name_v, - new_func_ptr_v, nparam_v); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, binder, mrb_obj_value(mod_), + class_name_v, new_func_ptr_v, nparam_v); } // Bind class method. @@ -56,8 +56,8 @@ class MrubyBind { reinterpret_cast(&method_ptr), sizeof(method_ptr)); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 5, binder, - class_name_v, method_name_v, method_pptr_v, nparam_v); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 6, binder, + mrb_obj_value(mod_), class_name_v, method_name_v, method_pptr_v, nparam_v); } private: diff --git a/mrubybind_types.h b/mrubybind_types.h index e649fc3..f59d036 100644 --- a/mrubybind_types.h +++ b/mrubybind_types.h @@ -1,8 +1,8 @@ #ifndef __MRUBYBIND_TYPES_H__ #define __MRUBYBIND_TYPES_H__ -#include -#include +#include "mruby.h" +#include "mruby/string.h" #include #include From 8fc6b50fcbf9be444e58caad3ae5d836d4232af0 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 18 Sep 2013 11:09:32 +0900 Subject: [PATCH 020/103] Avoid using obsolete API --- codegen/gen_template.rb | 4 ++-- mrubybind.inc | 44 ++++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index f274c59..7fd7c79 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -58,7 +58,7 @@ static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { %ASSERTS% - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; (instance->*mp)(%ARGS%); @@ -72,7 +72,7 @@ static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { %ASSERTS% - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; R result = (instance->*mp)(%ARGS%); diff --git a/mrubybind.inc b/mrubybind.inc index 883c326..21e8f6e 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -48,7 +48,7 @@ struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(void); M mp = *(M*)method_pptr; (instance->*mp)(); @@ -62,7 +62,7 @@ struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(void); M mp = *(M*)method_pptr; R result = (instance->*mp)(); @@ -115,7 +115,7 @@ struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0)); @@ -129,7 +129,7 @@ struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0)); @@ -182,7 +182,7 @@ struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1)); @@ -196,7 +196,7 @@ struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1)); @@ -249,7 +249,7 @@ struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2)); @@ -263,7 +263,7 @@ struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); @@ -316,7 +316,7 @@ struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -330,7 +330,7 @@ struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -383,7 +383,7 @@ struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -397,7 +397,7 @@ struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -450,7 +450,7 @@ struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -464,7 +464,7 @@ struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -517,7 +517,7 @@ struct ClassBinder { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -531,7 +531,7 @@ struct ClassBinder { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -584,7 +584,7 @@ struct ClassBinder { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -598,7 +598,7 @@ struct ClassBinder { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -651,7 +651,7 @@ struct ClassBinder { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -665,7 +665,7 @@ struct ClassBinder { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -718,7 +718,7 @@ struct ClassBinder { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -732,7 +732,7 @@ struct ClassBinder { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(mrb_get_datatype(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); From 5952fc93b58d3dfe8048800dad4e287a0181d97d Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 18 Sep 2013 14:38:18 +0900 Subject: [PATCH 021/103] Disable type check for receiver for inheritance --- codegen/gen_template.rb | 4 ++-- mrubybind.inc | 44 ++++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 7fd7c79..6fe8a1d 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -58,7 +58,7 @@ static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { %ASSERTS% - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; (instance->*mp)(%ARGS%); @@ -72,7 +72,7 @@ static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { %ASSERTS% - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(%PARAMS%); M mp = *(M*)method_pptr; R result = (instance->*mp)(%ARGS%); diff --git a/mrubybind.inc b/mrubybind.inc index 21e8f6e..ea56379 100644 --- a/mrubybind.inc +++ b/mrubybind.inc @@ -48,7 +48,7 @@ struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(void); M mp = *(M*)method_pptr; (instance->*mp)(); @@ -62,7 +62,7 @@ struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(void); M mp = *(M*)method_pptr; R result = (instance->*mp)(); @@ -115,7 +115,7 @@ struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0)); @@ -129,7 +129,7 @@ struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0)); @@ -182,7 +182,7 @@ struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1)); @@ -196,7 +196,7 @@ struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1)); @@ -249,7 +249,7 @@ struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2)); @@ -263,7 +263,7 @@ struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); @@ -316,7 +316,7 @@ struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -330,7 +330,7 @@ struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -383,7 +383,7 @@ struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -397,7 +397,7 @@ struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -450,7 +450,7 @@ struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -464,7 +464,7 @@ struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -517,7 +517,7 @@ struct ClassBinder { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -531,7 +531,7 @@ struct ClassBinder { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -584,7 +584,7 @@ struct ClassBinder { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -598,7 +598,7 @@ struct ClassBinder { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -651,7 +651,7 @@ struct ClassBinder { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -665,7 +665,7 @@ struct ClassBinder { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -718,7 +718,7 @@ struct ClassBinder { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -732,7 +732,7 @@ struct ClassBinder { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(mrb_data_get_ptr(mrb, self, &ClassBinder::type_info)); + C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); From 6d3b88bc350942988ed9899dbe370108921eb1c5 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 18 Sep 2013 21:56:03 +0900 Subject: [PATCH 022/103] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b9798d9..2bb0f5f 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,17 @@ mrubybind - Binding library for mruby/C++ ## Usage +### How to use + +1. Put source codes into your project. + * mrubybind.cc + * mrubybind.dat + * mrubybind.h + * mrubybind.inc + * mrubybind_types.h +2. Include "mrubybind.h" + + ### Bind C function and call it from mruby 1. C function (Any type you want): From 896eab84b2f9f626aeeae274dc81c62fabd58280 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Thu, 19 Sep 2013 13:38:24 +0900 Subject: [PATCH 023/103] Enable binding static method --- codegen/binder.rb | 17 +++- examples/main.cc | 7 +- mrubybind.cc | 17 +++- mrubybind.dat | 195 +++++++++++++++++++++++++++------------------- mrubybind.h | 21 ++++- 5 files changed, 166 insertions(+), 91 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 9294a80..68ae828 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -22,13 +22,26 @@ def MrubyBind.bind_class(binder, mod, class_name, new_func_ptr, nparam) end end - def MrubyBind.bind_class_method(binder, mod, class_name, method_name, method_ptr, nparam) + def MrubyBind.bind_instance_method(binder, mod, class_name, method_name, method_ptr, nparam) mod.const_get(class_name).class_eval do define_method(method_name) do |*args| if args.size != nparam raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") end - MrubyBind::call_cmethod(binder, self, method_ptr, *args) + MrubyBind::call_imethod(binder, self, method_ptr, *args) + end + end + end + + def MrubyBind.bind_static_method(binder, mod, class_name, method_name, method_ptr, nparam) + mod.const_get(class_name).class_eval do + self.class.instance_eval do + define_method(method_name) do |*args| + if args.size != nparam + raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, method_ptr, *args) + end end end end diff --git a/examples/main.cc b/examples/main.cc index 09670e1..fafa275 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -47,6 +47,9 @@ class Foo { int bar(int y) { return x_ + y; } + static int baz(int z) { + return z * z; + } private: int x_; @@ -60,7 +63,8 @@ void BindClassTest(mrb_state* mrb) { { mrubybind::MrubyBind b(mrb); b.bind_class("Foo", new_foo); - b.bind_class_method("Foo", "bar", &Foo::bar); + b.bind_instance_method("Foo", "bar", &Foo::bar); + b.bind_static_method("Foo", "baz", &Foo::baz); } mrb_load_string(mrb, @@ -68,6 +72,7 @@ void BindClassTest(mrb_state* mrb) { "p foo\n" "p foo.bar(567)\n" "foo = nil\n" + "p Foo.baz(9999)" ); if (mrb->exc) { diff --git a/mrubybind.cc b/mrubybind.cc index 4232600..38e609c 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -55,7 +55,7 @@ static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { return self; } -static mrb_value call_cmethod(mrb_state *mrb, mrb_value /*self*/) { +static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { mrb_value binder; mrb_value self_v; mrb_value method_pptr_v; @@ -67,6 +67,17 @@ static mrb_value call_cmethod(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); } +static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); +} + MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } @@ -93,8 +104,10 @@ void MrubyBind::Initialize() { ARGS_REQ(2) | ARGS_REST()); mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_cmethod", call_cmethod, + mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, + ARGS_REQ(2) | ARGS_REST()); int n = mrb_read_irep(mrb_, binder); if (n >= 0) { mrb_run(mrb_, mrb_proc_new(mrb_, mrb_->irep[n]), mrb_top_self(mrb_)); diff --git a/mrubybind.dat b/mrubybind.dat index a4df545..b031381 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,90 +1,121 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x4c,0x2e,0x00,0x00,0x05,0x64,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x05,0x46,0x30,0x30, -0x30,0x30,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x68,0x28,0x00,0x00,0x07,0x55,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x37,0x30,0x30, +0x30,0x30,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x8b,0x00,0x01,0x00,0x02,0x00,0x00, -0x00,0x0e,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb3,0x00,0x01,0x00,0x02,0x00,0x00, +0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x04,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x12,0xc0,0x00,0x81, +0x00,0x46,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, -0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x11,0x62, -0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x00,0x50,0x00,0x07,0x00,0x0b,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, -0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x03, -0x40,0x03,0x80,0x41,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64, -0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00, -0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40, -0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00, -0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, -0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02, -0x91,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, -0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67, -0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d, -0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00, -0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21, -0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, -0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x49,0x00,0x07,0x00, -0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x80,0x01,0x04,0x00,0xc0, -0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74, -0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61, -0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02, -0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02, -0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02, -0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02, -0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01, -0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03, -0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01, -0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69, -0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, -0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10, -0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02, -0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, -0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, -0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63, -0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00, -0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x80, -0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x03,0x40,0x04,0x00,0x40, -0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63, -0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73, -0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0x00,0x04,0x00,0x00, -0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x03,0x40,0x00,0x80, -0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d, -0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, -0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80, -0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0, -0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01, -0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00, -0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81, -0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81, -0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00, -0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80, -0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, -0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10, -0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02, -0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, -0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, -0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63, -0x61,0x6c,0x6c,0x5f,0x63,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x45,0x4e,0x44,0x00, -0x00,0x00,0x00,0x08, +0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, +0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x50,0x00,0x07,0x00, +0x0b,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x01, +0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x03,0x40,0x03,0x80,0x41,0x21,0x03,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65, +0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e, +0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00, +0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80, +0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x15,0x02,0x81,0x00, +0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf, +0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e, +0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, +0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00, +0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04, +0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73, +0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f, +0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, +0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63, +0x00,0x00,0x00,0x00,0x49,0x00,0x07,0x00,0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, +0x26,0x03,0x80,0x80,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03, +0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x01, +0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80, +0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f, +0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00, +0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01, +0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01, +0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03, +0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, +0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02, +0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02, +0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02, +0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00, +0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a, +0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72, +0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00, +0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x80,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, +0xa0,0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74, +0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, +0x00,0x38,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01, +0x00,0x15,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d, +0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00, +0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, +0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, +0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00, +0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x07, +0x0c,0x00,0x00,0x26,0x04,0x00,0x80,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0, +0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00, +0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, +0x40,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00, +0x20,0x01,0x00,0x03,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69, +0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, +0x38,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00, +0x95,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00, +0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81, +0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01, +0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, +0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80, +0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x41,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01, +0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00, +0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77, +0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f, +0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65, +0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d, +0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03, +0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, +0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44, +0x00,0x00,0x00,0x00,0x08, }; diff --git a/mrubybind.h b/mrubybind.h index 4a48ac0..31a3e0a 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -45,10 +45,10 @@ class MrubyBind { class_name_v, new_func_ptr_v, nparam_v); } - // Bind class method. + // Bind instance method. template - void bind_class_method(const char* class_name, const char* method_name, - Method method_ptr) { + void bind_instance_method(const char* class_name, const char* method_name, + Method method_ptr) { mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); @@ -56,10 +56,23 @@ class MrubyBind { reinterpret_cast(&method_ptr), sizeof(method_ptr)); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class_method", 6, binder, + mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, binder, mrb_obj_value(mod_), class_name_v, method_name_v, method_pptr_v, nparam_v); } + // Bind static method. + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, binder, + mrb_obj_value(mod_), class_name_v, method_name_v, func_ptr_v, nparam_v); + } + private: void Initialize(); From 96b925c60f012b907623ab0776fc761d387c39b9 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Thu, 19 Sep 2013 13:44:03 +0900 Subject: [PATCH 024/103] Align parameter order --- codegen/binder.rb | 6 +++--- mrubybind.dat | 14 +++++++------- mrubybind.h | 13 ++++++++----- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 68ae828..83d6b2a 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -11,7 +11,7 @@ def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) end end - def MrubyBind.bind_class(binder, mod, class_name, new_func_ptr, nparam) + def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) mod.const_get(class_name).class_eval do define_method(:initialize) do |*args| if args.size != nparam @@ -22,7 +22,7 @@ def MrubyBind.bind_class(binder, mod, class_name, new_func_ptr, nparam) end end - def MrubyBind.bind_instance_method(binder, mod, class_name, method_name, method_ptr, nparam) + def MrubyBind.bind_instance_method(mod, binder, class_name, method_name, method_ptr, nparam) mod.const_get(class_name).class_eval do define_method(method_name) do |*args| if args.size != nparam @@ -33,7 +33,7 @@ def MrubyBind.bind_instance_method(binder, mod, class_name, method_name, method_ end end - def MrubyBind.bind_static_method(binder, mod, class_name, method_name, method_ptr, nparam) + def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) mod.const_get(class_name).class_eval do self.class.instance_eval do define_method(method_name) do |*args| diff --git a/mrubybind.dat b/mrubybind.dat index b031381..721da68 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x68,0x28,0x00,0x00,0x07,0x55,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x08,0xaa,0x00,0x00,0x07,0x55,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x37,0x30,0x30, 0x30,0x30,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -39,7 +39,7 @@ const uint8_t binder[] = { 0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, 0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63, 0x00,0x00,0x00,0x00,0x49,0x00,0x07,0x00,0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, -0x26,0x03,0x80,0x80,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03, +0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03, 0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, 0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x01, @@ -53,7 +53,7 @@ const uint8_t binder[] = { 0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, 0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02, 0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02, -0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02, +0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02, 0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00, 0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a, 0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, @@ -64,7 +64,7 @@ const uint8_t binder[] = { 0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, 0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72, 0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00, -0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x80,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, +0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, 0xa0,0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74, 0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, @@ -78,7 +78,7 @@ const uint8_t binder[] = { 0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, 0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, 0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, -0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x40,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, 0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, 0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00, 0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, @@ -89,7 +89,7 @@ const uint8_t binder[] = { 0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, 0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, 0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x07, -0x0c,0x00,0x00,0x26,0x04,0x00,0x80,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0, +0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0, 0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00, 0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, @@ -107,7 +107,7 @@ const uint8_t binder[] = { 0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, 0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80, 0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80, -0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x41,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01, +0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01, 0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00, 0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77, 0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61, diff --git a/mrubybind.h b/mrubybind.h index 31a3e0a..059fcd9 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -37,11 +37,12 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, binder, mrb_obj_value(mod_), + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, class_name_v, new_func_ptr_v, nparam_v); } @@ -49,6 +50,7 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { + mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); @@ -56,21 +58,22 @@ class MrubyBind { reinterpret_cast(&method_ptr), sizeof(method_ptr)); mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, binder, - mrb_obj_value(mod_), class_name_v, method_name_v, method_pptr_v, nparam_v); + mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, + mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); } // Bind static method. template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { + mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, binder, - mrb_obj_value(mod_), class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, + mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } private: From 4a23150da6f851fe2b07a329ffe0f02850a0b52c Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 20 Sep 2013 07:01:05 +0900 Subject: [PATCH 025/103] Update precompiled data --- mrubybind.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mrubybind.dat b/mrubybind.dat index 721da68..e33b02c 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x08,0xaa,0x00,0x00,0x07,0x55,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x6c,0xf8,0x00,0x00,0x07,0x55,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x37,0x30,0x30, 0x30,0x30,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -10,7 +10,7 @@ const uint8_t binder[] = { 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, 0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x12,0xc0,0x00,0x81, -0x00,0x46,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x46,0x00,0x80,0x02,0x04,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, From c32fade851e2f431a4cbd932bb16ddd78eba74e6 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 3 Nov 2013 21:46:51 +0900 Subject: [PATCH 026/103] Updated according to mruby binary --- mrubybind.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mrubybind.dat b/mrubybind.dat index e33b02c..dd21d6d 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x6c,0xf8,0x00,0x00,0x07,0x55,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x2f,0x0b,0x00,0x00,0x07,0x55,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x37,0x30,0x30, 0x30,0x30,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, @@ -10,7 +10,7 @@ const uint8_t binder[] = { 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, 0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x12,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, From 5fe05b480c7d1baea0ae4574fcbc6a4b77bee404 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sun, 1 Dec 2013 23:29:31 +0900 Subject: [PATCH 027/103] Update according to mruby --- mrubybind.cc | 8 +- mrubybind.dat | 197 +++++++++++++++++++++++++------------------------- 2 files changed, 103 insertions(+), 102 deletions(-) diff --git a/mrubybind.cc b/mrubybind.cc index 38e609c..a26e12d 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -92,7 +92,7 @@ MrubyBind::~MrubyBind() { void MrubyBind::Initialize() { arena_index_ = mrb_gc_arena_save(mrb_); - mrb_sym sym_mrubybind = mrb_intern(mrb_, "MrubyBind"); + mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind)) { mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), @@ -108,9 +108,9 @@ void MrubyBind::Initialize() { ARGS_REQ(3) | ARGS_REST()); mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, ARGS_REQ(2) | ARGS_REST()); - int n = mrb_read_irep(mrb_, binder); - if (n >= 0) { - mrb_run(mrb_, mrb_proc_new(mrb_, mrb_->irep[n]), mrb_top_self(mrb_)); + mrb_irep* irep = mrb_read_irep(mrb_, binder); + if (irep != NULL) { + mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); } } } diff --git a/mrubybind.dat b/mrubybind.dat index dd21d6d..03cab0f 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,77 +1,78 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x31,0x2f,0x0b,0x00,0x00,0x07,0x55,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x37,0x30,0x30, -0x30,0x30,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0x00,0x02,0x00,0x00, -0x00,0x04,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0xc5,0x00,0x00, -0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb3,0x00,0x01,0x00,0x02,0x00,0x00, -0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, -0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x80, -0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x0c,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x12,0xc0,0x00,0x81, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x27,0xf1,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, +0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, +0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, +0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, 0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, 0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, 0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x50,0x00,0x07,0x00, -0x0b,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04,0x00,0x01, -0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x03,0x40,0x03,0x80,0x41,0x21,0x03,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65, -0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e, -0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00, -0x07,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80, -0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x15,0x02,0x81,0x00, -0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf, -0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e, -0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, -0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00, -0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04, -0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73, -0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f, -0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63, -0x00,0x00,0x00,0x00,0x49,0x00,0x07,0x00,0x09,0x00,0x00,0x00,0x07,0x0a,0x00,0x00, -0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x03, -0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, +0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, +0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, +0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, +0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, +0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, +0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, +0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, +0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, +0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, +0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, +0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, +0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, +0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, +0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, +0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, +0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, +0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, +0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x01, -0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80, -0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f, -0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00, -0x00,0x01,0x06,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01, -0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01, -0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03, -0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, -0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02, -0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02, -0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02, -0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x03,0x10,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a, -0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72, -0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00, -0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, -0xa0,0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74, -0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, -0x00,0x38,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01, -0x00,0x15,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d, -0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0e,0x00,0x03,0x00,0x07,0x00,0x00, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, +0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, +0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, 0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, 0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, 0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, @@ -80,42 +81,42 @@ const uint8_t binder[] = { 0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, 0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, 0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00, 0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, 0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, 0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, 0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, 0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x49,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x07, -0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0, -0x04,0x80,0x03,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00, -0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, -0x40,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00, -0x20,0x01,0x00,0x03,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69, -0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, -0x38,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00, -0x95,0x01,0x80,0x03,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65, -0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00, -0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81, -0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01, -0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, -0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, -0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80, -0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80, -0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01, -0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00, -0x29,0x00,0x00,0x00,0x04,0x10,0x00,0x01,0x60,0x10,0x00,0x1e,0x27,0x3a,0x20,0x77, -0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x10,0x00,0x05,0x20,0x66,0x6f, -0x72,0x20,0x10,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65, -0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d, -0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03, -0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, -0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44, -0x00,0x00,0x00,0x00,0x08, +0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, +0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, +0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, +0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, +0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, +0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, +0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, +0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, +0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, +0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, }; From 61c701e9ee5d79e90ac360d1043e7a1dc3b51256 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 31 Dec 2013 19:48:55 +0900 Subject: [PATCH 028/103] Update --- mrubybind.dat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mrubybind.dat b/mrubybind.dat index 03cab0f..7be9155 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x27,0xf1,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x55,0x22,0x00,0x00,0x07,0x6d,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, @@ -10,7 +10,7 @@ const uint8_t binder[] = { 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, 0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, From bb9f41cc422cb1838d1e10284525a1dd86e12dc8 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 12:59:40 +0900 Subject: [PATCH 029/103] Add tests --- .gitignore | 7 +++ Makefile | 13 ++++++ examples/Makefile | 13 ------ examples/main.cc | 116 ---------------------------------------------- test/Makefile | 40 ++++++++++++++++ test/class.cc | 55 ++++++++++++++++++++++ test/float.cc | 24 ++++++++++ test/int.cc | 24 ++++++++++ test/module.cc | 28 +++++++++++ test/string.cc | 27 +++++++++++ test/test.sh | 36 ++++++++++++++ 11 files changed, 254 insertions(+), 129 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile delete mode 100644 examples/Makefile delete mode 100644 examples/main.cc create mode 100644 test/Makefile create mode 100644 test/class.cc create mode 100644 test/float.cc create mode 100644 test/int.cc create mode 100644 test/module.cc create mode 100644 test/string.cc create mode 100755 test/test.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d2ba0b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.o + +/test/int +/test/float +/test/string +/test/class +/test/module diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5905098 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY: all clean test + +all: + make -C codegen + +clean: + make -C codegen clean + make -C test clean + +test: all + make -C test test + +# diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index f3535ed..0000000 --- a/examples/Makefile +++ /dev/null @@ -1,13 +0,0 @@ - -INC=-I $(MRUBY)/include -I .. -LIB=-L $(MRUBY)/build/host/lib -lmruby - -all: a.out - -clean: - rm -rf *.o a.out - -a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind_types.h ../mrubybind.inc ../mrubybind.dat - g++ -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) - -# diff --git a/examples/main.cc b/examples/main.cc deleted file mode 100644 index fafa275..0000000 --- a/examples/main.cc +++ /dev/null @@ -1,116 +0,0 @@ -#include -#include -#include "mrubybind.h" - -#include -#include -using namespace std; - -//============================================================================= -// Simple usage for binding function. - -int square(int x) { - return x * x; -} - -string emphasize(const char* str) { - return "* " + string(str) + " *"; -} - -void BindFunctionTest(mrb_state* mrb) { - { - mrubybind::MrubyBind b(mrb); - b.bind("square", square); - b.bind("emphasize", emphasize); - } - - mrb_load_string(mrb, - "puts square(1111)\n" - "puts emphasize('Hello, mruby!')\n" - ); - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - } -} - -//============================================================================= -// Simple usage for binding C++ class. - -class Foo { -public: - Foo(int x) : x_(x) { - cout << "Foo::ctor(" << x << "), " << this << endl; - } - virtual ~Foo() { - cout << "Foo::dtor(), " << this << endl; - } - int bar(int y) { - return x_ + y; - } - static int baz(int z) { - return z * z; - } - -private: - int x_; -}; - -Foo* new_foo(int x) { - return new Foo(x); -} - -void BindClassTest(mrb_state* mrb) { - { - mrubybind::MrubyBind b(mrb); - b.bind_class("Foo", new_foo); - b.bind_instance_method("Foo", "bar", &Foo::bar); - b.bind_static_method("Foo", "baz", &Foo::baz); - } - - mrb_load_string(mrb, - "foo = Foo.new(123)\n" - "p foo\n" - "p foo.bar(567)\n" - "foo = nil\n" - "p Foo.baz(9999)" - ); - - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - } -} - -//============================================================================= -// Simple usage for binding function under some module. - -void modfunc(int v) { - printf("modfunc called: %d\n", v); -} - -void UseModuleTest(mrb_state* mrb) { - { - RClass* mod = mrb_define_module(mrb, "Mod"); - mrubybind::MrubyBind b(mrb, mod); - b.bind("modfunc", modfunc); - b.bind_const("FOO_VALUE", 1234); - } - - mrb_load_string(mrb, - "Mod.modfunc(Mod::FOO_VALUE)\n" - ); - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - } -} - -//============================================================================= -int main() { - mrb_state* mrb = mrb_open(); - - BindFunctionTest(mrb); - BindClassTest(mrb); - UseModuleTest(mrb); - - mrb_close(mrb); - return 0; -} diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..7c3438a --- /dev/null +++ b/test/Makefile @@ -0,0 +1,40 @@ + +INC=-I $(MRUBY)/include -I .. +LIB=-L $(MRUBY)/build/host/lib -lmruby + +MRUBYBIND_SRCDIR=.. +MRUBYBIND_OBJ=mrubybind.o + +SRCS=$(wildcard *.cc) +EXES=$(SRCS:%.cc=%) + +all: $(EXES) + +clean: + rm -rf *.o $(EXES) + +test: $(EXES) + ./test.sh + +%.o: %.cc + g++ -c -o $@ $(INC) $< + +mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc + g++ -c -o $@ $(INC) $< + +int: int.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +float: float.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +string: string.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +class: class.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +module: module.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +# diff --git a/test/class.cc b/test/class.cc new file mode 100644 index 0000000..2c44988 --- /dev/null +++ b/test/class.cc @@ -0,0 +1,55 @@ +// Simple usage for binding C++ class. + +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +class Foo { +public: + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << ")" << endl; + } + virtual ~Foo() { + cout << "Foo::dtor()" << endl; + } + int bar(int y) { + return x_ + y; + } + static int baz(int z) { + return z * z; + } + +private: + int x_; +}; + +Foo* new_foo(int x) { + return new Foo(x); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind_class("Foo", new_foo); + b.bind_instance_method("Foo", "bar", &Foo::bar); + b.bind_static_method("Foo", "baz", &Foo::baz); + } + + mrb_load_string(mrb, + "foo = Foo.new(123)\n" + "p foo.bar(567)\n" + "p Foo.baz(9999)" + ); + + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + + mrb_close(mrb); + return 0; +} diff --git a/test/float.cc b/test/float.cc new file mode 100644 index 0000000..9d01809 --- /dev/null +++ b/test/float.cc @@ -0,0 +1,24 @@ +#include +#include +#include "mrubybind.h" + +double mul(float x, double y) { + return x * y; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("mul", mul); + } + + mrb_load_string(mrb, "puts mul(12.0, 34.0)"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + + mrb_close(mrb); + return 0; +} diff --git a/test/int.cc b/test/int.cc new file mode 100644 index 0000000..7d0a8f4 --- /dev/null +++ b/test/int.cc @@ -0,0 +1,24 @@ +#include +#include +#include "mrubybind.h" + +int square(int x) { + return x * x; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + + mrb_load_string(mrb, "puts square(1111)"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + + mrb_close(mrb); + return 0; +} diff --git a/test/module.cc b/test/module.cc new file mode 100644 index 0000000..ab5c620 --- /dev/null +++ b/test/module.cc @@ -0,0 +1,28 @@ +// Simple usage for binding function under some module. + +#include +#include +#include "mrubybind.h" + +void modfunc(int v) { + printf("modfunc called: %d\n", v); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + RClass* mod = mrb_define_module(mrb, "Mod"); + mrubybind::MrubyBind b(mrb, mod); + b.bind("modfunc", modfunc); + b.bind_const("FOO_VALUE", 1234); + } + + mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + + mrb_close(mrb); + return 0; +} diff --git a/test/string.cc b/test/string.cc new file mode 100644 index 0000000..73ddf9e --- /dev/null +++ b/test/string.cc @@ -0,0 +1,27 @@ +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +string emphasize(const char* str) { + return "* " + string(str) + " *"; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("emphasize", emphasize); + } + + mrb_load_string(mrb, "puts emphasize('Hello, mruby!')"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + + mrb_close(mrb); + return 0; +} diff --git a/test/test.sh b/test/test.sh new file mode 100755 index 0000000..34d110b --- /dev/null +++ b/test/test.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +################################################################ +# Test framework. + +function error_exit() { + echo -n -e "\033[1;31m[ERROR]\033[0;39m " + echo "$1" + exit 1 +} + +function run() { + echo -n "Testing $1 ... " + result=$(./$1) + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +################################################################ +# Test cases. + +run int '1234321' +run float '408.0' +run string '* Hello, mruby! *' +run class 'Foo::ctor(123) +690 +99980001 +Foo::dtor()' +run module 'modfunc called: 1234' + +################################################################ +# All tests succeeded. + +echo -n -e "\033[1;32mTEST ALL SUCCEEDED!\033[0;39m\n" From d7d005a45007e9aa7e1a3d26c5d940b622e52ddc Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 13:21:30 +0900 Subject: [PATCH 030/103] Use single quote instead of backquote for "wrong number of arguments" error --- codegen/binder.rb | 8 ++++---- mrubybind.dat | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 83d6b2a..adf5396 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -5,7 +5,7 @@ module MrubyBind def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) Kernel.send(:define_method, func_name) do |*args| if args.size != nparam - raise ArgumentError.new("`#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") end MrubyBind::call_cfunc(binder, func_ptr, *args) end @@ -15,7 +15,7 @@ def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) mod.const_get(class_name).class_eval do define_method(:initialize) do |*args| if args.size != nparam - raise ArgumentError.new("`initialize': wrong number of arguments (#{args.size} for #{nparam})") + raise ArgumentError.new("'initialize': wrong number of arguments (#{args.size} for #{nparam})") end MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *args) end @@ -26,7 +26,7 @@ def MrubyBind.bind_instance_method(mod, binder, class_name, method_name, method_ mod.const_get(class_name).class_eval do define_method(method_name) do |*args| if args.size != nparam - raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + raise ArgumentError.new("'#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") end MrubyBind::call_imethod(binder, self, method_ptr, *args) end @@ -38,7 +38,7 @@ def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_pt self.class.instance_eval do define_method(method_name) do |*args| if args.size != nparam - raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + raise ArgumentError.new("'#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") end MrubyBind::call_cfunc(binder, method_ptr, *args) end diff --git a/mrubybind.dat b/mrubybind.dat index 7be9155..c1623df 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,6 +1,6 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x55,0x22,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, 0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, @@ -31,7 +31,7 @@ const uint8_t binder[] = { 0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, 0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, 0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, 0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, @@ -56,7 +56,7 @@ const uint8_t binder[] = { 0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, 0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, 0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, -0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, +0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, 0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, 0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, 0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, @@ -81,7 +81,7 @@ const uint8_t binder[] = { 0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, 0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, 0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, 0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, 0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, 0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, @@ -111,7 +111,7 @@ const uint8_t binder[] = { 0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, 0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, 0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, 0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, From 9d0cd2c5a5d8ed745f7f52980eba92deda98c6e1 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 13:51:14 +0900 Subject: [PATCH 031/103] Change type error message --- mrubybind.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mrubybind.cc b/mrubybind.cc index a26e12d..5158250 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -24,10 +24,10 @@ const char Type::TYPE_NAME[] = "Voidp"; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value) { const char * argument_class_name = mrb_obj_classname(mrb, value); - mrb_raisef(mrb, E_TYPE_ERROR, "Illegal type %S, %S required, but %S(%S)", - mrb_fixnum_value(parameter_index), + mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S, argument %S(%S)", + mrb_str_new_cstr(mrb, argument_class_name), mrb_str_new_cstr(mrb, required_type_name), - mrb_str_new_cstr(mrb, argument_class_name), value); + mrb_fixnum_value(parameter_index + 1), value); return mrb_nil_value(); } From 9404e2108788a2a233aeb00c703eddf0d16a6d7d Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 13:55:25 +0900 Subject: [PATCH 032/103] Add tests for failure cases --- .gitignore | 2 ++ test/Makefile | 6 ++++++ test/test.sh | 21 +++++++++++++++++++++ test/wrong_arg_num.cc | 26 ++++++++++++++++++++++++++ test/wrong_type.cc | 26 ++++++++++++++++++++++++++ 5 files changed, 81 insertions(+) create mode 100644 test/wrong_arg_num.cc create mode 100644 test/wrong_type.cc diff --git a/.gitignore b/.gitignore index d2ba0b7..cf5086c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ /test/string /test/class /test/module +/test/wrong_type +/test/wrong_arg_num diff --git a/test/Makefile b/test/Makefile index 7c3438a..bf84706 100644 --- a/test/Makefile +++ b/test/Makefile @@ -37,4 +37,10 @@ class: class.o $(MRUBYBIND_OBJ) module: module.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) +wrong_type: wrong_type.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + +wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + # diff --git a/test/test.sh b/test/test.sh index 34d110b..3b0f0f9 100755 --- a/test/test.sh +++ b/test/test.sh @@ -12,6 +12,23 @@ function error_exit() { function run() { echo -n "Testing $1 ... " result=$(./$1) + code=$? + if [ $code -ne 0 ]; then + error_exit "exit status is not 0 [$code]" + fi + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +function fail() { + echo -n "Testing $1 ... " + result=$(./$1) + code=$? + if [ $code -eq 0 ]; then + error_exit "Failure expected, but succeeded!" + fi if [ "$result" != "$2" ]; then error_exit "$2 expected, but got '$result'" fi @@ -30,6 +47,10 @@ run class 'Foo::ctor(123) Foo::dtor()' run module 'modfunc called: 1234' +# Failure cases +fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" +fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" + ################################################################ # All tests succeeded. diff --git a/test/wrong_arg_num.cc b/test/wrong_arg_num.cc new file mode 100644 index 0000000..a2dbc86 --- /dev/null +++ b/test/wrong_arg_num.cc @@ -0,0 +1,26 @@ +#include +#include +#include "mrubybind.h" + +int square(int x) { + return x * x; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, "puts square(111, 222)"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} diff --git a/test/wrong_type.cc b/test/wrong_type.cc new file mode 100644 index 0000000..7560d38 --- /dev/null +++ b/test/wrong_type.cc @@ -0,0 +1,26 @@ +#include +#include +#include "mrubybind.h" + +int square(int x) { + return x * x; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, "puts square(\"1111\")"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} From 651d3f6481905f99bd7501fa6b147ea4f6e0759b Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 13:58:32 +0900 Subject: [PATCH 033/103] Failure exit when exception occurred --- test/class.cc | 2 ++ test/float.cc | 2 ++ test/int.cc | 2 ++ test/module.cc | 2 ++ test/string.cc | 2 ++ 5 files changed, 10 insertions(+) diff --git a/test/class.cc b/test/class.cc index 2c44988..3ad18e2 100644 --- a/test/class.cc +++ b/test/class.cc @@ -40,6 +40,7 @@ int main() { b.bind_static_method("Foo", "baz", &Foo::baz); } + int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "foo = Foo.new(123)\n" "p foo.bar(567)\n" @@ -48,6 +49,7 @@ int main() { if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; } mrb_close(mrb); diff --git a/test/float.cc b/test/float.cc index 9d01809..3273bbd 100644 --- a/test/float.cc +++ b/test/float.cc @@ -14,9 +14,11 @@ int main() { b.bind("mul", mul); } + int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts mul(12.0, 34.0)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; } mrb_close(mrb); diff --git a/test/int.cc b/test/int.cc index 7d0a8f4..afbdede 100644 --- a/test/int.cc +++ b/test/int.cc @@ -14,9 +14,11 @@ int main() { b.bind("square", square); } + int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts square(1111)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; } mrb_close(mrb); diff --git a/test/module.cc b/test/module.cc index ab5c620..6e7ed51 100644 --- a/test/module.cc +++ b/test/module.cc @@ -18,9 +18,11 @@ int main() { b.bind_const("FOO_VALUE", 1234); } + int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; } mrb_close(mrb); diff --git a/test/string.cc b/test/string.cc index 73ddf9e..46fa2fe 100644 --- a/test/string.cc +++ b/test/string.cc @@ -17,9 +17,11 @@ int main() { b.bind("emphasize", emphasize); } + int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts emphasize('Hello, mruby!')"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; } mrb_close(mrb); From c499eeb27e483750ed350fccd8275982d4408d10 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Fri, 21 Mar 2014 14:44:39 +0900 Subject: [PATCH 034/103] Update README.md --- README.md | 156 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 108 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 2bb0f5f..6549978 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,141 @@ mrubybind - Binding library for mruby/C++ ========================================= +mrubybind automatically creates C function/class-method binder for mruby. + ## Usage -### How to use +### How to use mrubybind in your project -1. Put source codes into your project. +1. Put following source codes into your project. * mrubybind.cc * mrubybind.dat * mrubybind.h * mrubybind.inc * mrubybind_types.h 2. Include "mrubybind.h" +3. Use `MrubyBind` instance to bind C function/class-method to mruby. +## Examples ### Bind C function and call it from mruby 1. C function (Any type you want): - int square(int x) { - return x * x; - } + ```c++ + int square(int x) { + return x * x; + } + ``` + +2. Bind it using mrubybind `bind` method: + + ```c++ + #include "mrubybind.h" -2. Bind it using mrubybind: + void install_square_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + } + ``` - #include "mrubybind.h" - - void install_square_function(mrb_state* mrb) { - mrubybind::MrubyBind b(mrb); - b.bind("square", square); - } + You can throw away `MrubyBind` instance after binding function. 3. Call it from mruby: - puts square(1111) #=> 1234321 + ```ruby + puts square(1111) #=> 1234321 + ``` -### Bind C++ class and method and call it from mruby +### Bind C++ class and method and create its instance from mruby 1. C++ class: - class Foo { - public: - Foo(int x) : x_(x) { - cout << "Foo::ctor(" << x << "), " << this << endl; - } - virtual ~Foo() { - cout << "Foo::dtor(), " << this << endl; - } - int bar(int y) { - return x_ + y; - } - - private: - int x_; - }; - -2. Bind C++ class using mrubybind: - - #include "mrubybind.h" - - // Helper function for constructor. - Foo* new_foo(int x) { - return new Foo(x); - } - - void install_foo_class(mrb_state* mrb) { - mrubybind::MrubyBind b(mrb); - b.bind_class("Foo", new_foo); - b.bind_class_method("Foo", "bar", &Foo::bar); - } + ```c++ + class Foo { + public: + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << ")" << endl; + } + virtual ~Foo() { + cout << "Foo::dtor()" << endl; + } + int bar(int y) { + return x_ + y; + } + static int baz(int z) { + return z * z; + } + + private: + int x_; + }; + ``` + +2. Bind C++ class using mrubybind `bind_class`, `bind_instance_method` and + `bind_static_method` method: + + ```c++ + #include "mrubybind.h" + + // Helper function for constructor. + Foo* new_foo(int x) { + return new Foo(x); + } + + void install_foo_class(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind_class("Foo", new_foo); + b.bind_instance_method("Foo", "bar", &Foo::bar); + b.bind_static_method("Foo", "baz", &Foo::baz); + } + ``` 3. Call it from mruby: - foo = Foo.new(123) #=> Foo::ctor(123), 0x104516780 - p foo #=> # - p foo.bar(567) #=> 690 - #=> Foo::dtor(), 0x104516780 + ```ruby + foo = Foo.new(123) #=> Foo::ctor(123) + p foo #=> # + p foo.bar(567) #=> 690 + p Foo.baz(9999) #=> 99980001 + #=> Foo::dtor() + ``` + +### Bind functions under some module + +1. Pass `RClass*` instace for `MrubyBind` constructor: + + ```c++ + void install(mrb_state* mrb) { + RClass* mod = mrb_define_module(mrb, "YourModule"); + mrubybind::MrubyBind b(mrb, mod); + b.bind("foo", foo); + } + ``` + + You can use `YourModule.foo` function from mruby. + +### Bind constant + +1. Use `bind_const` method: + + ```c++ + void install(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind_const("FOO", FOO_VALUE); + } + ``` + +## Supported types +| C type | mruby type | +|---------------------|-------------------------| +| int, unsigned int | Fixnum | +| float, double | Float | +| const char*, string | String | +| bool | TrueClass or FalseClass | +| void* | Object | + +See [mrubybind_types.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind_types.h). # License From f79ff5de53bc6e78a0f9b13a524ef24f951f36a7 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 22 Mar 2014 08:59:12 +0900 Subject: [PATCH 035/103] Concatenate .dat, .inc and mrubybind_types.h to reduce required files --- Makefile | 4 +- README.md | 3 - codegen/Makefile | 15 +- codegen/gen_template.rb | 2 +- codegen/mrubybind.1.cc | 10 + codegen/mrubybind.1.h | 7 + codegen/mrubybind.3.cc | 107 +++ codegen/mrubybind.3.h | 83 ++ .../mrubybind_types.1.h | 12 +- codegen/mrubybind_types.3.h | 4 + mrubybind.cc | 126 ++- mrubybind.dat | 122 --- mrubybind.h | 887 +++++++++++++++++- mrubybind.inc | 744 --------------- 14 files changed, 1236 insertions(+), 890 deletions(-) create mode 100644 codegen/mrubybind.1.cc create mode 100644 codegen/mrubybind.1.h create mode 100644 codegen/mrubybind.3.cc create mode 100644 codegen/mrubybind.3.h rename mrubybind_types.h => codegen/mrubybind_types.1.h (96%) create mode 100644 codegen/mrubybind_types.3.h delete mode 100644 mrubybind.dat delete mode 100644 mrubybind.inc diff --git a/Makefile b/Makefile index 5905098..b6f0db4 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,11 @@ all: make -C codegen clean: - make -C codegen clean make -C test clean +clean-all: clean + make -C codegen clean + test: all make -C test test diff --git a/README.md b/README.md index 6549978..e869b21 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,7 @@ mrubybind automatically creates C function/class-method binder for mruby. 1. Put following source codes into your project. * mrubybind.cc - * mrubybind.dat * mrubybind.h - * mrubybind.inc - * mrubybind_types.h 2. Include "mrubybind.h" 3. Use `MrubyBind` instance to bind C function/class-method to mruby. diff --git a/codegen/Makefile b/codegen/Makefile index 9f19e94..88489da 100644 --- a/codegen/Makefile +++ b/codegen/Makefile @@ -1,16 +1,21 @@ -TARGET= ../mrubybind.dat ../mrubybind.inc +TARGET= ../mrubybind.cc ../mrubybind.h all: $(TARGET) clean: rm -rf $(TARGET) -../mrubybind.dat: binder.rb +../mrubybind.cc: mrubybind.1.cc mrubybind.3.cc binder.rb ${MRUBY}/bin/mrbc -Bbinder binder.rb - mv binder.c ../mrubybind.dat + (echo "// Do not modify this file directly, this is generated" && \ + cat mrubybind.1.cc binder.c mrubybind.3.cc) > $@ + rm binder.c -../mrubybind.inc: gen_template.rb - ruby gen_template.rb > ../mrubybind.inc +../mrubybind.h: mrubybind.1.h mrubybind.3.h mrubybind_types.1.h mrubybind_types.3.h gen_template.rb + (echo "// Do not modify this file directly, this is generated" && \ + cat mrubybind.1.h mrubybind_types.1.h && \ + ruby gen_template.rb && \ + cat mrubybind_types.3.h mrubybind.3.h) > $@ # diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 6fe8a1d..109066d 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -2,7 +2,7 @@ MAX_PARAM = 10 HEADER = <::get(args[i]) \#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) diff --git a/codegen/mrubybind.1.cc b/codegen/mrubybind.1.cc new file mode 100644 index 0000000..fad57f5 --- /dev/null +++ b/codegen/mrubybind.1.cc @@ -0,0 +1,10 @@ +#include "mrubybind.h" +#include "mruby/compile.h" +#include "mruby/dump.h" +#include "mruby/proc.h" +#include "mruby/string.h" +#include "mruby/variable.h" + +namespace mrubybind { + +//#include "mrubybind.dat" diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h new file mode 100644 index 0000000..c58a71c --- /dev/null +++ b/codegen/mrubybind.1.h @@ -0,0 +1,7 @@ +#ifndef __MRUBYBIND_H__ +#define __MRUBYBIND_H__ + +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" +//#include "mrubybind_types.h" diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc new file mode 100644 index 0000000..4202eed --- /dev/null +++ b/codegen/mrubybind.3.cc @@ -0,0 +1,107 @@ + +const char Type::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "Bool"; +const char Type::TYPE_NAME[] = "Voidp"; + +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value) { + const char * argument_class_name = mrb_obj_classname(mrb, value); + mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S, argument %S(%S)", + mrb_str_new_cstr(mrb, argument_class_name), + mrb_str_new_cstr(mrb, required_type_name), + mrb_fixnum_value(parameter_index + 1), value); + return mrb_nil_value(); +} + +static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); +} + +static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value self_v; + mrb_value new_func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); + return self; +} + +static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value self_v; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); +} + +static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); +} + +MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { + Initialize(); +} + +MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { + Initialize(); +} + +MrubyBind::~MrubyBind() { + mrb_gc_arena_restore(mrb_, arena_index_); +} + +void MrubyBind::Initialize() { + arena_index_ = mrb_gc_arena_save(mrb_); + mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); + if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind)) { + mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind); + } else { + RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); + mod_mrubybind_ = mrb_obj_value(mrubybind); + mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, + ARGS_REQ(2) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, + ARGS_REQ(2) | ARGS_REST()); + mrb_irep* irep = mrb_read_irep(mrb_, binder); + if (irep != NULL) { + mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); + } + } +} + +} // namespace mrubybind diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h new file mode 100644 index 0000000..9175398 --- /dev/null +++ b/codegen/mrubybind.3.h @@ -0,0 +1,83 @@ + +namespace mrubybind { + +class MrubyBind { +public: + MrubyBind(mrb_state* mrb); + MrubyBind(mrb_state* mrb, RClass* mod); + ~MrubyBind(); + + // Bind constant value. + template + void bind_const(const char* name, T v) { + mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); + } + + // Bind function. + template + void bind(const char* func_name, Func func_ptr) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, + func_ptr_v, nparam_v); + } + + // Bind class. + template + void bind_class(const char* class_name, Func new_func_ptr) { + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, + class_name_v, new_func_ptr_v, nparam_v); + } + + // Bind instance method. + template + void bind_instance_method(const char* class_name, const char* method_name, + Method method_ptr) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value method_pptr_v = mrb_str_new(mrb_, + reinterpret_cast(&method_ptr), + sizeof(method_ptr)); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, + mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); + } + + // Bind static method. + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, + mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + } + +private: + void Initialize(); + + mrb_state* mrb_; + mrb_value mod_mrubybind_; + RClass* mod_; + int arena_index_; +}; + +} // namespace mrubybind + +#endif diff --git a/mrubybind_types.h b/codegen/mrubybind_types.1.h similarity index 96% rename from mrubybind_types.h rename to codegen/mrubybind_types.1.h index f59d036..6d4a937 100644 --- a/mrubybind_types.h +++ b/codegen/mrubybind_types.1.h @@ -1,7 +1,3 @@ -#ifndef __MRUBYBIND_TYPES_H__ -#define __MRUBYBIND_TYPES_H__ - -#include "mruby.h" #include "mruby/string.h" #include @@ -137,10 +133,4 @@ mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); // Includes generated template specialization. -#include "mrubybind.inc" - -} // namespace mrubybind - -#undef ASSERT - -#endif +//#include "mrubybind.inc" diff --git a/codegen/mrubybind_types.3.h b/codegen/mrubybind_types.3.h new file mode 100644 index 0000000..06274e7 --- /dev/null +++ b/codegen/mrubybind_types.3.h @@ -0,0 +1,4 @@ + +} // namespace mrubybind + +#undef ASSERT diff --git a/mrubybind.cc b/mrubybind.cc index 5158250..ba69ca2 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -1,3 +1,4 @@ +// Do not modify this file directly, this is generated #include "mrubybind.h" #include "mruby/compile.h" #include "mruby/dump.h" @@ -7,8 +8,129 @@ namespace mrubybind { -static -#include "mrubybind.dat" +//#include "mrubybind.dat" +#include +const uint8_t binder[] = { +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, +0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, +0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, +0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, +0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, +0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, +0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, +0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, +0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, +0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, +0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, +0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, +0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, +0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, +0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, +0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, +0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, +0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, +0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, +0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, +0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, +0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, +0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, +0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, +0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, +0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, +0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, +0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, +0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, +0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, +0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, +0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, +0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, +0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, +0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, +0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, +0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, +0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, +0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, +0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +}; const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Fixnum"; diff --git a/mrubybind.dat b/mrubybind.dat deleted file mode 100644 index c1623df..0000000 --- a/mrubybind.dat +++ /dev/null @@ -1,122 +0,0 @@ -#include -const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, -0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, -0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, -0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, -0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, -0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, -0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, -0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, -0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, -0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, -0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, -0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, -0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, -0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, -0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, -0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, -0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, -0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, -0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, -0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, -0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, -0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, -0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, -0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, -0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, -0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, -0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, -0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, -0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, -0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, -0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, -0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, -0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, -0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, -0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, -0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, -0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, -0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, -0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, -0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, -0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, -0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, -}; diff --git a/mrubybind.h b/mrubybind.h index 059fcd9..bd154fd 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,10 +1,895 @@ +// Do not modify this file directly, this is generated #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" -#include "mrubybind_types.h" +//#include "mrubybind_types.h" +#include "mruby/string.h" +#include + +#include +#define ASSERT(expr) assert(expr) + +namespace mrubybind { + +//=========================================================================== +// C <-> mruby type converter. + +template +struct Type { + //static int check(mrb_value v) = 0; + //static int get(mrb_value v) = 0; + //static mrb_value ret(mrb_state*, int i) = 0; +}; + +// Fixnum +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static unsigned int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } +}; + +// float +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static float get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } +}; + +// double +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static double get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } +}; + +// String +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_string_p(v); } + static const char* get(mrb_value v) { return RSTRING_PTR(v); } + static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +// Boolean +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value /*v*/) { return 1; } + static bool get(mrb_value v) { return mrb_test(v); } + static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } +}; + +// Raw pointer +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_voidp_p(v); } + static void* get(mrb_value v) { return mrb_voidp(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } +}; + +//=========================================================================== +// Binder + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct Binder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct ClassBinder { + static struct mrb_data_type type_info; + static void dtor(mrb_state*, void* p) { + C* instance = static_cast(p); + delete instance; + } + + // Template specialization. + //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { +}; +template +mrb_data_type ClassBinder::type_info = { "???", dtor }; + +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value); + +// Includes generated template specialization. +//#include "mrubybind.inc" +// Following code is generated from gen_template.rb +#define ARG(i) Type::get(args[i]) +#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +// void f(void); +template<> +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + void (*fp)(void) = (void (*)(void))func_ptr; + fp(); + return mrb_nil_value(); + } +}; + +// R f(void); +template +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + R (*fp)(void) = (R (*)(void))func_ptr; + R result = fp(); + return Type::ret(mrb, result); + } +}; + +// C* ctor(void); +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(mrb);(void)(args);(void)(narg); + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; + C* instance = ctor(); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(void); + M mp = *(M*)method_pptr; + (instance->*mp)(); + return mrb_nil_value(); + } +}; + +// class C { R f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(void); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(); + return Type::ret(mrb, result); + } +}; + +// void f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + void (*fp)(P0) = (void (*)(P0))func_ptr; + fp(ARG(0)); + return mrb_nil_value(); + } +}; + +// R f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + R (*fp)(P0) = (R (*)(P0))func_ptr; + R result = fp(ARG(0)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0); +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); + C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; + C* instance = ctor(ARG(0)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; + fp(ARG(0), ARG(1)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; + R result = fp(ARG(0), ARG(1)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1); +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; + fp(ARG(0), ARG(1), ARG(2)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2); +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3); +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4); +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5); +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6); +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + DATA_PTR(self) = instance; + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return Type::ret(mrb, result); + } +}; + +#undef ARG +#undef CHECK + +} // namespace mrubybind + +#undef ASSERT namespace mrubybind { diff --git a/mrubybind.inc b/mrubybind.inc deleted file mode 100644 index ea56379..0000000 --- a/mrubybind.inc +++ /dev/null @@ -1,744 +0,0 @@ -// This file is generated from gen_template.rb -#define ARG(i) Type::get(args[i]) -#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} -#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) - -// void f(void); -template<> -struct Binder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - void (*fp)(void) = (void (*)(void))func_ptr; - fp(); - return mrb_nil_value(); - } -}; - -// R f(void); -template -struct Binder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - R (*fp)(void) = (R (*)(void))func_ptr; - R result = fp(); - return Type::ret(mrb, result); - } -}; - -// C* ctor(void); -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(mrb);(void)(args);(void)(narg); - C* (*ctor)(void) = (C* (*)(void))new_func_ptr; - C* instance = ctor(); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(void) }; -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(void); - M mp = *(M*)method_pptr; - (instance->*mp)(); - return mrb_nil_value(); - } -}; - -// class C { R f(void) }; -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(void); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(); - return Type::ret(mrb, result); - } -}; - -// void f(P0); -template -struct Binder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - void (*fp)(P0) = (void (*)(P0))func_ptr; - fp(ARG(0)); - return mrb_nil_value(); - } -}; - -// R f(P0); -template -struct Binder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - R (*fp)(P0) = (R (*)(P0))func_ptr; - R result = fp(ARG(0)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0); -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); - C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; - C* instance = ctor(ARG(0)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0) }; -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0) }; -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1); -template -struct Binder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; - fp(ARG(0), ARG(1)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1); -template -struct Binder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; - R result = fp(ARG(0), ARG(1)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1); -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1) }; -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1) }; -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2); -template -struct Binder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; - fp(ARG(0), ARG(1), ARG(2)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2); -template -struct Binder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2); -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2) }; -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2) }; -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3); -template -struct Binder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3); -template -struct Binder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3); -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3) }; -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3) }; -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4); -template -struct Binder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4); -template -struct Binder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4); -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4) }; -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4) }; -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5); -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5) }; -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5) }; -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4, P5, P6); -template -struct Binder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6); -template -struct Binder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6); -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct Binder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct Binder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct Binder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct Binder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return Type::ret(mrb, result); - } -}; - -// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct Binder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct Binder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - DATA_PTR(self) = instance; - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(DATA_PTR(self)); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* instance = static_cast(DATA_PTR(self)); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return Type::ret(mrb, result); - } -}; - -#undef ARG -#undef CHECK From 5382eec73324e32451014ef3c51a7a010c6c5f84 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 22 Mar 2014 09:18:19 +0900 Subject: [PATCH 036/103] Add comments to header --- codegen/mrubybind.1.h | 20 ++++++++++++++++++++ codegen/mrubybind.3.h | 2 ++ mrubybind.h | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h index c58a71c..92f76a5 100644 --- a/codegen/mrubybind.1.h +++ b/codegen/mrubybind.1.h @@ -1,3 +1,23 @@ +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 9175398..89febe1 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -1,6 +1,8 @@ namespace mrubybind { +//=========================================================================== +// MrubyBind - utility class for binding C functions/classes to mruby. class MrubyBind { public: MrubyBind(mrb_state* mrb); diff --git a/mrubybind.h b/mrubybind.h index bd154fd..7c6c80e 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,4 +1,24 @@ // Do not modify this file directly, this is generated +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ @@ -893,6 +913,8 @@ struct ClassBinder { namespace mrubybind { +//=========================================================================== +// MrubyBind - utility class for binding C functions/classes to mruby. class MrubyBind { public: MrubyBind(mrb_state* mrb); From 0ddc82cb8cea07d76c386049091bb6a915629246 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 22 Mar 2014 09:32:17 +0900 Subject: [PATCH 037/103] Fix README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e869b21..860b819 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ mrubybind - Binding library for mruby/C++ ========================================= -mrubybind automatically creates C function/class-method binder for mruby. +mrubybind automatically creates C function/class-method binder for mruby, +using C++ template partial specialization. ## Usage @@ -132,7 +133,7 @@ mrubybind automatically creates C function/class-method binder for mruby. | bool | TrueClass or FalseClass | | void* | Object | -See [mrubybind_types.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind_types.h). +See [mrubybind.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind.h). # License From 6d1edabe71c2c22c6c87a0cc40ff0bec59928221 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 22 Mar 2014 09:45:20 +0900 Subject: [PATCH 038/103] Add a link to mruby repository --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 860b819..a144f50 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ mrubybind - Binding library for mruby/C++ ========================================= -mrubybind automatically creates C function/class-method binder for mruby, +mrubybind automatically creates C function/class-method binder for [mruby](https://github.com/mruby/mruby), using C++ template partial specialization. ## Usage From c910da1414a4ae3e692fe40638619049be6285e9 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Sat, 22 Mar 2014 19:00:19 +0900 Subject: [PATCH 039/103] Raise error when mrubybind.h is included from C --- codegen/mrubybind.1.h | 4 ++++ mrubybind.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h index 92f76a5..ea525e5 100644 --- a/codegen/mrubybind.1.h +++ b/codegen/mrubybind.1.h @@ -21,6 +21,10 @@ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" diff --git a/mrubybind.h b/mrubybind.h index 7c6c80e..72524fa 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -22,6 +22,10 @@ #ifndef __MRUBYBIND_H__ #define __MRUBYBIND_H__ +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" From edaa49f51efefcb68c73fd2bc68114757b1a4766 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 09:39:37 +0900 Subject: [PATCH 040/103] Define function under module except Kernel --- codegen/binder.rb | 18 +++- mrubybind.cc | 215 +++++++++++++++++++++++++--------------------- 2 files changed, 132 insertions(+), 101 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index adf5396..0d1259b 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -3,11 +3,21 @@ module MrubyBind def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) - Kernel.send(:define_method, func_name) do |*args| - if args.size != nparam - raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + if mod == Kernel + # Not sure why defining class method for Kernel is not work with code below... + Kernel.send(:define_method, func_name) do |*args| + if args.size != nparam + raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, func_ptr, *args) + end + else + mod.define_singleton_method(func_name) do |*args| + if args.size != nparam + raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, func_ptr, *args) end - MrubyBind::call_cfunc(binder, func_ptr, *args) end end diff --git a/mrubybind.cc b/mrubybind.cc index ba69ca2..675a337 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -11,8 +11,8 @@ namespace mrubybind { //#include "mrubybind.dat" #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xb2,0x96,0x00,0x00,0x08,0xba,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x08,0x9c,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, @@ -27,71 +27,121 @@ const uint8_t binder[] = { 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, 0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, 0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, -0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, -0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, -0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, -0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, -0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, -0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, -0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, -0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, -0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, -0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, -0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, -0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, -0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, -0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, -0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, -0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, -0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, -0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, -0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, -0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, -0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, -0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x95,0x00,0x07,0x00, +0x0b,0x00,0x02,0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04, +0x00,0x00,0x91,0x03,0x80,0x00,0xb2,0x03,0xc0,0x03,0x19,0x03,0x80,0x00,0x91,0x04, +0x00,0x01,0x84,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x81,0x21,0x00, +0x40,0x02,0x17,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x04,0x80,0x03,0x40,0x03, +0x81,0x00,0xa1,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00, +0x02,0x3d,0x3d,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73, +0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x17,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x73,0x69,0x6e, +0x67,0x6c,0x65,0x74,0x6f,0x6e,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, +0x01,0x0a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26, +0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0, +0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, +0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, +0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, +0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd, +0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, +0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01, +0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04, +0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20, +0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65, +0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01, +0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d, +0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d, +0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00, +0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c, +0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07, +0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80, +0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80, +0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81, +0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00, +0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01, +0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01, +0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x15,0x02,0x81, +0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, +0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e, +0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07, +0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0, +0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00, +0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, +0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, +0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, +0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c, +0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, +0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, +0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, 0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x27,0x69,0x6e, +0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67, +0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d, +0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00, +0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b, +0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00, +0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00, +0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, +0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73, +0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, +0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01, +0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x21,0x00, +0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x80,0x95,0x01, +0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02, +0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, +0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03, +0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03, +0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01, +0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02, +0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01, +0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a, +0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, +0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20, +0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69, +0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00, +0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00, +0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e, +0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c, +0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04, +0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00, +0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42, +0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80, +0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d, +0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, +0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06, +0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65, +0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07, +0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80, +0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80, +0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81, +0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00, +0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01, +0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01, +0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81, +0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, 0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, 0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, 0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, @@ -99,37 +149,8 @@ const uint8_t binder[] = { 0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, 0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, 0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, -0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, -0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, -0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, -0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, -0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, -0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, -0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, -0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, -0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e, +0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, }; const char Type::TYPE_NAME[] = "Fixnum"; From e5668d082baade607a7fd1d7128ba3bcbc03b6dc Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 08:47:31 +0900 Subject: [PATCH 041/103] Treat a warning as an error --- test/Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/Makefile b/test/Makefile index bf84706..17ec00e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -8,6 +8,8 @@ MRUBYBIND_OBJ=mrubybind.o SRCS=$(wildcard *.cc) EXES=$(SRCS:%.cc=%) +CXXFLAGS=-Wall -Wextra -Werror + all: $(EXES) clean: @@ -17,10 +19,10 @@ test: $(EXES) ./test.sh %.o: %.cc - g++ -c -o $@ $(INC) $< + g++ -c -o $@ $(INC) $(CXXFLAGS) $< mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -c -o $@ $(INC) $< + g++ -c -o $@ $(INC) $(CXXFLAGS) $< int: int.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) From f206eac67a1b706d82b366627d4982e66d83189f Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 08:49:04 +0900 Subject: [PATCH 042/103] Add call2 which uses cfunc_with_env to hold c function --- codegen/gen_template.rb | 20 ++++ codegen/mrubybind.1.h | 1 + codegen/mrubybind.3.h | 15 +++ mrubybind.h | 236 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 272 insertions(+) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 109066d..c414976 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -20,6 +20,16 @@ fp(%ARGS%); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + %ASSERTS% + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_voidp(cfunc); + fp(%ARGS%); + return mrb_nil_value(); + } }; // R f(%PARAMS%); @@ -32,6 +42,16 @@ R result = fp(%ARGS%); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + %ASSERTS% + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_voidp(cfunc); + R result = fp(%ARGS%); + return Type::ret(mrb, result); + } }; // C* ctor(%PARAMS%); diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h index ea525e5..38a7c3e 100644 --- a/codegen/mrubybind.1.h +++ b/codegen/mrubybind.1.h @@ -28,4 +28,5 @@ #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" +#include "mruby/proc.h" //#include "mrubybind_types.h" diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 89febe1..c0120ac 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -26,6 +26,21 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); } + template + void bind2(const char* func_name, Func func_ptr) { + //mrb_value mod = mrb_obj_value(mod_); + //mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call2); + //mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); + //mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + //mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, + // func_ptr_v, nparam_v); + + mrb_sym func_name_v = mrb_intern_cstr(mrb_, func_name); + mrb_value voidp = mrb_cptr_value(mrb_, (void*)func_ptr); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 1, &voidp); + mrb_define_method_raw(mrb_, mod_, func_name_v, proc); + } // Bind class. template diff --git a/mrubybind.h b/mrubybind.h index 72524fa..37a63a4 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -29,6 +29,7 @@ #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" +#include "mruby/proc.h" //#include "mrubybind_types.h" #include "mruby/string.h" #include @@ -181,6 +182,16 @@ struct Binder { fp(); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(mrb);(void)(args);(void)(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(void) = (void (*)(void))mrb_voidp(cfunc); + fp(); + return mrb_nil_value(); + } }; // R f(void); @@ -193,6 +204,16 @@ struct Binder { R result = fp(); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(mrb);(void)(args);(void)(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(void) = (R (*)(void))mrb_voidp(cfunc); + R result = fp(); + return Type::ret(mrb, result); + } }; // C* ctor(void); @@ -248,6 +269,16 @@ struct Binder { fp(ARG(0)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0) = (void (*)(P0))mrb_voidp(cfunc); + fp(ARG(0)); + return mrb_nil_value(); + } }; // R f(P0); @@ -260,6 +291,16 @@ struct Binder { R result = fp(ARG(0)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0) = (R (*)(P0))mrb_voidp(cfunc); + R result = fp(ARG(0)); + return Type::ret(mrb, result); + } }; // C* ctor(P0); @@ -315,6 +356,16 @@ struct Binder { fp(ARG(0), ARG(1)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_voidp(cfunc); + fp(ARG(0), ARG(1)); + return mrb_nil_value(); + } }; // R f(P0, P1); @@ -327,6 +378,16 @@ struct Binder { R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1); @@ -382,6 +443,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2); @@ -394,6 +465,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2); @@ -449,6 +530,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3); @@ -461,6 +552,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3); @@ -516,6 +617,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4); @@ -528,6 +639,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4); @@ -583,6 +704,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4, P5); @@ -595,6 +726,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4, P5); @@ -650,6 +791,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4, P5, P6); @@ -662,6 +813,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4, P5, P6); @@ -717,6 +878,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4, P5, P6, P7); @@ -729,6 +900,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); @@ -784,6 +965,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); @@ -796,6 +987,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); @@ -851,6 +1052,16 @@ struct Binder { fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return mrb_nil_value(); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); + fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return mrb_nil_value(); + } }; // R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); @@ -863,6 +1074,16 @@ struct Binder { R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return Type::ret(mrb, result); } + static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); + R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + return Type::ret(mrb, result); + } }; // C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); @@ -942,6 +1163,21 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); } + template + void bind2(const char* func_name, Func func_ptr) { + //mrb_value mod = mrb_obj_value(mod_); + //mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call2); + //mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); + //mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + //mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, + // func_ptr_v, nparam_v); + + mrb_sym func_name_v = mrb_intern_cstr(mrb_, func_name); + mrb_value voidp = mrb_cptr_value(mrb_, (void*)func_ptr); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 1, &voidp); + mrb_define_method_raw(mrb_, mod_, func_name_v, proc); + } // Bind class. template From c04365f82c42d2a6d9a872c72e85f91502623fa9 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 09:24:45 +0900 Subject: [PATCH 043/103] Use bind2 as default --- codegen/gen_template.rb | 5 +- codegen/mrubybind.3.cc | 8 ++ codegen/mrubybind.3.h | 14 ++- codegen/mrubybind_types.1.h | 1 + mrubybind.cc | 8 ++ mrubybind.h | 172 +++++++++++++++++++----------------- test/test.sh | 2 +- 7 files changed, 123 insertions(+), 87 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index c414976..f1a3927 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -7,6 +7,9 @@ \#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) +\#define CHECK2(narg) {if(narg != NPARAM) RAISE2(narg);} +\#define RAISE2(narg) raise2(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) + EOD FUNC_TMPL = < args, '%CLASSES0%' => classes, '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, - '%ASSERTS%' => asserts + '%ASSERTS%' => 'CHECK2(narg); ' + asserts } return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index 4202eed..2fca6a7 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -20,6 +20,14 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } +mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", + func_name, + mrb_fixnum_value(narg), + mrb_fixnum_value(nparam)); + return mrb_nil_value(); +} + static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { mrb_value binder; mrb_value func_ptr_v; diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index c0120ac..00862e1 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -18,6 +18,7 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { + /* mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); @@ -25,6 +26,8 @@ class MrubyBind { mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); + */ + bind2(func_name, func_ptr); } template void bind2(const char* func_name, Func func_ptr) { @@ -36,10 +39,13 @@ class MrubyBind { //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, // func_ptr_v, nparam_v); - mrb_sym func_name_v = mrb_intern_cstr(mrb_, func_name); - mrb_value voidp = mrb_cptr_value(mrb_, (void*)func_ptr); - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 1, &voidp); - mrb_define_method_raw(mrb_, mod_, func_name_v, proc); + mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer + mrb_symbol_value(func_name_s), // 1: function name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); } // Bind class. diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 6d4a937..e835396 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -131,6 +131,7 @@ mrb_data_type ClassBinder::type_info = { "???", dtor }; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); +mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" diff --git a/mrubybind.cc b/mrubybind.cc index 675a337..9d55b13 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -174,6 +174,14 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } +mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", + func_name, + mrb_fixnum_value(narg), + mrb_fixnum_value(nparam)); + return mrb_nil_value(); +} + static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { mrb_value binder; mrb_value func_ptr_v; diff --git a/mrubybind.h b/mrubybind.h index 37a63a4..a2e9611 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -164,6 +164,7 @@ mrb_data_type ClassBinder::type_info = { "???", dtor }; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); +mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" @@ -172,12 +173,15 @@ mrb_value raise(mrb_state *mrb, int parameter_index, #define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) +#define CHECK2(narg) {if(narg != NPARAM) RAISE2(narg);} +#define RAISE2(narg) raise2(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) + // void f(void); template<> struct Binder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); void (*fp)(void) = (void (*)(void))func_ptr; fp(); return mrb_nil_value(); @@ -186,7 +190,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(void) = (void (*)(void))mrb_voidp(cfunc); fp(); @@ -199,7 +203,7 @@ template struct Binder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); R (*fp)(void) = (R (*)(void))func_ptr; R result = fp(); return Type::ret(mrb, result); @@ -208,7 +212,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(void) = (R (*)(void))mrb_voidp(cfunc); R result = fp(); @@ -223,7 +227,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); DATA_PTR(self) = instance; @@ -236,7 +240,7 @@ template struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(void); M mp = *(M*)method_pptr; @@ -250,7 +254,7 @@ template struct ClassBinder { static const int NPARAM = 0; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(void); M mp = *(M*)method_pptr; @@ -264,7 +268,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); void (*fp)(P0) = (void (*)(P0))func_ptr; fp(ARG(0)); return mrb_nil_value(); @@ -273,7 +277,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0) = (void (*)(P0))mrb_voidp(cfunc); fp(ARG(0)); @@ -286,7 +290,7 @@ template struct Binder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); R (*fp)(P0) = (R (*)(P0))func_ptr; R result = fp(ARG(0)); return Type::ret(mrb, result); @@ -295,7 +299,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0) = (R (*)(P0))mrb_voidp(cfunc); R result = fp(ARG(0)); @@ -310,7 +314,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; C* instance = ctor(ARG(0)); DATA_PTR(self) = instance; @@ -323,7 +327,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0); M mp = *(M*)method_pptr; @@ -337,7 +341,7 @@ template struct ClassBinder { static const int NPARAM = 1; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + CHECK2(narg); (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0); M mp = *(M*)method_pptr; @@ -351,7 +355,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; fp(ARG(0), ARG(1)); return mrb_nil_value(); @@ -360,7 +364,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_voidp(cfunc); fp(ARG(0), ARG(1)); @@ -373,7 +377,7 @@ template struct Binder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); @@ -382,7 +386,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1)); @@ -397,7 +401,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; C* instance = ctor(ARG(0), ARG(1)); DATA_PTR(self) = instance; @@ -410,7 +414,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -424,7 +428,7 @@ template struct ClassBinder { static const int NPARAM = 2; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1); M mp = *(M*)method_pptr; @@ -438,7 +442,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); @@ -447,7 +451,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2)); @@ -460,7 +464,7 @@ template struct Binder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); @@ -469,7 +473,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2)); @@ -484,7 +488,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_PTR(self) = instance; @@ -497,7 +501,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -511,7 +515,7 @@ template struct ClassBinder { static const int NPARAM = 3; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2); M mp = *(M*)method_pptr; @@ -525,7 +529,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); @@ -534,7 +538,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -547,7 +551,7 @@ template struct Binder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); @@ -556,7 +560,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -571,7 +575,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_PTR(self) = instance; @@ -584,7 +588,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -598,7 +602,7 @@ template struct ClassBinder { static const int NPARAM = 4; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3); M mp = *(M*)method_pptr; @@ -612,7 +616,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); @@ -621,7 +625,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -634,7 +638,7 @@ template struct Binder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); @@ -643,7 +647,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -658,7 +662,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_PTR(self) = instance; @@ -671,7 +675,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -685,7 +689,7 @@ template struct ClassBinder { static const int NPARAM = 5; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4); M mp = *(M*)method_pptr; @@ -699,7 +703,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); @@ -708,7 +712,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -721,7 +725,7 @@ template struct Binder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); @@ -730,7 +734,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -745,7 +749,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_PTR(self) = instance; @@ -758,7 +762,7 @@ template struct ClassBinder { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -772,7 +776,7 @@ template { static const int NPARAM = 6; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); M mp = *(M*)method_pptr; @@ -786,7 +790,7 @@ template struct Binder { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return mrb_nil_value(); @@ -795,7 +799,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -808,7 +812,7 @@ template { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return Type::ret(mrb, result); @@ -817,7 +821,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -832,7 +836,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); DATA_PTR(self) = instance; @@ -845,7 +849,7 @@ template { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; @@ -859,7 +863,7 @@ template { static const int NPARAM = 7; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); M mp = *(M*)method_pptr; @@ -873,7 +877,7 @@ template { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return mrb_nil_value(); @@ -882,7 +886,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -895,7 +899,7 @@ template { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return Type::ret(mrb, result); @@ -904,7 +908,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -919,7 +923,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); DATA_PTR(self) = instance; @@ -932,7 +936,7 @@ template { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; @@ -946,7 +950,7 @@ template { static const int NPARAM = 8; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); M mp = *(M*)method_pptr; @@ -960,7 +964,7 @@ template { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return mrb_nil_value(); @@ -969,7 +973,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -982,7 +986,7 @@ template { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return Type::ret(mrb, result); @@ -991,7 +995,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -1006,7 +1010,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); DATA_PTR(self) = instance; @@ -1019,7 +1023,7 @@ template { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; @@ -1033,7 +1037,7 @@ template { static const int NPARAM = 9; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); M mp = *(M*)method_pptr; @@ -1047,7 +1051,7 @@ template { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return mrb_nil_value(); @@ -1056,7 +1060,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -1069,7 +1073,7 @@ template { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return Type::ret(mrb, result); @@ -1078,7 +1082,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -1093,7 +1097,7 @@ struct ClassBinder { static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); DATA_PTR(self) = instance; @@ -1106,7 +1110,7 @@ template { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; @@ -1120,7 +1124,7 @@ template { static const int NPARAM = 10; static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); M mp = *(M*)method_pptr; @@ -1155,6 +1159,7 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { + /* mrb_value mod = mrb_obj_value(mod_); mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); @@ -1162,6 +1167,8 @@ class MrubyBind { mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, func_ptr_v, nparam_v); + */ + bind2(func_name, func_ptr); } template void bind2(const char* func_name, Func func_ptr) { @@ -1173,10 +1180,13 @@ class MrubyBind { //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, // func_ptr_v, nparam_v); - mrb_sym func_name_v = mrb_intern_cstr(mrb_, func_name); - mrb_value voidp = mrb_cptr_value(mrb_, (void*)func_ptr); - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 1, &voidp); - mrb_define_method_raw(mrb_, mod_, func_name_v, proc); + mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer + mrb_symbol_value(func_name_s), // 1: function name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); } // Bind class. diff --git a/test/test.sh b/test/test.sh index 3b0f0f9..38e4f3f 100755 --- a/test/test.sh +++ b/test/test.sh @@ -45,7 +45,7 @@ run class 'Foo::ctor(123) 690 99980001 Foo::dtor()' -run module 'modfunc called: 1234' +#run module 'modfunc called: 1234' # Failure cases fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" From e49122054d52d7e9b748c07fb7c9806b19a96595 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 21:10:39 +0900 Subject: [PATCH 044/103] Use cfunc_with_env for instance method binder --- codegen/gen_template.rb | 16 +++- codegen/mrubybind.3.h | 14 +-- mrubybind.h | 190 +++++++++++++++++++++++++++++----------- 3 files changed, 158 insertions(+), 62 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index f1a3927..a1ecf3f 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -79,11 +79,15 @@ template struct ClassBinder { static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(%PARAMS%); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(%ARGS%); return mrb_nil_value(); } @@ -93,11 +97,15 @@ template struct ClassBinder { static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(%PARAMS%); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(%ARGS%); return Type::ret(mrb, result); } diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 00862e1..ef7dc3e 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -66,16 +66,16 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, - mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); + mrb_value env[] = { + method_pptr_v, // 0: instance method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); + mrb_define_method_raw(mrb_, mod_, method_name_s, proc); } // Bind static method. diff --git a/mrubybind.h b/mrubybind.h index a2e9611..2df2870 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -239,11 +239,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(void); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(); return mrb_nil_value(); } @@ -253,11 +257,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(void); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(); return Type::ret(mrb, result); } @@ -326,11 +334,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0)); return mrb_nil_value(); } @@ -340,11 +352,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0)); return Type::ret(mrb, result); } @@ -413,11 +429,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1)); return mrb_nil_value(); } @@ -427,11 +447,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1)); return Type::ret(mrb, result); } @@ -500,11 +524,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } @@ -514,11 +542,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } @@ -587,11 +619,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } @@ -601,11 +637,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } @@ -674,11 +714,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } @@ -688,11 +732,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } @@ -761,11 +809,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } @@ -775,11 +827,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } @@ -848,11 +904,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return mrb_nil_value(); } @@ -862,11 +922,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return Type::ret(mrb, result); } @@ -935,11 +999,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return mrb_nil_value(); } @@ -949,11 +1017,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return Type::ret(mrb, result); } @@ -1022,11 +1094,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return mrb_nil_value(); } @@ -1036,11 +1112,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return Type::ret(mrb, result); } @@ -1109,11 +1189,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return mrb_nil_value(); } @@ -1123,11 +1207,15 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return Type::ret(mrb, result); } @@ -1207,16 +1295,16 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, - mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); + mrb_value env[] = { + method_pptr_v, // 0: instance method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); + mrb_define_method_raw(mrb_, mod_, method_name_s, proc); } // Bind static method. From d76b8cf806e6c4fe23735f25e43e646bd475a1e5 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 21:16:19 +0900 Subject: [PATCH 045/103] Remove unneeded binder method --- codegen/binder.rb | 30 ------- codegen/mrubybind.3.h | 8 -- mrubybind.cc | 190 +++++++++++++----------------------------- 3 files changed, 59 insertions(+), 169 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 0d1259b..828edf0 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,25 +2,6 @@ # and included into C code. module MrubyBind - def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) - if mod == Kernel - # Not sure why defining class method for Kernel is not work with code below... - Kernel.send(:define_method, func_name) do |*args| - if args.size != nparam - raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, func_ptr, *args) - end - else - mod.define_singleton_method(func_name) do |*args| - if args.size != nparam - raise ArgumentError.new("'#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, func_ptr, *args) - end - end - end - def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) mod.const_get(class_name).class_eval do define_method(:initialize) do |*args| @@ -32,17 +13,6 @@ def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) end end - def MrubyBind.bind_instance_method(mod, binder, class_name, method_name, method_ptr, nparam) - mod.const_get(class_name).class_eval do - define_method(method_name) do |*args| - if args.size != nparam - raise ArgumentError.new("'#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_imethod(binder, self, method_ptr, *args) - end - end - end - def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) mod.const_get(class_name).class_eval do self.class.instance_eval do diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index ef7dc3e..c3e0419 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -31,14 +31,6 @@ class MrubyBind { } template void bind2(const char* func_name, Func func_ptr) { - //mrb_value mod = mrb_obj_value(mod_); - //mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call2); - //mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - //mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - //mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, - // func_ptr_v, nparam_v); - mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer diff --git a/mrubybind.cc b/mrubybind.cc index 9d55b13..d1fbfb0 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -11,146 +11,74 @@ namespace mrubybind { //#include "mrubybind.dat" #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xb2,0x96,0x00,0x00,0x08,0xba,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x08,0x9c,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xb9,0x95,0x00,0x00,0x04,0x33,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x04,0x15,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, -0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x00, +0x00,0x0a,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, -0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, -0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, -0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, -0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x95,0x00,0x07,0x00, -0x0b,0x00,0x02,0x00,0x00,0x00,0x10,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04, -0x00,0x00,0x91,0x03,0x80,0x00,0xb2,0x03,0xc0,0x03,0x19,0x03,0x80,0x00,0x91,0x04, -0x00,0x01,0x84,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x81,0x21,0x00, -0x40,0x02,0x17,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x04,0x80,0x03,0x40,0x03, -0x81,0x00,0xa1,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00, -0x02,0x3d,0x3d,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73, -0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x17,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x73,0x69,0x6e, -0x67,0x6c,0x65,0x74,0x6f,0x6e,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, -0x01,0x0a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26, -0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0, -0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d, -0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e, -0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d, -0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd, -0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91, -0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01, -0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04, -0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20, -0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65, -0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01, -0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d, -0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d, -0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00, -0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c, -0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07, -0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80, -0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80, -0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81, -0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00, -0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01, -0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01, -0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x15,0x02,0x81, -0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, -0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e, -0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07, -0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0, -0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00, -0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, -0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, -0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, -0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c, -0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, -0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, -0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, -0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x27,0x69,0x6e, -0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67, -0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d, -0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00, -0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21, -0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, -0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b, -0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00, -0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00, -0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, -0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73, -0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, -0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01, +0x80,0x46,0x00,0x80,0x01,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x03,0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00, +0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x12,0x62,0x69,0x6e, +0x64,0x5f,0x73,0x74,0x61,0x74,0x69,0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, +0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00, +0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00, +0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, +0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00, +0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00, +0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a, +0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1d, +0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95, +0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91, +0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e, +0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e, +0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0, +0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95, +0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0, +0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x27,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e, +0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e, +0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29, +0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00, +0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65, +0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09, +0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c, +0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08, +0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01, +0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21, +0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f, +0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f, +0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00, +0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00, +0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, +0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63, +0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, +0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01, 0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x21,0x00, -0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x80,0x95,0x01, +0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00, +0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01, 0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02, -0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, +0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, 0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03, -0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03, +0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03, 0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01, -0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02, -0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01, -0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a, -0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, -0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20, -0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69, -0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00, -0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00, -0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e, -0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c, -0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04, -0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00, -0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42, -0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80, -0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d, -0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, -0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06, -0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65, -0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07, -0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80, -0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80, -0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81, -0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00, -0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01, -0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01, -0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81, -0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, -0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e, -0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02, +0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00, +0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f, +0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20, +0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00, +0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65, +0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a, +0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00, +0x00,0x00,0x08, }; const char Type::TYPE_NAME[] = "Fixnum"; From 6d9bed2272518742bd9b39e359a359bcb37c3271 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Tue, 15 Apr 2014 21:23:54 +0900 Subject: [PATCH 046/103] Remove unneeded functions --- codegen/mrubybind.3.cc | 27 --------------------------- mrubybind.cc | 27 --------------------------- mrubybind.h | 8 -------- 3 files changed, 62 deletions(-) diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index 2fca6a7..04cd3d2 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -52,29 +52,6 @@ static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { return self; } -static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value self_v; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); -} - -static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); -} - MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } @@ -101,10 +78,6 @@ void MrubyBind::Initialize() { ARGS_REQ(2) | ARGS_REST()); mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, - ARGS_REQ(2) | ARGS_REST()); mrb_irep* irep = mrb_read_irep(mrb_, binder); if (irep != NULL) { mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); diff --git a/mrubybind.cc b/mrubybind.cc index d1fbfb0..e767607 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -134,29 +134,6 @@ static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { return self; } -static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value self_v; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); -} - -static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); -} - MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } @@ -183,10 +160,6 @@ void MrubyBind::Initialize() { ARGS_REQ(2) | ARGS_REST()); mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, - ARGS_REQ(2) | ARGS_REST()); mrb_irep* irep = mrb_read_irep(mrb_, binder); if (irep != NULL) { mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); diff --git a/mrubybind.h b/mrubybind.h index 2df2870..12ee809 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1260,14 +1260,6 @@ class MrubyBind { } template void bind2(const char* func_name, Func func_ptr) { - //mrb_value mod = mrb_obj_value(mod_); - //mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call2); - //mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - //mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - //mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - //mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, - // func_ptr_v, nparam_v); - mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer From b2d41a4e6bc07534bf633e781313d00d219bb4a2 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 06:27:18 +0900 Subject: [PATCH 047/103] Define instance method under class --- codegen/mrubybind.1.h | 1 + codegen/mrubybind.3.h | 5 ++++- mrubybind.h | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h index 38a7c3e..c2503ec 100644 --- a/codegen/mrubybind.1.h +++ b/codegen/mrubybind.1.h @@ -29,4 +29,5 @@ #include "mruby/class.h" #include "mruby/data.h" #include "mruby/proc.h" +#include "mruby/variable.h" //#include "mrubybind_types.h" diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index c3e0419..ad26cce 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -67,7 +67,10 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); - mrb_define_method_raw(mrb_, mod_, method_name_s, proc); + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } // Bind static method. diff --git a/mrubybind.h b/mrubybind.h index 12ee809..817c024 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -30,6 +30,7 @@ #include "mruby/class.h" #include "mruby/data.h" #include "mruby/proc.h" +#include "mruby/variable.h" //#include "mrubybind_types.h" #include "mruby/string.h" #include @@ -1296,7 +1297,10 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); - mrb_define_method_raw(mrb_, mod_, method_name_s, proc); + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } // Bind static method. From 3f290211a27830a1e5536977df9e7b8de5787a30 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 06:31:06 +0900 Subject: [PATCH 048/103] Define constructor function using cfunc_with_env --- codegen/binder.rb | 11 ---- codegen/gen_template.rb | 8 ++- codegen/mrubybind.3.cc | 15 ------ codegen/mrubybind.3.h | 15 +++--- mrubybind.cc | 117 +++++++++++++--------------------------- mrubybind.h | 103 +++++++++++++++++++++++++---------- 6 files changed, 127 insertions(+), 142 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 828edf0..81647cc 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,17 +2,6 @@ # and included into C code. module MrubyBind - def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) - mod.const_get(class_name).class_eval do - define_method(:initialize) do |*args| - if args.size != nparam - raise ArgumentError.new("'initialize': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *args) - end - end - end - def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) mod.const_get(class_name).class_eval do self.class.instance_eval do diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index a1ecf3f..2582eee 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -61,11 +61,15 @@ template struct ClassBinder { static const int NPARAM = %NPARAM%; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% - C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_voidp(cfunc); C* instance = ctor(%ARGS%); DATA_PTR(self) = instance; return self; diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index 04cd3d2..bfd9357 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -39,19 +39,6 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } -static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value self_v; - mrb_value new_func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); - return self; -} - MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } @@ -76,8 +63,6 @@ void MrubyBind::Initialize() { mod_mrubybind_ = mrb_obj_value(mrubybind); mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, ARGS_REQ(2) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, - ARGS_REQ(3) | ARGS_REST()); mrb_irep* irep = mrb_read_irep(mrb_, binder); if (irep != NULL) { mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index ad26cce..42ade50 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -45,13 +45,16 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, "initialize"); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)new_func_ptr), // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::ctor, 2, env); mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, - class_name_v, new_func_ptr_v, nparam_v); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } // Bind instance method. diff --git a/mrubybind.cc b/mrubybind.cc index e767607..83e3f24 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -11,74 +11,46 @@ namespace mrubybind { //#include "mrubybind.dat" #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xb9,0x95,0x00,0x00,0x04,0x33,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x04,0x15,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xec,0xad,0x00,0x00,0x02,0x7c,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x02,0x5e,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x00, -0x00,0x0a,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, -0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, -0x80,0x46,0x00,0x80,0x01,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x03,0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00, -0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x12,0x62,0x69,0x6e, -0x64,0x5f,0x73,0x74,0x61,0x74,0x69,0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, -0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00, -0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00, -0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, -0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00, -0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00, -0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65, -0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a, -0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1d, -0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x95, -0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91, -0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e, -0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e, -0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0, -0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95, -0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0, -0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x27,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e, -0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e, -0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29, -0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00, -0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65, -0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09, -0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c, -0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08, -0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01, -0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21, -0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f, -0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f, -0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00, -0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00, -0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, -0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63, -0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, -0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01, -0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x01,0x0a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00, -0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01, -0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02, -0x80,0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02, -0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03, -0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03, -0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01, -0x80,0x02,0x91,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02, -0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00, -0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f, -0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67, -0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20, -0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00, -0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65, -0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a, -0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00, -0x00,0x00,0x08, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x4f,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00, +0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69,0x63,0x5f, +0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69, +0x6e,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00, +0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, +0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74, +0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, +0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06, +0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00, +0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00,0x03, +0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01, +0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19, +0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15, +0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01, +0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e, +0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e, +0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15, +0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38, +0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27, +0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62, +0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20, +0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00, +0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72, +0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45, +0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75, +0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66, +0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, }; const char Type::TYPE_NAME[] = "Fixnum"; @@ -121,19 +93,6 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } -static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value self_v; - mrb_value new_func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); - return self; -} - MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } @@ -158,8 +117,6 @@ void MrubyBind::Initialize() { mod_mrubybind_ = mrb_obj_value(mrubybind); mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, ARGS_REQ(2) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, - ARGS_REQ(3) | ARGS_REST()); mrb_irep* irep = mrb_read_irep(mrb_, binder); if (irep != NULL) { mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); diff --git a/mrubybind.h b/mrubybind.h index 817c024..6243718 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -225,11 +225,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); - C* (*ctor)(void) = (C* (*)(void))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(void) = (C* (*)(void))mrb_voidp(cfunc); C* instance = ctor(); DATA_PTR(self) = instance; return self; @@ -320,11 +324,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); - C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0) = (C* (*)(P0))mrb_voidp(cfunc); C* instance = ctor(ARG(0)); DATA_PTR(self) = instance; return self; @@ -415,11 +423,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1)); DATA_PTR(self) = instance; return self; @@ -510,11 +522,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_PTR(self) = instance; return self; @@ -605,11 +621,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_PTR(self) = instance; return self; @@ -700,11 +720,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_PTR(self) = instance; return self; @@ -795,11 +819,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_PTR(self) = instance; return self; @@ -890,11 +918,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); DATA_PTR(self) = instance; return self; @@ -985,11 +1017,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); DATA_PTR(self) = instance; return self; @@ -1080,11 +1116,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); DATA_PTR(self) = instance; return self; @@ -1175,11 +1215,15 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; + mrb_value* args; + int narg; + mrb_get_args(mrb, "*", &args, &narg); CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); DATA_PTR(self) = instance; return self; @@ -1275,13 +1319,16 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, "initialize"); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)new_func_ptr), // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::ctor, 2, env); mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, - class_name_v, new_func_ptr_v, nparam_v); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } // Bind instance method. From 4c16a630eda40e818a70c51d98d5e1e757224719 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 06:46:23 +0900 Subject: [PATCH 049/103] Factor out defining constructor and instance method --- codegen/mrubybind.3.cc | 16 ++++++++++++++++ codegen/mrubybind.3.h | 30 ++++++++++-------------------- mrubybind.cc | 16 ++++++++++++++++ mrubybind.h | 30 ++++++++++-------------------- 4 files changed, 52 insertions(+), 40 deletions(-) diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index bfd9357..6a6b31a 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -70,4 +70,20 @@ void MrubyBind::Initialize() { } } +void MrubyBind::BindInstanceMethod( + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)) { + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); +} + } // namespace mrubybind diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 42ade50..c04c295 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -45,35 +45,20 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, "initialize"); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)new_func_ptr), // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::ctor, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); + BindInstanceMethod(class_name, "initialize", + mrb_cptr_value(mrb_, (void*)new_func_ptr), + ClassBinder::ctor); } // Bind instance method. template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_value env[] = { - method_pptr_v, // 0: instance method pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); + BindInstanceMethod(class_name, method_name, + method_pptr_v, ClassBinder::call); } // Bind static method. @@ -93,6 +78,11 @@ class MrubyBind { private: void Initialize(); + // Utility for binding instance method. + void BindInstanceMethod(const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + mrb_state* mrb_; mrb_value mod_mrubybind_; RClass* mod_; diff --git a/mrubybind.cc b/mrubybind.cc index 83e3f24..2b33d2e 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -124,4 +124,20 @@ void MrubyBind::Initialize() { } } +void MrubyBind::BindInstanceMethod( + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)) { + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); +} + } // namespace mrubybind diff --git a/mrubybind.h b/mrubybind.h index 6243718..6d897c9 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1319,35 +1319,20 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, "initialize"); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)new_func_ptr), // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::ctor, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); + BindInstanceMethod(class_name, "initialize", + mrb_cptr_value(mrb_, (void*)new_func_ptr), + ClassBinder::ctor); } // Bind instance method. template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_value env[] = { - method_pptr_v, // 0: instance method pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, ClassBinder::call, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); + BindInstanceMethod(class_name, method_name, + method_pptr_v, ClassBinder::call); } // Bind static method. @@ -1367,6 +1352,11 @@ class MrubyBind { private: void Initialize(); + // Utility for binding instance method. + void BindInstanceMethod(const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + mrb_state* mrb_; mrb_value mod_mrubybind_; RClass* mod_; From de6f13c3eed775e5a28c094e32f52dfe7b396742 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 08:30:19 +0900 Subject: [PATCH 050/103] Bind static method using cfunc_with_env --- codegen/binder.rb | 12 --------- codegen/mrubybind.3.cc | 9 +++++++ codegen/mrubybind.3.h | 16 +++++++----- codegen/mrubybind_types.1.h | 3 +++ mrubybind.cc | 51 ++++++++++--------------------------- mrubybind.h | 19 +++++++++----- 6 files changed, 47 insertions(+), 63 deletions(-) diff --git a/codegen/binder.rb b/codegen/binder.rb index 81647cc..f94f172 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -2,16 +2,4 @@ # and included into C code. module MrubyBind - def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) - mod.const_get(class_name).class_eval do - self.class.instance_eval do - define_method(method_name) do |*args| - if args.size != nparam - raise ArgumentError.new("'#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, method_ptr, *args) - end - end - end - end end diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index 6a6b31a..f95e390 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -39,6 +39,15 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } + +void +mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) +{ + mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. + mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); +} + + MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index c04c295..82aee32 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -66,13 +66,15 @@ class MrubyBind { void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, - mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } private: diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index e835396..b3d73a2 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -133,5 +133,8 @@ mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); +void +mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + // Includes generated template specialization. //#include "mrubybind.inc" diff --git a/mrubybind.cc b/mrubybind.cc index 2b33d2e..b164d0c 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -11,46 +11,14 @@ namespace mrubybind { //#include "mrubybind.dat" #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xec,0xad,0x00,0x00,0x02,0x7c,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x02,0x5e,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x15,0x99,0x00,0x00,0x00,0x7a,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0x5c,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x4f,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00, -0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, -0x00,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69,0x63,0x5f, -0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69, -0x6e,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00, -0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00, -0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74, -0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00, -0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06, -0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00, -0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00,0x03, -0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01, -0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19, -0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01,0x15, -0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01, -0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e, -0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e, -0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81,0x15, -0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38, -0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27, -0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62, -0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20, -0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00, -0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72, -0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45, -0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75, -0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66, -0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, }; const char Type::TYPE_NAME[] = "Fixnum"; @@ -93,6 +61,15 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } + +void +mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) +{ + mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. + mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); +} + + MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); } diff --git a/mrubybind.h b/mrubybind.h index 6d897c9..f60f8e3 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -167,6 +167,9 @@ mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); +void +mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + // Includes generated template specialization. //#include "mrubybind.inc" // Following code is generated from gen_template.rb @@ -1340,13 +1343,15 @@ class MrubyBind { void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, - mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + struct RClass* klass = mrb_class_ptr(klass_v); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } private: From ca4279640b4c90ad57ff6eb4937d3cd31cdbaf7b Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 08:38:47 +0900 Subject: [PATCH 051/103] Factor out GetClass method --- codegen/gen_template.rb | 16 +-- codegen/mrubybind.3.cc | 12 ++- codegen/mrubybind.3.h | 29 ++--- codegen/mrubybind_types.1.h | 3 - mrubybind.cc | 12 ++- mrubybind.h | 208 ++++++------------------------------ 6 files changed, 62 insertions(+), 218 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 2582eee..3e274b3 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -17,13 +17,7 @@ template<%CLASSES0%> struct Binder { static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - %ASSERTS% - void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))func_ptr; - fp(%ARGS%); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -39,13 +33,7 @@ template struct Binder { static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - %ASSERTS% - R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))func_ptr; - R result = fp(%ARGS%); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index f95e390..768e515 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -41,7 +41,7 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { void -mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) +MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) { mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); @@ -79,6 +79,12 @@ void MrubyBind::Initialize() { } } +struct RClass* MrubyBind::GetClass(const char* class_name) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + return mrb_class_ptr(klass_v); +} + void MrubyBind::BindInstanceMethod( const char* class_name, const char* method_name, mrb_value original_func_v, @@ -89,9 +95,7 @@ void MrubyBind::BindInstanceMethod( mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); + struct RClass* klass = GetClass(class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 82aee32..9029b6b 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -18,25 +18,12 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { - /* - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, - func_ptr_v, nparam_v); - */ - bind2(func_name, func_ptr); - } - template - void bind2(const char* func_name, Func func_ptr) { mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer mrb_symbol_value(func_name_s), // 1: function name }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); mrb_define_method_raw(mrb_, mod_, func_name_s, proc); } @@ -65,26 +52,32 @@ class MrubyBind { template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer mrb_symbol_value(method_name_s), // 1: method name }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + struct RClass* klass = GetClass(class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } private: void Initialize(); + // Returns mruby class under a module. + struct RClass* GetClass(const char* class_name); + // Utility for binding instance method. void BindInstanceMethod(const char* class_name, const char* method_name, mrb_value original_func_v, mrb_value (*binder_func)(mrb_state*, mrb_value)); + // Mimic mruby API. + // TODO: Send pull request to the official mruby repository. + void + mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + mrb_state* mrb_; mrb_value mod_mrubybind_; RClass* mod_; diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index b3d73a2..e835396 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -133,8 +133,5 @@ mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); -void -mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); - // Includes generated template specialization. //#include "mrubybind.inc" diff --git a/mrubybind.cc b/mrubybind.cc index b164d0c..e7455a5 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -63,7 +63,7 @@ static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { void -mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) +MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) { mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); @@ -101,6 +101,12 @@ void MrubyBind::Initialize() { } } +struct RClass* MrubyBind::GetClass(const char* class_name) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + return mrb_class_ptr(klass_v); +} + void MrubyBind::BindInstanceMethod( const char* class_name, const char* method_name, mrb_value original_func_v, @@ -111,9 +117,7 @@ void MrubyBind::BindInstanceMethod( mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); + struct RClass* klass = GetClass(class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } diff --git a/mrubybind.h b/mrubybind.h index f60f8e3..9ce3cf2 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -167,9 +167,6 @@ mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); -void -mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); - // Includes generated template specialization. //#include "mrubybind.inc" // Following code is generated from gen_template.rb @@ -184,13 +181,7 @@ mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struc template<> struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); - void (*fp)(void) = (void (*)(void))func_ptr; - fp(); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -206,13 +197,7 @@ struct Binder { template struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); - R (*fp)(void) = (R (*)(void))func_ptr; - R result = fp(); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -283,13 +268,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); - void (*fp)(P0) = (void (*)(P0))func_ptr; - fp(ARG(0)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -305,13 +284,7 @@ struct Binder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); - R (*fp)(P0) = (R (*)(P0))func_ptr; - R result = fp(ARG(0)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -382,13 +355,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); - void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; - fp(ARG(0), ARG(1)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -404,13 +371,7 @@ struct Binder { template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); - R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; - R result = fp(ARG(0), ARG(1)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -481,13 +442,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; - fp(ARG(0), ARG(1), ARG(2)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -503,13 +458,7 @@ struct Binder { template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -580,13 +529,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -602,13 +545,7 @@ struct Binder { template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -679,13 +616,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -701,13 +632,7 @@ struct Binder { template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -778,13 +703,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -800,13 +719,7 @@ struct Binder { template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -877,13 +790,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -899,13 +806,7 @@ struct Binder { template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -976,13 +877,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -998,13 +893,7 @@ struct Binder { template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -1075,13 +964,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -1097,13 +980,7 @@ struct Binder { template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -1174,13 +1051,7 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return mrb_nil_value(); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -1196,13 +1067,7 @@ struct Binder { template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); - return Type::ret(mrb, result); - } - static mrb_value call2(mrb_state* mrb, mrb_value /*self*/) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); @@ -1295,25 +1160,12 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { - /* - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, - func_ptr_v, nparam_v); - */ - bind2(func_name, func_ptr); - } - template - void bind2(const char* func_name, Func func_ptr) { mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer mrb_symbol_value(func_name_s), // 1: function name }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); mrb_define_method_raw(mrb_, mod_, func_name_s, proc); } @@ -1342,26 +1194,32 @@ class MrubyBind { template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - struct RClass* klass = mrb_class_ptr(klass_v); mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer mrb_symbol_value(method_name_s), // 1: method name }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call2, 2, env); + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + struct RClass* klass = GetClass(class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } private: void Initialize(); + // Returns mruby class under a module. + struct RClass* GetClass(const char* class_name); + // Utility for binding instance method. void BindInstanceMethod(const char* class_name, const char* method_name, mrb_value original_func_v, mrb_value (*binder_func)(mrb_state*, mrb_value)); + // Mimic mruby API. + // TODO: Send pull request to the official mruby repository. + void + mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + mrb_state* mrb_; mrb_value mod_mrubybind_; RClass* mod_; From f6171996d29f0b39bd13bb106104cd70cc1dd8ab Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 08:49:44 +0900 Subject: [PATCH 052/103] Rename argument check macros --- codegen/gen_template.rb | 11 ++-- codegen/mrubybind.3.cc | 2 +- codegen/mrubybind_types.1.h | 2 +- mrubybind.cc | 2 +- mrubybind.h | 117 ++++++++++++++++++------------------ 5 files changed, 66 insertions(+), 68 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 3e274b3..fdb0a1c 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -6,9 +6,8 @@ \#define ARG(i) Type::get(args[i]) \#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) - -\#define CHECK2(narg) {if(narg != NPARAM) RAISE2(narg);} -\#define RAISE2(narg) raise2(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) +\#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} +\#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) EOD @@ -115,12 +114,12 @@ def embed_template(str, nparam) params = 'void' args = '' classes = '' - asserts = '(void)(mrb);(void)(args);(void)(narg);' # Surppress warning. + asserts = '(void)(mrb);(void)(args);' # Surppress warning. else params = (0...nparam).map {|i| "P#{i}"}.join(', ') args = (0...nparam).map {|i| "ARG(#{i})"}.join(', ') classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') - asserts = (0...nparam).map {|i| "(void)(narg); CHECK(#{i});"}.join(' ') + asserts = (0...nparam).map {|i| "CHECK(#{i});"}.join(' ') end table = { @@ -129,7 +128,7 @@ def embed_template(str, nparam) '%ARGS%' => args, '%CLASSES0%' => classes, '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, - '%ASSERTS%' => 'CHECK2(narg); ' + asserts + '%ASSERTS%' => 'CHECKNARG(narg); ' + asserts } return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc index 768e515..1ab274b 100644 --- a/codegen/mrubybind.3.cc +++ b/codegen/mrubybind.3.cc @@ -20,7 +20,7 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } -mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", func_name, mrb_fixnum_value(narg), diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index e835396..ae9ea77 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -131,7 +131,7 @@ mrb_data_type ClassBinder::type_info = { "???", dtor }; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); -mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" diff --git a/mrubybind.cc b/mrubybind.cc index e7455a5..4c4d42a 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -42,7 +42,7 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } -mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", func_name, mrb_fixnum_value(narg), diff --git a/mrubybind.h b/mrubybind.h index 9ce3cf2..e2cfb94 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -165,7 +165,7 @@ mrb_data_type ClassBinder::type_info = { "???", dtor }; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); -mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" @@ -173,9 +173,8 @@ mrb_value raise2(mrb_state *mrb, mrb_value func_name, int narg, int nparam); #define ARG(i) Type::get(args[i]) #define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) - -#define CHECK2(narg) {if(narg != NPARAM) RAISE2(narg);} -#define RAISE2(narg) raise2(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) +#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} +#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) // void f(void); template<> @@ -185,7 +184,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); + CHECKNARG(narg); (void)(mrb);(void)(args); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(void) = (void (*)(void))mrb_voidp(cfunc); fp(); @@ -201,7 +200,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); + CHECKNARG(narg); (void)(mrb);(void)(args); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(void) = (R (*)(void))mrb_voidp(cfunc); R result = fp(); @@ -219,7 +218,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); + CHECKNARG(narg); (void)(mrb);(void)(args); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(void) = (C* (*)(void))mrb_voidp(cfunc); C* instance = ctor(); @@ -236,7 +235,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); + CHECKNARG(narg); (void)(mrb);(void)(args); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(void); @@ -254,7 +253,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(mrb);(void)(args);(void)(narg); + CHECKNARG(narg); (void)(mrb);(void)(args); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(void); @@ -272,7 +271,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); + CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0) = (void (*)(P0))mrb_voidp(cfunc); fp(ARG(0)); @@ -288,7 +287,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); + CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0) = (R (*)(P0))mrb_voidp(cfunc); R result = fp(ARG(0)); @@ -306,7 +305,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); + CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0) = (C* (*)(P0))mrb_voidp(cfunc); C* instance = ctor(ARG(0)); @@ -323,7 +322,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); + CHECKNARG(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0); @@ -341,7 +340,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); + CHECKNARG(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0); @@ -359,7 +358,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_voidp(cfunc); fp(ARG(0), ARG(1)); @@ -375,7 +374,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1)); @@ -393,7 +392,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1)); @@ -410,7 +409,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECKNARG(narg); CHECK(0); CHECK(1); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1); @@ -428,7 +427,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); + CHECKNARG(narg); CHECK(0); CHECK(1); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1); @@ -446,7 +445,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2)); @@ -462,7 +461,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2)); @@ -480,7 +479,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2)); @@ -497,7 +496,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2); @@ -515,7 +514,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2); @@ -533,7 +532,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -549,7 +548,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -567,7 +566,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); @@ -584,7 +583,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3); @@ -602,7 +601,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3); @@ -620,7 +619,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -636,7 +635,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -654,7 +653,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); @@ -671,7 +670,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4); @@ -689,7 +688,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4); @@ -707,7 +706,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -723,7 +722,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -741,7 +740,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); @@ -758,7 +757,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); @@ -776,7 +775,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); @@ -794,7 +793,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -810,7 +809,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -828,7 +827,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); @@ -845,7 +844,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); @@ -863,7 +862,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); @@ -881,7 +880,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -897,7 +896,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -915,7 +914,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); @@ -932,7 +931,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); @@ -950,7 +949,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); @@ -968,7 +967,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -984,7 +983,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -1002,7 +1001,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); @@ -1019,7 +1018,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); @@ -1037,7 +1036,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); @@ -1055,7 +1054,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -1071,7 +1070,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -1089,7 +1088,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); @@ -1106,7 +1105,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); @@ -1124,7 +1123,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECK2(narg); (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); From 0f89749ddd87c528fc95e529738682b2f5b4c1d8 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:03:44 +0900 Subject: [PATCH 053/103] Remove binder.rb --- codegen/Makefile | 8 +--- codegen/binder.rb | 5 -- codegen/mrubybind.1.cc | 10 ---- codegen/mrubybind.3.cc | 102 ----------------------------------------- codegen/mrubybind.3.h | 1 - mrubybind.cc | 40 ---------------- mrubybind.h | 1 - 7 files changed, 1 insertion(+), 166 deletions(-) delete mode 100644 codegen/binder.rb delete mode 100644 codegen/mrubybind.1.cc delete mode 100644 codegen/mrubybind.3.cc diff --git a/codegen/Makefile b/codegen/Makefile index 88489da..d606198 100644 --- a/codegen/Makefile +++ b/codegen/Makefile @@ -1,17 +1,11 @@ -TARGET= ../mrubybind.cc ../mrubybind.h +TARGET= ../mrubybind.h all: $(TARGET) clean: rm -rf $(TARGET) -../mrubybind.cc: mrubybind.1.cc mrubybind.3.cc binder.rb - ${MRUBY}/bin/mrbc -Bbinder binder.rb - (echo "// Do not modify this file directly, this is generated" && \ - cat mrubybind.1.cc binder.c mrubybind.3.cc) > $@ - rm binder.c - ../mrubybind.h: mrubybind.1.h mrubybind.3.h mrubybind_types.1.h mrubybind_types.3.h gen_template.rb (echo "// Do not modify this file directly, this is generated" && \ cat mrubybind.1.h mrubybind_types.1.h && \ diff --git a/codegen/binder.rb b/codegen/binder.rb deleted file mode 100644 index f94f172..0000000 --- a/codegen/binder.rb +++ /dev/null @@ -1,5 +0,0 @@ -# This code is compiled by mrbc, -# and included into C code. - -module MrubyBind -end diff --git a/codegen/mrubybind.1.cc b/codegen/mrubybind.1.cc deleted file mode 100644 index fad57f5..0000000 --- a/codegen/mrubybind.1.cc +++ /dev/null @@ -1,10 +0,0 @@ -#include "mrubybind.h" -#include "mruby/compile.h" -#include "mruby/dump.h" -#include "mruby/proc.h" -#include "mruby/string.h" -#include "mruby/variable.h" - -namespace mrubybind { - -//#include "mrubybind.dat" diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc deleted file mode 100644 index 1ab274b..0000000 --- a/codegen/mrubybind.3.cc +++ /dev/null @@ -1,102 +0,0 @@ - -const char Type::TYPE_NAME[] = "Fixnum"; -const char Type::TYPE_NAME[] = "Fixnum"; -const char Type::TYPE_NAME[] = "Float"; -const char Type::TYPE_NAME[] = "Float"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "Bool"; -const char Type::TYPE_NAME[] = "Voidp"; - -mrb_value raise(mrb_state *mrb, int parameter_index, - const char* required_type_name, mrb_value value) { - const char * argument_class_name = mrb_obj_classname(mrb, value); - mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S, argument %S(%S)", - mrb_str_new_cstr(mrb, argument_class_name), - mrb_str_new_cstr(mrb, required_type_name), - mrb_fixnum_value(parameter_index + 1), value); - return mrb_nil_value(); -} - -mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", - func_name, - mrb_fixnum_value(narg), - mrb_fixnum_value(nparam)); - return mrb_nil_value(); -} - -static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); -} - - -void -MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) -{ - mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. - mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); -} - - -MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { - Initialize(); -} - -MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { - Initialize(); -} - -MrubyBind::~MrubyBind() { - mrb_gc_arena_restore(mrb_, arena_index_); -} - -void MrubyBind::Initialize() { - arena_index_ = mrb_gc_arena_save(mrb_); - mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); - if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind)) { - mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind); - } else { - RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); - mod_mrubybind_ = mrb_obj_value(mrubybind); - mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, - ARGS_REQ(2) | ARGS_REST()); - mrb_irep* irep = mrb_read_irep(mrb_, binder); - if (irep != NULL) { - mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); - } - } -} - -struct RClass* MrubyBind::GetClass(const char* class_name) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - return mrb_class_ptr(klass_v); -} - -void MrubyBind::BindInstanceMethod( - const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)) { - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - original_func_v, // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - struct RClass* klass = GetClass(class_name); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); -} - -} // namespace mrubybind diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 9029b6b..f687ab8 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -79,7 +79,6 @@ class MrubyBind { mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); mrb_state* mrb_; - mrb_value mod_mrubybind_; RClass* mod_; int arena_index_; }; diff --git a/mrubybind.cc b/mrubybind.cc index 4c4d42a..6474967 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -1,4 +1,3 @@ -// Do not modify this file directly, this is generated #include "mrubybind.h" #include "mruby/compile.h" #include "mruby/dump.h" @@ -8,19 +7,6 @@ namespace mrubybind { -//#include "mrubybind.dat" -#include -const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x15,0x99,0x00,0x00,0x00,0x7a,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0x5c,0x30,0x30, -0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, -0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, -}; - const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Float"; @@ -50,17 +36,6 @@ mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { return mrb_nil_value(); } -static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); -} - void MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) @@ -84,21 +59,6 @@ MrubyBind::~MrubyBind() { void MrubyBind::Initialize() { arena_index_ = mrb_gc_arena_save(mrb_); - mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); - if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind)) { - mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind); - } else { - RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); - mod_mrubybind_ = mrb_obj_value(mrubybind); - mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, - ARGS_REQ(2) | ARGS_REST()); - mrb_irep* irep = mrb_read_irep(mrb_, binder); - if (irep != NULL) { - mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); - } - } } struct RClass* MrubyBind::GetClass(const char* class_name) { diff --git a/mrubybind.h b/mrubybind.h index e2cfb94..d7115be 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1220,7 +1220,6 @@ class MrubyBind { mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); mrb_state* mrb_; - mrb_value mod_mrubybind_; RClass* mod_; int arena_index_; }; From 7663107a126b25ae8250ea6903c77a7190b8b219 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:12:53 +0900 Subject: [PATCH 054/103] Make able to define function under module --- codegen/mrubybind.3.h | 5 ++++- mrubybind.h | 5 ++++- test/test.sh | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index f687ab8..c3f0ab3 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -24,7 +24,10 @@ class MrubyBind { mrb_symbol_value(func_name_s), // 1: function name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + if (mod_ == mrb_->kernel_module) + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + else + mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); } // Bind class. diff --git a/mrubybind.h b/mrubybind.h index d7115be..55d029b 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1165,7 +1165,10 @@ class MrubyBind { mrb_symbol_value(func_name_s), // 1: function name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + if (mod_ == mrb_->kernel_module) + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + else + mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); } // Bind class. diff --git a/test/test.sh b/test/test.sh index 38e4f3f..3b0f0f9 100755 --- a/test/test.sh +++ b/test/test.sh @@ -45,7 +45,7 @@ run class 'Foo::ctor(123) 690 99980001 Foo::dtor()' -#run module 'modfunc called: 1234' +run module 'modfunc called: 1234' # Failure cases fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" From 4c69a585299103350f35acd36c8b5f9859c78da7 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:20:49 +0900 Subject: [PATCH 055/103] Remove warning supressing code --- .gitignore | 1 + codegen/gen_template.rb | 6 +++--- mrubybind.h | 10 +++++----- test/Makefile | 3 +++ test/test.sh | 1 + test/void.cc | 26 ++++++++++++++++++++++++++ 6 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 test/void.cc diff --git a/.gitignore b/.gitignore index cf5086c..ade8c1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.o +/test/void /test/int /test/float /test/string diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index fdb0a1c..e8a6ea2 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -114,12 +114,12 @@ def embed_template(str, nparam) params = 'void' args = '' classes = '' - asserts = '(void)(mrb);(void)(args);' # Surppress warning. + asserts = '' else params = (0...nparam).map {|i| "P#{i}"}.join(', ') args = (0...nparam).map {|i| "ARG(#{i})"}.join(', ') classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') - asserts = (0...nparam).map {|i| "CHECK(#{i});"}.join(' ') + asserts = (0...nparam).map {|i| " CHECK(#{i});"}.join('') end table = { @@ -128,7 +128,7 @@ def embed_template(str, nparam) '%ARGS%' => args, '%CLASSES0%' => classes, '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, - '%ASSERTS%' => 'CHECKNARG(narg); ' + asserts + '%ASSERTS%' => 'CHECKNARG(narg);' + asserts } return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} diff --git a/mrubybind.h b/mrubybind.h index 55d029b..ea73ea5 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -184,7 +184,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); (void)(mrb);(void)(args); + CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(void) = (void (*)(void))mrb_voidp(cfunc); fp(); @@ -200,7 +200,7 @@ struct Binder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); (void)(mrb);(void)(args); + CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(void) = (R (*)(void))mrb_voidp(cfunc); R result = fp(); @@ -218,7 +218,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); (void)(mrb);(void)(args); + CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(void) = (C* (*)(void))mrb_voidp(cfunc); C* instance = ctor(); @@ -235,7 +235,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); (void)(mrb);(void)(args); + CHECKNARG(narg); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(void); @@ -253,7 +253,7 @@ struct ClassBinder { mrb_value* args; int narg; mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); (void)(mrb);(void)(args); + CHECKNARG(narg); C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(void); diff --git a/test/Makefile b/test/Makefile index 17ec00e..0d53868 100644 --- a/test/Makefile +++ b/test/Makefile @@ -24,6 +24,9 @@ test: $(EXES) mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -c -o $@ $(INC) $(CXXFLAGS) $< +void: void.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + int: int.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) diff --git a/test/test.sh b/test/test.sh index 3b0f0f9..5aeeffe 100755 --- a/test/test.sh +++ b/test/test.sh @@ -38,6 +38,7 @@ function fail() { ################################################################ # Test cases. +run void 'dummy called' run int '1234321' run float '408.0' run string '* Hello, mruby! *' diff --git a/test/void.cc b/test/void.cc new file mode 100644 index 0000000..3c924e3 --- /dev/null +++ b/test/void.cc @@ -0,0 +1,26 @@ +#include +#include +#include "mrubybind.h" + +void dummy() { + printf("dummy called\n"); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("dummy", dummy); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, "dummy()"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return 0; +} From 3a3935eded64f8ac7af678dee2cecb3d7cfa18fe Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:26:33 +0900 Subject: [PATCH 056/103] Use new mruby API (cptr, instead of voidp) --- codegen/gen_template.rb | 6 ++-- codegen/mrubybind_types.1.h | 6 ++-- mrubybind.h | 72 ++++++++++++++++++------------------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index e8a6ea2..221ed6b 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -22,7 +22,7 @@ mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_voidp(cfunc); + void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_cptr(cfunc); fp(%ARGS%); return mrb_nil_value(); } @@ -38,7 +38,7 @@ mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_voidp(cfunc); + R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_cptr(cfunc); R result = fp(%ARGS%); return Type::ret(mrb, result); } @@ -56,7 +56,7 @@ mrb_get_args(mrb, "*", &args, &narg); %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_voidp(cfunc); + C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_cptr(cfunc); C* instance = ctor(%ARGS%); DATA_PTR(self) = instance; return self; diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index ae9ea77..bf93ecb 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -97,9 +97,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_voidp_p(v); } - static void* get(mrb_value v) { return mrb_voidp(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } + static int check(mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_value v) { return mrb_cptr(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } }; //=========================================================================== diff --git a/mrubybind.h b/mrubybind.h index ea73ea5..e488a9e 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -131,9 +131,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_voidp_p(v); } - static void* get(mrb_value v) { return mrb_voidp(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } + static int check(mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_value v) { return mrb_cptr(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } }; //=========================================================================== @@ -186,7 +186,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(void) = (void (*)(void))mrb_voidp(cfunc); + void (*fp)(void) = (void (*)(void))mrb_cptr(cfunc); fp(); return mrb_nil_value(); } @@ -202,7 +202,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(void) = (R (*)(void))mrb_voidp(cfunc); + R (*fp)(void) = (R (*)(void))mrb_cptr(cfunc); R result = fp(); return Type::ret(mrb, result); } @@ -220,7 +220,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(void) = (C* (*)(void))mrb_voidp(cfunc); + C* (*ctor)(void) = (C* (*)(void))mrb_cptr(cfunc); C* instance = ctor(); DATA_PTR(self) = instance; return self; @@ -273,7 +273,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0) = (void (*)(P0))mrb_voidp(cfunc); + void (*fp)(P0) = (void (*)(P0))mrb_cptr(cfunc); fp(ARG(0)); return mrb_nil_value(); } @@ -289,7 +289,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0) = (R (*)(P0))mrb_voidp(cfunc); + R (*fp)(P0) = (R (*)(P0))mrb_cptr(cfunc); R result = fp(ARG(0)); return Type::ret(mrb, result); } @@ -307,7 +307,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0) = (C* (*)(P0))mrb_voidp(cfunc); + C* (*ctor)(P0) = (C* (*)(P0))mrb_cptr(cfunc); C* instance = ctor(ARG(0)); DATA_PTR(self) = instance; return self; @@ -360,7 +360,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_voidp(cfunc); + void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_cptr(cfunc); fp(ARG(0), ARG(1)); return mrb_nil_value(); } @@ -376,7 +376,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_voidp(cfunc); + R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1)); return Type::ret(mrb, result); } @@ -394,7 +394,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_voidp(cfunc); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1)); DATA_PTR(self) = instance; return self; @@ -447,7 +447,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2)); return mrb_nil_value(); } @@ -463,7 +463,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2)); return Type::ret(mrb, result); } @@ -481,7 +481,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2)); DATA_PTR(self) = instance; return self; @@ -534,7 +534,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3)); return mrb_nil_value(); } @@ -550,7 +550,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); return Type::ret(mrb, result); } @@ -568,7 +568,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); DATA_PTR(self) = instance; return self; @@ -621,7 +621,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return mrb_nil_value(); } @@ -637,7 +637,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); return Type::ret(mrb, result); } @@ -655,7 +655,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); DATA_PTR(self) = instance; return self; @@ -708,7 +708,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return mrb_nil_value(); } @@ -724,7 +724,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); return Type::ret(mrb, result); } @@ -742,7 +742,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); DATA_PTR(self) = instance; return self; @@ -795,7 +795,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return mrb_nil_value(); } @@ -811,7 +811,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); return Type::ret(mrb, result); } @@ -829,7 +829,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); DATA_PTR(self) = instance; return self; @@ -882,7 +882,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return mrb_nil_value(); } @@ -898,7 +898,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); return Type::ret(mrb, result); } @@ -916,7 +916,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); DATA_PTR(self) = instance; return self; @@ -969,7 +969,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return mrb_nil_value(); } @@ -985,7 +985,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); return Type::ret(mrb, result); } @@ -1003,7 +1003,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); DATA_PTR(self) = instance; return self; @@ -1056,7 +1056,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return mrb_nil_value(); } @@ -1072,7 +1072,7 @@ struct Binder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); return Type::ret(mrb, result); } @@ -1090,7 +1090,7 @@ struct ClassBinder { mrb_get_args(mrb, "*", &args, &narg); CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_voidp(cfunc); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); DATA_PTR(self) = instance; return self; From f7f61576fbba69b2d7d23952d563072a3fa116ac Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:40:24 +0900 Subject: [PATCH 057/103] Confirm arena is not increased #5 --- test/class.cc | 6 +++++- test/float.cc | 6 +++++- test/int.cc | 6 +++++- test/module.cc | 9 +++++++-- test/string.cc | 6 +++++- test/void.cc | 6 +++++- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/test/class.cc b/test/class.cc index 3ad18e2..00d1a12 100644 --- a/test/class.cc +++ b/test/class.cc @@ -39,6 +39,10 @@ int main() { b.bind_instance_method("Foo", "bar", &Foo::bar); b.bind_static_method("Foo", "baz", &Foo::baz); } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, @@ -53,5 +57,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } diff --git a/test/float.cc b/test/float.cc index 3273bbd..a81380e 100644 --- a/test/float.cc +++ b/test/float.cc @@ -13,6 +13,10 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("mul", mul); } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts mul(12.0, 34.0)"); @@ -22,5 +26,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } diff --git a/test/int.cc b/test/int.cc index afbdede..7ea050e 100644 --- a/test/int.cc +++ b/test/int.cc @@ -13,6 +13,10 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("square", square); } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts square(1111)"); @@ -22,5 +26,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } diff --git a/test/module.cc b/test/module.cc index 6e7ed51..07405ae 100644 --- a/test/module.cc +++ b/test/module.cc @@ -11,12 +11,17 @@ void modfunc(int v) { int main() { mrb_state* mrb = mrb_open(); + RClass* mod = mrb_define_module(mrb, "Mod"); + int arena = mrb_gc_arena_save(mrb); { - RClass* mod = mrb_define_module(mrb, "Mod"); mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); b.bind_const("FOO_VALUE", 1234); } + if (mrb->arena_idx != arena) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)"); @@ -26,5 +31,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } diff --git a/test/string.cc b/test/string.cc index 46fa2fe..e207777 100644 --- a/test/string.cc +++ b/test/string.cc @@ -16,6 +16,10 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("emphasize", emphasize); } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts emphasize('Hello, mruby!')"); @@ -25,5 +29,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } diff --git a/test/void.cc b/test/void.cc index 3c924e3..e89f332 100644 --- a/test/void.cc +++ b/test/void.cc @@ -13,6 +13,10 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("dummy", dummy); } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "dummy()"); @@ -22,5 +26,5 @@ int main() { } mrb_close(mrb); - return 0; + return result_code; } From 61633b87cb405186b3548921083dd32af7dea1eb Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 09:42:37 +0900 Subject: [PATCH 058/103] Return immediately when exception occurred --- test/class.cc | 6 ++---- test/float.cc | 5 ++--- test/int.cc | 5 ++--- test/module.cc | 5 ++--- test/string.cc | 5 ++--- test/void.cc | 5 ++--- 6 files changed, 12 insertions(+), 19 deletions(-) diff --git a/test/class.cc b/test/class.cc index 00d1a12..c6c1c45 100644 --- a/test/class.cc +++ b/test/class.cc @@ -44,18 +44,16 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "foo = Foo.new(123)\n" "p foo.bar(567)\n" "p Foo.baz(9999)" ); - if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } diff --git a/test/float.cc b/test/float.cc index a81380e..d5ba98e 100644 --- a/test/float.cc +++ b/test/float.cc @@ -18,13 +18,12 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts mul(12.0, 34.0)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } diff --git a/test/int.cc b/test/int.cc index 7ea050e..3d334ec 100644 --- a/test/int.cc +++ b/test/int.cc @@ -18,13 +18,12 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts square(1111)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } diff --git a/test/module.cc b/test/module.cc index 07405ae..6aced76 100644 --- a/test/module.cc +++ b/test/module.cc @@ -23,13 +23,12 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } diff --git a/test/string.cc b/test/string.cc index e207777..9599937 100644 --- a/test/string.cc +++ b/test/string.cc @@ -21,13 +21,12 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "puts emphasize('Hello, mruby!')"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } diff --git a/test/void.cc b/test/void.cc index e89f332..fd3f0c2 100644 --- a/test/void.cc +++ b/test/void.cc @@ -18,13 +18,12 @@ int main() { return EXIT_FAILURE; } - int result_code = EXIT_SUCCESS; mrb_load_string(mrb, "dummy()"); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); - result_code = EXIT_FAILURE; + return EXIT_FAILURE; } mrb_close(mrb); - return result_code; + return EXIT_SUCCESS; } From 7fdd438b186a507281bbbcc95266177e2e370a1f Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 10:05:12 +0900 Subject: [PATCH 059/103] Add test for cptr --- .gitignore | 1 + test/Makefile | 3 +++ test/cptr.cc | 36 ++++++++++++++++++++++++++++++++++++ test/test.sh | 1 + 4 files changed, 41 insertions(+) create mode 100644 test/cptr.cc diff --git a/.gitignore b/.gitignore index ade8c1d..4016432 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /test/int /test/float /test/string +/test/cptr /test/class /test/module /test/wrong_type diff --git a/test/Makefile b/test/Makefile index 0d53868..472a399 100644 --- a/test/Makefile +++ b/test/Makefile @@ -36,6 +36,9 @@ float: float.o $(MRUBYBIND_OBJ) string: string.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) +cptr: cptr.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) + class: class.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) diff --git a/test/cptr.cc b/test/cptr.cc new file mode 100644 index 0000000..6a9a8cf --- /dev/null +++ b/test/cptr.cc @@ -0,0 +1,36 @@ +#include +#include +#include "mrubybind.h" + +void* myopen() { + return stdout; +} + +void mywrite(void* fp, const char* string) { + fwrite(string, 1, strlen(string), (FILE*)fp); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("myopen", myopen); + b.bind("mywrite", mywrite); + } + if (mrb->arena_idx != 0) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } + + mrb_load_string(mrb, + "f = myopen()\n" + "mywrite(f, 'cptr test')"); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + return EXIT_FAILURE; + } + + mrb_close(mrb); + return EXIT_SUCCESS; +} diff --git a/test/test.sh b/test/test.sh index 5aeeffe..742ba5a 100755 --- a/test/test.sh +++ b/test/test.sh @@ -42,6 +42,7 @@ run void 'dummy called' run int '1234321' run float '408.0' run string '* Hello, mruby! *' +run cptr 'cptr test' run class 'Foo::ctor(123) 690 99980001 From cc303d5a9188615f98dfdd4402c71fe83d18d174 Mon Sep 17 00:00:00 2001 From: Keita Obo Date: Wed, 16 Apr 2014 20:41:59 +0900 Subject: [PATCH 060/103] Add comment for type conversion header --- codegen/mrubybind_types.1.h | 18 +++++++++++++----- codegen/mrubybind_types.3.h | 2 -- mrubybind.h | 20 +++++++++++++------- test/cptr.cc | 1 + test/float.cc | 1 + test/int.cc | 1 + test/module.cc | 1 + test/string.cc | 1 + test/void.cc | 1 + test/wrong_arg_num.cc | 1 + test/wrong_type.cc | 1 + 11 files changed, 34 insertions(+), 14 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index bf93ecb..d5abd95 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -1,19 +1,27 @@ +// Describe type conversion between C type value and mruby value. + #include "mruby/string.h" #include -#include -#define ASSERT(expr) assert(expr) - namespace mrubybind { //=========================================================================== // C <-> mruby type converter. +// Base template class. template struct Type { + // Type name used for error message. + // static const char TYPE_NAME[]; + + // Returns whether the given mrb_value can be converted into type T. //static int check(mrb_value v) = 0; - //static int get(mrb_value v) = 0; - //static mrb_value ret(mrb_state*, int i) = 0; + + // Converts mrb_value to type T value. + //static T get(mrb_value v) = 0; + + // Converts type T value to mrb_value. + //static mrb_value ret(mrb_state*, T i) = 0; }; // Fixnum diff --git a/codegen/mrubybind_types.3.h b/codegen/mrubybind_types.3.h index 06274e7..d578b2b 100644 --- a/codegen/mrubybind_types.3.h +++ b/codegen/mrubybind_types.3.h @@ -1,4 +1,2 @@ } // namespace mrubybind - -#undef ASSERT diff --git a/mrubybind.h b/mrubybind.h index e488a9e..5029f5b 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -32,22 +32,30 @@ #include "mruby/proc.h" #include "mruby/variable.h" //#include "mrubybind_types.h" +// Describe type conversion between C type value and mruby value. + #include "mruby/string.h" #include -#include -#define ASSERT(expr) assert(expr) - namespace mrubybind { //=========================================================================== // C <-> mruby type converter. +// Base template class. template struct Type { + // Type name used for error message. + // static const char TYPE_NAME[]; + + // Returns whether the given mrb_value can be converted into type T. //static int check(mrb_value v) = 0; - //static int get(mrb_value v) = 0; - //static mrb_value ret(mrb_state*, int i) = 0; + + // Converts mrb_value to type T value. + //static T get(mrb_value v) = 0; + + // Converts type T value to mrb_value. + //static mrb_value ret(mrb_state*, T i) = 0; }; // Fixnum @@ -1138,8 +1146,6 @@ struct ClassBinder { } // namespace mrubybind -#undef ASSERT - namespace mrubybind { //=========================================================================== diff --git a/test/cptr.cc b/test/cptr.cc index 6a9a8cf..6324f83 100644 --- a/test/cptr.cc +++ b/test/cptr.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include void* myopen() { return stdout; diff --git a/test/float.cc b/test/float.cc index d5ba98e..18fb527 100644 --- a/test/float.cc +++ b/test/float.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include double mul(float x, double y) { return x * y; diff --git a/test/int.cc b/test/int.cc index 3d334ec..d7fd84f 100644 --- a/test/int.cc +++ b/test/int.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include int square(int x) { return x * x; diff --git a/test/module.cc b/test/module.cc index 6aced76..a70f614 100644 --- a/test/module.cc +++ b/test/module.cc @@ -3,6 +3,7 @@ #include #include #include "mrubybind.h" +#include void modfunc(int v) { printf("modfunc called: %d\n", v); diff --git a/test/string.cc b/test/string.cc index 9599937..5f8e8e5 100644 --- a/test/string.cc +++ b/test/string.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include #include using namespace std; diff --git a/test/void.cc b/test/void.cc index fd3f0c2..1873b5e 100644 --- a/test/void.cc +++ b/test/void.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include void dummy() { printf("dummy called\n"); diff --git a/test/wrong_arg_num.cc b/test/wrong_arg_num.cc index a2dbc86..667178b 100644 --- a/test/wrong_arg_num.cc +++ b/test/wrong_arg_num.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include int square(int x) { return x * x; diff --git a/test/wrong_type.cc b/test/wrong_type.cc index 7560d38..a76bfec 100644 --- a/test/wrong_type.cc +++ b/test/wrong_type.cc @@ -1,6 +1,7 @@ #include #include #include "mrubybind.h" +#include int square(int x) { return x * x; From dd4f96646a972fd86ac05c57b01e53c3db839d2e Mon Sep 17 00:00:00 2001 From: dycoon Date: Mon, 17 Mar 2014 20:43:08 +0900 Subject: [PATCH 061/103] call back. --- codegen/Makefile | 3 + codegen/gen_template.rb | 6 +- codegen/gen_types_template.rb | 60 +++ codegen/mrubybind_types.1.h | 47 ++- examples/Makefile | 12 + examples/a.out | Bin 0 -> 3601668 bytes examples/main.cc | 164 ++++++++ mrubybind.cc | 2 + mrubybind.dat | 122 ++++++ mrubybind.h | 752 ++++++++++++---------------------- mrubybind_types_generated.h | 177 ++++++++ 11 files changed, 839 insertions(+), 506 deletions(-) create mode 100644 codegen/gen_types_template.rb create mode 100644 examples/Makefile create mode 100644 examples/a.out create mode 100644 examples/main.cc create mode 100644 mrubybind.dat create mode 100644 mrubybind_types_generated.h diff --git a/codegen/Makefile b/codegen/Makefile index d606198..d994d17 100644 --- a/codegen/Makefile +++ b/codegen/Makefile @@ -11,5 +11,8 @@ clean: cat mrubybind.1.h mrubybind_types.1.h && \ ruby gen_template.rb && \ cat mrubybind_types.3.h mrubybind.3.h) > $@ + +../mrubybind_types_generated.h: gen_types_template.rb + ruby gen_types_template.rb > ../mrubybind_types_generated.h # diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 221ed6b..dd76bda 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -2,8 +2,8 @@ MAX_PARAM = 10 HEADER = <::get(args[i]) +// This file is generated from gen_template.rb +\#define ARG(mrb, i) Type::get(mrb, args[i]) \#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) \#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} @@ -117,7 +117,7 @@ def embed_template(str, nparam) asserts = '' else params = (0...nparam).map {|i| "P#{i}"}.join(', ') - args = (0...nparam).map {|i| "ARG(#{i})"}.join(', ') + args = (0...nparam).map {|i| "ARG(mrb, #{i})"}.join(', ') classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') asserts = (0...nparam).map {|i| " CHECK(#{i});"}.join('') end diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb new file mode 100644 index 0000000..f432bde --- /dev/null +++ b/codegen/gen_types_template.rb @@ -0,0 +1,60 @@ + +MAX_PARAM = 10 + +HEADER = <::get(mrb, args[i]) +\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +EOD + +TYPE_TMPL = < +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](%ARGS%){ + mrb_value a[] = {%ARG_VALS%}; + mrb_yield_argv(mrb, v, %NPARAM%, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +EOD + + +FOOTER = <::ret(mrb, a#{i})"}.join(', ') + args = (0...nparam).map {|i| "P#{i} a#{i}"}.join(', ') + + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARG_VALS%' => arg_vals, + '%CLASSES%' => classes, + '%ARGS%' => args, + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +print HEADER +(1..MAX_PARAM).each do |nparam| + print embed_template(TYPE_TMPL, nparam) +end +print FOOTER + diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index d5abd95..6a75c13 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -1,7 +1,10 @@ // Describe type conversion between C type value and mruby value. #include "mruby/string.h" +#include "mruby/proc.h" +#include "mruby/array.h" #include +#include namespace mrubybind { @@ -29,7 +32,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; @@ -37,7 +40,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static unsigned int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } }; @@ -46,7 +49,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static float get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } }; @@ -55,7 +58,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static double get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } }; @@ -64,7 +67,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const char* get(mrb_value v) { return RSTRING_PTR(v); } + static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } }; @@ -72,7 +75,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -80,7 +83,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -88,7 +91,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -97,7 +100,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value /*v*/) { return 1; } - static bool get(mrb_value v) { return mrb_test(v); } + static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } }; @@ -105,11 +108,37 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; +<<<<<<< HEAD static int check(mrb_value v) { return mrb_cptr_p(v); } static void* get(mrb_value v) { return mrb_cptr(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } +======= + static int check(mrb_value v) { return mrb_voidp_p(v); } + static void* get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_voidp(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } +>>>>>>> call back. }; +// Function +template<> +struct Type > { + static const char TYPE_NAME[]; + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { return [=](){ + mrb_yield(mrb, v, mrb_nil_value()); + }; } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +struct TypeFuncBase{ + static const char TYPE_NAME[]; +}; + +#include "mrubybind_types_generated.h" + //=========================================================================== // Binder diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..8ee7810 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,12 @@ + +INC=-I $(MRUBY)/include -I .. +LIB=-L $(MRUBY)/build/host/lib -lmruby + +all: a.out + +clean: + rm -rf *.o a.out + +a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind_types.h ../mrubybind.inc ../mrubybind.dat + g++ -std=c++11 -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) + diff --git a/examples/a.out b/examples/a.out new file mode 100644 index 0000000000000000000000000000000000000000..e69e348dfe64a896a0a115ee3e5f1043a7563a75 GIT binary patch literal 3601668 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

CO3W%-Ee`e(&L7 zefP~pFOU&3XMb$_=ds@XW9=DxhC>;U4ak8w9aGNxOr90_Q=6Wk+tgzj&WMqPf^TBU ztg_NwB)6e6i>)wIWxaayGW8~QHuLs%!6*0IjR);hh&iplpdw$8J?9&G5@Z`dSnk%G zp%*IfH2_{`Qo2X5x=fHtJ{me*LcwjCFI#%m z&;<s?;!|wp%(OzRWNDW3YgXIagLZbv1SX-vNtsv#L)0a&OPD0NAFE4;!ZCh& z(Dh&|NALtmj{N8P*J=GAk0;2re(|U27^f{{xvQi zvp(U(YezS<*HQ|&iG1if3_wnmFb6;L-DlJx;`iN!yS>KWU{a9jT`tm4y zyf@2_sL9HdPX$uT%xvW)9HLBBcM!KyA2Rd#5LsNDFITK#PUTcT*1X0ROq}Ww0P_j1 z33-$GY%F#_$MK%@onpP_3;Xr&ytJur|IWB4{#*Y}Pw$TVGf^gKd_2AIv*W3hju@sc z9bV9-Lrs_NyF=yhkLNm+`HJmGe4GcF%1Z4#8}EK>HK)HhE6vD6~2~9fX>S;KA4M%0J8H5jn5? zvBwy%{1x!rOykyO@jn5o4QN9qXx<3nsZcazjbOl?rf70A%&-H^;(a)2vKMN2#=M=E znYP7=Z;rEMI0$TzKNg+ZSkB|i({~bS;^6C3@lUVw0={nN9bvBtb4%w1Ob|o5X33bP zd4IutfnCJDSaw@~1glZyIT$l1j>H#Qn9Bt7Dgt6ZFmsLl*Eh`8`L>*E1oM-=VK(}8 zT`QP*yz*9&GcFv;$H%FFzJ+`ri|)qMu4XwTI$I4v`Gu#0ll3`=~jA&wSUNh-qam!uY~bJuNb>?z{W-wF)(!(Ki(r%zenR5oVuHY_e}y* z1x{k%=N^(jXxmzXNi<+1?_K8ahXx3BJi5$jy#bxUb!N$S7Q^=mOD7F;T2~zisES2r zEvI$HL8Z&Myw5+nN4F1+jykES_&d^+x_^P`jL{iaN0wmsz3 zT5yoTZfmIU=DdTrR}2hVF_Soy8Fi4+sB_+pRLgAK(^Y**#oTgE4s=!wPPU6ETxT90 z@Mxp1UHBz;G`Oa4pyq91|J`WiZQE+2^lx0hr)wx)S{%>L(v^5;D0{ri`6;<=Wy>sb z8Zn013NRb>_I@$@C;lJWB;?ZjL~av4q}iRDeRM>%J?kvh!cHnKd?s^B3Qi9hVB2iG zz@e0CdT!DO$yK4YS4!Gmjt*eOc~Y18`=M#PTfe9JlCpVEWp%N+J$K7=%K!Mqb5VhKeL)dt&J-XrQ=wup1>=Yel|ugGZ~%nRKylgLUmc1*d| z9kL3rV}c$XBQYWoGn=Qx%N(9jZ{}Ov{bhJE@W#_Cm-kl41 zKs~Ie9iE}vkwyf-J};rvegyk4?lF#s+jWTyeTq39+JrP1+#pw#JunO}!lGh@hr}Hf4`9+=w83~2XS|#4D zD9c>dkIF*cXH*>fdd9^YlkZEN7CLB)vJXe=YE`c)s8 zzkAwV4-eSQF|4F~=&U%m%lvNC=-%A?NG3ElGsigBD;pUvM+Tjh4Un-m-dK&faGgST z-0V<WAz0P zB`y^DP&Vw02#)`8F(-8_W5~@C5rLiOzR=mt7`rl^u z@$DkM?QNgB?Pz;RA}t|BR3}+YxiU0qCdsAV)8tjG)f&>A6?0e(BM@r{P}NVNT$ zsW34$qs6E#euzA`7JdmYnu+>gqOjJhSV{TY65KziLrG3%O^vBZSiSm{%DI}hmb%+B zH9zun+$85_PK>2PKceqnOg>WM8?3zfH(RN{&PU$JCag%KW;0*vhny+t=%;zEvjQV~ z#nlIO^pi3`MyQb;&dRRLIO8Dq-f1&U)dF4W4+8N6PlNB%oaCC27dVXBC!gCx!vpDl z!Cfwc=$bt!MS`$CXnWmQK+p2tH9&tq9ow`eCR+Ljbp_V^37*gRRu>67Tf{=heR$Kls55pg;^G&*URgOpg zhs*qYMJB#lPS1v_0LL=izoJC}Nc|75f? z!I{nYpDL@K=Vf5$v0{%4E9V}81JVcza*97-px59AGxU1!$Gr#)J0dNSwjc;{`pIag zcFw4|Q(X=#V>YkSD^bjuGv$1kEy0r+S1J^@dp|M4hom|}C1q!h(=t~jIn40tuOtG2 zpn}eNoh|1>Xj#Ud${2EYlW}}ze2LqhT%`g54SVBFkxpxe46w^|4Ec1@7f|dlQ!Hle zi?-PD6g!NLpY9iXOIZsLrXzI9`UI8SQBd+*>~xZry;LPH*13@lG*5Xbd^ittx#bL7 z_yh{qrAQ6=!czd4!i9EyZ?wPT7p_}<(sPCOObS;X3a>GR?{HFE^i}>7CVOB$Ghg`9 zT;aleN^i`E`Gwz&EKAQ2=CdeVc__Tr6#l%EI^PyPg~DsWd{(~j8*+sU^YY%9Kg%kU z$TC%hPZH)86s|lJUS7p_@Vp5~>!F~8a`T*pABr&VU|v>OBn zVWAFXr4E@K+^*pVBp^enql5-vaTs>-?^l=1Py?d98*r#!$M;mnST#WVl_RE9WW0_| z26LH>5s3+vTC*(U?|~M*eSQWgoH?h&Ye!`G= zSEy{gIoF=XparfJxRM~mDFH4HoM<@WYQgEvx%NSX25{xTl?kp4xC-FZpB7GU&b3VP z1vdq_TGd+%+$`Y4RJLBdIoEO=lHlrrt5JD1z|90soNdd~n{(}FE!+g)hO4~cz%>BZ zA~@3yy*bz33QZ_)JaC*6O$Y;U(~BA4DvXD7?JEsl;0VrcIg9G5``_B1ZJZ)sHBLU+sJu&*RfntZ{ zi?#h)Sn_weOP-ltq>`19lDjB*xRW}>mORTZc_t;_X-l3($-@guPAOS5_DOMScgeGn ztdy*bl)QtIYn;??5qsb~$1iy{CEsOB)}ib*1tp843rl`sTb>$a=?hh|GE(yMlpJ?b zqixA%eoDSFO1{UITuR9jPr1I+(qtatZ+90PwJf1r6srqGVovHM1QG~GNEA9zioMqs zo0Cr}R)VRdu-MP3*bb01z{t{J{lp1NDJ>VjWdsn#JxFnxiXSRBvdZ-d`62^LH&)u~ zjEn?RQC5QK?TUvPa9V9BVbED=#0VDhT!w*+LdfU`!`Zo(qu6w4d7Sieh#~n^8U$Jt zG|*+FmXbpWjBV#y_6I3P4P)DM1hR=tbCgLPYBK4Hk~w5jg2^=0W*SZ=!xtD4WSXT+ z;xChFCYffDNeL#?Pmx8`G>l9wr15zsnHrQy>~1nmC$)i0N-&uYwwWqv&;q_qC&v`! zSf0zFGmoc`LkT8F3VKpaMOOPH&H4d~IhOS$uoive*%u_FcoC~+i>wTne`a|01p7n2 z-(lJF><{_5E3;SIA3AoSiM$EwmAI@6g7_^)j2UrQ%eOis4$nm#E_vi}u&`cY3L$R= z-{+H8qI-f`BGqNuKAzMGv_uJ}C10liTGGTWoSyy)GkZ|%|4b(Dv*bej17kuW^4E53 z?YMn_C7jMsBQ2gC*9*BredHD!z~=AM ziE*8T_!(PkICJ4ZXT@crq`}I}TAh`;XT3Z>&!4H94!vhjSEKew@~JE_jYw^0<+e=S ziA7bqjY=`i*mv%S=u>A!I5VC3SH0Z6Gc^}6{!M4)ZnS7vWu5gr=c>7(lagzTMi63< z35{re6zyMu*Gf}x1z*M~R4$7$o}mH?dT+gH4NqMMRLs?*L;mS3y^Z&MlhBZia5ilh zFvamSP5S4r_jF}-|3dE%Tlk<^p&ySAcxI|L->cu4i`RJTnSkRchu}_YEd_KwB^vZD z=4Of^jj5O8ep*m>K<4mIZ4c$V8OCGrRDS})cjV_&nteAw5LpfL8ADBCLFnMg4x-); zC$$n(l*AYBh{3$eKr!xsiA0x@Zvi&sKs|TVmWGwB?afmx7x8~%F2~}%R zp{j@?VnvrYoa)scl|PuhQorwtf-278jHHwD#I(+!p!+&npF19CJZU-}NY@XPcym^m z9?zd(fS2GjzXx54zj+K?~{x4ys*t_j6a0* zz4_{WXp3d`^OvP59u85)LxI{r08clr$k78NlX#b*)FhPN_$4lGre3?rWrmvsny8Cv z`u*>PZu8Km-eR9cb5>%Z!75B;rXUsY8ww!Zcc%$os$@q+l?jkAD-;y}ON!^b1S17C zbSXXX0H@Zh+$B#B6`HLJhzFw+zhRs3ltI$3=M3uEF(!i4Ng(i@m8LxmONs4`jny4a zYlBq;r5y95@N0{Q+4Udtj-^D>;=(QabN=}AN#@l=LZr0*L1pIHE`dN1m@?$OS_d;WU27BSB(R1jXsX1ngQl*l*qQm zo8?#e_g<>g=yg!4^S}RvDhdlWs+I3$_IvB6d>t%W{8ba%0tVT9C*c+a-JzLZnTTyD zd_5%;Hqx*ag8gfxb1Af~My_whNq^7I>F*{!GQ7Ge>dTVN5LYb>I3`&o6~?zFx@MyfFd^E4wlzTBu>!??M$2x-~* zbV$x0(+7`-gMITjlHTz6=743(4^RlE+&8?nuXo!3pQiNe%Y2jlD6;m(Yw6GT#w%gd zjCnvrc~^G13NZJ_#IxVG74>M`=spVh9BJ8$02X)kWm?SbD(=0WXzcU8^__8I^|mh_ zI0zyvKwugBVw*h#X+QSG*|+`Y_Qm3F9H0jL&+Ln>hxXKs_2G}N8za9rJn(;EU$n8C zV{iN7Y=mMry%%zCRiS;c?U(<#eQ~so@00nZ>xl@V2=N%N#a$+QoY7NYA??RT`{}28 z(lFBhaTZtF$_C<~&(}=2o8cCwPn4t=NaR zWd|o;Ju3O~QNibyyb=h61Bs%YPq|?N8DthFAJJWq)*dy(p;DA!a#Y7S3e})85M{ND zWZ7sF&=|bROsnT9vtfz`x#<;#op<$M!|>czX^vfwO9T8s(h1FK?~hEx$yDZ^Y)M{j zNnT+{?qB_*L!)XW;6n#X=BU_XZ%1ehZp#jGpG-&FULUmNm9GAQz<}L5+FCf6V^PGN zA8GEF9EV4gU(uEgK?{(c8*6)c(11tXsIy{|J3s0+#oS`%XOl6-%|$}04RX{AAP=bFo9OwHh6HtG|<$IdV88H=O`|G zwdyuSguKPnEv*5$xOI#Yfd?!N4>x&CI(I?~=7-5~iH|x2kfu%5GC7O8{2b*zdL3(VtN-(@;a)iBmZo|?g za-^d+3W)=WL(=1PWGZf9_8n+j^Jlpyw_|inA7vHLW!^G2BPAbU_HRsL-<}*72fF)w zxm^6`N7X;9@A^mQ>#yFs{wVdULA6n0YtywA>9ZmXzLnL9PZJ;3jTpfzLg``SZ%dDg z(H~$h0;n}+u&wwNgDsjHVlddGFkR!U{CuO!iMG!S{Z=e}W~lAM&^LFO^J}>PjA1p3 zAzV<6ZNGNzVP&W5yD1z}072M0PjxWEhI5x-J!9NGQo6?6XQGJYcprTdCx`Khlr0&g z3`h($7j7R_LEj8A)yG8sH3Y!oTkhSgmzXg~Od=8TtwS<=oYvXmyVrZCPNqP~#Yp;a z259FX_eFnz{$tR9cbB}{B9iWNfP!hS^>s=L>2iusB)0~2tPt{kIB64n2`uI0AK0n6 zvm~!7pYBVXI-W+2b?J^Vb3@GD<-;Jvu!q-}{QiRW6Lx{Q_fb&tx}1;us7~<7%}ROE*B|wb+tS( zn`1G60nUsjo{^1z_JdDtzMTByyA4j={-FK-J&D)R{u!Mi?@lWw^TjkhV8L$d3Dydj z&R?D#C9lvkW7|h>vl@re_*9c zZmM>NkA8{^NikC*KNJB9@eNpb<}8Lxclq#B_5r`Z!spw!(Qn_~rhR_bhrHXynqof+ zY!R|B>Bn>U@@Pz)J4v$&O)^GBF22`&j9Yc+%hvVji%Xr2AjG4qo)5#WKs50Wcu(a5G^-(0P!aGxF;^M=(S*eMrK{XL#s{ifSCW&S#e(Jj@5*u-bY&Um5|f= z%kGcq^GX1(`zz8(3jNF|inQ20H=gl>G^kiKRBf;S5N^MrtcA=t+L}}`O}2hZ!HCG+ zcbHnTM@d;q20q4ky}`bgc!PAl-&mAfVv41*y9+w=mE)2{XQSIVYtQZPP77ySa07sX znGFe(k>7v}Ebst`&s(Cu!tk2=Ms^s~GWUlxnfrJ&Bga63!Q{_O*Pyh1yY5DtxpJuAfJ^5*tI*OL|c&0w+PL8(+;>k1_T6J6iNZ|J?eDFL&?XVRfI= z>4@M6)5FK4n?mlDVf54FICpvyml;mqJf8_JZv&J5y{3}dCYDxgB+X6tc;CAn{^p&r zi;dCz=S*?|*}P9@@f`S$ZQq|<5HD7mIm2!pA7=*gxs-v9S(7-D&I=nOijq6uF6Q8- z_Rz_)2dp7=ohkbvFBE88hWVxj#CNn9A=G?Mx>i1e)B|d%eDjmb)c3cl_k?)haAc2s z_mkN=BT2=Nh=o|W&mmGb}k3#x<^{w9Y znaAP7a7Q2XIT+YZTK`c%AHzK*>3U9? z<%|P#GrN5)6>j@n2xQJNmjp$UoOux`5Q5sdSX;B-jl z6VDj`7VO|{W2EouYHsWNtBnute1M30vb2vF9lf&62oJ)n1D(qom-+RZ;dfkmJfqhR zzm8g(YzAJBAt+SL60jYC@UHmpu-goMHS$*bOtAblMjrk)4UZ*n#*n|s-6tldCwHHe zI11(ri?b%cS?PcZIP^9xcMD3ka*&VVQ+&1~U^?pC%~F}(14|f>@3Lv@7YN8+d5-k+ zbUvErKWk4mIS>Ez6I=gj7`Zf)d>`v)iP zC@o75(-?}Q4TibTF8NR&ok>r)k+SMmC%&Szy zY@_7IIwn1-~+pV&~x-1}q^i}U7#Ko6I{QH?YJg0KIH{*eZ`pmE7ORr&$GIs(pbXH`Lneo)nwJi3RT!9)jiw!GiaxU6|n%VLn3QH0eQc3Qtp`U4HLll~2XQz*E!w3>G! zLS_Uhr1|0O*8x$LhMOthvbd^!N(grZrN25K_SLq=uOvtX-G?ZM=ajxdOkIi{fBVAX z+$5lRGP6MG-_63IK=-23wam2-{rh__rzT-Es|c4oqAE?#`I;FW^D?U@1Cy&mnI&Bx ze)!?er;c8CTnqmaZ@6u3+30UtS{UMWZJD!*oVuq1tB{n*EyY9L&0HMJSrglSZfuN> zgqCh{Yx~}HuT%ZaQuLY7d6`I3s`fsknU@$vjj~x{RP@HISwiGDQc=y>k8<9kLX9br zJ-%Bxhqoe^4JX?Bs0-!)5Zp8<9ZZvsz#-7@z;uA*ziCx-yD$5H^-_r7DQkA^t9)tSlPkZjp!}Tu*i@gKO?0f$V?zt{7&FD5W~4j1-dd9W{Bv(@b|$qU0;J6z z^joy)#T?b(M`MteV*j$IXSA%av0-;mdJ>N1+?k3`Hljw;H_CE#H}F1?^KwzGOq`=XWySHkN7(>~sB*pHCR{NBQV~k}C-?9|u$n?TK)EoN~g#GuI6`~L4yuhkhH`<0`o!|4({>lrW{a@fK0eZmr zP5}`*y_?#7<9p(M@crH2{yTg>^>Oh1)lUux--Uqfi@qN`FMOSc-^)!g`(lY}VAsiE z_t_pSaaN8cCVnK!zJ>VjALqstjQlyV!q5EiSHRBj!v^4bOR)l&&;o$#;e9s;!YL|i8)Gkbv0+w z7uG9&_CfL2md+wq$6cU2c4`iHVSV)+!sxnB$7fF$4Qe(sx$`*Rg&+MeVwlOH5BwM< zx2^M+zWywfm#m~}vhyDhtj%25!S=0^q58?+ zH&lm!NU&MydEx9e(2Dc4yVbFjH;@CmA=?wDIV&$mA^$))rN@P{SCFYN5Ae@@&+s_Q zS$Rlv7=6b2nWjF2?U9e?LtgLhAp$2^6`md&cSrcdFjV-qsc|lc<&GX`PNe)aTvfcx zeJXvf6c4# z{nDY$s)2mpOd9BO0Tp^LY|}SD75yX@L7(b;n=&+P`c};L>!H;a^#Jis!pUja(GM6vW(S zpRD#a+#w7)#`=yIgjPS7b4e~6=)U2kT)|%+;?^dZwvyGNc@SnCgqb$bb)1wUG1JX* zp7L2c;urFH44=;*=yE4T>Nb6!B=3%RzR_Ix>|O@U)Pe5c9AzcndiOs8@FJ3vl0!ay zO*lJI)G08UVUiLH)RDNvS;=wID~-!GeMvZb?%uF(e%BPZHu1$m*ek=)fd!`k~RC zG|=q_QNr#<_fhBJ4Sur?-J!WtKy{y{6AexA*q}QKXx8&ST?$6aLBCt zO=y1ZK=<&ZzY11JZ$B(>{dWu}8*io0DA0Y9+HB94Gm{189k@y)Z+;|rxlM>YPs}c$ zle$2+istLE3s&C*9@w>snnKvK!`V~zh8<~P+j`Q!qMQErKGlo znbg_vvKf<|w=zB>-s2lX?7ydd{)oOZ>^!W{PBWm__< zWR5(NaIke=<7fOgHi^zB>ekPUl}l}X9f?mBWU)B@19)Gky!r%8ZT%P4|0LT|A#GZ^ zF?`zk8>k>2bsk>l3kig|-}k;CH=51o010xW${P~rg~EI$?#u zR-kkQKSPQyR&s*8u+hFzlE@e#A@c=c{vDOlhcNen$8`hmEm6+w)ge&zFyQ-?C=%3# z$N<~PqAjq!B+BOi^oifN0pjQF9W&m1c~T)0H2Ig}0LQ2p=?`y}`lnk^i)3NOlNlyu=R8@g@Uz{JH?4lzIn zyNehvvLeUQk4cdcBmZoEj~eK1>?r!YIzuApVr)r!Zbf1Hsa;sUo;ICfZxeG#T#^tZG&Aiv0Jh&=-3&{m^d!n`w8ot>eX@|X6h#I{#(ZUv zu9Gs8_S{T;ZwGaLuI}gZ<#%D{`o5@dvcDQC+L_#!2xrMok@T_hzHq(`Jw^fx{n`?r zw~kd)OSXQW@CO@sr}Y9s*m?Q)*Y!Q#wB+lg-qbo>U(3E3)@XKLJ@4|avhOWtSu=fh zy_Us(!YF}W=_=gV#FM#@?rghC{Nai0FA}3pHsuZzAVG%%eL##Pe>wTR1}CKfoqX?$ z_b!IyiAd}E`JZ>!9VaGSmKzjY`y%(qpNomFV$s=2nUzVi@Z8TXJm22}TCBr;ASm*9{zIAijmh2po$ICu(4t+nFLIbXrSq>Rk8Xu$HM##o zdOFu}B%8W3mVBeql-4BDU%(d83=*O9kn|zR&S37_k$mG2v1D6lz{ceJUCpm#Bc%AW z{T6NACv8(#Lfc%EkAI1s0Xv+fvQ3yfzw6C?-5edKadNLh!Loni&B*h6kI>Km)c`W~ z&%J~6`}^I$-Gyl81lv(*x{NFP6vyI)q75bE&+WlKz!tB`Y--=Soej)$6YDapc zZtCki(UwSwuYlI_9dheb}Rx|@r3up-wd7qza>uztysGUq)0Q_FT= zWJ$O!ajS+~3m8b}GST$@{J3>Pb^bUvz7)vdq<#mCae-ZKgBcd(gBcPgm?8TCdv1)s zZL{~>if4MrSFFRKlT3-D*9}Taz>Y85ZoR_E_2bj}(zd%pt zkNjiax?J)t+SnsEj#-J$y8P7l+wFH2R$HTd%pPRwKwda0&B6$xaFSzq$p=zo&la|( ze>IW04*~|#8U^I|E1y_oW=*qd2WzAex6|Fwd34)9LMN^|o$>Pyj>~^I$&S!~C%94N zGwJ@E?tqUj#t2d5mSDU%_}~?LY$%1e+tU=%)>Xtl@z!&Me?nM43L8?hx9#uLw!U>o zb4#{?blJZK?@{~!Z|=WLp2}+u^RRkRK_=?SEcaUEX!)$)KTc~{#Y2>vA2YNRQU1h^ zrtEh9$p5$58^W90mc5^c-xFVi0JbL{)i-jV@8@P`*d&s&f8>vE?-(lmz^{+{Ie*}1 zIi@?yJaEV^CSC0@@N$Q!2H>^7N>#l3sNdN?A|a~-6wC^*Fb2+>f(9e!mJeO(|R-_g3|^Z*snj zGHJB)BpKz~Pn_=u9XBub;|(q{LbHrvn~(L2-Ef2->MKRLSIpmO`T9-Ffm){s@h?bd ztd{`6*6|nPwOGE_LUz&|j_mi!t^sog<%{WD>05OsA46l_Vo}x3itf9N!tke-bp*b4 zd15xp9r3TtxtyI>U%w>&)sEW86&L9dy=;~qv9BkZd6dinrlYp>a$q`Y;}?B%?l=7I zh!C!jc9*CxG&$I-I~0=K%fx(RkwK>Q7>U*vHPkHHf2~)03)f-tF`(K0ro1xLOf*N` z{e(a~+n(=YS;xH)`Km#rIpfbe-+D;vC&snIomb5xO-K8Y=Vvn$_jiq9anVbo;~l|c z)GOy=t)Ah}hj_zgEqB*_c}*@HbWGZYgMO+H_PA%i>~TaM_s&7-7Jq=v9hdK9D#GMi zlP=<=cTk>j3tqd>n7NuPAhXYszOpXUgJ`HvieuFT7-TB2aP^D#e*^A-G3H$Ub?6U6 zTmfTT)O_hTV2sNW@hf4B*_SuN3b9%7%V3(4MEq-fD-}zyf)a19Jtj9$KZ-L>7DDp( zn$FD8Vn3ZZaBaRbcgno+{WHlo;#vYU{Z_#h$poU+&bul-L?;}agGGQF@#{EL2v)zq z?-Zw1+Rg76ffU9G!C4` zBd@WN<7c$veo2o1PHMm-Wd|rZPS5d24}5-iwZ%tgX8*sHWShiu*gNl3ZSuyk#oq0o zWqWd$eq%43qLeX#?7xkvc%bs>)YUmw%IZXNJ0CyL%)8t2nT@$`2Y31XJ@r@j`dmu` zLRzXTy>g~>Usw>1mvW7s6-rgINGECY;mA$u8G2RdFH(t2a(=s&nC$0dyo^ z$%NyytRtzJy2;Kge_hfX`XA@zWrbyyx^2mqwJ24d{S`2|`5rTKvCsmLb+@;9N2Q2b zcngYYw&4V{K6Y1M9_g3_FuHZk#TuPdGce^wB$-@%#tw0cKfSy>B~jP}alcf@`p z(BNErVP=hLbcKk=C1XtTnGu#tLwpZ^LHceXl^H!nei1Gc*5prYk7jDK0=b$z~ z&DrhdaCO)0dk=YM;iE~PCrvFc?e>6{S#0W>QUv2Ga$p93+Gs?^N#PovC@ehTJdb zxZe+s>nROKk(zK&9pvt~o%1}V7$j3o&Hwvb`+44Z=aO^&=W{gAyZ72_t-bczYp;D< zn_phLKo2j5>mkSV;sCakJU_S-i>;B)q7N0ef znD6#VtPA<8V;UUJf3HIvHp4C(1h}oC#LA}g8LgwlD*nJPJ!#Mo^oM_ztGt^jUo}cC z@sWQv4D{vxgzQ3iRng7IhjB}uI$tkZZcT2Mx?gKOBvE%otZZk*LR1;+R!maW(>hlU zWs)d)Eg!aX$$nZXyU|#8LPH-RpukTlp&_p3*S(mxA5$Eh*2u;mx5Wk~-k6RbJCJBg zvGOlzz9wCDCy-Q*%=Ap&6(!d7gA64yp3}}RRfQ`D+mRMLgUkl5DLuRiiuah3w?OfC z5?@8Y4Z&(6AX#WzIBH!~qvfkJ&xGfF{?ypn(7M) z=nH;G*vZ?LOo&x1A~kAR-4WpuhO2%>$@V4obZmk;hZPR4klAs|UEd%m*WK?`x3OjT zo$2bChKvpU7fI!H0-h8hPdEWq|)278p-Ia>RmHHae^tdqKzO+10=NZ)O}!GI5wsY`T!^y_;sm2PQV1 zH=k21rkY`$W2$qysSCCc4Kwj>R`9F+%?#Gr-!{Q_{7oJuf!1_Qc5C7~mAwdg{ImE_ z8v){HvJ{d$H1r!%8%gGaId=?CEdFwO2U?DATJtx}XVfg-N1;ml7ySa!C(XHB7k_Z^ z#n1_6QRh(2*YMk^`3Zc5T6P+rjaoK}UoUM%XWYfIov5C(;yulTo4RC zswaHJ<_+ZEhP?9J{f@Q!%y=hx-a7|wS+xcK0j3AU4iMBOj0243i@NaZDE$*Fdabg* z7$1;Xi?rJEl?B!uci(vmel3jg>d*iR5~$fi%Dwho8^E$LOq!2ZUadm8iT~95=RU&_ zKva^*o#(ZN&{3SPl^Djy78lm?mwA1^BN6aS#fQt$S)amOmWcKa&kX5Y zNKrPCURW5AB`v~wzKzLb(FjIzJY7-p4z@#BW3it)E*@9*6)v08)R5u;q*jS^`0)6S zyyaB3n?Rr_40dr~0wgB^G7gZ@9eLrb?9~B)jL1q7EmQ0J6Y_AJ)5v&xu?!)Q@mXj< z4hvYC++q3!3534tsIQ3a>?rDU63{B2fI7IFoUb!hu{A*6YRw+GvAuCN$MY) z%kdHt$_}5s*{0ZixOLmBO)x^{Y4M90_y3tLupxHi73yPK-=_=4%8zB%P6PM1^+uiW z!sfn=eW7a>Ag$ZwVp^A`s=097%S=e(M=cZOCTiM{+^2GSLCvnR=Zgm=rsd^kkxWlN zT0LDNs63t<##v#X-(6j0i*?r6l*B8&)mfPdwW9+LR5a1DYQ9(`T3B{;#?i-S#GfSS zE-IJ(*uHM~^Y^A^-1E(T8imjLyYA)BX}C)=2Pk&K6MRWSe+$9BdaA9RDQ4;HK(hRw z8h_KZGkoPId#k$>Y<2Ms44=H9Wz!LdfKzMprUh#-afk8Tafqxs9@_9ADsBXsKfVgD2bKE|>L| zT#u5-l35lLz)9|oZfTMu%GP5*OZ7v^C6*STCRzToB5rw&c1_~tmfM@$Id5q24x{kFcw_rRCb$IE zOSNKkT9puz)2tjn1|VenGv4%X(TGojTv(&}ef5FU23HVh#C3^HOuk)sw6@{5qk|>G4l}bH|$j}nlRT}I-jN@=&<;)u3>AG+5U+X z8TiYLuMuc&$eX%HBIIo}*}>N+(Ud`DJIOl4$`8Wz!>aA1ZUNOkK@Sq7PZ{_N3=U>l z`>uwNIV&<@I#`mDLg5<(QH5@&SX7}$ z9|h;nc+JR{?QllpK7L2$L-f>9-ttS&Kw(BT@I)g4cU~K~{3T6uVk6}Jje=-emu==a z%^YrhdK7?ZPTOYYDt`2vV;Cob=oR;MvERt$={HJm6<5XDtb7hfHQ_xM;ao{O^vA$ztap>I z!mLU*S@EQTUargJR4I<3|I~}zv_;cSci3~P79jPPHDmI8|3)&y9yA9viz1UT>rI|WmXoU`d1W=OcvQv@@Zn4{jF?o zTyb)o-K#FjP88*35|8Gn*{~6tw~7wSjA><0XIe~KpmUt)9LPA6B96WtroIyh0+F@9ij9EX}qKjkqjnY*hdM$1HJ@Rcm$9tC%(2kQP-}}*jkiFwpr2Lu@1pCvfPm=wIC=c zWoSx2OtU<_9)$7z0oL;GGgzSCzM%aEd$qwGKc!WXdY>%Fzfr|XH)E&zqh^aG3`y`3 zV-`Gbc!9yKu4AnH*@1M+Mz*MjHC=GEyh4o&|1iiaIa$K}vP9icToB|#O()g461>Ti z@)O^;Pi$(l+iF5MmM`&6%8yk%QwyEfy%qjHu#Uk4{EGZFkR}TTBf%YnWKbawyDc37 z7Se_B3SlhBS750)cE&Dj_Hm(|9ayT6KZpM&As`i4HM!5K$^FByfWe+nQK}VZ ziZ$Cf&W@Fh6UTTcizb7-D#1VWAO2+{%72OlHqm9-B!fNtU<0q_2?;96k+s=c@i)j7 z&QkJ7E{&e zudwl_SJ>ZMK{<8#py~(8*%=J_MR^0AI9S8b3Hk!EGlDD8MbYzbdrk_5wy-FX(iS>T z>)J90w5BchGGqpqiU>#&1v~>;kY8E6kz-b|xkn!1x=j!MChFR;Y{y4s@o$#dMTvfv zRl5FgGwu1Oi<~O&!bUn}34U7#_Bah(>(@TZ=h(dJxoQaHnX!CCNkQdtdTubEXI~q1 zk(ZSm5yXC0WQtzV$^>Vb<_+OnxV?>um#j3A!XR5U6~D&+=zVIj7*mKnmz0x*df10X z$wZUA6|s3Q^@GF0d<~FlnWOm|TqVBJfoZ`uyDdrli_vMKKnw4sG*#8 zK6Z+t+o{rthNGxutZX=TyK_7c0F=qk%qq)|EN!4u_x*)U{?#mZ*7>*c zS*1Q@zvl7_>q`1(pYjFT;9`|-?4ABuPfNB3YmM^rqfDfEp-4TvjM##u3BM0rZ)Rr| zs`>{??00!8L;=2oAw~OV^Cvh|s9_9pJAjqb0!1k+avA!R*otB5V;^*%7$1_z+o+I9 zohMv?rJJh0Hjw}An2>z^e$JI<2 zZ^G4m;4!YoTGeCamADQ~XwB*look@ujv|>XVsqEQy9f_M(!n4I%vT}rJs6bi8^^D{ zpC%gm#LA9441TBaHo-JpuQw@aQ@g$!DvMSp>W+xb+l_o&srP%ci1%r%{Ez~`Hz$Xi zC-w|oQl8iVZ%lD=jCo?ivlGMfGHYHF?0j*~a`t9{mCGi&q0Wv$ZS-zaO2w${N<5!? zKYr$Z^4(nF*khZQE%g@+?m3B=FYu*_Pnlx(RiIV*|i7;nl1}uA(Vto0q zT}lp)?~r)CO~}-+9ZIN%6QLv>tO*?^>t2MctZNtVl<+&KkIy@+1oY}C*uIP^s+;D2 z^m^H;&N*O_|Dl^*p_ZHkv&qr<-dpBgab<@6iMfLiGsAsO^-y(8jRb1{<0u^~JCd@A zx~r8?YzYUFpz7{Up|CRzW?&Y;J`@f*h!_gv|N9A*++T+65%mj=+!L%{qzqeI3JNyO zuwBM@V}@-eD-JSj7xOnVY(22FBDB8+x+YonkB< zrRRrkqpC()&Op75_dkwPk@hxrgu^7O@P+xJ*aM2Oir)XGuWVxAJdS}g*qdLe@j{+m z^A1vZQiC~mJhJM4^ti-^ZdN=k<5=)zqV9~?yp#E+Z@hRgE6!@neIa93?}XUiO}>q?_O@rrq2=_&t2taL%YtJ>bfn_NW-fFC8ao z2ogdRmcuD@?vXc?1)sN6+3=fCC$G4T{;b#uS8F;U*iEWf_O5;UJ}DrDS`LHKQ%( zLg5arsZH_P1W$6!i@ZF^)ypKbiiY-^QSSuRcY|!dotg0zg}Y^ zWbD-3k@9VZDG!;e4diz!qG zorfKQOSwvEyVxvfCmret=RZ|+7FJbnK9NRi$X_H6B)(gs;q>Rui0_nWxZ=61;@jir zJvSuIq2Rs^l|vUM>JEv``vi+kWoxOdong}fw(V4@g4RZM{s51q17f||PT<9jJdZ`lnk;{XKnWqfiCq8`e z(ec8>W%8RT}exq0I3y!?7i&<_WjlqWe|$JNRg z4YQy9nHTS`?%MawD*4w`^l6N9 z9mt%qqwr%X#>N)BbpJp$_|~|DlAUoD3rb=OZdPh+!HU=d&+<2BzLnT?Xl&lrV={O+ zIV*YH>_MzSSLt8X>pvt5L*+?YfzrA1!HFefJVbxsO?FbNe3>8+S7K{>w1&ZkA52yD zpsrL*JHa{jP(e}FQM-{Q!x1aHK=TA0J-_Bl1{KzBX7V>#l+B7Ux##N#_DQhSZbT2p zDh*s}6`ec`jgnU#lxpz?hGud4LUHz9iim`WQ_fZ;f;E7Ppy}z)U%)DBeh1PM!c&fR{#|0)p8BNs_taU(^3BpF_^z5S z-@N2L7&{VeQ&RFyJI>@H+E9Uoe_-oHq1v)+DsVRROf6O?M~^}&#@|ali$(-BW#-ha_VHhV2wf<;Fs$GOZFa>qVE|n}D)%ri(5B^&J zI>rpheC5->fIdQ~|jY2ag--q?MRMDW}d zs%OVN>Q@*R#C(odArS()a zTjoO*E|b1wP+kAXGk`r|t;t1RliKP|Cx>Ui)KIsQgVIpqaBdM`y!tgG57tQ~(;H*(f$31nID&F3K#BT)~Cgl{G-C*l|3Z^kH{i0p)4cQ_K8{5 z?KnA?ksO_yywA?{y~V-3Z13YK-o%da@h;M9b;g;(wJf}vqIj>t;*Xr*B8I|Nd)y`G zR#JVD}RKuzot_WU$@OvKiTp7ng*+*5DNUrI-L;KQbPx#b_$TGJU_Lu9nQ zi0PgU$h)NQ?`k2sQ}tOAKcorn`kTQ$JjCt)pkGJui+S4tRHW~QntKuXYS_r-3N7xM zlthP8T>#7E1zAKZ_Bf3y-CyVROODG;T9{x(5+sg3s?Tc>J(EOu9GzV~JcH?RhIa-h zQC+Ow;O!68rom1|EBJJ43q5{nkR3qhEcv`G2!MVUTR0SLzS*?->1IlLwS#62pI7u; zGfd5PZ-}S{`N8SXi#k3%{s+2Ia+1__H^gN9Jxx+Y>H4Y(qdx@sV2^hZ7KgB-KIKH6 zt(w*Pe+DBhQ0w2Kk7dF4@2i3}RT7Ycsq<$!m^%Mr2eTX)`l(a@!a8q6FKMJlzgLv~q|I@b#l@LA{*!TzR9@D5{-{)z60CFe;T6__7BmgQ{y=xMj{_YsrkV> zji0aUQ%uMN6xAn3uTPGv^>86;{XheoL|P!u_U1q|+Hf=Q*teaU^j7Po-seGSh?nuk z0-2oSkmuNP>E-hcU7i2aEymBt5LhjQ*NfDX-RVlF2<&6)Oe6KVEZAFsGIatRTc0c% zB}Y`VDc%6jCJq4#Q0H%E>4bCABi2jDfzef4=8|8pw)(+>n`5rOk>3~d7U-y;T3P=U z??bKQy{;MFKR4pN*kw79PHH*(kQ48}QVj9Y>)q^w*_O>bYW>5ETF^@|xT1+r>YD%Ko_~RVpiGmELQ0r4uD9ukJz=IuNkN*m|odc|2>1f9m z7uSc9dD%_2zE%#Baa=`8t{VbO+!(P;(-)fyCl5)By~!~$DBD+Ik{|wGO3!Jf^gD|v zJw>H|x1J-M?|4+mezKrG*(I@Q|MoFiBwPc{(4l0Zm>k@(zP>C75~K>xEgeOMCoCdmz#v@ozZuGP#JwrtqbOa z-?7Ec+AO_~nolFK@4Da|`(xvMaB5na6Wlkfu#j-G3Jgk5nXQxq!xURub2fk15QV10 zXjP>P`yHUbw#Rn_j4r{T=Yj>A(?UpozR)Sl$fd} zwvO&~fHU$uE84Ne?QPs}%of!*mxI?+$*Uu-eUEE>da@F=v}<8p-d1Mg?Lsroko#}qL?!qEJ|U?Z7nd2hOdKOlss z=fi1nZKE+5?Eu;}1+Xb(h{x~cK)!j~3B|E!G)LDF+i`Edrh=StYaNfZem#>yczi+d zjEQMg((>i20v@}*k;yv$ZCBu06_9ej8D@rB^_0s#E2J-};^S;c0&VK4iFZ@?`x}H9 zsc5edYlv(y#b9pNFqKywG4tx`w>wv2%Ug~Ke4n57nQn9GnN_yC61M(7onQA>s)*K@ zUva;}HRfVR?y)FQF9-UAT;k1PITKJc1HW&c@i!yFDZ8vAqU}{i>vUVMGk`Gw;C1hz z_JsW^4zOnUU%R}4u5eCOXC=Pl67!-&PQzySFS*2+5+Tudb)tydUvHNe5}kaFaJL-&5hS2YulIRTu5s( zhkAkpQY|jcJxbNs5s(9_h~IJU)h$WCGV=DprA!RNxKbKpxbc4x)oOa za0B5>_bY7NOX+Ut(pzDojD$_g-E8}B2W#4cn_CNpW>fft+N>FTxxwqO!eo^IAhxiW zX;OuzNt)I73fsC_xf5JDCQSLQl$*sHl}yQ6p|^`G$9av~A6wEJpB-GDK9yrKi>vun zZ=1@&<11kqy;<^Fuy^Yuo;UDV*^L5jDuUqR>Q=eB#!-N)(^}yQDRgbUTv3X%eOoCv zJv&&myj6NJR}SfY|3gbDAiasLms`VAnKob;Yr z<|y}FJq0J`9ahGI8IG#0`JJ!ta9q}s<5K`kNgfiM9CAjnzc)1ax2fC^rD1eUeHQQP z&o{$`HlRVgp6 z4eFWmPDvgdJV-j#znMl3Zg=H#sxr6>L8DhBXuLU5;`_MIBwnh-X;I?CE^(p~$3=-( zy2N9ZI8=!U5O1N@p9fJnx2T{FG%^j5GU_WD*2`I6qKcgyD%%+P9Y<=MgZ^SEG_d@? z?+G8|fS(gE18Cnj@oppX^1QUq)#!fKqoXjA2%-OrC;YC19wTTu3;)FvzR!X0pN@Rn zp713Oy6$zyxMOA8oDX&2ZwlNT7o3UTk>Sn`{BD6q?y=*gwdurnZZT+Dh&=RP_I})i zH8xC5pTM7ejb#mr3iL^iuV*EG@8ksv~I?0hi3mTbgy#g;{TOyi32?TztZj5gf0{N zI`3nv;@7T0I)oU~ru-{h&W}srSdPx`PLJQVMU}?s@ghn|Y3zapqviz{aTu!Sr&jr# zs@Z$d1b5O_!I#TP0yCRgakib}J(BH{_vx4eg`4b>elo-m=AVj(#GwaVGl60@JE z%O>Vzo({Bhh?V`sbiT5fcsp%kb3e9kopqdPi@k61+iE>n;;=JV9KYg-;sOrOe9gvO z>t`}vBqy<%!<;&fl-S%GM*DM^m0PW)yBNB4R7HuIN(5hmcei;va`V3NEZ$cvsUTHw zjR%Rn<=Cf%lw$mRJyvlHcn326en6E74yJgD3PYB(D;4f2?|ZuIa)TZJEooO$vxK$l ziiePe9Ups?kH*7YAUE+``DoBnHUuTFXv{AUQ9Dgsz*wR_Y zfW5R=vOP!ABBWf&*{mx$OOYT~a^evMyW>;yczT=9oW@1NcT7&kgn=00t9MnKM+azb zyo$zf&q?4QEgzOyVv7-75r!TaL3=LDbAIG;{|0gbp6zQ@XOTfQvcKTzh4nALH}v|vPkiD+Hi%wE*xz-G z-QQUQuUeoWKREu~v_8QB!EqPRC&qvP6VX$_Sy#$IM1uL#kg7LF93<`LF}Dy%$?ygQ z_f%1>l{Fs)pHDN`k>$rwJ$DmkEL39^2a2ZM|L}(i&2Ib-`)nz#TRL%DeRlsrt@hcEnS%RO zaES7AI=F{4J?e|G@_nJ1rpwXEC{;Lq31VdM2``Pa<)jp~YZp7Q zg;(COt(^3A5FFkOx`LzE_q-T|SHTH$R{JkAL|1%`bz`Ke{|ty2GG9TQ+u^ z4&$FjZeqZ`rF$4NA6K0(>L+0O{DMZj(yDoO*wO;B^!ML5r!C=9y}Iqfmof9BaKG-D z!aI9LYXSK5d;Fk6cuYs7gm@rAR^+-Go$Q422;+>xsANx2q* z_9k2N7?sywfwH~K;Gq|h=ZDFg#a89S60J1q;_5--th$nw8v2V)a6oj3V~2_PZeLPJ z@6YH2B02A$-8Q322iKQp4Y4&=TJhPL!2E1Wt3Bc<7`J%b#fxtIf*HgkiYs)`w*j|uh!*+RB^bc|8`-Nw4%mQuT7`*o*YP>39eZVOkgLk@HTtZHP1*@ z{0^2RZ%uxw4(_|#WAlDcdqUV-V}x%NN;}ve=C4qGqbC=;v4(_{Hz(>9j_6|u6QaG1 z=nGPOZjIe6t_V+?AG`iL%CT+C+R69rxHPjNc)1=?Z6XxBB-l94H1)3fsufe-l@3gs zheaqn811_OGgp2ocq&gVNj_&Pzry=ukyOM#;s)29t?khRJ8G2A}v>vP7W{6|#QrbFw%*1p<%WreJW$ zj(-@k@v1GndFie)mOG}m+}sC3*QhE>74rW`g$}{@5vGsAELtglke#rPU4LkZ*4xx~ zgTFhq33i7!K_AKTB`h~w_OGBlNhUwZ$6H=mz)k4P8JCrBn6TI#`C0sR`@KW>qIe2^j}-id zAWktszXBIwe28GOODnrsOIvpB#NBw+<%9h&jp;2Ax!AGtvjwdlY?lw#pa%Mtx{os} z7xgT}^+>xtt2*hCz1Z9~u1fjC`4#;7v@5IZvq)g;M29tl&y|kKG2frb++k+#ZOt9N zKiJ8undf#-h&QpdK&V9v)R;)re-3$^Wvs9P*7c=Z8QTPBSBlRJ%lboTM?9N2TO-OG zBlatfAvg2^CsHctr{62Qcl|Cv3#WjMr(6wNx}|oY z+T79|TCdy^6=iq~zTV)Zhj(<6OwZHUsbI=)X?3|Rq{8?;{bHA{xe2%0xRg$wv6nzS&&#DmYywkxqC%(|MY};c1ri^!Ec9p61T16;kKaO!27+nqtW2xwe}{+s*2^ zt+qS3x8tZ;+kN$TN_&wUZFU!v(Kh-7#;pu)lPWuC4gIrF7T)zLd z8swgyj!v@%DTaK=4%}q;`(Nn#MWNFktsccHdIA*oixE=8JyZxmCF%-Tmav{z{t8l( zi1$&YHa+3$(Xs=ar5gp-0XntL&|-=b-vhkjr@Bz*EHk{q0jtjJv+B(LqM)ex!JVQ2 z3#o`8&4PSPoM!bPJSfG(tK6einX-u@P&Y)FPP2p)NN}~~ayPX-ir-;v$IF4~EmFgY zUlbp$E4uMs$>H7kv4<|U>D|xpUWxI!u=qek*inx$Dg%oM=HLU$M(c)OS#>dt) z`K(Bj!xd-Q@rzKsi(0wYl7FDP)$muRW$xs+)Rl7`^>(gf!MPB2hZCRF=d$2h!Kx2T zMOCPG$y9#3K48}~b6;uN2fB{OE}f0My}@}_ZbvChou6}slh@e@NAUorJk|)Jy9a=5 z#LbdOqmTi|q=8UMARht}Bq14L@9WZE4U3)|V$V)1Dyv1&KZPJuLXhtsZN#F15Rh3R z$kY(z^)wKh6V~}-ni0AW5Vb(n(;5}VA)MgeXF!Y-8myxgZ5mSRPdrarUJ&0Qyx&~w zUoX#vf~xSCv86(wCW* zD%z7c++hK%c4~~fq}kpnW36lC2h+n5$3%}qbR-!;fIq_d_Zz4vTCbhv7nz;P-Mo*# zYH%j5b^c!&v|a}|6p3*HDbs)mA9+!1e$`=RKk zbf3Uhd4rHT_ z)l0_?3T|3g>X;|g6VRH`^*lawgnxkc@ANSL%B;x%Au6HhIV-`hqBJU4V0mQ?&!*V^{`b~(>$(XMyG?< zooRJ^gG|d1E}hsKqw+ejHA)}c{|y1sDXRafxWIZu@Hr0tQo*Mxt*%0)YyGPoe69cM z+1sr0k!e---vJKtc_I1eyxRhoyhD`C(Zx)@X~k-5MH98C+AY%Ti0U=2*oO~69Cc}| z%!&2X;j77EWyS-RoG7(x(H?^${kd5FosC5NtWaysuYoK@=GE5e+*JKG6QkBpsLWV|5%e_62ULC4o3TS}*xCaF-( z@vn8J?&Ao+CN=2*XF7nFB7klj&j>f}r!bs>{GKQ)?Y8;xF6-JT%dTUlqwVO>>NK)y zzsPQ4rUPgl3giV5fL%;Y2Uy_%_KpDTmS#G@V-8^J10e~!pqUOZ*8zMU0obk9bbxal zz$+2JE~he2c|_Ju`1>a63S;wLCWi8)Re_X_h@ILtX!CECoqc#>m8o#f0YrHr zDdA?It|O!)Kfod1%c0QKo}I(b*x~`);D`FW?WS+Qss}px4Tt?zkmruiMOj!a&XA`*nZLo4$`{fw zfqYv@yG7|5Xj8{!OM%^UB8VnP<9o&<5uk$ig>Cvse#a6xx zt9+?&NQY^N3whI2D^m2|?lQX3@{w&+op+oq)8^MKVnfP~!vt%Y?P&t~DL7LrD2J!! zowK)sGFn85mH!PWu{(j(;MwrU>H6`I`(flTEDhAl-*haiBP%2zTJs88^NNGE)tcAr z-l~)ir4p)~ADdv!==SuPQcX84l)rM=S%A3d=?F1mE09Y{_l;zty+i_a@xa~#u4gqDx z%$G;^>P8c=Cg;aagEt)`7}3bxZd5tNT~^~E zf;*6nZ5G_Xhuh(fm0!!ZFtHW=r!yVWCTo0;DIa41?Kzt=Xp6>`KH`~qLb;@kd){!4 zZ3a%*u_RtJvxDCCwBi*L zy0K~FAAKtAv($E;I?Q;VLqcu?u zTVW4=7~E88(cQL{-yP$0u~59W3qHQh$f%`ay)NS;Wrl1;bcCQJ^Bh%6D^BsD82sp1(+If~WOE8FilA8ueHVyX z88a>nt-V-Nn9^X~%@k1=Dao6`AT;BUZ4E-3c6N1W=2AROd3AG*1<}y9_c3(!Gd7XY zIEEXs*#K)i#bIi`pj(U2(AYq!t%+C}j{=#^)B(kQP9GdzBUlKhnn5Z+QQi<{@DfQ+wDR(#A-A<1i2HYYyH4%bgELrp{Jc+YFNUJx6X zRjuYGuByEtR<1)Y(Foj&-c0U)5$}Zts%|5flDGrBZ`skCujg!n-=w)} zyy8)zQq#2MUy;hSg=+uuQ{bDsaVs5IG-o(V$;*N&Ql++OGo2^uv~sIA7|U=IRD;;U zLhg21K$qZ;h$U6PogSLy3NYC@MFotN>|mcX9W4w*&;3q-o-VTb}5v5a6~m`1<5 zn0|NhAuYohRdjLt6P-g)|1ri{c;9-HQDb>43TxMSv}Js!jCeSs+SQ+RGCx~i9}FW* zEDN4@xN`jC9qtGD&D`lbnS`pNhz!(s9Ru)@?*T1|g-N6Q;Ko z0J$fMg8Wju8KpNkc}nFyHVbQpU^6<^yM8GX86FC-gGxtcmX2xlKtS23Cyg^ZzWh(Q zF<6BEb|a*ZTdP_)KaB(I@p*7i^Q5%ay5#TN5&03Xns%500@TD^q1N&ij}EqS<@_}V zt>_lg5u(UwC(pkdTdi4RcWvNFckGakI~@|caWFFm?=?9_?>Uzuwt(G;icuVL&5jD# z^BNtbs64L`x1c#23i@Qm50IR9$94o=Dj6lTT^a3DDu**~8Nr6@8yYqg^v{eRnb^AB zOM8$M8%7?L$PYdt&p0ywA-I#qkmg%UA*aHlXsMs^@Du;u;z|yWO5U%Mk&TkkF`=}) zA^ulqH4eMc2<5tPAipEgh4U@Yu2Rh69#DbI&K<2HQU%A-qtzmvrLJw!%iLS{) z^9RQRPY9-3KdF+V*IQ7nU5P`}rZED|r|~`(P0RZn?sJ2Ub#$^NY@Ar^qh-M}C`t0P z_1;P%x_nL^-9PZ&u34pq6fJ_(Ad*x(J&UMl5k~y&jb!R#(w$TrPR^WUy<@!4YQ*I< z>j69t$xrU?*kYRhW52A7;0OUUTC2BC;HQPOYOxxPh43{VRpdR+C!ZC)_VW_cy2LwogDgzsTXc*WvrZxMx7SAq2D5QnT6K@a_O(0K+@~ zPn~Y8oF!1Tk2Ngo|Dy~@xBPc6F^IwtneN1;ty)iW<@amMb(=Hay5VYjrAG=Qp<#IU z^6vmU*YqPE@*R#ZlTCTJL{OMTxkh5-CWrDRfvJ69BR$x_*QXhucSYH$LFQCfZniQS zm+f{Ib_-+F@{0cr_)|{SZaL{c#~bP)5o*_pt6XY+lp5akuX4#dM#=Ihrq(A5)+aB^ z#;g>}t7u4ekCo{;cf2<5l5Fo{^WF6BE6$sFY1v8VvB`TQI&T-jPR#Po(0i{#sz=~Q zXkL6Gj>cHB7x62}JE=%o&&3jQo!+ZAUyldil#bq@_yu~ohX$sI`l+|9I^%ft;qd?! zcT5)6S~#M@I$33}a8z*ebtYw;6c;IG`UAG&|sllt?#O_-)jj=aXKR-nY7e<~?A$amjPLIlT> zkZL6)jVHW5oYMEx{~vSlQ`s97o|ALVa&bg9@aza1EpB65~30N5sm0qbkk2 zh4ltRSemkfdl=_==j<;`nN zwNcX#|LSnX7B;FjYN~fXQ|O(VR=YB&>4RYzsc9vEYL^tS}ZurtHZZpZ)irQUy7&Bt&{OuFSofS>e?SZ-Ln3(vV((L%BQ8(`I+AwNyIsf%tKym1qS|Fc&Dx_<60dV5LeN@& z?KD7laG=CLcA!041$|ARJtENk9O$Mpuv*_s6mhl0rXdw{H`&fFlqZUe-K(ST{Gggo zqOnYu@1<@yzM%Y5qM42y#-@g|$T_me53&Z8>eWnc4h^wZq$s+`a(5R3cky5dCW{7W zKuRph^!O?o9Gu}ma}{8(n}T!`xXz7rk07Ds#r44;K`@Nt1xSL5xpN%&VvEOWjIQ(7 zooce{8q$pX#7BqmvVb#SKRLx z!m`nUgLBR^us?@jCU(CMR4F?zgmuRWIEjG}{aXtxPq!1rgNtDv=FM_>qoceNX~QUl z&IFg&FU(5|9sBwThLKk!QjN$pF-@b}xg_mYVgi}NTx%dXtETn|zSp;0gu*_ytykD5 zSmUyDZFW&>-0pg!;r@GC!RPcXTR+ql9NH(i*ClBeIC-3fj%yxN=xXQ7+3iGmRzvGk zfOWP{?1hIB#yG%H5k@sO+rF#NlH^WYM%N-0A>E`P*;PEsq{+ZOR;KZ$daNaf^>dtX zs&KF}n5_~ZK#j3bqtEM2<7+BbkduTG+&@L9;v^b~V z%yxp2itmxho!b`j8&}^!60A8yc>0&Oy)G92=1vbA<96>dN=ZDH5%9YVd31|^#+sKzG~ z+J{h;tw7bMaDBDeQ9QR5sEsM8mqVz+5Q-}Nkt+Q0>XucQAA;`M2zm*im+aFL^qdg1 z=E}y}M)k0*W?3cw=n!gI2nFrwAe`Q#CBm*D=-m$V_oAC#<_44L{~dC)gBOS->5s1nb;vEhDB477`DOaPEWf-I0yGU4|L|b;qV927t+_}R zEdH7!9quN<;;$QE-SNz*>^1_;9}|{M8}V1l!&(*`5HjR!V5hJu~DEqM1ft$W1&w$??l& zaQIQpEoLo#2mYuKekt&RU1Z(Y`J}Snpn5#YvOepw#=0!s?zd9br8GKWn8XKF*cord zu$h_b;R;M>Qb0yIDp2cxje8IksP)%7``NQefe;vyIsOaIo9Gw;Y~TE>-^~snm=*Ha zp*g@M4q!zD(7ri9u>*K40@$uOz#$G`ZUoS_IY4Iza83xI5bo)&O@?Od|I=B$SeZiR zq}&_5u9oiJWJLt>6IW%hsJecpRXQhm28uGu`?!2{yeQd*Q28Bd`lCE7HT9k{FuQd9 zl=;D%4m4Vht>S0O9!%Z~d+@jbPSzU?f0y71W*A${l~*pR-$w=uw_4F6Bmm9ty;hwu z2G*(zZ2gR2^cE1{4y`I_;$O9w_)bNH)_IFjIGTFbeN2{ju~xv33^}hF52*j{5vGDY zTw-pOu5m;&g+u#WUWX{}ptQVQUEaDGCWhRq1Jd#~^|NxTqP(EIojQR z%E9}O@7ERsBN`l~c)?BlszOk`p%!cxZZNVnrMowN!%(+1HTWHekMto*|4*2n*O+cw zS?^hT>4jE}v~8?wjBRXi*j`ns3jcQ&IF?S5pcsoAijUK|=mH%*zS4m6#>4%vnRL8?atHixy_LRihE*b?qHY+=S;uc@xBh@amQF{+JW2#GiJ$`84C5t9g zHE+!?PqM9YD08aiLwSdBXfBBv)z_+@z-B|@jV`B8oU~N$6ZTzF^OJiypmH%V8PqOI z%Z&U9R({M8j9}WRwj((>bWdYTKM{w^k5y{ za=!;aK;&^;g35Tcs*c?US0W}Ptl^aT{LZG;J9%71EXnKQ6?bjQZ=-w-ooa7;O!4(w z)z|D`gtzog8wD-nZ5*}a4RMKn1SfiVf#KFA-iX}ze#yDhNhIFp!0x57n$qyT`ILb< z#qskKuV)T?tMr%3!c1?jie@hHZm^>VqUS=BJoJ$@ZFT%OhX@%n@y~bu9V*(qDu!@;ql>nv@dpvK049jCrM7L0rN4?+n z1fq}RlGF(`=$=@bS$RwYzq%3!VIPc(VtkCwU7nGfxHvC!R=*}GKV))zdZ02c`vA1x- z_BN2w_hP=2!=>zbL?~Xu-&_!Pjg@6nF1e>wV`?VB9gb05x|5fy2PaAo3C87RAX2^W zd5qQOc&p6?d6}___jjRedg}7bfj`8`w(d%^0ARd#Pp{RYy~H~ym-dIhp5kdjURQ+1 z-GRO6N?qtQ917BD1(U*MSas@HzOMA&i8ltL`Ddtbtt$5esFI}_dbg+z946ao99_2` z;`<1E{x!WYc3FA#0$mCyccZ3}1pcm&>|*tyNW9O$Qew3Mxq~>`Wfx-8w6iXt{&^%F zfUGWL89N)gl0747WUE=BR5;|S+J%{mf=8OA-3Qe{e2J@j3Wj{xD&A(%dmx(_3x_GGRL#V0B#>phT zq-I$&fNMj5Ya@V%n*p2|0!)bj63qY#LV)ohKrjiOo5AFSFvmqOIPI$cPW<*q?@9ef z(G7GLu8XT$;owy#)x41r0UPc^VCuX8~KObm< z=_824fgqM|sg4;-EieHCBCVu$Io_|7>n{CN2q`_BVL_g<{0ldy`hv6$la!Mjj{g}e z`>Gy&`pCcDQ8`>xR_@_cvI0KfZD-PmM^mL#$&%s0$vg)ZtiyG69WGl$%o@N;u4q)A zk}E0K>_5LrPq+TRj+@p^QeFQ)aQAKY|J}p>zsfOmV8l?0By5SI^u0TDb831tAz)-5 zZ=LMR-P6eCgiQ*bEPrT3_CZJXd48K5BC?8qDa-ec$kz09?JL6Q(J77gZr6}-D%I8Z z>TYR-o7lTIcMI#gP>nJuBpZs}|MUQBoTbX!TX|(9k@IgRPNA*C}m zh;(hO?VhFIHEB^N!Y|TA*fqWF=5`N77?WA8;}?`8i{an7zswQ?Mw)pn`*mxBYV!}l zGHdHc7rVlZ4}WJh!|F7da!|41;o%Tx<;XVNGao??de8gSDiS|rV86!UVMFJ};h|Ta zzXyask{TY?DBFgIH%Qj-;1>%w+vKuRy)=OIna^Vn7Z``AaEFVTQ}vCSB@I`R~$LBuUEGYhpjVT|&Cgs-ZXY zt8q}dXFn6*Y~_4Kj#nFwD5#p5^t3L~_g5Ps&UZyt9ZHeE3K>p|MHI@)yH9BDR@!jf z!}uQQ7NYXJ{E6|mEGEb z`rBA6Tu51Cv3j)cbq&YkH|6g(%bZ4L%`1SUa9CEP{ zyefLWjev}~Cgq&cUcq%R)UvVTQjS9$tghITM72EHPR_okgl8)5VfLD{v^7@NmL8W<@g@_UM|TQE zdWs{qtB65HG*CKC2GSIH>d#2c+Si%2R(V*9KDENbIXvmyIuH9sJhagmb1T21ZWc~Q z(m43{Pu7+8&TVYwvnUWXbNA%%EKX}o%?fs)t02Q)4+mwTP!4BfNbcGX8tb?QTQ-po zYkf_8AW?Z*rsh8$s~@u+l|_3?NtmU&WeTs>V_bXq2OD-KBQNVDle3vGeB@UG3q4c3 zRXakD?h>5qT=LJw#4AdSm^dV2Vl$JqZ7{L9)~edSH753M#>A)X8T(Xq)o=tj;b`+- z#?cQVezb_wNfOK3m|rW<^oG4rwB*K^n=j`c_EE5AzI?1=16M_wq}F6=T%8vA^Rl5$ zY{>8~p@RKGeDs6Q@^v`SUE&9r<6w(@S^nsCCe)9CF`;g+`q<3#V|9@=qzBu(7QJ4k z@?x-xlJn&>yf;_XzyCug${8(-K0wqa#=nO(t$>mql|oneM%~ z)=l>kA!zVVlmm?0@!S7TtO*~%9a5ZdZn;5S`B4(AVPG*L`V|@cEUEE8a}z)O`-O() zar2d-dm4eK<(SSTC#Br2RP)0hOi5y{$nz?4ijYzB?H!-zh|i;yMz_|Y1+Goy=uCf9 z4lU{W@};@q{GzEb8N&)?laBmjrtT1ZqVdAUOEe}mcRQmq?Ofedx~D`UyT?t?D#VkG>Ju3J@CGupFGMn-89J+<}>X@uq4w;O~?{RyVnoftS zCs!zCLf&}cUj#}ud2ov(z8h%qpB~@ART2vjty4s89L@+gtVMsUm6Bt!Dlf>DkCmKe zle65`9Q>o$uTYz@?&VgB+?aGG%Zn-F+r*E2q*K^GZ>L`c4>6ZTDYsW2+g{A2l=A7_ zEywKJPn7vRr7VPL4AAASNOvK7l_Kf~SmsNmvL$)r`Ons13Xnx`1%#RIMLyI@O+NjB zX*91Af?;_qx#ExqhkyeMJ%BWynr;^THL1x4#F^HCa4<{vT*{ za$3VWEgHj8&6=p{`O$nKy|%5^|Hp0CzvDLRPfla~r7Yf$sB4b@DjBfc-B@nhOaeQK zb3N07e7eWVhvF^=Nl8Up(o6=E?YKGP^>S+@dH=DY;&?;@c$WV!?qbu$Z2dghPMAZ$ zmjf_pKFF-LAy0suDY;GS-E{mB3ehsB zs%3%>R4Q#c-p2n;!?{i2jRgCPew+e^o*U~P{=?ah#6=N_T#=CLX^K5o)rL7pq}=c} zkO}sdjGAQxoO=n{p)budRx0Cjm(irRFI2|yt(3S|8CPg}(QKYst_%fuCZox~K1~^0 z@KniY;!>WXjP`D7(j?G-sEAfdk zo^f{Dru4^x0@Io+)|0zOD}J~uL-2>u#ID>IQa4)O%6i{b|ABy8`$h%3S}*zmM7g0g zE|4|mOfV^IC?6Eu%%rKwU}^sNpR`MnKIPP=L#*sBlEWc%TH_G9JNz?*wu4@mG==ZS zxoXrQrSLy)VZpOCg@5bcuq-_3T|EV>Be<1!FV;>9dUDMzJ^{R@BeCBEHi7YW~nfIx<72 zHc7Efn(odFLm}mE{IDIedM~yZMCtvvy{k^Db1kihVQLXPi-x6_|EtPBke>2qQrt28 ztUO!T*eHRmlI35u*%9_1-zf!9pw|+LFOU41S5-7L*RjRzywC>E6p5_7 zAi~s7m_`_d)S6twCW=a_dQiFU{xE1z#5!&RR0v|8@RADn))&{BWm;P;6pV&up7E9yZA- zB8OK~w3v^tXmiO7FZ2&j|5wv~-EC7^zaFlmP7&l!UsFrjqFDKH%qWAtGM8usVp^?n zNc6!?N8qYL`4ZS;XYo=-M5nOmi!Bc4+q!;Uw58C>%G`QIB1qS0=RNMnM8Im^VukEn zZmrwOoF*%cE71OXq>GJhtLmPrlQRjU^31Ib`<3@jO^;~5GbMc)hC`Yd25XN)Q|-~D zSFOr~tG7iT38jY7mz7!_%FSj<2Z~Gj##i5%%Bc=yqY-|r3IEOKmS=vI;(d7Nl$$wF z1JrEOzcT()9_R1zzhkTXZ_Y6OF`&u4VvCoio4qby*i<8%>V8Qjl;yAZjmpv0@`E;1 zPxT_#s(mQvRqgN91X4}9JcqHHV0`uS6vn+Gj5CDMnFk!vSeY*|P-Xw7&L%(GVEX_r zCHZ7O+Maugbk6vJ;b_r?p`g3gSdzPX7zl0#_`CiK9JXlh#)(Viua(^pVLrlPwoSDw zg!zK3pdV~g6|-*VDlN2Fnp<=uPcyTiD;^6#DcdoQqOgAGUO||VLeuMj>N|tO|!8~ze5`J6ClDyXV0() z23rIPC74L{h$ptT;RI4E9_M^zG&m8i5z7rEBzxO21+JYA%gX~5wuU|55*vWKSN^e0 zvWq!F_rRm|-{Ce3J;C=3qLt9GET?17e@@j+$G$NzvpSf41P=F=$LF#+!*Pqm>uor3 zabWO(D!_Vox*e4L8Pp_&{`+BkM9TiCbD3O;vaCk*Pk>X<=Np6tW@!%5GlZylft(*z zpSzTzzQamfq#X3%CR*{`XH+H}LDdQEMF7fBAFG$P=WYKlw-x8)=oVFol}%wq!kCnE z(xMu3>(i>C6Lu{i&JH1Jo}n7rCB>xV`|r9`9qBUHyRCTDgNnFZ-6OZ#mLeOs*gL9f zq02256Qr6|sy3eORbFtWX>9xMP!hZQyLGfq^_hCx86pU=NN(y{sjl?wr(l+8i5J_p zqC8vXe;us2?X2#l;&N0EPb_TLOiRk^lcb1a#hvqPG~r>Nb&DjhuZa=Nx|uaHj8i|s4E=TI zDuNO6mmyF&UPmx4h6D3{+)6qbU4m!)bchpLf!GO>T9pnqqN9z-_H7C3A(HLaH1##B z3AhyerwI|ieG4{Ja@B`TOIE66zAM??e}O`X{7r^I|F?}8#__WC48y@X=9=DyN_QS{ zjQ5?LSeuYMBfE0=<6gqvDFgd{l#$f-)fwsG*~t?+%^o>2v;58Kf?=pLM~n;X&+Ir$ zckXL?^i`m%(n}@U}IoVka5nSlL2K zi=?1pW#@|ljyacRdthS*9Y;QpF>QTwDxgkRDs)v(D8!9^@Sk5{AVnPpWhKjebrbD>?#G{@k z=`8kdJiD13{xJFjn&F)WjnBIBPX5Lg6m!5vY$m?Wj4habB{JcW&<-mr68aQl1zl9D zy~IXoC+{Qg((Zoy5vqN5a<<|pDfbAMOOM_uF`#XH7s_oY$Y~QR|2y0y-k4yA+B6cF zN5k<}c1}2kr}K6NS&8MDoHXB1nRU49UY$Zy41o;k&0P;}Zb)9$$s;sF`}zOJ+`GU> zRh;kRxh$~A>REBsRimuB+MrQ4nrb3Z7jhv&gcX9K1dTOP)Tk+JAZmo*Cc^Qs8kH(- zZA)8iy|rqkK#@v90^#BX@s@}nYOQBkMMQ;g&F^_;&e=V?gg{&S|9|yE&e=Kd%)Il? zdz*J|+Hqig44u)~1K4)E-KZ(}%jh^UAB`(rj)(J(QIkBXMJ~oX;YERGd6hM?V?5a9!I*!j17Du>AI=$3BPn2GxFKD>8? z+A;)ZVA1k-2EUs12T?!b{a<12Ioz_9I4#yv|8TSZtCQ=$odBh=ryqHvy>;Kk7JA1;9#7F1%`40Xl8|~w-7oQi@TNS+3 zifw-r+p&q*`p|dkHd4+Ym`Z;yr#;?z1&-8JNXk{GI?ax(!npt6px>z`Mt55=nl4jY zgEuE)WTl@Yy~my`Z~`H}iOpulpGZc3oQxw5B$6?EO>{FHPt%?VYeEMqR|UmZ?l9;l zsCn0O2L0}{V!KABwg!Kih;5F+`&R1ZCQ?tZqYCaby8V0;-+VZ+tP*(m^!ePtYUy}j z{E@ld`&zaA8uiVw>O0s)fJJa83FnR{)C#ZZ{0)$K2F7c?2+2JGqkOhJK75hsk7P({NfRc8Ol)1P!?qIlWzB;mR||o4{wo& z5Qo|-CrlLk5456%JB1ZVtr@PiYJP+vl?FG=11RXC#?{6WRVNK0^y=?8*dcLKPQrj1 z>-s~@e)hvZfSo2Pjtv8T5}tD#t}fG)zFwA5o^PEn0jfsd66JZ|$t zLV>TO0tYPoG(nmIFKFUGHEhB$q=-o(gDijCZjvSP4e}Dq!DbZ*&F_0gw6yU)qExg{ zYW~GKwqHQ8C-J+X&%%G|Nke=gQ(J>c8p0}%E^ z;^srkU(wfA`TP2h26hSB;z|>{ByDjR`Ac1?7SMmW-Kl>;>q9l+qu7~LT^l6$Jz*Ze>$%*M#me0{8a8kKr$E(6M=IA}ZZ9G{9HgR~`+gV?Ji9)pouY+#o zLNBkOC9C@{8bOK3!55yt1=Z)n&s_X;@h9v2e!tj5m<`LhJCbL49&UgyeJKg#e3;5rPr>%1lSorz~D%5xdGqJcb6 zkqvbZV?*me9WInA#XK|=CO|post;MYuRFBNi`_*j>A};n_s6&fz8LokwfAKSv)V{L z;aFikU4v)@;#OFVHGRES3~xR-9bMu-s6sKB;K8Rt)J03gO+%S@5=~CDR^Z7vS|y$i zJSXEx^IL_d*$lke^e5WlIMy5mY)Qw|;7q{&FRS%fs>K1WP>^QT%ItUWYY9eXDUo$} zOXRoEmvtc1e0&5k=ivd;2xils^fuuq+T;VklYAAk3go~A@&mc=Dft@XKK)Poz;k3p z0ZjoQNf}}xN$G5mq$D*N*oJ2go+NE9o+NEPo=$z{2?x3xuuio-o&8FMD^5=gwbhB< z72_wCA*VVHSV83nuD7bro8PQ&!}X6}e?a-2B;NMFJc(5gauU95rRI7FNcZcC?_TGVf%L z;1T~uP0qX`r_z{)_XvkpLjOzuzZ~?b)q>t&j58?pWD6<;L0a-eJt&1#@&xq(UgJFR z*q$GTCvJBMo;cCcL1b%l6iNiIB*ig!dg+^eN8ImEohgd#ha<~Njt!n~{A||({EU(^%#yAbCE54{8yTCi(CvTN`BH;~|RY69*X zWw5}Ghf{->LLL?B*rg9SMhJv2G}D=?4gkaEoYWm^PgloMhI7>dif}$W8}W;K>PulW zxItFx=6s_p@P&J{lth=_?-Id_0l-ixmElRHG#*bXrE)yIM}S)WP^kH~Dz!suBjJDl ze@O4EPeCh=oZe>;{P6T%hqI%hfPPSVKY?%u==$H%+v)F_-m|`Zot)g@)g?p!6OWjp zdeXZEKhdKB0MIdza#Mz1+vSJxc>PYkmWK^1umAIVfpUd}rU|P=8RQmPeR4|`p5zv` zio8fJA~TYU$c^M8r@l;~oD(eQ74d{J6^m2|B{;VnoI9(H=o?%VD@-WWgUj1@gVmN* z7~sT>u*8jZ6E~;s%cm_<8lteCNUYFmg~--<^P$B8IGY7x{08Ku8Wt(Er?2{glz;kp z^MpHqZ&Y@EJcC+^0{}uJlzI!1T8Pv-3i=DuGbn}1sDd?}>#av~XnJ0dPC_XZNEOWM zTY(5KjLTR$}aD(?H zCerTC75Plusi5Xb)G$>7a8X4mJh{2Doi<)jDy%2GUEbeo#}~u>kuE4_9jS_7L-p3B zV2B3q5>$q;!38Lf^*a5Dj~;nUj9hTSp%dcDq4;d%geI#N zBZ8nD5!A{NK^;Z}K)W6g+~Pk^YUh9pZ-QU}H{RxouVlhNTp$5Ypk(*#W%<+*NkKm9E%2yX3F9=~_ zzIiAVE}|huegN!aNkVbcns96c3eb}9kOjP!h7GyElm3GPPx7!`5AJ|$ccB?q!*F7DdZc?9_@yr}Nf!vuEQSYm0TPJ=U>g0HQ1zK!}`R0D9=EU;u##W-jPsGe}t| zl}d?JDy2fHd_-tzngoB`iC#sk$-r;{$h_gX-ev+}IEotC0JCwlol*+L$jxXZ#;br^ z066rG6dX8`fM7(6=u^V*NeT~^(Wwr8apGjPhUI34RkG_7Y;JPv(1eR;?vK!R`r?My=XM4|T6UwMdxJQq7pWEX~^G%VXh_TV5cMfifX=N{d1g) zpv+$R+`>ho%WV3M4?*)`Pm|;hER5@JiUg3)5+4-da1RR2g&N5La(>9Z4~WwR$k)nY z$ASn(z|{|R9gAdlP|#NB+kCHnnNjO6sBaOJ26yU_FnG5Z9yE+44p`YxJ2LOXndj%N zQ&%gaTEh;?jEPRJmTFP17{kppAU!SA) z71m8aIZ+9P$x*SkkWc%wXn}rb1S2RCKM|(MfO(NHBa&gnLU~8i8?qb@fAzC_hViVE zFs~3MEg44Qv)!m`F=00AJ>t`Bz$_!o(wEDL*0p7WtZO@AK83dEp)ac6mN4HF=Cx!PS=UQ% zNtpeF`DM>Afp;ZLS`J{Q0VdSuop3`d&esXcFb)07EHX5nUKNqWn>w+6D*3#maq7xz zuTkFz7xGNrT)LRhWZE#7HpV@8Mav%Bts9Eh8Fblx)ci^l*GFXxWt*OuLBNVVasS9gqsaCLR_YLTN@95vD~8zgnf2_Qt?2+!YL zcq&D!m$>mnwj7k>MSVpr%nw@lsC_;M-ncG@z7I-Zz51sM4|Izab(u;7FOe~e_B#nh z2GHJzo~R9@idF5WcHz!8V!tC13vj!VkqhhZA(?ud#NtlN=^MPN`gvf31?VKAgQyw z0!Ms~e2r{Wt9j^H9vh(X7mfSRZuOX z0o7p{5?3J@9S^|9GKh}h6ZCDNH>fOPJey%b8)<9IxS)L{_*#djU4I4ZX2QIpz(u8P zCz#xJ%JCe1Wt+ZWE6PRmT|2I2>wujrY)ZpsK+XD;Zh6a|^e}=Ta9+WHHdY2qfPh`U z9tFp9&?SlG2yIOTG);SeLaxyZMlL#Yu)Zk7hIhIH+(k!Up&U<_ZvPB;$bm1dA_u;t zBF#HFj{{#aqn}9QS%@cR{K=Y@CDSDCIzEELGdW_$RfA+@Em*uD`sExC0!<<^R>)c`7 zs$^^FvfbKDb&kSHaX*$)(klE^(X)RolRb+}=nOvC#ii6g-kfCp@6#Pu#q@uF76&i4cl}?8 za(t%#_n|NS)c-p1H}!u$dKvovFNXflQ5wWVo>8<#|Npob{hzNi1SCSa(19R`O|Qoy z8B~~qUUh+CXfS&+0);|wg+`+|5*vyqomi)yk207qLHkqCF@EyMZ+^5T1-hRW-~cZ5 z73Z@-TtntUFW77rk)ZxXb?mnsy_39zmk2gacSHY|C=b1k5)<@4L$`<4`1<3r2%oj3 z32Gm*XS7nk4X}r5(J1*%v?wx|Is}9e^kfhD3`DK9Bv=Qj8;J$!gT`Tg2rE{iP2hpj z$io;)Hp%lOg`bUc@@R*t>O3lB`*-(>p%$ikIflx@h>G4)(s`Jc@#jJrijaXSgrc4y z(dLO!X6V522(&CnXpJbUdJbo1ll3EEZ(5HP4)K7#>2%sS%6*fVyKq{)RRYFBV>*#?F48@QW zY4&QF23#_bM3qlw@Zg<;QZJtL2RRZ9;7OapnP=J*+7=Rsw#BV4YdFv?$CSe3XyPr! zv)h4WxA$*LP=_`Z8v=lCg=#^!{hxa=#OL9hG4z7MX4dL2d?0YFFtp@+qA78tE;ezT zj5Oj{g(q?3sFgSd@g$D5coIh%SGVp?#8I1?8<`xlPg6@H6X<|U&5w)~Pk&^jcos$q z_^h!-hTv(&*W~&D4;YH|XAmdwPp0TSw2%_s9NK++4NZGi-Uw$+I@D)~OAHo@^$U`J zL@zEB@dogT@V1Odj|{Vre~d`hTp54B2oY_O{6if91B%~;;24_eQt%V%i}4fr0vsUt z30g$ONcWX=@Drn{w>$G9*lS9D!alg)lAn$>IfsHn&N-VN!?+YASCFC1WCh8w9z&Vk z?}^T0JU}v(@Z`x*^fAoNBEyhaWEgf<1)l7zN<7(F>`ZnRJJYS-en0RmaLsBXjRa2# zmikDtR0mmVdWOKbTHq!9A3gY~WU2f(OD*))BNIYobMVl|N?fZ!3!-abte^!~G7fPi z<1ol3N+7yMV3!yhkzFEfgm#JdE3=aEmj2K5+{h^M(ezSzs_*pt$mQalq_Fk7%3(TBD%tYC;5W=#7_>_;QTR*uTL8R+|gy;`RU)oup$lR*D zrcY{#+SOIJesu)`;OfWfZuK4IwcRb-oT*={Io?~lnXJ6#@V0chVGsoHX7!!a-M6mc zmzJnAwMBVth4E{TI~8{g${)&W&HU6Ve}R`%SKr#qJQGt_sOww0`lPPMc%9^;SonZA zUb8r}gC;4nv*Av3dw=fuF;w9CP@7k*S6sq7EyNG0Pd3`To3Pnhc@1K&yjJEtR@RWZ zo<9a!e;jB1;j;cX-umMN>yH!7AE;49GyoWfw)bsS7Tdf?32nE{Z`~via1#OiDf6CW zX5o*Mtv^n&{>ZTYIMw>&H0zH+@<-$zv;P>7QyLi))LdTiV_vhEMKScNCNRrh-)bx} zGu&aaS0 zC%(}tc+es$2`XU+gjtL&Rfy5;!}i1WI@NRxDaHcl90ZM$ZyglxKZlaR$htB0ArRw4@k<~YK5(Mg2=sHJxQbQd zIT=rk-|1+unVfQBs2Bx>x|yvSuVr`!@f?q5EuQ6g)+r4I5J}~so9XA5d-Joun$!de zxkNy0Kxk!ZsFkaJY}&~0s6MrkU3fUOk^4w8Ea=fM*tfqsZ-33Y&{wIaT^`thSc>vmc<`n^A5EtkgJ^`hB5vcF7ZcL9U>Ry@;TkTFgGL!z7O}@4$o7aa=Tb zB8xa6?*Hl=GVY%*e}m38{iitcDf)c)u5Pj8#F+k(`>DYGWVu|>&rp~&HLQ%>&)N#{ zbm&iUBvF8qKEMg-p|(u$lVI~B&0l$l{33plARqStaYH_QsNRqd$|&U{7f;GZJ{V76 zs9#D)gg*qkQrd~J8&7(2v`my|ikc}qG;wTME}oPfw%Dl;{CYoDD%70M4?~byp2=Tl zkhSu4N!B?QvN~&oW%bE@5^@UCvLYuYbzm=6Evo{S7|SAwSO|90GcT8G8ro4c+eGTK z4aAXcU`DpVsUNru4BxIa(g%n(P|Z+(mEn6#z5Ki6+e}RKGVmhy`$9SK3w!`Tk5z?-18U&c0{#L)@X85Fyq1RP z0)akw2Jp1&=c6&=)Io6pFMz`(`$N0arysKvDh78Wyz^=3(*ZR(puQh@s#Ul)hHH+JZIml^TNa)~ligW~ zC%cn6(}^clrAzT8D z(0DB<&iOLU3+X|`%B5HkC*nYyh(p}G?0sAGzp;pv;^Sc@c#`nMITKIfoQ0=TzjyDU z`neFOH&LG3>d{B+UFhNpqlYoJup7P0&fdf3&}X#v@}Za2Ruct108|ldYGB+8y<9UD zwz?t=eXhEQYli3=8VWf2!cvri&RqD(`C}X)rQf(qL?k%cq;Fh}PNpHD?hoQUvvC97 zYL&*ffIAwDc~$(yfdJeIX81#>&M&L8qe%`{sn4Izp$emXKd=C|(?E(=&fEQv-HlSPEtSWjTWRRfOA7!X6>re{>c zlsp-qZyk4Sb~k0(vVtHSg!DdXt|Aa7gS8*WQe>CEKm>(gv&#+df=dGo?;>BnJY52R~mkeA1Hz0f1wQ!Swvw}&t-UWq{q=Vdx;(4)K9%m;8hLy3KiM|jv?xkllKyy zTL*ahhHw;-j}8WrB$K)HHy#lPO(q*pr=gd6E#{um0k(vH#QOaONQ(jB-3riyKPOlI zkP7tY3{S#JcsMc`Sfb`02#w$hpbc|`_Szsj zWoRn-mCB)9Y3N7M-0OstR4Wb5z;zPH5dgmin505Z2@Wrgg(I0;9B2fyMC^gO@YQc2 zqjVCHh=pb|@eVnx;g*E}^D}lL^OoUBy~OINOX*W0{{V;p8ZQhtVk*yLQvl?h{+j(n zvLKpIFOu_90K+@=LoJ>zJnQgu>zDjY^l}#1JchqOl$8rzL)^{!WxeV1kOz2U03T46 zR|&7zhsL{DAu7VR96XsZ7f&KC{f<4y)9(nLxl{~(#10N@_D=Bc081J?!#3dfZecFZ zk!{h3%mv%$dzIxKfTFy(daZ3PYRle$`hE`Z5`en}MRSNF?FD;ZjOOtquEd$R5@!;b zIJ@+|5AQQ#0ROfBaql`I5&yOO_Ri;rvP((+$A9TBty}xU;CrS8-;-bT|SE?YbjJk!f7!|6Oo&tINa_|5IydFQ%Egk?-4NJ}H#jhs$Arr6kvH(N7&n~p< z>1csCv4g1RF<6~K#rXcgWo@m><@a^iKe(#R{y@B^0>peS}+1x(H52Mad5B4p;PVn4fiM<6O~3@}*qa8JUCc_4ncD@-C%u z1Aat*5$Xc6m*bVhJQs?d>@y$igZbz6c<4tjOq1s`92}o9<}IW{1tbFK8#+*-?tbV3 z(z^^PhUZj1og)!x{NVrm-#Yav7hu#HlYP7X*BfEDVeG@ByF$BOOeduw(E)8Uno)?;*uVS^QVQ@t_MJsZ$(fk4;>36>*h$xma7rE48azW5Q%O$Bp zWkv>}1k~Y438-LZJS*`e)!2G66h+&qFAR!>2>CoL^q}>ZK7f@Xkj8*ynI;2~6sCX{ zgm&PX4LC=kE;~xf4E`7&JR(9Rl<=YTX)4ydhuVBH5=f4)fz;#{AL$2?*^cS%`2ySF zu|pBd`|Zb=EBLEjfVHIrADdO{sNXRxrRG7PA>;)F(0?>-e|PjL%X~l`sGBsr7jcPY zrb(i$iVyE;s}`UFwg<0I$yeGcst>zLTO#e+HL?9&rjnB3))khg>v6@B^mqz!D|+NtU4GmMV?a@r2z+w^vn;htBL$D zs0V(i1<#;N3iJ{4L&GgGevqTVd@r&eS~wdfQ#k8XxsV)s)WQ|@K)xp{2d?<@3@cZR z>DkInRF)sa6;EM@E828uuJ{r467OFWhVHM@&PD2xDox!WyhUi;q^SdI;8?`&rs!js zTEz~ZUU=j5KjVxC^E@vjew+g>=Q~IzNlwkB>`G>3w^G;o@yyWuGtmZ&-{7&j`^}%u z5RMxYe7R6(2-?dqH+aHE!c#_@(qOSxaFQ!Ha2Jd)^x09f?h*P7lO>_H%n7YcScIOf zjV+9}oAX~|{n1yov8B;P#(eJB-01V#*!<`pjo(+>qQBC{mP8+yzePN|T9b3ynz7%; zaM2O-#RvLTIA{+@`G8z5Qs}1F58>GqFgd}aLv7WJ*cjy(d#Iuv0Flm?UB7ZXws|mC z487-28sFfjnKrpl5D~25E~ViKq$!JzQx^3DeKThV&xJGwxM&A-`<>8ZpdpbUGUE+<(R?51&)BwvLl$}#Il_eC2VIL?Jn336MB~=q z!YPPaffM$G+DDX~@hnz#4|lHWhf^u41^2h&q!*=ung=^9khKu#$f&D~Nl*kCniYO8 zu+<^KD8d%O@g3bw#JBc$qRi-X;9u!ay$;OL89E=a4O?`izC=oBZ$DH)jOa*xhZMY) zPalIH|HKcrSOgO=*>}T2;R*K0PL;!GLfNRmDkRIt^p`mDkbI963I0wDAb5_~GN z2-M^{8@yUBdDoJB)irRkf^Y=Tt=csA5>oGjRyP`a* zU{s4WTO=6J<_ZKazKZb>Vq|LEVZ#^8E-KS^qbq9epu#KHhdjfgNX&V1TO-3~m){Ti zH^?2Wx$0y%ZR}a$w3+fsJc^xYxy?ehMSm0=p%uFz9-s`zp&5YTILGju-FOw~(tC@! zBP_&lN9=eNIME6iGo(~dl1tD+eamh8yCXWd&`bm0YyPdi$PSDue8JDpF2k2*@xVe%{`5;pRU*`(P3+&(k z09!Io0=TisRKx?gHcnz99I(VDoQftGI36VNXyKb!3klY%6nqy%6>^~+BWRO_*qiN> z(X=X11(>+?_kSY2U96sk@YkV!Ywx(9M(-5SDG979N?~Y@Qjsr~j+aL;r42ekCE)aB zsDw0pruSWqe{4uC{!t|`zM4<3AHS`ga=TpQn6Kiv;@?{O2CWHT$`$oSAF#~VhrY~5 zVTCA!(n)uMHk+O%E1|h0o_-bCe|E)^4zD^6< zE;Wkuz5Nw1b+CYxtHpGLLyh#`-CkfvKjHK(8z1UOM|**oPfA_U*p0*V)UnPWcN&W5 zHY3=o3;gypHlSdg>Q|}i)C~1@tUQv(=}F5G-`^MdGK)B~L%qlfQ5AzkFkA}J*iA+} z&=1$@%>F%+04Czu|KMEj-<>kW%}Isju$d`Ki6>xOxM(cpH8J0TAL?-+y_7nGI%fvZ zI0jdt_!Apvv`iiANNtgg8|lPde5e-1+C<|VUb*()uJ3ya&H`G8bDPkv%2H$ zt^Idk(T|?ie?3;xY_;|05+L1U*TUV_?{p2eK1S9n|XIg;#fY zcsCvyk;`Cd;`14dXYyoVO0A$4aT1h*VR>sT*6XEs&~Th?E#?4iCHSFVG8*X#9oSyr zVD}kK4F~+P58M5ItQLO`XOi;416?u(2{4a>M~D}xn+qF_^SUHH<_f<2pS}9@uINc1Yr}(^ z^G2l9^w-9^Cgo)f3!a)@;5ogEJqESrI6++z`ZT@a!G8fJ_^y^NHF?`Y8{L13zNby}AOtAbS5`UTDQ~vi_~%f>d%vS~x2uT>4|i3Y==o+YxmwSO{h% zd^K-M@`SJ9!>f(vqLU15G|!I7)D*QJDrAxyl~XBXsSujNtAy;j8h5r2mlPW=B)5II z5L@+HN7$7KW20Uxd7HsV$=j|NZ+m_Z-o8`g`zw2O_ImAF=jk0tZE1<7g+Aduxvta?NeN}qz=lUe`Nis9 zZKi9|keuPTb{8l2Re|Z=6Z_Ld+MrbZOwuS;Mmju5_@6R&a3h8@ocKY3e`imtdmG-V zxkg!}k~JFMRvNf>m6+~&8_m_Obxl%phM^^1k3BTpCfnc0<3l+fK||3GWq4-c83-Bo ziC6mfiZBXPjz_y%mJmd(UAxwM`i6$uQbR-Ssgb|H0Ki|8F>7F)+Ke)&;6+V3@LJ*0T350|j7U!~SVip$uj;-o5!v>~@#UnTV|ZAXSUi?h(|k#4}T z54GBiSf>~rfxZ!a0e=_b5hJ8F#u?5zj$NWGIzf^X((bM)f&3L}Q(ekpI5Ly+GKz6K zC$ef|7#ea%`$E==gM)BnrrTOtQn#Q>+{&VtMVEYwF1aYyCBY1!S-9(MWid{a(XIhG z^M|2>+#V%V3{o0;m}V2Hh3GK>XhNwwc5U#S$S>@^&~SS!2j(;BT)Sd)Hw~>{g-khd z>>c`|Fw%iOF#S2s)zR5s4c3I-GEht(=Cs>Gx7kt;+E0-El^B90SUmKV)ZwUPz$lKM zq!veIetx48Cjxg}2|b=9&Qgy{siqzmBAuwmiF5mKsmUR~>|}Ayu^T)DId(_6mMw3S zA;a`8wnBn=bcim+_*g@XJ6ICd4j7W`Hu;7zB$7YIH25C<66bpq<*1+iE8fPMFv=>XZD3)vy^w#m>4X#Eq`5T_A zIAR-Ok!2jSEtrRa$?R@*zsWoyVF0M9dSRZdIP>^S<~c_)kFO`@$?Vk(c!e3r>5X}E zlb9znuDYOXpzy6WAQ#Mo(&EfBDUo@6R_4ixF;AAsJogLc0l~1H6n*Cn=>zgpr}e9^ z^Ink>ycInLO1j{Y*9FUs5JO$$N%9+Zti?GjC&pn}rdRZohfLW8 z{(6PQfiqQB@2RI6Z~_6#w$_rcCpV;5t4bsW9=Rs$}eoV-XKR#(3aFcN-qKlE99K12H;0 zI6e^wr=9__l^dIB%&m3q1H#vlm zXQ<())T_iaHr-rk4m!~;yv|2H)Le?!2EL-Q*(DIRm4*(M$t=oL!#cfK%zpH1FOsfR zkrcQhDR4zGfg8usg&#xZB%v#kLRTb&PMM7xHdD~nl5THfkg-7{Dkn~u%jZg*hae*L zxeleF5RhsY&y2d4QiDOLmDQBlw;&bH548hE_87~eVUXIv1Qt@u@Uf8Efrflb%^wmP z{67%hFq{vl%m0JIt2C}aTmMY~#u>KcI?&D~XqO)xm_XnM{y+c{SoV=2X0b_Zed0;r z=^7s3Qx9H(oH-*5Y6vM)LXCLUuIgFRKGMJ@7&#n5(gHw>qkBpkM;Vkf#?L%jKm4`f z=1@Fvc&rq(;Zo4z9R2gt1YUXHD)-+@XBP8>%oPV{`!VFr_{pFNq~K+l#D-wqff)KU zZZKe!hN0vse<6y=kBoBurNbq>!zvs1?$K(hPy{qI<|iY=#urwX7D)S+J?Iu>g)_|Ba6Daz%(3;d^QaLJAYX-&c;UN8bi7!@!AdHSl!<30o}7>*5$*aa#1oNdnRa#H zrx)L-eKYYSA7$YQ2iwf_G9po-wnDMOCpP~f^=mnxW9N$+7*$&_s#6V&VhcAiP10EL zI-hu9ajUYZ3gp3<)*uykGxB7}QZ>@B1|tMN`h%=hQgfk!YX(xd-QQTs!#M#5#6{>| z+{Z%9%f-y`M8xO&O`i;1Ivj-68UI^0ki&kFy)I5+yH zR$LlgBl|-u&X2yP75k%qm%kC9I94kzMC^W{*xw0Ojs8X}E{Xm^e*aON03BB68 ztc^D5wd6?XRf>yS|L@Z4P261lKj5z?;9A8SZPKgbNa&RTtq{-pe~rI>^ZWk^y?&Y? zR3^Q;j)Y!cLPh`Z^vVZQaOc-}=$vwRn-$P!mDD-ZtaxVOxR5Gunb18{n$(n;H5bKn zPY}9?R#8m!ChDGhg+SyRx~GYay&cNOojW2$#2<>J{^?Q{bwP!3k1dOd>7RYLJSx;? zW(R*1QU4Uh^-mG?Pf?=&DN5EqMKS$D`{6~aI9YAW1rn%CU)+R=gjH$*9SCdffN?Z$ zm*+}d0a*RCEdZ2C*2Iu7O}`l?TA!wPGK|D${dW>3 z#BvV&DiI%}T@?=v74&(KFdrtt80|9YBj~)SXPBmMWL=N3oJV_xsXn?$)b$I(+}SgX z$0lKZOPCSKFt!95{(&%O_YU(6VbYRdjJDVBkT}0cn9aXTq>s_|1pZli2pEITi&)O% z$uJUU=l8NME~wL|B*V!5^7NH$f0gBoN`f(PPT3{PX(h}#NiZq0uI)x&yiJ(CJ;Q7< z>e@`0Pk)ircB34-#Ai2QUQ33ti@ta%Rl+EUH|xJlhLP>6Zjf?u7Gb6(!^pY+{zjPz%|5O|TUB!FIGq&v?_g!dWgxz8uI%Wb6lE=j~c z#Yms?d}4d`OC%k(Uz%9&dLv!O5`HV5ON{jO`x4U^nD9yIbCBL1iuG|Q*2f{UkFBL& z59ko*amD&vYk&LqC)VeSLB^R%j<>k3*$2NahtV?JrwTJb*3p0`f9 zzXLzi9fS8^UOn%<8AoX+u&P!<1UQ2~1sfQQTdHea+GK}{nxn_a@$ujl;h))YLLkS{ zAhsTMtQvCC)QBMUH{s$gR?B5YVb|Ar>y^+7ybigcOSyj*tK3e4r{}GlW*c(a)G5m1 z;(aC|wSXgaZQeUm??%jJ@H!ExHv5BDyw!XKz$FNLb@xi@ABEC{9`&HI=ryW_mQ z*dEu8U*d9Bn{i?Yu7MRIL>`)oPZs1qV@0D-ku^S%h0#u-R^#Dh&j5ySi+IX$!;kqo zF@tw37voh~Jjyl+3rA8rihexDNQb%E!LR(QHcHWfYkck>M zLQML~Sy+<50Se6x=N?eTm1D$Vkm9Z#6pe|A0z2)IsL!mZ0q0n9F^^5oVTEnbE#R`8 zEAmz;Pv9Vu^$4zwb+#9{n5;B%eLl-4AsJ(0J>Q&*c7bkKJ3}COg=mR3E+d?ug3;A` z+078sNqL2rr3A0WB`IOsN|BS8Voi*R4+@$L0%1T}h$XQslbMy4RTjSEJ3;H$sA0FDeeNm9gU zGsz*^jvSw!19IT#Po7&(zTK`{4SEgNIa|2XDE?KGtx|j!WO-qh_#bg+kkc4`ZVGE9`8ojp3ZHc zS!QQ*=h}^1H+^^y?l}%2^QMky+NKVi*Mul5mOUtoO1&pRV$<>I)(z|M$X?5|ldV5a zvHr-g{y5e8<237!LFNzj?Uvnxve&B4!Pvxs1Ei*5>LyWy1(S3Ik zp3AS@s?Cc=dfU?=(kbNUO*U`m=fC=R%chP=XQdQPx-2C%cBaoTJCCr!F-HGMeT)ku zGQDeqirH#GEfyv9mr)*Q?%CwVS1xf86&d^i{mF2+JTFFuyBQL9ZNmE|7thYJ>*J40 zOSvqi5Bdk496WVXM>~52moc=<#bqI`v^UD@+?L(^ab#16@_2K&Fr}NvC;^J_0;=gq z>eC0NrDSgqH3m;+o!J|b>Gty#sT<5Yt;8`+Tol_ zNoSw=cEy?8B6?)HYy(ItR&6ZICS!InzHUyNh{zq1V& zl|K)m+tksyjlh`Z36LkTmI10qd2kVJY~xG#o4qspD@@B|@rIV1l;y{u+9>#&nK03t zy|d%T3&0=L2$+VN(@dNyBfbKaYk*2;GqY{pfnIL@II7J45j6j%4s5|w z=7Q%~h^M2^Q!EY{_TK}4V5cw3~tdG1olbGcx&+>JQ<3eQWSMDkIlC$y)(^4sRq zS7RQ#@kS`7@GxKK>(n{vBK#__*}Uc>EGi_PO5^pY3>qGbYJsy_3i#+zP^^77bx=O) z@9p*}4X1)$SZ0xv61=kUt0m{6U8~Y>36D%u9{QZQ_uo9HAXRzzPk2}Lr9YiCY0@sP zQtTQOzAgozB#F3+oP$?gI8kFQ?qZ*&{Sv<->USK!6Y*0`JN)R%#9Jo0(_Xk z=N}Rirwj1aaxg~c79yY6UFeg*dEs*J)uPw55iqu$I%!O4RUW7%Q9;TTcY}lRd=AfK zYGyYl&=ZqrIMY*o6m_$l?48R&9WJ@e>f8qAz#XvBw9Yk~BkKN-j(&!Up*gYFhNB9x zdxCPS{Bi|5M=4q#!aDYO&Fb5p7NuxgXnX4E>*0FXS1U#Pm7>j|1IN@n50>h{xu=-G zL>;)P7BvPHb@fu7j5fF{)HOi4YK0nsEmGHJZymfArwDc(tvqxUI21_rz;FLLIxXd+ zI`lY1hHYPj-$Gw14fV)GmIn8dsZ%4^c+%Y|7;od&=@p%8*rd%Z%vB2#X0J)6Spvlj z4g^IEd$_6~_59aJwNPtX1h*=56NSz-SUW1`_cnDje#IJ;hvy&*cq|K|#;fb|wkZ$q zBYa1smKX`i>|8^+oIVrYgM-SJUc_Ly4dR%$Sc(TJCPUFJj5E_|55o)N6*yqiL5ma?a51!S6*b0#x=+bpMs#NBRSgU7MDihZ-X|4yv2g(@$gdURM7I znK`d@x;=U{1*WE7D4LqrTJtUBDuVMz&2VnWz5YrSa`)M6gs`}52m5Rx$=NFglYM;{T88#Ou7W2>Z6<$z zw5Db!wC5U%1A9|?0&aa220w5;OWAtUBk(8ozxyERA6|@hERwnm$Psw1OqwjW;%dAJUI-?!IRz2B_mwMK!47ur!UywEsmtY znRxxV8mn*cIE;+B3K5>1@S%9H3T&GX9pRUfdC#VrjnR$LlZ@{_ne`=i8bJ(~@DV>h zLp1G4^ZX22`DH9zAWlQyj9)AptU%njn5>NeXhK-7%&_bEjiR}@^$B;UaeXzef2tXQ zTouSQ9?x7n19dlyq%zc-tZf7Dv;kKIGkeGFPK0gIDv;gN-AeJ$B-B2AfrD-%Oj~^D!5gsSl%rm z;>+eOQ|x{&Z*>m=ccDrSJZkZzYhQitrj+g2PrwLLikptOWXCG5whlJig9C zIT9{e|NN)?JRu}HSRToETsDt0#SlTTVMrV;D7pfi4Xh;hf`71H9?4{UC*FC%2X~Be zl;tCl@#OgdcKtWM7F2##@Iv${(2McE7{8Jo!`y9YoGJc-;dfME*t& zn|=jWj7ArjC#4ewG#=bfq*!d@PW&KF!I8D+g$@jwK3)ChozK}IRY%#mG*n`{Os=>Y zO>l(V(5`;7t24Cwv}rjl`v)b$V>X_ui<@i;v5Oav5@g1s6jw3gkstl@JNuKe{E7{^ zRU+OlsVlZoN%j<21jUJ8wS3o~sRawk{gcRO4;n4zE+%8sB#IOK5j%>Un^y(#<>|28 zY{+d0+<3?}r?q&J!?@|tt=ln=5ZM7!4F2g&e^ctr<9@?Z|JwC?>ji&P8T;`)2WrZL z_d>j5e|LIt6cyS@NcC@CBgV!YOL8Dd?JLg96*Uda)d?QDIucHTimkjy=@jd0p@ohN*e9NaDOkew9@MT|) zhbWbiZ4G4HfnA?4L(toaAN182=*+>>Eesyd=Mn}F zDVgYEpGf81n@qhPDISIpl-Um;3C>D-lVJg8&qIPGEJHa7webW`;wW?kjL=;*2RHT< ztaObw^$^oxW)UyVq)$LZ8mGes;fKIsS|bNF@a^!|V$|XlOMBLyjy&C>BP^d1?MVVX z{{TjZPkRLPuA=j1&IEG z6o|e`cwtVcx#9QFc|pIjpY1Ry&G;GPh-LCxNf7;_owg*9GpfH zHRt;XR?(DOWk&h?6^{iJ;NKiI{FkQe`G$8?R>9-JRk%JUAmJUm# z4NL0M@5L!dR;1OgU+mhgu2o)KKlp>YZH;SY9^KeI;}~^q%ho{+8-jgO-@*=47z3mI zER{49E*sI3M#LZqsUyfIkt72Hzze!@>A91?^}W%g`r%cAT}nDz@PF6GTYhuT?oFK= zb>+b?0NuG31c7gjK{NeWpBz_Z>O1$R(lgF9$5eE|bMem~ys>i~2VotbbbK4_12x~t z;Zu zu}U&E!(m~2KT zWNiM#BJu(9H2Tf7ufi`cuRfTc?bwt6G@a2!lbX~$n5x zR>MkAw^>~zxw=&4ggAK1z@veZ1c20|`_pm&2WfXG0)TaL_=9I?@Il zg>>DHV`CD&OZrqn5Y0I;W0YCX%%Bjy7`nis;WCkGNO+dXLr9|EtJ=K!2Qd1eq@*JD zGJ~aPOgK)@1xxY3IU2m+B+xY=DH^a)bd80gRR%?k(!udglenyD{~Z>>qHiro{Qd-k zzJCIJ?+ibXf)-uYjUn&!Q^K?2KaNpeeAA@PfapW&Tgr-8a_r9G}(8Og#qh97L-W!K&4xTKtCb& z_N}P}L_p{+F_-dw7jCA}aSE@CXaDL^0>c!suXo@XrnVxfag!UoB=U7V)gQNti7IPF&Vx zkYDac7Ms&6K)@b5z@$1or=Ls__NxTS#wUEi_ra3v33;JWtTSpZ1Wp0dFT7_|O=*nu zeJ81}9{b$I3Fj`sQ!K@^zD-W&!HiGi-?m>A@ zCOH|_p76b(ywh||+@xA?aw6p?#VLOyUZFqzSO;^F@WqrDTL!nsJh1`lYFH3RYFg@B z>JUS*MJ_@nGyVmJ6c|RhxlsBiM2UhAcE&hCi?U)wGZ71d#Gqp<@U-i5;Xj}gD-cMbg2Zbj zUTJ&qDx;X4_yNI^{{AKjXLPYx{h&Pf0U(q{E}szHo9O(*gEstTpimDO5hD_()mS}$ zYH6Tt_55RYQO1@Tgkfx%QJ6YBUHTQD(066?#XS||j~FMR>-|5qaFS@ZP5)AXF1&;! zl=^F95AD%>@$U!m*>==+C^z`)9fxv*C&LZyOZ*I1*p3MTaee^!@IUv47l6a8-mvhm z!D)VhV1hqfb|}=823m$5{Nd}Fye4uL9u}^Qx%|gXOz?+!wJGR{^_|S);Gh^$1^l^@~o*Z50BdN3|H+oYOe(>-;o)j;)2XbUZGazgo zS%Yy-mtHv^!A8KL38=$Nx_k(?odjfRHba5Qwx0ud5PrlD*}kV9@2!24Za%nu17q#O z*+0GZ-y!4a%MKGy$6#OG4_B|pP&!y$zZ{-}q2(|}KYSRy3g#^T--)4zf8JXRee_Q( zWHA)p-lIgfqaJim87x~u0DX-aK)F&Rm9PeGgr-2 zON==wDG->?kr(2kY`>a@zlG{B8y+RE^>eheAMIAhsFl@C{x zSF!l$N+S0(qwmm=7~4W|^0sKd2>zT_0mMjfXwg>;7#?s`Dl{%D;Zcg5S>$CTg?PI4 z=OAZjNJivRScWEb8!+BRjMcYybz+I|qDP4L9Gs+9^Lcnw_p0LV^Tb4;VQ;0sFJ%Lb zst4YnOf|iKVCO-%((22R6(>E|Fnr)$tztmT(XE{C;JAzP9feB6uSAxbAm~qOnc?P?8>Ki|=Pq982XUHjLeZXfYWLFk^>^k5s|uu10f% zqzfiygEz`Sy{E<#3zJyK&85bm9`&K%O1i=(#wvIw(~2$HOBklF$CcE;*cpB9-x$$9 zqV7^&+2Z>b7Ub&tF4KW5m zPW{?QYHR_hGbmT(#g?#&{Ugc4R*Y3M5P)=Z%!+c|3F|<8XheLy=#n-F4%dGye^aUe z+Xr|m!@I~B|0u^6D{cceoQymA7(?q?vH<*vSib}DmraJVP>QFN-&tjS=xDv&UM@thXK3@)jNC?0ss8=N5Hksib&5v2j& zW+a5-{Bq=mQp%F~YxM+6J0yRVso<|_o55dy5fQl^YWuDY48Uz2l=nf{(HG;bx6~bG zf(#C^T40r2eViT%kvTs*M%;WFkI3DN*pNt<{JaaG2I>yJ_k2F&JqObCs5_?L2>O=_$OCO{ z`ct=X?YwzDe4@!&3&qY{}Lbc-|*BLJ~)vvctjfXk31yin$UePh-b7$NDn49dkQj+5u(L zBNK&8$2ZnXNdHw5@>@XaD|?6eo-n`b8D{%PSagz*sOfu3Pf#!Hwp2=kMkVLXKrhAWBm%adUwQR)q% zcv;TL$uJUU=MA!)vk9{k8m)(R`6f!3Ou}sF875FJVa_4UUwVdFFkHf95$3_3VYVCi zTtJvfhkz-TltQ&L7#lW?145*XuDC)O|qP!gn7Srm}0{G zH5o?IdAlJtqX_d5VQ4NTyN_eqQY=^{^D!)7FrVOiJ^PI$#0+LLW22_u;H^xk0v)9$~v$F@5S8qOv@oq!3o zdFXpIHI0Q!h5dW*&S0YKEuZ1~ccp=*IQ4BYz6h;IRTd5F?%$ExthUbjHsy3@D)%p^ zDn+gTf2I_6{Fc4sT?1Q-$QP*PrJn+ z-fl@e<$>QJclc_j`i4P3IALzRYCDOjH2hNb3UG7d-V4=<9ju^axZ0^!Gd>|Mu2L~R z`KSnY0<>ir*CkGZ41k{4j6cN@75jO>74Gn4C-&Cs;jDi6#TDW1A(L%NBbTA$M+Wef zY4&Lzaej4%in|kdAq(&q{q+y_S7aPg)X6q=bM&F?oe{3}inThzkr0~UMlk9Te7p@m zWmpIPvid%Fwu(f|BZb?wVT?+~4@)CCu)lu^WFJX(eO!Jz zw#s`!l{uHf@8SaP6s6%4Qg0fgF8cVLd&J!-$aKZ!$h1;FLu9dQuK8fREi*%1BbC{= z;h<(5Bvn-~0+$4)&-!$Gw~~^6jYAu#rM1Z01%Cqwaqm)Sg#-KIiBA~e1mMF^5Tio+ z(bpp!#59J8fE?b-2!|&}cTPOZ@pK`dPlZf`9})0AT&LzC))%3QP_qLdY~r?IP;b+Q zq;plcP42qYfA#&I?z|hk%EM=XhJazbOW$0`UN+|DZQdfZQeT0z=qg@CjT`7b$4{uV47HRviMVe$`+=YKwy zU-r)qgrFnS50gJNo_|>^ztMi?zvM9aTX<%w{TDL- z;=|-08qYsCA-}jsRNr<9%E01>-dO0ssj(&uixuI3&tVFd{tQbw52YC6VIf;kK>&d9 z=vh|pLs9x&%=q12s8NdRVRFo4j?0*11#+}(g*dJVxLhs$wHSw_gm>T6Wt)pA5n~E;eb|-9Pk6YD?EqN%(>~Wh~`* zmhwxKV)PeHA{jP=hx5o+*lnD=6WTHe$u7Qw0r^gvbvYyq*|+QHmOTUUDfB77nzp8z zwY->vT5^ah_?PU(-g%e=0Ack<@RdYq*?P>ZPid`qq)o&1@OVRe(v${2Ug#kF2v1~t zfdzhgSz1cuGaN0|Yu8ns9HaKRtn3h7cPz1c9EJU-lw3%Z)?I{B0*6DXlV?^-ZaQ}8 zp;4N_!qN{{*xYzw-d+mJW?_qV9fnv}#0$&qrLccqh{A3~VYK(X$<5bT0&28$WH05- zV|gbXL3zK8mv>_?OXaQKammp7%C^1jPPd3PT{dEF<*+WST?OKoyEYxo7q(l219g~-GlJ$c0Y2-TlZ5A_12(4KsD0iY%W3hTR%p#C$N z=SAkpF-krh#+NY1eaw+&dLW37N(#5szZ!P zs9&j!^`G&ID#ZUSW0OJyz64K>O-k{MjZMC3kYf|}h&evNX&)S)B-)~p#P+T8fo<8h zhoa)Wb^N*+UwhRNN?EJ&wyBLdI4SWy4u2}J% z%mTi`A;uQ}u_tbRowW@ia5I375@0$%X8M^-e+KE;FNh>E{=AD}O@EFggQ3Ofmhb(~ z>b`<~p46K4w09e`P)3+YG+4#o)-dAn=An6;bb)m#eEbSzz62wd{fb-4Q~cAlZSdWge2NjAXR78(sR_GfE>z^py& zi5W+SzH}`8jCHOC^)ZGS(j-=Z1OhYqs^axq#Lvd5?;(QoCdiScy1ZznOMm1d9DY~V zCndYN{=SrRak5G3%Dk_q-GdW5(5s!8)K?Z2rGPwo1pq?_Qq-0iIfWSXY3h_gRP)V#_=9KklCrlhnqv?MIj(#pxty zVf4+K*P|oH6_e#7ni3GHrZNeQWRsVb^2Yg=)!o_1n;AGs6WDEEk!c5uVMk z$*g~+q}1bJwC0vA{rYe3-=U^4+Ns~isEHWpnET@q4O3eY!zB}DkbV3jcv`s?CwnyW z&c;gB*Y0=VOG-Q4VlZF8t&N>*go4$8OB)+d5mzm!42g*D(hJZIwL?!so8#xdRr97F zN3<^joep)6Hoh#J^SE}5x@quxSOl=Psa$J4u~(K^+^QUnBI5K0w%Tp=Un*KLBmi@?TPQ zb&vjAeje?^Qu^a@uN0%5I)qA}jP4n7qi;%-`FP46dOwACfD^Lkwvykd$s#~Pi$<$1wx|r$`sTa%C ze55*=>dZrJv$sRBhuY*Sq?o*MeFfzsOH0vSsRt#&CmE}XZ7Eto5b{x}jbyylrlp7T z!z8$fg+teT_d4U|HO|KFpkryVl!)y=f-c43g$1?R*fN}mdJQyo6*|)_V4#_KvCM31 z?5=55i!-ztnJr(~_)#ksp;|3nMHP?4p?0Do$nbN> z*pX`2LNQnnj*!{sF%aT*jL97v&Z555M%Jp}tTn-6t)LG626y;6 z!Z|6R4od=sei_ei!v$2$npV$xFk@b;-5XSgW`HFlBhhza{*nCYnggU0k&W#qk?V&t zwDFbNR0oWk14RymNI0~s-D&_TT^?ktm2i=mU0oMF!_df|S~T)|{lAAsJ~!A-ORpXP z?ZO$aXve8<4E`Q>Aiq!T{x6~3OU8#snc97K`m}}mSBN(x*rRdTYpzvS3U^0a!iH(n zv$Pv|n^RWy8g>1oyyI#HM&3iZLGMXzuY?vO%)rIt=Cpbc>Fh1bh!Uei#4WV9CD7#a?B zglg^1nmIGfu4@z(E3H}|wbfQ_wLVaMKtPBD6-28%L=b%J8mXui z5EcI4-^}iPgn<3`!RJGE@9sR#oH=vm%$YO4B}y2yoXhIk|0oN+mmv}tUudkCw?yM- zQUM5OO=D=Y)Nt&}A<-FU@?&RV^O(VWVC8c2`eYu6j!b?>n{;Sj)_gDL6)ALX%3tC0 z^*o)vp%G&tdqI1N3hfr=iZ*>MeJ?+y2vLTYqD>ypY=&6d0cswEwXE-zy@30C2g}v} zJ1J(GdZSHqx!<+Y`x9lDY#oY#y`0_mWt^y#-qEIdZcSAmnQxUsOy+XxjJ?#`=|+W9 zf|PxtO#%<>G-V%?ayYN;upv=yY+K*x3|vdFt!eTQ*cLfKI;cy_2UcllZxGxV2T?qC zv5|AW9N4fwW2$GUd`2896)5|?6aB*{fK&9(LCGSdf1VHYkI_EvWpyYZr^V+qM+g1m z|C&eWH`8VK%$H2}W!X8eY+W1Mc1*PTmF82YoxFpA6P=+ixJ}=XF&_(bN%Xoo$Zf3c zXd0T|@@}_mz;9vIk4QpMz5BbG3ZgeW&tF47?@rJ=$?Iftm`;to)Yq`Bx87jhBbuDz zzO1fviFcOE%P-?2je2%sC_1keFhjND4JVyHdX8wuZ@O$N@BAZy% z9c~10d3QR+RQQlm1VTz?@H&E@!Sb`5Ca?)h&xK{4MUt>`ZG-0>o-toC&8?M6f>=_E zJd~ed-u?B8bT)r?b-8$TM0$=-*y{*$Y~)^*gf(`t4M^7ZkrE^u@OVnz2e=RO4KZMH zMt**nL#NG}?|;ebSlh8%SNQ{x%%nY)vVLO^o4P$`tyv039+cKJ&+@(Zd4?IVFdF|Q zI-+#`Ge`20uFH4UHEsI*A<^s%k2ol)ml2Qg(@z_-bDDFJ(Y8aE62fDw4y$vW7EGV` z{uJX5De2#24jC?p#(yVuI3&->ndvq)Qh2Pg#PHi1H?1+HlSzza94X)mW!|!7Z0uv$ zQhRIFj2HJFCSJ6I+etrqahd!zaq7koi~t;ZHj8=tSjETl?qibT{wCwp%Ieavx%{MtkDbklazN7%2)W8De^m5EYGy&g4tTWg_m>qWT_&o>7LdE)7qUtJWa!*MXeRkI|spaT()OVH0c!!{^y;Z%aw*%|nookg+tBlQD~yIJ3aSkUlf(%qdam*nVloWAt3cVj4s!ta*T$;n}XtKOo>*=@wi* zwaE_X5q1C_N_lj`-VGnG-D{nH)d#e%;azZ=H~Sa!#?GI0g|!6RR5Av2{EF`?5Rik_ z$5nVIiV_^dHP7wkpz3g;c~=qd3PF{oAF6FXfbXw<7-ssx&sDW8IsO4~Pz~oz5zOE_ z?ePpAwQqD9TMBT3l3yR(7&9ow?KEP z9GO@Ybg%z}rp#n_6H9dqPskYfk48K%bv4RqmC24!)V8vw-d z=$~9mPS$4}YP`EqU3XbAhIsz;9V#R``0q`dAe?61p}x3`AglxU-P?FE@8!{W?a8{_ z#1`+xhYt>fjOd(0oKMG>udF|6eA60SnKn`l?_v2z4I8I#H{~{I{26zqv(39Gze|SQ z@^xNs+1LYrRIWR!F7|3c_B;JYVJ7QrnR{lvJ7f}Svh3z)+?`N>=^KsXd1H@q#9+L`msBRH zUzt;+y~yvJT5L{_S$V=jFoZVeoYnpc@pO@WogtImA@$9@wF=TY#z?;9?9}H1ufv+q z>#)tcsux?`qb4~+>d}ZNxc+}WjxO5uY+}j&f>X1qBz!}&Z))?p` zu1?uZ{W7-nX}P5a*VT*#Rs>c)l^9YqK1#7b5>Ja%f@cgm#S7OY`7^{wnp}CuCP5Zc(QfA)Kgdx=lb`# z>W^qse`uE#f+sh_4#3UchW)kPM|-?p{#&cJW$M7rqUNehXB{4&E+C$xv|&N9@EGEM zRl~Qz0i(Zl#PJ@UMCYtY5N6gau4$ibS`pTd)O9$XiE*Hk=5urSNVrbuEM$CDIIqI? z!uEaDZLwCPueV0yAHt;F=ty2zCNoneQmx@9_Z^R1b5Ka_Z@8Yb#%@;24h9C zEr5X%eDgLju|JhOrx6j2Lv!R{=i0=~v9W7Hp_sCd z4$EG{SFKgHFq5isQbcTYC|drhyhi~XlRiI${!`99W0YCEW4CIYOV}_=6)e`%VFrHk zd^Qlc>rG3#Cln_0Q&p`|w9%X7#+G(9K0l1xsjD1wn@DW7HCW40ZeDv)(Erw3b+}e@ z(K%-OV3BcF^{u~-+VXH#4X zTU*!iL9f`WUHjKgu0I~nm|Gdn6~Bi@3XIM)}R|^Xoi*alW0YoBcFCMf7n6;Bn|0m+vcT#~51{oi%F#tFWgk$Hvz0 z$X){7nE*kKL+o9YvktJ*~FGb|F9JZniQRL5i(IM}D-Oz?e zG#A@xgl?7F8`rP(i2vz{Kpr+F<>3#}j`9$VkJRiD$V9OsxU+2jpWFPArcL;YjZA3$ zmz0Wt+Gtaql@4R>1~eMa+*~z=4ZU|g8ZLFLJwlgHIYr}tSDmn-bZ5(Y#mnct$HauRj$xmKxy>ug~1(Z0(D6eGT+q z7SMmGAKL-_E!5ULCv|snOUnn{vR}=9(~*VFtQB!N=iq%Ls;X+6Yb7;M(lmeSiAak( zZ2H&EtN6uZJNjDWc)Obc=|7y?l}3^Ek`GZFeeL}P+*2&s8#s#Xjbl%PpT%|!=~nWQ zs|u_etnG6b;^ti6%NS}c8+w&4!HY$P$0fEVfBk&v-x}%P-VCRv-%YIE3G+jrj5_AqRN6qD@~=cYlUeQxEAU6LfEtdVc%&v45Ww#{+$C7`{0B zRmS3R(Re@GgZX^x`?9)bHa+%ozThBpD-o$|K)h=25s|=mf)4)^NZ!uie0NYC&vV?S#7h_P^X}K(j*79 zR%q|-$78wB-P3EK@T?ucr8pyMgXoDQ9}9Ia>Ox8LZF zAR_}I*4EWK#1QMv;JtsT#6^|T+8%9z8<&#jy-#?LpGyrWA2qY#R1Pd@v7V$R%bRJ7`SNYjzNe~1&9g|C zrAFAdolp~NI~8ht?d3-2y+w{C>Z1{&Hr6%}i{A52q+p&z=PWc2_ag?x05L}AnP$#b zhF&J6Taw0K&wdo1j5h*1h0h!JMUcix9+Yo!UXMGRDh*vj|9nkzRR>jS2=3JQP zeQ*p?ACxwTAQb;9HNBh5*F*W@558OzZv85%P4vq+?IsC}&O_sSUe+2O1i7o}z#!iN zM+NyVWr&jOX62)DQ)sCzYf4zwUO`#UtxlFzl}7u%0qvC$zXIwQZgcBiH%e$!%LH>ReqY1c3{*`VoNEfpEwTL{%brZP# z7V^6+8N#)hJ!bTIG=9wy(yF<14>2kxhKrrD@jN6}i#<7Rn$OvbK&n2*zKYK2?yMfq z4p{uf0wr0(%V_+JLyfImzPVwYjSy>c4x>~^vThL18`llR#dwd-Q&0bDm4pf5Sj-Pc zKjv%+8N#F{p8N)$a8_;*>&=}l9~!q(<@%5}Bgqo>Sd9^^C(x^oXMG)BFUvZH;l>_D z!Xnw9dAFDp-d8qjFhnES+r2C8iw$Wnx_Uq1u@Tj8tej47D}b@t=q+!E&G9HXQpTfu zZboywP>GyKA)nD0s}@DnHP5k^$b~Inkf-!jU2NA3uV)|p5jF!U&8JGZ=1*0_NlJGJ zeOobEjzM?H;a8D<$*~pZ3s&Yf&+B_0<;*fwP=ARYo26v_KB`+K$rUmSA3Zj|Ag1+c&#U4963r^K$8vs<#k;g&LogI(b3UGeYff z-RHa#B8um|qVooWYNvmwpwE^Mv*j&JRlR6BbdJ$AKY7QDwWXA6D{X9>pDo?`Lta=N z#-`qgS~JMy6k&2u?!hK^p%Ovs#%@*s{e?!kWw?FZX(mYIcR0c5?u7618g={PKnsjq z8%p|^bx^?S(LYh=9K_HAabCTNZ z#<#6x`q<(@m_h_A}iyMU^vu{EY;f`5)QBjb`%tLBaY_PjA=LLA7Si zZ?4@Tp$Yoklx8df&C~O!o6BsKX3T*W$>V4iR#K(2!_F9#(LAfLQNK(?X~f%VHGz3# zx-hPnwhOgG7j&VvrMOiW{!Qk%T-<8jHjW<9yrB1N-`IZpt!B0a;X6aVTZJYDV9R*f z;+V*d#&7yAHDGVNfqO`xsDaQ04%AwasmIW0p;9AUCmHI%7xRxq0uW#~ib+KpmSIKS zbIiHw8DEy-c_ z{Z%0!k4`aV3bI%Gw|q?jLo}BZWAbb}E*gK1E{<(GKHAhmTU?&2EQ%CIy~TUm?<;FV zg|GJAS-6=SNY}-3{2#ir?fKf?N*o7U1JH=xUjEe@E(t5Ro0m^3NHl!~LwW+|Jpvo` zQ%r=J{y99bcI7W^znDTI{s|NkL?pYtn$MJ-Hh+^Tmju(>=EF7&uhB-ic#<#)tGx^K>mZv7kc@-6ea0 zf1M7G&9W2iHaaW^ABEkT9+7cfyzo$%(VUq27uy-xZhDM4$P5`{71(YIrgIIHU^>@y z8%*c9b^`LRMe`;EgZ=zRB1yqOEF`pK(#48}Tp@v2Xa(xO_YIs!6@;_hlTR9mf-FsC zn#LAG?tI$@Gl@NUpdr&dGUMh&y|e_sWN$_A%l1|x_quE_rVZwNyFC2~RTw327a=G6 zmox2KbMyPlNGsc*gJE!qf|rAdu*TS;7r!Y{o&JH$18+Im^!kHrL{78+XZ|;I1djsi zac}QrlivFSDgB!{_Tlz|YsFB>V!XZwLsugYYDcg>qkcSL7~wcC4@r!@VM=TiGp{OL zUbl=Ztn7i)tDj8#h5MV)&I$y#(@*eM8f}0okY^mXi#wuj`a(&JowQ?1^RpNBAHlw2 z6-W#2>GkfQaF5FA$%7I2icg;?6NE!g+FoQ+oH!0v>^KM;l|ttE1D`-G8~TKW-jr-@ zX7@TEXiwARM)kd5Sk^^)+jZJPqo!iw5UY;&)(EG*ol3zktEKi zbY8W4d2zTG`%cpup0M5i$^lUE%V00I#_YvD&LguIdlxr|P=(o#b=I{XJTu&njm9@Z zK)5H{&b=I;+Z)!|Jz3nY6{v3{g1wiTV1sicJEHxxBN|^udRHII^RP}ZYsNDH(n$aI z9bB2hd&#-RTd(==<^|_kYLSz0Veo6j#akdzFa~HY3CAfRIZY>SI2dxUlA5+y-=-Ih ze}_ljPUaCDAu>#7y~^!p+#E$lvxL8fC;rLwgb8&YcL6Q;ypvzyVNvi9t>}HtB9-Td z>v=BEJE+WN`B067Pj9PaU?x=N{WdKF?#onf)$s=LAQ&7y{Ra?W`@AjX z`FH%A>~sHIRIoc}nDZrWnD31*ryu`H3sb$N`y$D(G4z(6Tf^68nNpvS>%VFk*}iX_ zsyX>#w(n@YXrA4x?n!1nr$#ROH4QKMSCHB9IO)^Ft*nt-9y4nQ^=zpen_15;YUP;B z`Qu;PHoIkggr;zMJi8@22j_}4%8xR0`&CR!aB$;NyQaQ^?8eYDop2Xyr_k$;r7_N8 zp%N_I`X)wwmxfxW!A!@RJ7Y@=B<(eUw0~e^{g&6lN%_GxYFM59S!jOw--pQ>+;7lU z)4M0=)JS4vpFU3E3k$SOF_D%}Z|mD=I(hkPbaEUmQ@TdEZ(&xM$*jIG6Th$LeI{kr zO+IYwS=~?5w#+(0p*Bw2x)Pc*=f{=~=)!nSUGQYDmUHJ<%&f^qKll^d=mVwDPOt6T zqIR>>!TP3~b9!y|0_zQnwVjAJEW3^RPJl8lchgY+dbLGb3t#Z`Y!r?nM|A! z^`%R!NfmqP5GV4RxqUJkDI#_;*?KSl{Z-U87ha0Aiz#%jRG1;|OlWd@v6HwMG^hIR zyl`ZQ=Y-fhMi!!6Z?Xm}Zdpcd{v3BJhcP?&sE` zj!dtODmn_xHROSE)9cUtlEoyJDk!Ot>turNA!hh#UBOZ}meuQW>j zNFEs_pT~_2xamDUMZX`HmDKMiaG$2%iDi><2u6CK+ee|>%ZzS6jI=2I68H4F>95`c z=>*=K&ICC`JQ)#8kY(2s$nzZ@oDNUUW#g>3)QNMt_GOA;X;)*EZ4`zOQ!L{kdttc> z86ei%DV7pWPzjc+%&*0X`IXsKeTI(PPghi#F$9XDO(!$K1apG-DLR}9gbL9(O@CJp zO)eZJY12f4*Rfu4FntHjx%Mn^LpYK zV013l4aE*~eRoch;(^5BxLr`rL7v z7G9_M?1#*3Kfpc5eEZQF=?nC3j#$I4LZo3Mt=^x#-zDMhz{!jxqOIAD8*!mql~=xC zYR|q4N|&I!wASt8eV6xaA^F4E@j`@+&%(@pl4oQ?j%8ikUfzoHnGTW zc>Yv32bMP3qx1AQ+#s1K>qd)mS$r3;H4uBwxa0O}=mo=zqfcd2ATrBP1Qka_ z1f56vl7ucY~GT)1-XRJR`#xNw(6;}5~e(1q)Ak13dN;Uarjbtg-&Dq5ulRo|R9 zI69}ku(BMN^LXumHOOGJ+=y+%jJjPTciUdk_*oj>I+w4F5SdhM-hR@h-Q1dpIE^L3 zK&f@|3XR^nomtlZ5ez6@0Vh^13de*dh&58DqYxQIDzf`DNHL>4zqN=W2+8)mvq^6z zoXuKAr%X7pwgcU&tfL0inbDiFte!!c#xx=KQao7xo48X<-RGv&eg1Ch?v^`s9SbEd@Fykgl%vt8|D2t2xUo}KFgs`r{epaE&ngFa9r}q!Q*t~`OB>rjv?fn31x&MTF75P0CiLNKoi&cX)1U&EFAIl6N z8soZ8>1U^T6)PXe&{84;miTudUe@YJ6%vqBPRLFv z>%fxo&!_Z-sG`h;nVU`N8fQ4zHMn#j_I72O7U@sYhK)+t7xQ(2HAe%l^@*ynJCm08 zb81C4UZ0PgydaJZ8fVOE4QZ5WO2l4?6j`~eo^Ft^;%qNn;{6GQY)X$LM{=_C=a{+tiKvdG`TA=p z^&?cM^+QVhtG|WCd&=+7LTGwNi+YqSDz6_ZkVAa_QXU!qj{;@N{zflnID;mmeY4y_ z^{_Zp`BQE-!7>N3)xN(;AD#fH{}_+}>UT#>at0AU6^(bnXX8=^?o7@%*`nk<@ycx( zI^5La-qvWUnuN8cSh^8){>iMc7y+8CFfWYZbrcH?)6au45=-mvElL<)vbIu;FWF+D z@%5#K`!B`!%YzlRHNHmi$QWN2abu0IaKF#SJ4fR$Fh7Rt>*u-eV1MnWu^QN4-I{Zf z_SfDx6B$w^nt*$2K&IcWfkqeheg)w)gG3(jv_UfZ#-K|G>U>)c=|nH~Nf{HptuNg=^A1nR@<(M! zGBfPO!7vkiB9y6y1{&WCjq(m2rjcZ zOg8Jo5z!-cL<~_Mq5DY!t{e)V_X=+1FnjjgRA@F$`xjD$xrSW^dnF)_!OZ{}LF7uSVm1*N~)k zfB$RlWgKn`_V;NP?z95!$Ld>Y);O$6*o9ZBTN4dz;|webai`U2Rgcr#fRrFuXMV^* z<#0SeX0g9a-XQw~)%U-0K=7+v~ z>>t7-qUv#j_?LW@xE*C~U*eo6NsHW(wS2KxvvLH3^(Rb#&Sr1vGn6$=aeMt(7Dt=z zcqb@(0_LqeBU@i%zNWR6T~1Gp`YSM=l9qRS`KuY%)-7|Ub|-c_Oh27Rg$z=k4+cQ1 zsFJx|0$W*19v5vI&87m)5_of2(5yjvG^I}CZAWw7?7r`~2Werpitw}MQ+@DRqBEXF zbc2Q2MjMtqUk1j??3bLq{7+#(%9QB;FN(|91!A)4SO0j_pVMNPZXt}`?cwve%(QHW zlFeBj`nTk2`(PSz9EO+sXD`5UzSy!Yb&mb;OKAULt~tzch9)_z4}{{Rxl9auspriC z!aGvGqtJvD$+Z?UaB})!E|E$d~*=r4Dk2m_?U}cxiXTQmR8x5f`uE*s3C#rOw_|7?R?{2L!kA;<;(a{|U~l8ODFOeUT?w}5c6fZ>IoQ!$ zn%vWD&goXZG_gAIRbo}pb#iDj^pxqu|oTaDA~!<3!O?fwf^1y+IOna`o}{=l zRNM)A9!PW1Hts_iKA0a!`=Pol@xRimTHC4(+$TnlKSzoyZsW0X3MInSD1%-DQ}I|n z-&xdv3bq*sdT){$Q5o;uJsBL$90MZXevh@ACxP{#g*Kt*Z4R=MHTL z*}5l3n~tLH_G^-)cl8d2bj|%oe8@G?q^@2U+oTD9rHr}Az4zJEP_i07o9E4-;MBBl z>6Pbv=KX>fygyNy4pYU60tb43HHo}~_3pbGNU2Kl2RscmqX}$S569uQE{@TS@9EBV z!N=VC>m-!%!Z-A|qGKn$trX9b0;B+=vc5)rC5h?k9d3!a@iB zc8rXdX_OozPaxD+s>c7}xz?+8xJ^{C-V4&KUfZKPcRs7TXPESN`r9R4DU|dlH(hc+ zsr+~7lE()yuz!W8hu9W*fxPQ^BXOL#gB>$p!NYUUwJodF+WnjraB+qI1|nR#g!6F* z;4Bz6H)1b(C&8x_iXVsKR!tv&;pIHZv41BmeA?W-BrBt?&}x@j642+xkj_ybzn5xQ z<6os-TLXLBQZR5~y@H@7xXMG<|6UohcBTaA*aQBLB zJF(#%_YC828b}%(Y>P6zZOd>qf0H?N1;;*&8zhKP8(wQIvcSc23Il$ncQ6!%huo(2 z43CK|S|bQZ`k!g)d3AQ;*jx0*Np!nTHJQ_II=XTx51KY{w!byAadKgA&QSb;9L^4F z^ig>1)f4+}voYLNmWJ#%ad2@2BYScG;rPJsPg2rKC)BNT zDx7@g*vnRaVQua7|HMsFew<|^o!5pt3k1-)n6q;SJxeB{>&^a=%dt(`;)%cZ2yEOO zw|RCJPpEY)_+0%@qX)W+;a7u0GpT7sYvd-(os4L_6e%PDXFJ#diwtE4jI<69;=fmR zB_!gUgat|{G$(WJaG-3Ps=D@k#h+Kz+Te(l#>(mIJ%o7!(+f3qT<_clPjXwx*~#u zZIhW+yP)H}*QTi7qD|99#HRWw)>XICTe1>Y9oZ@p*(T$`Fy}ghoVS~t4eGYGu!E!V zt&|fUfD6vYntFbgOnqmvli@YcXajpY3;gR%H(NQ0#@lvN%we_|bIkTE4Z&L*Noi5n z5=C7|QF3Jk2RmtUN7~m+4xBHnUH4Hjp@9ChGuj_XN&U9SOjMdU)M?Hb)0EcM$aNAM zXz^Ek0~t^8LxY%;Tk1OG!{5mBlqU#vg$On&o98LL#T#oLxDhmm*fvlR@4yyvUge}v z-O!=Jr+c=MR2-f^HR6JZrs&s2?vPyk-=)zx1hbFtj|o461rKMivys2?{fldXRweeQ z4Scqt*G&IX-5tI5JV=es;ViW_Wt#`e7LU%^PFyKCH*80;YlgfUb;*G}>x^INeS%0K zSug#OR`87}?vyIuw z4g5hS{$`Yhd$^^s$-S(m6o8=m7u>-L+acN~i%=Gf=+tPRk2P$QSuU?ZJ>%ehx&68T zvgj2+gn*O!J0%59)@6ycghAfgMv7U&XX5| zdAicrwXwE+%+0aw9_riI)OY^>ufCyssPA#aVh{D@n)*KZ%P#GcbDll&Y6hqG+-v6BTSg0~_%V`w zasZ_yH?&rIcXv|Wa#qTf>}pC=kdw%#(j~hbo*hp{|1>4(Vr7~DUI;;?y|1pYT74@F z3^n@J6=?J)j*#f@nxV~PsDIrVk{bYGp;x{MkQU35NQ-$P(&BRT4YehZ76X*UAFW~l zn%-_5WDyoe<+^Mg8L-z~$gHzu#?M9t|GPD>T-kZe!#ZWq>dOs-;_J}7|8C9a?WX2& ztXGXHOSYS?85`96zyE=n-+QZLo9Vt$#eNZ1{J-0(>vk#I_N4YI?0TpO&az}!!vijA zEtgF!JGe~J>I31+@Q+g}%rzEI;d$MQmm`UGy0hQ&1OMQy0O8lz|M}7Qfl`$Wg3?WP z)doxiyLx#&+J_i>N+;);7X%HoK?0q$l9}ZQ|63$GnOQ8cNxaf~U>hSv;eYJfDa&Pe z67W=$6`g6YBu?rM?vXLZ8}3S2yDb~KNY44Mi7T*u?x;8RLoWuWAkG3jrJ`KrL)K#8@bG{-Ior{w@^= zSH3;{ZwxMd@-Z5JU(HfvW_%5ImZ?CW1k@isPu)ym?g3yo5FHRkVy*Okprl%>HLOoe z2%$X`nDb{a3b1GBsLqXz&mKUMS9<5%D^*AHt=J$>$MGX|!roP$gr_0QXnHNrRW#^I z?>!bd^ucO3>V5fVvko@L=kXN~_C=5U;|5t9cE&dc=$Y^SnFI9h0DFYq?FL)AQMdoZJ>Snz0If`R_1hiOu)4yYsS3SDkI>4~6aZ!JR$@C605(TF~3L^_l~p^8s~ zGB}z}!FCIA2l~rct4hTiD7WJ)z#E|0+4qwK`43=y&Z`Ba#;q(NW^(#c1xd3g3FD** zrXR^_=|CEo2KaOzQ!7SRo^Yymgiu|K$Jj5hPDa*glA_gSM>7934)+>xo5tT`nf0sOX zJo|ZtwM+NP2!Rh;5l8_a#LX%ARF=hG;guD$5DK9b8vaoCDul{m1fADV{{TNHTH`4!#1p$)&O5k%9s+ghn`x({-y+0 zplccyTe-6UYti@->R)mwtb{Fe@n4xuz3YBqbhmQNG`VhXgn~4%wTIPd8VdpBQ#9Tp zUQeCuY&J!f4KR@^T0-PYZ`@#u%#t6d9L2PoV*kcCHu_tPNduZmTUeiBOUq?BoxJXS!n8^y8wTb2Ut_xK8KLhY7NmFf|v)KP1=@pA9XP>3Zie00szq#}I z#wq*pcDt%o9gLgKZ0gO`1i!`~CE*CZI&s5Gi3vWro&}F%4BcWT_{wPf6m`*~hV>Sc zV-jdS!sKYY2VRfw1e4={zxkg=_d)`z?EMxTsiQZmseWf~m6E~Gu$3avET+Rm5W-be!Out*Sj446m97?eCpFfk}&qD}L@ zM}DSfGkYMh)zPNI6%@w2sN!eQ4;Tt#g6NYY@6;)K@zX9ev}L>ZvmuIy$y49k|Lfsw z*wqtn)hl+=iS^lL19zfi+nj>%+n?u&a*p9y`=dlHR1)go-n|GE?FqZ`WMOO4HWn!JL`xK9OUz_e0rK{3A+phSDY3cU%GHtq_E8W3* zN1YsP=;eIsJte8*gv6&1^e676G`6WVHb6M_0EYz&VWH)DkKS!sa3BSyFf66m^HYi) z9u#|T=f%bh>PPzn_RPp2@@+94fG(L8cy z)4-Fs58yx?6=vZ;PI-pgaO=JOuO^E3Nc&9NPrE?@dFi+0Qc$);Fl85hz1^!eR0;(| zVGiQUY|^Wv#8umK0m8@XqnIxBA;yP~L@j#WU*sE4MF#o%uXqr&yV}1(ofKq!Hq6>= zv(_ssG#PM^6Yzgg+}N67Osv(01=^`(i=bi>}^4 z9vj(B!w2!Ve9dEn1R_(?F-Ra2LwgV;5OWe2d<{Z2bo>^JF2n1#hNG+TLS-POc7S#5 zhy+rt@)AfOHTq?dK!(}dJg<)q`_3{|G{*}YDTex0(muMSQmx5IV2%J=BoNWSQz3y= z*xNiWe-cdy@+(sU2_&v!Adr{W+1mncZ?Lz8K?_Krqq>G#+_l_xMrwRpqR9j*lSg~s zK^|of@+f=Iyj-s`A^wBK`(RvV+mY^nsr@{uP}Dps^s;SMZMJ-AM#YP)t|VXnWBf+y zHPgg@ultl!%F!#+!3xqaITr9i0Si{}(j63;hRIO|yE82N%QGVhJ4;7$uT| z$+3NQ*p3X^Ve9OO$uVAK*V8998nfG^?JPsZUl`~1(Ih>d5v>6DpTK4X;fHhX*IW2) zV(fi?u-*l%K1ug!*brsjJ@~{#xE-j zo@bdWxyrY1R*A`;#~LZqQU^~ezCuzLWX(bH0B-WUoClN1&uDJ)JriYoCq6YAEsovT(z>iL*14#61w8L6ZsPJ@Vx$Jjq||k z+I6)NaP!EtS?X2Z=0&Y>tcxaBB$q{ZZw#UsZxW%-$l9R|kGlN*k^B?~*Bz*_13Q3O!q(5dF zrUT5I@sS~}yBsU-Cl^!DU<(^@!YnC?05;;+&GvN?HiEM9ND)}N3D78`M-qrppGlDi z%+0~KV8(`^w#|TzFkl-rU`b(?GAI?#`|a_HRQk;D8o^5(<$rS>z17NdnWP51AfMFB zAK}5EV1GUxyr8T45b3v}V7Vkd{!?3-l>Kv@Q1aY_{O4%BIgPiBB5Zv+3HaJAWbEW5 zphJ!JB;c7ML_PPx!`y`H3d6tMoCKVrGSPve_xDtNE3GzF*QHfGayM1?NL2j>vSO;f zXqT$<+hYb6q@Q|-MQs2JqOT{OqQn6#NOd&63jWf;(s5&yINT4A%eb07f!ZE3S@al4 ziRXbSAX%A`wU4#)0FwZUr)*ECAX9X7HuWI*!dxCCjw}#(Di3(C-kP z28J6mo7@ob!&mza;>Y18bf6II1)Ht=_?hO({o;HwV~F?B=Kq9xk~?zl^tQ zO*oA#`q)(CtQG{w>gGr-Lf9h2a;k0{V6+PdRI=Ly0WudEO<6wO5734fQ9||V?WKvCtNDk7U=JQeA2^WT&T8mr0Zm8&0W4 zJ_<_j^pxrWD*b(!VJ5lR2$%mBze3cJtuFWS1Q^tjRd7zHu?d9+b)=WkBA)j9M5P57_d7lxt!?VDzs00TERuh#Y;- zEI=X=dd`?@tXh6g)$=YuA_?RWv|@}!PP^?1iKH*-LL#$H$z`sJt;Dp5jsT~jbb+3Yoiv1#-`Rw3edHzBl%RJQLQ{FSi7CRZ}D5(PDwrq+o#z zOT_{?oS7`d0;x8RTKvL%$B4(qRr_0RFq0}0SRi!hXDh*6s>N+K#r7p2aU%#RV*0D-b}v14ibmx zh)%@dZ~`!p>zRW6?(jVY>*-BtG_5e$9x-@Nx4p-MT^45RR`7IBcu$8Qb^c$>;RNrq zX;#uMlcX8&i|<0HiJzy-?nj6$_{DwnQ5yKgX=FgkS-5*s6NAqW2#{B;WM#OEh&E8wO z;tF%R;45iX&wF<ņ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

3Cy|1%7xz~bCJ(bnS%=De1n`1mkw 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

fRvjXDN0To)nl76sb9(8jEi(JSp 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

uJc4%2OKl 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

`lOk|tXLV^c! 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

Z;I@pJW4oZ-H_*wR0>6`Pw_!e94 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%0Ak(g6t9vl)hjKW={?r!CVXIBJ!(cZ?UIAyDsF0`O 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 z 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Ω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�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 literal 0 HcmV?d00001 diff --git a/examples/main.cc b/examples/main.cc new file mode 100644 index 0000000..0adef6f --- /dev/null +++ b/examples/main.cc @@ -0,0 +1,164 @@ +#include +#include +#include "mrubybind.h" + +#include +#include +#include +using namespace std; + +//============================================================================= +// Simple usage for binding function. + +int square(int x) { + return x * x; +} + +string emphasize(const char* str) { + return "* " + string(str) + " *"; +} + +void BindFunctionTest(mrb_state* mrb) { + { + mrubybind::MrubyBind b(mrb); + b.bind("square", square); + b.bind("emphasize", emphasize); + } + + mrb_load_string(mrb, + "puts square(1111)\n" + "puts emphasize('Hello, mruby!')\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + +//============================================================================= +// Simple usage for binding C++ class. + +class Foo { +public: + Foo(int x) : x_(x) { + cout << "Foo::ctor(" << x << "), " << this << endl; + } + virtual ~Foo() { + cout << "Foo::dtor(), " << this << endl; + } + int bar(int y) { + return x_ + y; + } + static int baz(int z) { + return z * z; + } + +private: + int x_; +}; + +Foo* new_foo(int x) { + return new Foo(x); +} + +void BindClassTest(mrb_state* mrb) { + { + mrubybind::MrubyBind b(mrb); + b.bind_class("Foo", new_foo); + b.bind_instance_method("Foo", "bar", &Foo::bar); + b.bind_static_method("Foo", "baz", &Foo::baz); + } + + mrb_load_string(mrb, + "foo = Foo.new(123)\n" + "p foo\n" + "p foo.bar(567)\n" + "foo = nil\n" + "p Foo.baz(9999)" + ); + + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + +//============================================================================= +// Simple usage for binding function under some module. + +void modfunc(int v) { + printf("modfunc called: %d\n", v); +} + +void UseModuleTest(mrb_state* mrb) { + { + RClass* mod = mrb_define_module(mrb, "Mod"); + mrubybind::MrubyBind b(mrb, mod); + b.bind("modfunc", modfunc); + b.bind_const("FOO_VALUE", 1234); + } + + mrb_load_string(mrb, + "Mod.modfunc(Mod::FOO_VALUE)\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + +//============================================================================= +// + +static mrb_state* mrb_callback = NULL; + +std::string call_callback(std::function f) { + if(f) + { + f(); + } + //std::cout << "call call_callback\n"; + return "call_callback called\n"; +} + +std::string call_callback_a1(std::function f) { + if(f) + { + f(23); + } + //std::cout << "call call_callback\n"; + return "call_callback called\n"; +} + +void CallbackFunctionTest(mrb_state* mrb) { + { + mrubybind::MrubyBind b(mrb); + b.bind("call_callback", call_callback); + b.bind("call_callback_a1", call_callback_a1); + } + + mrb_callback = mrb; + + mrb_load_string(mrb, + "puts call_callback(lambda do\n" + " puts \"??\"\n" + "end)\n" + "puts call_callback_a1(lambda do |a0|\n" + " puts \"a0 = #{a0.to_s}\"\n" + "end)\n" + "puts emphasize('Hello, mruby!')\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + +//============================================================================= +int main() { + mrb_state* mrb = mrb_open(); + + BindFunctionTest(mrb); + BindClassTest(mrb); + UseModuleTest(mrb); + CallbackFunctionTest(mrb); + + mrb_close(mrb); + return 0; +} diff --git a/mrubybind.cc b/mrubybind.cc index 6474967..18a9c4e 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -17,6 +17,8 @@ const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "Bool"; const char Type::TYPE_NAME[] = "Voidp"; +const char Type >::TYPE_NAME[] = "Func"; +const char TypeFuncBase::TYPE_NAME[] = "Func"; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value) { diff --git a/mrubybind.dat b/mrubybind.dat new file mode 100644 index 0000000..7be9155 --- /dev/null +++ b/mrubybind.dat @@ -0,0 +1,122 @@ +#include +const uint8_t binder[] = { +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x55,0x22,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, +0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, +0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, +0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, +0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, +0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, +0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, +0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, +0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, +0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, +0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, +0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, +0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, +0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, +0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, +0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, +0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, +0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, +0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, +0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, +0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, +0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, +0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, +0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, +0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, +0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, +0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, +0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, +0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, +0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00, +0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, +0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, +0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, +0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, +0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, +0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, +0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, +0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, +0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, +0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +}; diff --git a/mrubybind.h b/mrubybind.h index 5029f5b..6b0af36 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,3 +1,4 @@ +<<<<<<< HEAD:mrubybind.h // Do not modify this file directly, this is generated /** * mrubybind - Binding library for mruby/C++ @@ -29,33 +30,23 @@ #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" -#include "mruby/proc.h" -#include "mruby/variable.h" //#include "mrubybind_types.h" -// Describe type conversion between C type value and mruby value. - #include "mruby/string.h" #include +#include +#define ASSERT(expr) assert(expr) + namespace mrubybind { //=========================================================================== // C <-> mruby type converter. -// Base template class. template struct Type { - // Type name used for error message. - // static const char TYPE_NAME[]; - - // Returns whether the given mrb_value can be converted into type T. //static int check(mrb_value v) = 0; - - // Converts mrb_value to type T value. - //static T get(mrb_value v) = 0; - - // Converts type T value to mrb_value. - //static mrb_value ret(mrb_state*, T i) = 0; + //static int get(mrb_value v) = 0; + //static mrb_value ret(mrb_state*, int i) = 0; }; // Fixnum @@ -139,9 +130,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_cptr_p(v); } - static void* get(mrb_value v) { return mrb_cptr(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } + static int check(mrb_value v) { return mrb_voidp_p(v); } + static void* get(mrb_value v) { return mrb_voidp(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } }; //=========================================================================== @@ -173,28 +164,21 @@ mrb_data_type ClassBinder::type_info = { "???", dtor }; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); -mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" -// Following code is generated from gen_template.rb -#define ARG(i) Type::get(args[i]) +// This file is generated from gen_template.rb +#define ARG(mrb, i) Type::get(mrb, args[i]) #define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) -#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} -#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) // void f(void); template<> struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(void) = (void (*)(void))mrb_cptr(cfunc); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + void (*fp)(void) = (void (*)(void))func_ptr; fp(); return mrb_nil_value(); } @@ -204,13 +188,9 @@ struct Binder { template struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(void) = (R (*)(void))mrb_cptr(cfunc); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + R (*fp)(void) = (R (*)(void))func_ptr; R result = fp(); return Type::ret(mrb, result); } @@ -220,15 +200,11 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(void) = (C* (*)(void))mrb_cptr(cfunc); + (void)(mrb);(void)(args);(void)(narg); + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; C* instance = ctor(); DATA_PTR(self) = instance; return self; @@ -239,15 +215,11 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(void); - M mp = *(M*)RSTRING_PTR(cmethod); + M mp = *(M*)method_pptr; (instance->*mp)(); return mrb_nil_value(); } @@ -257,15 +229,11 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(void); - M mp = *(M*)RSTRING_PTR(cmethod); + M mp = *(M*)method_pptr; R result = (instance->*mp)(); return Type::ret(mrb, result); } @@ -275,14 +243,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0) = (void (*)(P0))mrb_cptr(cfunc); - fp(ARG(0)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + void (*fp)(P0) = (void (*)(P0))func_ptr; + fp(ARG(mrb, 0)); return mrb_nil_value(); } }; @@ -291,14 +255,10 @@ struct Binder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0) = (R (*)(P0))mrb_cptr(cfunc); - R result = fp(ARG(0)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + R (*fp)(P0) = (R (*)(P0))func_ptr; + R result = fp(ARG(mrb, 0)); return Type::ret(mrb, result); } }; @@ -307,16 +267,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0) = (C* (*)(P0))mrb_cptr(cfunc); - C* instance = ctor(ARG(0)); + (void)(narg); CHECK(0); + C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; + C* instance = ctor(ARG(mrb, 0)); DATA_PTR(self) = instance; return self; } @@ -326,16 +282,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0)); return mrb_nil_value(); } }; @@ -344,16 +296,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0)); return Type::ret(mrb, result); } }; @@ -362,14 +310,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_cptr(cfunc); - fp(ARG(0), ARG(1)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1)); return mrb_nil_value(); } }; @@ -378,14 +322,10 @@ struct Binder { template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1)); return Type::ret(mrb, result); } }; @@ -394,16 +334,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); DATA_PTR(self) = instance; return self; } @@ -413,16 +349,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); return mrb_nil_value(); } }; @@ -431,16 +363,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); return Type::ret(mrb, result); } }; @@ -449,14 +377,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return mrb_nil_value(); } }; @@ -465,14 +389,10 @@ struct Binder { template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return Type::ret(mrb, result); } }; @@ -481,16 +401,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); DATA_PTR(self) = instance; return self; } @@ -500,16 +416,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return mrb_nil_value(); } }; @@ -518,16 +430,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return Type::ret(mrb, result); } }; @@ -536,14 +444,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return mrb_nil_value(); } }; @@ -552,14 +456,10 @@ struct Binder { template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return Type::ret(mrb, result); } }; @@ -568,16 +468,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); DATA_PTR(self) = instance; return self; } @@ -587,16 +483,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return mrb_nil_value(); } }; @@ -605,16 +497,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return Type::ret(mrb, result); } }; @@ -623,14 +511,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return mrb_nil_value(); } }; @@ -639,14 +523,10 @@ struct Binder { template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return Type::ret(mrb, result); } }; @@ -655,16 +535,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); DATA_PTR(self) = instance; return self; } @@ -674,16 +550,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return mrb_nil_value(); } }; @@ -692,16 +564,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return Type::ret(mrb, result); } }; @@ -710,14 +578,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return mrb_nil_value(); } }; @@ -726,14 +590,10 @@ struct Binder { template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return Type::ret(mrb, result); } }; @@ -742,16 +602,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); DATA_PTR(self) = instance; return self; } @@ -761,16 +617,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return mrb_nil_value(); } }; @@ -779,16 +631,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return Type::ret(mrb, result); } }; @@ -797,14 +645,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return mrb_nil_value(); } }; @@ -813,14 +657,10 @@ struct Binder { template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return Type::ret(mrb, result); } }; @@ -829,16 +669,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); DATA_PTR(self) = instance; return self; } @@ -848,16 +684,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return mrb_nil_value(); } }; @@ -866,16 +698,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return Type::ret(mrb, result); } }; @@ -884,14 +712,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return mrb_nil_value(); } }; @@ -900,14 +724,10 @@ struct Binder { template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return Type::ret(mrb, result); } }; @@ -916,16 +736,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); DATA_PTR(self) = instance; return self; } @@ -935,16 +751,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return mrb_nil_value(); } }; @@ -953,16 +765,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return Type::ret(mrb, result); } }; @@ -971,14 +779,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return mrb_nil_value(); } }; @@ -987,14 +791,10 @@ struct Binder { template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return Type::ret(mrb, result); } }; @@ -1003,16 +803,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); DATA_PTR(self) = instance; return self; } @@ -1022,16 +818,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return mrb_nil_value(); } }; @@ -1040,16 +832,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return Type::ret(mrb, result); } }; @@ -1058,14 +846,10 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return mrb_nil_value(); } }; @@ -1074,14 +858,10 @@ struct Binder { template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - R result = fp(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return Type::ret(mrb, result); } }; @@ -1090,16 +870,12 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - C* instance = ctor(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); DATA_PTR(self) = instance; return self; } @@ -1109,16 +885,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return mrb_nil_value(); } }; @@ -1127,16 +899,12 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; - int narg; - mrb_get_args(mrb, "*", &args, &narg); - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(0), ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9)); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return Type::ret(mrb, result); } }; @@ -1146,6 +914,8 @@ struct ClassBinder { } // namespace mrubybind +#undef ASSERT + namespace mrubybind { //=========================================================================== @@ -1165,16 +935,13 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { - mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer - mrb_symbol_value(func_name_s), // 1: function name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - if (mod_ == mrb_->kernel_module) - mrb_define_method_raw(mrb_, mod_, func_name_s, proc); - else - mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, + func_ptr_v, nparam_v); } // Bind class. @@ -1182,53 +949,50 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - BindInstanceMethod(class_name, "initialize", - mrb_cptr_value(mrb_, (void*)new_func_ptr), - ClassBinder::ctor); + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, + class_name_v, new_func_ptr_v, nparam_v); } // Bind instance method. template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - BindInstanceMethod(class_name, method_name, - method_pptr_v, ClassBinder::call); + mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, + mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); } // Bind static method. template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - struct RClass* klass = GetClass(class_name); - mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); + mrb_value mod = mrb_obj_value(mod_); + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); + mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, + mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } private: void Initialize(); - // Returns mruby class under a module. - struct RClass* GetClass(const char* class_name); - - // Utility for binding instance method. - void BindInstanceMethod(const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)); - - // Mimic mruby API. - // TODO: Send pull request to the official mruby repository. - void - mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); - mrb_state* mrb_; + mrb_value mod_mrubybind_; RClass* mod_; int arena_index_; }; diff --git a/mrubybind_types_generated.h b/mrubybind_types_generated.h new file mode 100644 index 0000000..352d2b6 --- /dev/null +++ b/mrubybind_types_generated.h @@ -0,0 +1,177 @@ +// This file is generated from gen_template.rb +#define ARG(mrb, i) Type::get(mrb, args[i]) +#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + + +// callback (P0) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0){ + mrb_value a[] = {Type::ret(mrb, a0)}; + mrb_yield_argv(mrb, v, 1, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; + mrb_yield_argv(mrb, v, 2, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; + mrb_yield_argv(mrb, v, 3, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; + mrb_yield_argv(mrb, v, 4, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; + mrb_yield_argv(mrb, v, 5, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4, P5) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; + mrb_yield_argv(mrb, v, 6, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4, P5, P6) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; + mrb_yield_argv(mrb, v, 7, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4, P5, P6, P7) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; + mrb_yield_argv(mrb, v, 8, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4, P5, P6, P7, P8) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; + mrb_yield_argv(mrb, v, 9, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + + +// callback (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static std::function get(mrb_state* mrb, mrb_value v) { + return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; + mrb_yield_argv(mrb, v, 10, a); + }; + } + static mrb_value ret(mrb_state* mrb, std::function p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +#undef ARG +#undef CHECK From affc616e4b223b800084f89dd211688c831c9ccc Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 18 Mar 2014 18:30:55 +0900 Subject: [PATCH 062/103] avoid gc. --- codegen/binder.rb | 48 +++++ codegen/gen_types_template.rb | 34 +++- codegen/mrubybind_types.1.h | 122 +++++++++++- examples/main.cc | 112 +++++++++-- mrubybind.cc | 3 +- mrubybind.dat | 189 ++++++++++--------- mrubybind.h | 8 + mrubybind_types_generated.h | 340 ++++++++++++++++++++++++++-------- 8 files changed, 651 insertions(+), 205 deletions(-) create mode 100644 codegen/binder.rb diff --git a/codegen/binder.rb b/codegen/binder.rb new file mode 100644 index 0000000..ba96b84 --- /dev/null +++ b/codegen/binder.rb @@ -0,0 +1,48 @@ +# This code is compiled by mrbc, +# and included into C code. + +module MrubyBind + def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) + Kernel.send(:define_method, func_name) do |*args, &block| + if args.size + (block ? 1 : 0) != nparam + raise ArgumentError.new("`#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, func_ptr, *(args + [block])) + end + end + + def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) + mod.const_get(class_name).class_eval do + define_method(:initialize) do |*args, &block| + if args.size + (block ? 1 : 0) != nparam + raise ArgumentError.new("`initialize': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *(args + [block])) + end + end + end + + def MrubyBind.bind_instance_method(mod, binder, class_name, method_name, method_ptr, nparam) + mod.const_get(class_name).class_eval do + define_method(method_name) do |*args, &block| + if args.size + (block ? 1 : 0) != nparam + raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_imethod(binder, self, method_ptr, *(args + [block])) + end + end + end + + def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) + mod.const_get(class_name).class_eval do + self.class.instance_eval do + define_method(method_name) do |*args, &block| + if args.size + (block ? 1 : 0) != nparam + raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, method_ptr, *(args + [block])) + end + end + end + end +end diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb index f432bde..632e2a3 100644 --- a/codegen/gen_types_template.rb +++ b/codegen/gen_types_template.rb @@ -11,17 +11,35 @@ TYPE_TMPL = < +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](%ARGS%){ + mrb_value a[] = {%ARG_VALS%}; + return Type::get(mrb, mrb_yield_argv(mrb, v, %NPARAM%, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(%PARAMS%) template<%CLASSES%> -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](%ARGS%){ - mrb_value a[] = {%ARG_VALS%}; - mrb_yield_argv(mrb, v, %NPARAM%, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](%ARGS%){ + mrb_value a[] = {%ARG_VALS%}; + mrb_yield_argv(mrb, v, %NPARAM%, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 6a75c13..eaaf042 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -3,11 +3,96 @@ #include "mruby/string.h" #include "mruby/proc.h" #include "mruby/array.h" +#include "mruby/hash.h" +#include "mruby/variable.h" #include #include +#include namespace mrubybind { +template class Deleter{ + mrb_state* mrb_; + mrb_value avoid_gc_table_; + mrb_value v_; +public: + Deleter(mrb_state* mrb, mrb_value avoid_gc_table, mrb_value v){ + mrb_ = mrb; + avoid_gc_table_ = avoid_gc_table; + v_ = v; + } + ~Deleter(){ + + } + void operator()(T* p) const { + mrb_hash_delete_key(mrb_, avoid_gc_table_, v_); + delete p; + } + +}; + +template using sp_mrb_obj = std::shared_ptr; +//template using sp_mrb_func = std::shared_ptr >; + +template class sp_mrb_func{ + std::shared_ptr > p; +public: + sp_mrb_func(){ + + } + templatesp_mrb_func(std::function* pt, D d) : p(pt, d){ + + } + ~sp_mrb_func(){ + + } + std::shared_ptr >& ref(){ + return p; + } + std::function& func(){ + return *p.get(); + } + operator bool() { + if(!p.get()){ + return false; + } + return (bool)*p.get(); + } + void reset(){ + p.reset(); + } + template void reset(Y* y){ + p.reset(y); + } + template void reset(Y* y, D d){ + p.reset(y, d); + } + template void reset(Y* y, D d, A a){ + p.reset(y, d, a); + } +}; + +template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ + RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); + mrb_value avoid_gc_table = mrb_obj_iv_get(mrb, (RObject*)mrubybind, + mrb_intern_cstr(mrb, "__ untouchable __")); + mrb_hash_set(mrb, avoid_gc_table, v, v); + return Deleter(mrb, avoid_gc_table, v); +} + +template sp_mrb_obj make_sp_mrb_obj(Deleter d, T t){ + T* pt = new T(); + *pt = t; + return sp_mrb_obj(pt, d); +} + +template sp_mrb_func make_sp_mrb_func(Deleter > d, std::function t){ + std::function* pt = new std::function(); + *pt = t; + return sp_mrb_func(pt, d); +} + + //=========================================================================== // C <-> mruby type converter. @@ -120,23 +205,42 @@ struct Type { }; // Function -template<> -struct Type > { - static const char TYPE_NAME[]; +struct TypeFuncBase{ + static const char TYPE_NAME[]; +}; + +template +struct Type > :public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { return [=](){ - mrb_yield(mrb, v, mrb_nil_value()); - }; } - static mrb_value ret(mrb_state* mrb, std::function p) { + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](){ + return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -struct TypeFuncBase{ - static const char TYPE_NAME[]; +template<> +struct Type > :public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](){ + mrb_yield(mrb, v, mrb_nil_value()); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } }; + + #include "mrubybind_types_generated.h" //=========================================================================== diff --git a/examples/main.cc b/examples/main.cc index 0adef6f..8a2fc4b 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -4,6 +4,7 @@ #include #include +#include #include using namespace std; @@ -107,24 +108,73 @@ void UseModuleTest(mrb_state* mrb) { //============================================================================= // -static mrb_state* mrb_callback = NULL; -std::string call_callback(std::function f) { +std::string call_callback(mrubybind::sp_mrb_func f) { if(f) { - f(); + cout << "pre f\n"; + f.func()(); + cout << "post f\n"; } - //std::cout << "call call_callback\n"; return "call_callback called\n"; } -std::string call_callback_a1(std::function f) { +std::string call_callback_a1(mrubybind::sp_mrb_func f) { if(f) { - f(23); + f.func()(23); } - //std::cout << "call call_callback\n"; - return "call_callback called\n"; + return "call_callback_a1 called\n"; +} + +std::string call_callback_a2(mrubybind::sp_mrb_func f) { + if(f) + { + f.func()(23, "string"); + } + return "call_callback_a2 called\n"; +} + +std::string call_callback_a1_int(mrubybind::sp_mrb_func f) { + std::stringstream s; + s << "call_callback_a1_int return this ->" << f.func()(23); + return s.str(); +} + +mrubybind::sp_mrb_func old_f; + +void set_old_f(mrubybind::sp_mrb_func f) { + old_f = f; +} + +void call_old_f() { + old_f.func()(); +} + + +class Callbacker +{ + int a; +public: + Callbacker() + { + a = 5; + } + + int func_test(mrubybind::sp_mrb_func f) + { + f.func()(a); + return a; + } + + std::string func_a2_string(mrubybind::sp_mrb_func f) { + return f.func()(48, "str"); + } +}; + +Callbacker* new_callbacker() +{ + return new Callbacker(); } void CallbackFunctionTest(mrb_state* mrb) { @@ -132,19 +182,47 @@ void CallbackFunctionTest(mrb_state* mrb) { mrubybind::MrubyBind b(mrb); b.bind("call_callback", call_callback); b.bind("call_callback_a1", call_callback_a1); + b.bind("call_callback_a2", call_callback_a2); + b.bind("call_callback_a1_int", call_callback_a1_int); + b.bind("set_old_f", set_old_f); + b.bind("call_old_f", call_old_f); + + b.bind_class("Callbacker", new_callbacker); + b.bind_instance_method("Callbacker", "func_test", &Callbacker::func_test); + b.bind_instance_method("Callbacker", "func_a2_string", &Callbacker::func_a2_string); } - mrb_callback = mrb; - mrb_load_string(mrb, - "puts call_callback(lambda do\n" - " puts \"??\"\n" - "end)\n" - "puts call_callback_a1(lambda do |a0|\n" - " puts \"a0 = #{a0.to_s}\"\n" - "end)\n" - "puts emphasize('Hello, mruby!')\n" + "v = call_callback do\n" + " puts \"?? called\n\"" + "end\n" + "puts v\n" + "puts call_callback_a1 { |a0|\n" + " puts \"a0 = #{a0}\"\n" + "}\n" + "puts call_callback_a2 { |a0, a1|\n" + " puts \"a0 = #{a0}, a1 = #{a1}\"\n" + "}\n" + "puts call_callback_a1_int { |a0|\n" + " puts \"a0 = #{a0}\"\n" + "}\n" + "puts \"Callbacker.new.func_test \" + Callbacker.new.func_test {|a0|\n" + " puts \"class a0 = #{a0}\"\n" + "}.to_s\n" + "puts \"Callbacker.new.func_a2_string \" + Callbacker.new.func_a2_string {|a0, a1|\n" + " puts \"class a0 = #{a0}, a1 = #{a1}\"\n" + " \"cat #{a0} #{a1}\"\n" + "}.to_s\n" + "set_old_f do puts \"call old_f\"; end" + ); + mrb_load_string(mrb, + "GC.start\n" + ); + mrb_load_string(mrb, + "puts \"later...\"\n" + "call_old_f\n" ); + old_f.reset(); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } diff --git a/mrubybind.cc b/mrubybind.cc index 18a9c4e..8721692 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -4,6 +4,7 @@ #include "mruby/proc.h" #include "mruby/string.h" #include "mruby/variable.h" +#include "mruby/hash.h" namespace mrubybind { @@ -17,7 +18,6 @@ const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "Bool"; const char Type::TYPE_NAME[] = "Voidp"; -const char Type >::TYPE_NAME[] = "Func"; const char TypeFuncBase::TYPE_NAME[] = "Func"; mrb_value raise(mrb_state *mrb, int parameter_index, @@ -83,4 +83,5 @@ void MrubyBind::BindInstanceMethod( mrb_define_method_raw(mrb_, klass, method_name_s, proc); } + } // namespace mrubybind diff --git a/mrubybind.dat b/mrubybind.dat index 7be9155..7c7ee83 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,7 +1,7 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x55,0x22,0x00,0x00,0x07,0x6d,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xfd,0x76,0x00,0x00,0x07,0xfd,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0xdf,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, @@ -21,100 +21,109 @@ const uint8_t binder[] = { 0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, 0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, 0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, -0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00, +0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x40,0x15,0x01,0x80,0x80, +0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00, +0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, +0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03, +0x11,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, +0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40, +0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, 0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, -0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, -0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, -0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, -0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, -0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, -0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, -0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, -0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, -0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, -0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, -0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, -0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, -0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, -0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, -0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, -0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, -0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, -0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, -0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00, -0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, -0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, -0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, -0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, -0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, -0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, -0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, -0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, -0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, +0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00, +0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04, +0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e, +0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65, +0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00, +0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80, +0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d, +0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a, +0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x2c,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x08,0x00,0xa6,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00, +0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x40,0x95,0x01,0x80,0x80, +0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00, +0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, +0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, +0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03, +0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01, +0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40, +0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, +0x03,0x00,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27, +0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f, +0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05, +0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73, +0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72, +0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45, +0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75, +0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74, +0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00, +0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0, +0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74, +0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61, +0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05, +0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1, +0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65, +0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x34, +0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x08,0x00,0xa6,0x01,0x80, +0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40, +0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x80,0x95,0x01,0x80, +0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80, +0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81, +0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00, +0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80, +0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02,0x01, +0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80, +0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, +0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, +0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00, +0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01, +0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00, +0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, +0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, +0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, +0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00, +0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80, +0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, +0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42,0x00, +0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00, +0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69, +0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, +0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, +0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, +0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff, +0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x81,0x15,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, 0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, 0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, 0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, -0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x81, +0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x03,0x00,0x80, +0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff, +0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e, +0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, +0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00, +0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04, +0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, 0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, 0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, 0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, diff --git a/mrubybind.h b/mrubybind.h index 6b0af36..3a7c08b 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -988,11 +988,19 @@ class MrubyBind { mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } + mrb_state* get_mrb(){ + return mrb_; + } + mrb_value get_avoid_gc_table(){ + return avoid_gc_table_; + } + private: void Initialize(); mrb_state* mrb_; mrb_value mod_mrubybind_; + mrb_value avoid_gc_table_; RClass* mod_; int arena_index_; }; diff --git a/mrubybind_types_generated.h b/mrubybind_types_generated.h index 352d2b6..9d0c779 100644 --- a/mrubybind_types_generated.h +++ b/mrubybind_types_generated.h @@ -4,170 +4,350 @@ #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) -// callback (P0) +// callback R(P0) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0){ + mrb_value a[] = {Type::ret(mrb, a0)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 1, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0){ - mrb_value a[] = {Type::ret(mrb, a0)}; - mrb_yield_argv(mrb, v, 1, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0){ + mrb_value a[] = {Type::ret(mrb, a0)}; + mrb_yield_argv(mrb, v, 1, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1) +// callback R(P0, P1) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 2, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; - mrb_yield_argv(mrb, v, 2, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; + mrb_yield_argv(mrb, v, 2, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2) +// callback R(P0, P1, P2) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 3, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; - mrb_yield_argv(mrb, v, 3, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; + mrb_yield_argv(mrb, v, 3, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3) +// callback R(P0, P1, P2, P3) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 4, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; - mrb_yield_argv(mrb, v, 4, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; + mrb_yield_argv(mrb, v, 4, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4) +// callback R(P0, P1, P2, P3, P4) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 5, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; - mrb_yield_argv(mrb, v, 5, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; + mrb_yield_argv(mrb, v, 5, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4, P5) +// callback R(P0, P1, P2, P3, P4, P5) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 6, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4, P5) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; - mrb_yield_argv(mrb, v, 6, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; + mrb_yield_argv(mrb, v, 6, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4, P5, P6) +// callback R(P0, P1, P2, P3, P4, P5, P6) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 7, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4, P5, P6) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; - mrb_yield_argv(mrb, v, 7, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; + mrb_yield_argv(mrb, v, 7, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4, P5, P6, P7) +// callback R(P0, P1, P2, P3, P4, P5, P6, P7) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 8, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4, P5, P6, P7) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; - mrb_yield_argv(mrb, v, 8, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; + mrb_yield_argv(mrb, v, 8, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4, P5, P6, P7, P8) +// callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 9, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; - mrb_yield_argv(mrb, v, 9, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; + mrb_yield_argv(mrb, v, 9, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } }; -// callback (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) +// callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) +template +struct Type > : public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; + return Type::get(mrb, mrb_yield_argv(mrb, v, 10, a)); + }); + } + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + // don't call. + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static std::function get(mrb_state* mrb, mrb_value v) { - return [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ - mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; - mrb_yield_argv(mrb, v, 10, a); - }; + static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; + mrb_yield_argv(mrb, v, 10, a); + }); } - static mrb_value ret(mrb_state* mrb, std::function p) { + static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { // don't call. (void)mrb; (void)p; return mrb_nil_value(); } From 60c8c40d77565bdf5bd8a2ffe42b4bf2cffa9ea7 Mon Sep 17 00:00:00 2001 From: dycoon Date: Thu, 20 Mar 2014 14:41:34 +0900 Subject: [PATCH 063/103] managing class value. --- .gitignore | 4 + codegen/mrubybind_types.1.h | 146 ++++++- examples/Makefile | 2 +- examples/main.cc | 61 ++- mrubybind.cc | 239 +++++++++-- mrubybind.h | 23 ++ mrubybind.inc | 766 ++++++++++++++++++++++++++++++++++++ 7 files changed, 1195 insertions(+), 46 deletions(-) create mode 100644 mrubybind.inc diff --git a/.gitignore b/.gitignore index 4016432..11fc0aa 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ /test/module /test/wrong_type /test/wrong_arg_num + +a.out +*.exe + diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index eaaf042..aa88e61 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -8,24 +8,109 @@ #include #include #include +#include namespace mrubybind { +extern const char* untouchable_table; +extern const char* untouchable_object; + +class MrubyBindStatus{ + +public: + + struct Data; + typedef std::shared_ptr Data_ptr; + typedef std::map Table; + + static Table& get_living_table(){ + static Table table; + return table; + } + + struct Data{ + mrb_state* mrb; + mrb_value avoid_gc_table; + + Data(){ + + } + ~Data(){ + + } + + mrb_state* get_mrb(){ + return mrb; + } + + mrb_value get_avoid_gc_table(){ + return avoid_gc_table; + } + + }; + + MrubyBindStatus(){ + + } + + MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ + + Table& living_table = get_living_table(); + data = std::make_shared(); + data->mrb = mrb; + data->avoid_gc_table = avoid_gc_table; + living_table[mrb] = data; + } + + ~MrubyBindStatus(){ + + Table& living_table = MrubyBindStatus::get_living_table(); + living_table.erase(data->mrb); + data->mrb = NULL; + + } + + static bool is_living(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb].get(); + } + return false; + } + + static Data_ptr search(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb]; + } + return Data_ptr(NULL); + } + + + +private: + std::shared_ptr data; +}; + template class Deleter{ - mrb_state* mrb_; - mrb_value avoid_gc_table_; + MrubyBindStatus::Data_ptr mrbsp; mrb_value v_; public: - Deleter(mrb_state* mrb, mrb_value avoid_gc_table, mrb_value v){ - mrb_ = mrb; - avoid_gc_table_ = avoid_gc_table; + Deleter(mrb_state* mrb, mrb_value v){ + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_set(mrb, avoid_gc_table, v, v); v_ = v; } ~Deleter(){ } void operator()(T* p) const { - mrb_hash_delete_key(mrb_, avoid_gc_table_, v_); + mrb_state* mrb = mrbsp->get_mrb(); + if(mrb){ + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } delete p; } @@ -50,6 +135,9 @@ template class sp_mrb_func{ return p; } std::function& func(){ + if(!p.get()){ + throw std::runtime_error("empty function."); + } return *p.get(); } operator bool() { @@ -73,11 +161,7 @@ template class sp_mrb_func{ }; template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ - RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); - mrb_value avoid_gc_table = mrb_obj_iv_get(mrb, (RObject*)mrubybind, - mrb_intern_cstr(mrb, "__ untouchable __")); - mrb_hash_set(mrb, avoid_gc_table, v, v); - return Deleter(mrb, avoid_gc_table, v); + return Deleter(mrb, v); } template sp_mrb_obj make_sp_mrb_obj(Deleter d, T t){ @@ -92,12 +176,12 @@ template sp_mrb_func make_sp_mrb_func(Deleter > d, return sp_mrb_func(pt, d); } - //=========================================================================== // C <-> mruby type converter. // Base template class. template +<<<<<<< HEAD struct Type { // Type name used for error message. // static const char TYPE_NAME[]; @@ -111,6 +195,14 @@ struct Type { // Converts type T value to mrb_value. //static mrb_value ret(mrb_state*, T i) = 0; }; +======= +struct Type; +//struct Type { + //static int check(mrb_value v) = 0; + //static int get(mrb_value v) = 0; + //static mrb_value ret(mrb_state*, int i) = 0; +//}; +>>>>>>> managing class value. // Fixnum template<> @@ -240,7 +332,6 @@ struct Type > :public TypeFuncBase { }; - #include "mrubybind_types_generated.h" //=========================================================================== @@ -270,6 +361,35 @@ struct ClassBinder { template mrb_data_type ClassBinder::type_info = { "???", dtor }; +// Other Class +struct TypeClassBase{ + static const char TYPE_NAME[]; +}; + +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_value v) { + return mrb_type(v) == MRB_TT_DATA; + } + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + +// mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); diff --git a/examples/Makefile b/examples/Makefile index 8ee7810..547a8d0 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -8,5 +8,5 @@ clean: rm -rf *.o a.out a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind_types.h ../mrubybind.inc ../mrubybind.dat - g++ -std=c++11 -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) + g++ -g -std=c++11 -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) diff --git a/examples/main.cc b/examples/main.cc index 8a2fc4b..f7969e3 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -222,12 +222,70 @@ void CallbackFunctionTest(mrb_state* mrb) { "puts \"later...\"\n" "call_old_f\n" ); - old_f.reset(); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } } +//============================================================================= +// + +class ClassValue{ +public: + int a; + + ClassValue(){ + std::cout << "ClassValue construct.\n"; + std::cout.flush(); + a = 7; + } + + ~ClassValue(){ + std::cout << "ClassValue destruct.\n"; + std::cout.flush(); + } +}; + +std::shared_ptr create_class_value() +{ + return std::shared_ptr(new ClassValue()); + //return ClassValue(); +} + +void class_value_increment(std::shared_ptr cv) +{ + cv->a++; +} + +int class_value_get_a(std::shared_ptr cv) +{ + return cv->a; +} + +void ClassPointerTest(mrb_state* mrb){ + { + mrubybind::MrubyBind b(mrb); + b.bind("create_class_value", create_class_value); + b.bind_class >("ClassValue"); + b.bind("class_value_increment", class_value_increment); + b.bind("class_value_get_a", class_value_get_a); + } + + mrb_load_string(mrb, + "puts \"start ClassPointerTest\"\n" + "cv = create_class_value\n" + "puts \"cv -> #{class_value_get_a(cv)}\"\n" + "class_value_increment(cv)\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv = nil\n" + "GC.start\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + + //============================================================================= int main() { mrb_state* mrb = mrb_open(); @@ -236,6 +294,7 @@ int main() { BindClassTest(mrb); UseModuleTest(mrb); CallbackFunctionTest(mrb); + ClassPointerTest(mrb); mrb_close(mrb); return 0; diff --git a/mrubybind.cc b/mrubybind.cc index 8721692..d55d0bc 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -1,13 +1,139 @@ +// Do not modify this file directly, this is generated #include "mrubybind.h" #include "mruby/compile.h" #include "mruby/dump.h" #include "mruby/proc.h" #include "mruby/string.h" #include "mruby/variable.h" +#include "mruby/value.h" #include "mruby/hash.h" namespace mrubybind { +//#include "mrubybind.dat" +#include +const uint8_t binder[] = { +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, +0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, +0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, +0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, +0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, +0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, +0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, +0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, +0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, +0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, +0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, +0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, +0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, +0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, +0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, +0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, +0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, +0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, +0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, +0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, +0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, +0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, +0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, +0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, +0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, +0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, +0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, +0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, +0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, +0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, +0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, +0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, +0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, +0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, +0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, +0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, +0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, +0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, +0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, +0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, +0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, +0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, +0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, +0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, +0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, +0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, +0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, +0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, +0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, +0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, +0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, +0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, +0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, +0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, +0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, +0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, +0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, +0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, +0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, +0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, +0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, +0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, +0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, +0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, +0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, +0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, +0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, +0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, +0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, +0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, +0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, +0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +}; + const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Float"; @@ -19,6 +145,10 @@ const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "Bool"; const char Type::TYPE_NAME[] = "Voidp"; const char TypeFuncBase::TYPE_NAME[] = "Func"; +const char TypeClassBase::TYPE_NAME[] = "CppClass"; + +const char* untouchable_table = "__ untouchable table __"; +const char* untouchable_object = "__ untouchable object __"; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value) { @@ -30,22 +160,52 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } -mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", - func_name, - mrb_fixnum_value(narg), - mrb_fixnum_value(nparam)); - return mrb_nil_value(); +static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); } +static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value self_v; + mrb_value new_func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); + return self; +} -void -MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) -{ - mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. - mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); +static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value self_v; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); } +static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); +} MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { Initialize(); @@ -61,26 +221,43 @@ MrubyBind::~MrubyBind() { void MrubyBind::Initialize() { arena_index_ = mrb_gc_arena_save(mrb_); -} - -struct RClass* MrubyBind::GetClass(const char* class_name) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); - return mrb_class_ptr(klass_v); -} - -void MrubyBind::BindInstanceMethod( - const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)) { - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - original_func_v, // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - struct RClass* klass = GetClass(class_name); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); + mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); + RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); + if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind)) { + mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind); + avoid_gc_table_ = mrb_obj_iv_get(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_table)); + } else { + mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); + + mod_mrubybind_ = mrb_obj_value(mrubybind); + avoid_gc_table_ = mrb_hash_new(mrb_); + mrb_obj_iv_set(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); + mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, + ARGS_REQ(2) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, + ARGS_REQ(2) | ARGS_REST()); + mrb_irep* irep = mrb_read_irep(mrb_, binder); + if (irep != NULL) { + mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); + } + + { + std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); + mrubybind::MrubyBind b(mrb_); + b.bind_class >("MrubyBind", "MrubyBindStatusPtr"); + mrb_value msbpv = Type >::ret(mrb_, mrbs); + mrb_obj_iv_set(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_object), msbpv); + } + } } diff --git a/mrubybind.h b/mrubybind.h index 3a7c08b..76a7b9a 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -957,6 +957,29 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, class_name_v, new_func_ptr_v, nparam_v); } + + // Bind class.(no new func) + template + void bind_class(const char* module_name, const char* class_name) { + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_value mod = mrb_obj_value(mod_); + if(module_name){ + mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + } + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value new_func_ptr_v = mrb_nil_value(); + mrb_value nparam_v = mrb_fixnum_value(0); + Type::class_name = class_name; + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, + class_name_v, new_func_ptr_v, nparam_v); + } + + template + void bind_class(const char* class_name) { + bind_class(NULL, class_name); + } // Bind instance method. template diff --git a/mrubybind.inc b/mrubybind.inc new file mode 100644 index 0000000..563bba8 --- /dev/null +++ b/mrubybind.inc @@ -0,0 +1,766 @@ +// This file is generated from gen_template.rb +#define ARG(mrb, i) Type::get(mrb, args[i]) +#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +// void f(void); +template<> +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + void (*fp)(void) = (void (*)(void))func_ptr; + fp(); + return mrb_nil_value(); + } +}; + +// R f(void); +template +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + R (*fp)(void) = (R (*)(void))func_ptr; + R result = fp(); + return Type::ret(mrb, result); + } +}; + +// C* ctor(void); +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(mrb);(void)(args);(void)(narg); + if(new_func_ptr){ + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; + C* instance = ctor(); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(void); + M mp = *(M*)method_pptr; + (instance->*mp)(); + return mrb_nil_value(); + } +}; + +// class C { R f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(mrb);(void)(args);(void)(narg); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(void); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(); + return Type::ret(mrb, result); + } +}; + +// void f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + void (*fp)(P0) = (void (*)(P0))func_ptr; + fp(ARG(mrb, 0)); + return mrb_nil_value(); + } +}; + +// R f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + R (*fp)(P0) = (R (*)(P0))func_ptr; + R result = fp(ARG(mrb, 0)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0); +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); + if(new_func_ptr){ + C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; + C* instance = ctor(ARG(mrb, 0)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1); +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + if(new_func_ptr){ + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2); +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3); +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4); +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5); +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6); +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return Type::ret(mrb, result); + } +}; + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { + (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)method_pptr; + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return Type::ret(mrb, result); + } +}; + +#undef ARG +#undef CHECK From b300ae6e117a1dd274f731cf42fdd673d1d9c7bd Mon Sep 17 00:00:00 2001 From: dycoon Date: Thu, 20 Mar 2014 14:50:10 +0900 Subject: [PATCH 064/103] add call block description. --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index a144f50..4ba1336 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,35 @@ using C++ template partial specialization. See [mrubybind.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind.h). + + +### Call block from C++ code + +1. define C++ function having callback function + + std::string call_block(mrubybind::sp_mrb_func f) { + if(f) + { + f.func()(23); + } + return "called\n"; + } + +2. Bind it using mrubybind: + + #include "mrubybind.h" + + void install_square_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("call_block", call_block); + } + +3. Call it from mruby: + + puts call_block { |a0| + puts "a0 = #{a0}" + } + # License MIT license. From 188886d1babe129097793f620039f70dfa2f14eb Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 21 Mar 2014 21:01:28 +0900 Subject: [PATCH 065/103] add MrubyRef. --- codegen/Makefile | 4 + codegen/binder.rb | 11 ++ codegen/gen_call_template.rb | 59 ++++++++ codegen/gen_types_template.rb | 20 +-- codegen/mrubybind_types.1.h | 125 ++++++++++++----- examples/main.cc | 128 +++++++++++++++--- mrubybind.cc | 134 +++++++++++++++++++ mrubybind.dat | 245 +++++++++++++++++++--------------- mrubybind.h | 18 +++ mrubybind_call_generated.h | 77 +++++++++++ mrubybind_types_generated.h | 200 ++++++++++++++++----------- 11 files changed, 773 insertions(+), 248 deletions(-) create mode 100644 codegen/gen_call_template.rb create mode 100644 mrubybind_call_generated.h diff --git a/codegen/Makefile b/codegen/Makefile index d994d17..4f4ae8e 100644 --- a/codegen/Makefile +++ b/codegen/Makefile @@ -1,6 +1,7 @@ TARGET= ../mrubybind.h + all: $(TARGET) clean: @@ -14,5 +15,8 @@ clean: ../mrubybind_types_generated.h: gen_types_template.rb ruby gen_types_template.rb > ../mrubybind_types_generated.h + +../mrubybind_call_generated.h: gen_call_template.rb + ruby gen_call_template.rb > ../mrubybind_call_generated.h # diff --git a/codegen/binder.rb b/codegen/binder.rb index ba96b84..a0e0c5f 100644 --- a/codegen/binder.rb +++ b/codegen/binder.rb @@ -45,4 +45,15 @@ def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_pt end end end + + def MrubyBind.bind_custom_method(mod, binder, class_name, method_name, method_ptr, nparam) + mod.const_get(class_name).class_eval do + define_method(method_name) do |*args, &block| + if args.size + (block ? 1 : 0) != nparam + raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") + end + MrubyBind::call_cfunc(binder, method_ptr, *([self] + args + [block])) + end + end + end end diff --git a/codegen/gen_call_template.rb b/codegen/gen_call_template.rb new file mode 100644 index 0000000..26d12ea --- /dev/null +++ b/codegen/gen_call_template.rb @@ -0,0 +1,59 @@ + + +MAX_PARAM = 10 + +HEADER = <::get(mrb, args[i]) +\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +EOD + +TMPL = <MrubyRef call(%ARGS%){ + MrubyArenaStore mas(mrb); + //%ASSERTS% + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), %ARG_VALS%)); + } + +EOD + +FOOTER = <::ret(mrb, a#{i})"}).join(', ') + end + + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%CLASSES%' => classes, + '%ASSERTS%' => asserts, + '%ARG_VALS%' => arg_vals, + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +print HEADER +(1..MAX_PARAM).each do |nparam| + print embed_template(TMPL, nparam) +end +print FOOTER diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb index 632e2a3..6ec1691 100644 --- a/codegen/gen_types_template.rb +++ b/codegen/gen_types_template.rb @@ -13,34 +13,38 @@ // callback R(%PARAMS%) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](%ARGS%){ + return make_func_ptr(d, [=](%ARGS%){ + MrubyArenaStore mas(mrb); mrb_value a[] = {%ARG_VALS%}; return Type::get(mrb, mrb_yield_argv(mrb, v, %NPARAM%, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(%PARAMS%) template<%CLASSES%> -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](%ARGS%){ + return make_func_ptr(d, [=](%ARGS%){ + MrubyArenaStore mas(mrb); mrb_value a[] = {%ARG_VALS%}; mrb_yield_argv(mrb, v, %NPARAM%, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index aa88e61..655b2f2 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -15,6 +15,23 @@ namespace mrubybind { extern const char* untouchable_table; extern const char* untouchable_object; +class MrubyArenaStore{ + mrb_state* mrb; + int ai; +public: + MrubyArenaStore(mrb_state* mrb) + { + this->mrb = mrb; + this->ai = mrb_gc_arena_save(mrb); + } + + ~MrubyArenaStore() + { + mrb_gc_arena_restore(mrb, ai); + } + +}; + class MrubyBindStatus{ public: @@ -96,6 +113,11 @@ template class Deleter{ MrubyBindStatus::Data_ptr mrbsp; mrb_value v_; public: + Deleter() + { + + } + Deleter(mrb_state* mrb, mrb_value v){ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); @@ -106,29 +128,33 @@ template class Deleter{ } void operator()(T* p) const { - mrb_state* mrb = mrbsp->get_mrb(); - if(mrb){ - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_hash_delete_key(mrb, avoid_gc_table, v_); + if(mrbsp.get()){ + mrb_state* mrb = mrbsp->get_mrb(); + if(mrb){ + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + } + if(p){ + delete p; } - delete p; } }; -template using sp_mrb_obj = std::shared_ptr; -//template using sp_mrb_func = std::shared_ptr >; +template using obj_ptr = std::shared_ptr; +//template using func_ptr = std::shared_ptr >; -template class sp_mrb_func{ +template class func_ptr{ std::shared_ptr > p; public: - sp_mrb_func(){ + func_ptr(){ } - templatesp_mrb_func(std::function* pt, D d) : p(pt, d){ + templatefunc_ptr(std::function* pt, D d) : p(pt, d){ } - ~sp_mrb_func(){ + ~func_ptr(){ } std::shared_ptr >& ref(){ @@ -164,24 +190,52 @@ template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ return Deleter(mrb, v); } -template sp_mrb_obj make_sp_mrb_obj(Deleter d, T t){ +template obj_ptr make_obj_ptr(Deleter d, T t){ T* pt = new T(); *pt = t; - return sp_mrb_obj(pt, d); + return obj_ptr(pt, d); } -template sp_mrb_func make_sp_mrb_func(Deleter > d, std::function t){ +template func_ptr make_func_ptr(Deleter > d, std::function t){ std::function* pt = new std::function(); *pt = t; - return sp_mrb_func(pt, d); + return func_ptr(pt, d); } +template +struct Type; + +class MrubyRef{ + mrb_state* mrb; + std::shared_ptr v; +public: + + MrubyRef(); + MrubyRef(mrb_state* mrb, const mrb_value& v); + ~MrubyRef(); + + mrb_value get_v()const; + bool empty() const; + bool test() const; + bool obj_equal(const MrubyRef& r) const; + std::string to_s() const; + int to_i() const; + float to_float() const; + double to_double() const; + + MrubyRef call(std::string name){ + MrubyArenaStore mas(mrb); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 0)); + } + +#include "mrubybind_call_generated.h" + +}; + //=========================================================================== // C <-> mruby type converter. -// Base template class. template -<<<<<<< HEAD struct Type { // Type name used for error message. // static const char TYPE_NAME[]; @@ -195,14 +249,6 @@ struct Type { // Converts type T value to mrb_value. //static mrb_value ret(mrb_state*, T i) = 0; }; -======= -struct Type; -//struct Type { - //static int check(mrb_value v) = 0; - //static int get(mrb_value v) = 0; - //static mrb_value ret(mrb_state*, int i) = 0; -//}; ->>>>>>> managing class value. // Fixnum template<> @@ -302,35 +348,48 @@ struct TypeFuncBase{ }; template -struct Type > :public TypeFuncBase { +struct Type > :public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](){ + return make_func_ptr(d, [=](){ + MrubyArenaStore mas(mrb); return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; template<> -struct Type > :public TypeFuncBase { +struct Type > :public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](){ + return make_func_ptr(d, [=](){ + MrubyArenaStore mas(mrb); mrb_yield(mrb, v, mrb_nil_value()); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; +// mruby value +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value) { return 1; } + static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } + static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } +}; + #include "mrubybind_types_generated.h" diff --git a/examples/main.cc b/examples/main.cc index f7969e3..48c046d 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -26,7 +26,7 @@ void BindFunctionTest(mrb_state* mrb) { b.bind("emphasize", emphasize); } - mrb_load_string(mrb, + mrubybind::load_string(mrb, "puts square(1111)\n" "puts emphasize('Hello, mruby!')\n" ); @@ -69,7 +69,7 @@ void BindClassTest(mrb_state* mrb) { b.bind_static_method("Foo", "baz", &Foo::baz); } - mrb_load_string(mrb, + mrubybind::load_string(mrb, "foo = Foo.new(123)\n" "p foo\n" "p foo.bar(567)\n" @@ -91,13 +91,14 @@ void modfunc(int v) { void UseModuleTest(mrb_state* mrb) { { + mrubybind::MrubyArenaStore mas(mrb); RClass* mod = mrb_define_module(mrb, "Mod"); mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); b.bind_const("FOO_VALUE", 1234); } - mrb_load_string(mrb, + mrubybind::load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" ); if (mrb->exc) { @@ -109,7 +110,7 @@ void UseModuleTest(mrb_state* mrb) { // -std::string call_callback(mrubybind::sp_mrb_func f) { +std::string call_callback(mrubybind::func_ptr f) { if(f) { cout << "pre f\n"; @@ -119,7 +120,7 @@ std::string call_callback(mrubybind::sp_mrb_func f) { return "call_callback called\n"; } -std::string call_callback_a1(mrubybind::sp_mrb_func f) { +std::string call_callback_a1(mrubybind::func_ptr f) { if(f) { f.func()(23); @@ -127,7 +128,7 @@ std::string call_callback_a1(mrubybind::sp_mrb_func f) { return "call_callback_a1 called\n"; } -std::string call_callback_a2(mrubybind::sp_mrb_func f) { +std::string call_callback_a2(mrubybind::func_ptr f) { if(f) { f.func()(23, "string"); @@ -135,15 +136,15 @@ std::string call_callback_a2(mrubybind::sp_mrb_func f) { +std::string call_callback_a1_int(mrubybind::func_ptr f) { std::stringstream s; s << "call_callback_a1_int return this ->" << f.func()(23); return s.str(); } -mrubybind::sp_mrb_func old_f; +mrubybind::func_ptr old_f; -void set_old_f(mrubybind::sp_mrb_func f) { +void set_old_f(mrubybind::func_ptr f) { old_f = f; } @@ -161,13 +162,13 @@ class Callbacker a = 5; } - int func_test(mrubybind::sp_mrb_func f) + int func_test(mrubybind::func_ptr f) { f.func()(a); return a; } - std::string func_a2_string(mrubybind::sp_mrb_func f) { + std::string func_a2_string(mrubybind::func_ptr f) { return f.func()(48, "str"); } }; @@ -192,7 +193,7 @@ void CallbackFunctionTest(mrb_state* mrb) { b.bind_instance_method("Callbacker", "func_a2_string", &Callbacker::func_a2_string); } - mrb_load_string(mrb, + mrubybind::load_string(mrb, "v = call_callback do\n" " puts \"?? called\n\"" "end\n" @@ -215,10 +216,13 @@ void CallbackFunctionTest(mrb_state* mrb) { "}.to_s\n" "set_old_f do puts \"call old_f\"; end" ); - mrb_load_string(mrb, + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + mrubybind::load_string(mrb, "GC.start\n" ); - mrb_load_string(mrb, + mrubybind::load_string(mrb, "puts \"later...\"\n" "call_old_f\n" ); @@ -244,6 +248,10 @@ class ClassValue{ std::cout << "ClassValue destruct.\n"; std::cout.flush(); } + + void decriment(){ + a--; + } }; std::shared_ptr create_class_value() @@ -262,39 +270,119 @@ int class_value_get_a(std::shared_ptr cv) return cv->a; } +void class_value_decriment(std::shared_ptr cv) +{ + cv->decriment(); +} + +std::weak_ptr convert_to_weak_class_value(std::shared_ptr cv){ + return cv; +} + +int weak_class_value_get_a(std::weak_ptr cv) +{ + if(auto ptr = cv.lock()){ + return ptr->a; + } + return 0; +} + void ClassPointerTest(mrb_state* mrb){ + { mrubybind::MrubyBind b(mrb); b.bind("create_class_value", create_class_value); b.bind_class >("ClassValue"); + b.bind_class >("WeakClassValue"); b.bind("class_value_increment", class_value_increment); b.bind("class_value_get_a", class_value_get_a); + b.bind_custom_method(NULL, "ClassValue", "decriment", class_value_decriment); + b.bind("convert_to_weak_class_value", convert_to_weak_class_value); + b.bind("weak_class_value_get_a", weak_class_value_get_a); } - mrb_load_string(mrb, + mrubybind::load_string(mrb, "puts \"start ClassPointerTest\"\n" "cv = create_class_value\n" "puts \"cv -> #{class_value_get_a(cv)}\"\n" "class_value_increment(cv)\n" "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.decriment\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "wk = convert_to_weak_class_value cv\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" "cv = nil\n" + "puts \"GC\"\n" "GC.start\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } } +//============================================================================= +// + +mrubybind::MrubyRef mruby_ref; +mrubybind::MrubyRef mruby_ref_a, mruby_ref_b; + +void set_mruby_ref(mrubybind::MrubyRef r){ + mruby_ref = r; +} + +void set_mruby_ref_pair(mrubybind::MrubyRef a, mrubybind::MrubyRef b){ + mruby_ref_a = a; + mruby_ref_b = b; +} + +void MrubyRefTest(mrb_state* mrb){ + + { + mrubybind::MrubyBind b(mrb); + b.bind("set_mruby_ref", set_mruby_ref); + b.bind("set_mruby_ref_pair", set_mruby_ref_pair); + + } + + mrubybind::load_string(mrb, + "set_mruby_ref \"test3\"\n" + "set_mruby_ref_pair :s, :s\n" + ); + // + std::cout << "mruby_ref = " << mruby_ref.to_s() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.to_i() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.call("gsub", "te", "toa").to_s() << std::endl; + std::cout << ":a == :a = " << mruby_ref_a.obj_equal(mruby_ref_b) << std::endl; + std::cout << "arena_index = " << mrb_gc_arena_save(mrb) << std::endl; + + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } +} + //============================================================================= int main() { mrb_state* mrb = mrb_open(); - BindFunctionTest(mrb); - BindClassTest(mrb); - UseModuleTest(mrb); - CallbackFunctionTest(mrb); - ClassPointerTest(mrb); + try{ + BindFunctionTest(mrb); + BindClassTest(mrb); + UseModuleTest(mrb); + CallbackFunctionTest(mrb); + ClassPointerTest(mrb); + MrubyRefTest(mrb); + } + catch(std::runtime_error e){ + std::cout << "std::runtime_error -> " << e.what() << std::endl; + } + catch(...){ + std::cout << "unknown error!" << std::endl; + std::cout.flush(); + throw; + } + mrb_close(mrb); return 0; diff --git a/mrubybind.cc b/mrubybind.cc index d55d0bc..ed42d49 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -144,11 +144,13 @@ const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "String"; const char Type::TYPE_NAME[] = "Bool"; const char Type::TYPE_NAME[] = "Voidp"; +const char Type::TYPE_NAME[] = "MrubyRef"; const char TypeFuncBase::TYPE_NAME[] = "Func"; const char TypeClassBase::TYPE_NAME[] = "CppClass"; const char* untouchable_table = "__ untouchable table __"; const char* untouchable_object = "__ untouchable object __"; +const char* untouchable_last_exception = "__ untouchable last exception __"; mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value) { @@ -250,6 +252,7 @@ void MrubyBind::Initialize() { } { + std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); mrubybind::MrubyBind b(mrb_); b.bind_class >("MrubyBind", "MrubyBindStatusPtr"); @@ -260,5 +263,136 @@ void MrubyBind::Initialize() { } } +MrubyRef load_string(mrb_state* mrb, std::string code) +{ + mrubybind::MrubyArenaStore mas(mrb); + + RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); + mrb->exc = NULL; + mrb_value r = mrb_load_string(mrb, + code.c_str()); + if(mrb->exc){ + mrb_obj_iv_set(mrb, (RObject*)mrubybind, + mrb_intern_cstr(mrb, untouchable_last_exception), mrb_obj_value(mrb->exc)); + r = mrb_nil_value(); + } + else{ + mrb_obj_iv_set(mrb, (RObject*)mrubybind, + mrb_intern_cstr(mrb, untouchable_last_exception), mrb_nil_value()); + } + + return MrubyRef(mrb, r); +} + +MrubyRef::MrubyRef(){ + +} + +MrubyRef::MrubyRef(mrb_state* mrb, const mrb_value& v){ + this->mrb = mrb; + mrb_value* p = new mrb_value(); + *p = v; + this->v = std::shared_ptr(p, set_avoid_gc(mrb, v)); +} + +MrubyRef::~MrubyRef(){ + +} + +mrb_value MrubyRef::get_v() const{ + if(v.get()){ + return *(this->v.get()); + } + return mrb_nil_value(); +} + +bool MrubyRef::empty() const{ + if(!v.get()){ + return true; + } + return false; +} + +bool MrubyRef::test() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + return mrb_test(v); + } + return false; +} + +bool MrubyRef::obj_equal(const MrubyRef& r) const{ + if(!empty() && !r.empty()){ + return mrb_obj_equal(mrb, get_v(), r.get_v()); + } + else{ + return empty() == r.empty(); + } +} + +std::string MrubyRef::to_s() const{ + if(v.get()){ + MrubyArenaStore mas(mrb); + mrb_value v = *(this->v.get()); + if(mrb_string_p(v)){ + return std::string(RSTRING_PTR(v)); + } + else{ + v = mrb_funcall(mrb, v, "to_s", 0); + return std::string(RSTRING_PTR(v)); + } + } + else{ + return ""; + } +} + +int MrubyRef::to_i() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_fixnum_p(v)){ + return mrb_fixnum(v); + } + else{ + v = mrb_funcall(mrb, v, "to_i", 0); + return mrb_fixnum(v); + } + } + else{ + return 0; + } +} + +float MrubyRef::to_float() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_float_p(v)){ + return mrb_float(v); + } + else{ + v = mrb_funcall(mrb, v, "to_f", 0); + return mrb_float(v); + } + } + else{ + return 0.0f; + } +} + +double MrubyRef::to_double() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_float_p(v)){ + return mrb_float(v); + } + else{ + v = mrb_funcall(mrb, v, "to_f", 0); + return (double)mrb_float(v); + } + } + else{ + return 0.0; + } +} } // namespace mrubybind diff --git a/mrubybind.dat b/mrubybind.dat index 7c7ee83..f86353a 100644 --- a/mrubybind.dat +++ b/mrubybind.dat @@ -1,131 +1,162 @@ #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xfd,0x76,0x00,0x00,0x07,0xfd,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0xdf,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x7e,0x5e,0x00,0x00,0x09,0xe1,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x09,0xc3,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, -0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xda,0x00,0x01,0x00,0x02,0x00,0x05,0x00,0x00, +0x00,0x16,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, 0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x08,0xc0,0x00,0x81, +0x40,0x46,0x00,0x80,0x02,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x06,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, 0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, 0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, -0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, -0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, -0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00, -0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x40,0x15,0x01,0x80,0x80, -0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00, -0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80, -0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03, -0x11,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40, -0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40, -0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f, +0x63,0x75,0x73,0x74,0x6f,0x6d,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, +0x00,0x52,0x00,0x07,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, +0x03,0x80,0x00,0x11,0x04,0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40, +0x03,0x80,0x41,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, +0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00, +0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, +0x00,0x00,0x01,0x2e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08, +0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, +0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, +0x40,0x15,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, +0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01, +0x01,0x37,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80, +0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, +0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, +0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00, +0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01, +0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00, +0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, +0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, +0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00, +0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, +0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x01,0x40, +0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, +0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c, +0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00,0x01,0x00, +0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01, +0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68, +0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00, +0x00,0x00,0x01,0x2c,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x08, +0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, +0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, +0x40,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, +0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01, +0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80, +0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61, +0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, 0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, 0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, 0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, -0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00, -0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04, -0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e, -0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65, -0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00, -0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80, -0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d, -0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a, -0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x2c,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x08,0x00,0xa6,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00, -0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x40,0x95,0x01,0x80,0x80, -0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00, -0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, -0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01, -0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03, -0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01, -0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40, -0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00, -0x03,0x00,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27, -0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f, -0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05, -0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73, -0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72, -0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45, -0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75, -0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74, -0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00, -0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0, -0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74, -0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b, +0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00, +0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00, +0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, +0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73, +0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, +0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01, +0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x01,0x34,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x29,0x00, +0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02, +0x40,0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02, +0x01,0x80,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02, +0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03, +0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02, +0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02, +0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01, +0x80,0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03, +0x01,0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03, +0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01, +0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a, +0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, +0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20, +0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69, +0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61, +0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72, +0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00, +0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04, +0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, +0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, +0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73, +0x73,0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61, 0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05, -0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1, +0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1, 0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65, -0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x34, -0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x08,0x00,0xa6,0x01,0x80, +0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e, +0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80, 0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40, -0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x80,0x95,0x01,0x80, +0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x81,0x15,0x01,0x80, 0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80, -0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81, +0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81, 0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00, -0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, +0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, 0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80, -0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01,0x40,0x95,0x02,0x01, -0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80, -0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, -0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00, -0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01, -0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00, -0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, -0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, -0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, -0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00, -0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80, -0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a, -0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x42,0x00, -0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x00, -0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00,0x29,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x0d,0x69, -0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00, -0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01, -0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f, -0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff, -0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x81,0x15,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x81, -0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x03,0x00,0x80, -0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff, -0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e, -0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20, -0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00, -0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04, -0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x03,0x11,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80, +0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01, +0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00, +0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75, +0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00, +0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02, +0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, +0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63, +0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08, +0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01, +0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21, +0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f, +0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f, +0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00, +0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01,0x40,0x00, +0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, +0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00, +0x00,0x01,0x3a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x08,0x00, +0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00, +0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x80, +0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02, +0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, +0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0, +0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x81,0x40,0x95,0x02,0x01,0x01, +0x37,0x02,0x80,0x00,0x06,0x02,0x81,0x40,0xb7,0x03,0x00,0x40,0x01,0x02,0x80,0x40, +0xac,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40, +0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, +0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, +0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00, +0x08, }; diff --git a/mrubybind.h b/mrubybind.h index 76a7b9a..ddab2fe 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1010,6 +1010,22 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } + + // Bind custom method. + template + void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + mrb_value mod = mrb_obj_value(mod_); + if(module_name){ + mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + } + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM - 1); + mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, + mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + } mrb_state* get_mrb(){ return mrb_; @@ -1028,6 +1044,8 @@ class MrubyBind { int arena_index_; }; +MrubyRef load_string(mrb_state* mrb, std::string code); + } // namespace mrubybind #endif diff --git a/mrubybind_call_generated.h b/mrubybind_call_generated.h new file mode 100644 index 0000000..3978a56 --- /dev/null +++ b/mrubybind_call_generated.h @@ -0,0 +1,77 @@ +// This file is generated from gen_template.rb +#define ARG(mrb, i) Type::get(mrb, args[i]) +#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + + + templateMrubyRef call(std::string name, P0 a0){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 1, Type::ret(mrb, a0))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 2, Type::ret(mrb, a0), Type::ret(mrb, a1))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 3, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 4, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 5, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 6, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 7, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 8, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 9, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8))); + } + + + templateMrubyRef call(std::string name, P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + MrubyArenaStore mas(mrb); + //(void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 10, Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9))); + } + +#undef ARG +#undef CHECK diff --git a/mrubybind_types_generated.h b/mrubybind_types_generated.h index 9d0c779..43be37d 100644 --- a/mrubybind_types_generated.h +++ b/mrubybind_types_generated.h @@ -6,34 +6,38 @@ // callback R(P0) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0){ + return make_func_ptr(d, [=](P0 a0){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 1, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0){ + return make_func_ptr(d, [=](P0 a0){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0)}; mrb_yield_argv(mrb, v, 1, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -41,34 +45,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1){ + return make_func_ptr(d, [=](P0 a0, P1 a1){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 2, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1){ + return make_func_ptr(d, [=](P0 a0, P1 a1){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; mrb_yield_argv(mrb, v, 2, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -76,34 +84,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 3, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; mrb_yield_argv(mrb, v, 3, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -111,34 +123,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 4, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; mrb_yield_argv(mrb, v, 4, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -146,34 +162,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 5, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; mrb_yield_argv(mrb, v, 5, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -181,34 +201,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 6, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; mrb_yield_argv(mrb, v, 6, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -216,34 +240,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5, P6) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 7, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; mrb_yield_argv(mrb, v, 7, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -251,34 +279,38 @@ struct Type > : public TypeFuncBas // callback R(P0, P1, P2, P3, P4, P5, P6, P7) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 8, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; mrb_yield_argv(mrb, v, 8, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -286,34 +318,38 @@ struct Type > : public TypeFun // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 9, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; mrb_yield_argv(mrb, v, 9, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -321,34 +357,38 @@ struct Type > : public Typ // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 10, a)); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static sp_mrb_func get(mrb_state* mrb, mrb_value v) { + static func_ptr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_sp_mrb_func(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; mrb_yield_argv(mrb, v, 10, a); }); } - static mrb_value ret(mrb_state* mrb, sp_mrb_func p) { + static mrb_value ret(mrb_state* mrb, func_ptr p) { // don't call. + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; From ddfe7b4abb8b746535c1ee6f877ffba3136aad0f Mon Sep 17 00:00:00 2001 From: dycoon Date: Sat, 22 Mar 2014 10:58:59 +0900 Subject: [PATCH 066/103] change class name func_ptr -> FuncPtr. --- codegen/gen_types_template.rb | 20 ++-- codegen/mrubybind_types.1.h | 34 +++--- examples/main.cc | 16 +-- mrubybind_types_generated.h | 200 +++++++++++++++++----------------- 4 files changed, 135 insertions(+), 135 deletions(-) diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb index 6ec1691..900991d 100644 --- a/codegen/gen_types_template.rb +++ b/codegen/gen_types_template.rb @@ -13,38 +13,38 @@ // callback R(%PARAMS%) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](%ARGS%){ + return make_FuncPtr(d, [=](%ARGS%){ MrubyArenaStore mas(mrb); mrb_value a[] = {%ARG_VALS%}; return Type::get(mrb, mrb_yield_argv(mrb, v, %NPARAM%, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(%PARAMS%) template<%CLASSES%> -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](%ARGS%){ + return make_FuncPtr(d, [=](%ARGS%){ MrubyArenaStore mas(mrb); mrb_value a[] = {%ARG_VALS%}; mrb_yield_argv(mrb, v, %NPARAM%, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 655b2f2..4ba77e7 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -143,18 +143,18 @@ template class Deleter{ }; template using obj_ptr = std::shared_ptr; -//template using func_ptr = std::shared_ptr >; +//template using FuncPtr = std::shared_ptr >; -template class func_ptr{ +template class FuncPtr{ std::shared_ptr > p; public: - func_ptr(){ + FuncPtr(){ } - templatefunc_ptr(std::function* pt, D d) : p(pt, d){ + templateFuncPtr(std::function* pt, D d) : p(pt, d){ } - ~func_ptr(){ + ~FuncPtr(){ } std::shared_ptr >& ref(){ @@ -196,10 +196,10 @@ template obj_ptr make_obj_ptr(Deleter d, T t){ return obj_ptr(pt, d); } -template func_ptr make_func_ptr(Deleter > d, std::function t){ +template FuncPtr make_FuncPtr(Deleter > d, std::function t){ std::function* pt = new std::function(); *pt = t; - return func_ptr(pt, d); + return FuncPtr(pt, d); } template @@ -348,35 +348,35 @@ struct TypeFuncBase{ }; template -struct Type > :public TypeFuncBase { +struct Type > :public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](){ + return make_FuncPtr(d, [=](){ MrubyArenaStore mas(mrb); return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; template<> -struct Type > :public TypeFuncBase { +struct Type > :public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](){ + return make_FuncPtr(d, [=](){ MrubyArenaStore mas(mrb); mrb_yield(mrb, v, mrb_nil_value()); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; diff --git a/examples/main.cc b/examples/main.cc index 48c046d..c0a1d56 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -110,7 +110,7 @@ void UseModuleTest(mrb_state* mrb) { // -std::string call_callback(mrubybind::func_ptr f) { +std::string call_callback(mrubybind::FuncPtr f) { if(f) { cout << "pre f\n"; @@ -120,7 +120,7 @@ std::string call_callback(mrubybind::func_ptr f) { return "call_callback called\n"; } -std::string call_callback_a1(mrubybind::func_ptr f) { +std::string call_callback_a1(mrubybind::FuncPtr f) { if(f) { f.func()(23); @@ -128,7 +128,7 @@ std::string call_callback_a1(mrubybind::func_ptr f) { return "call_callback_a1 called\n"; } -std::string call_callback_a2(mrubybind::func_ptr f) { +std::string call_callback_a2(mrubybind::FuncPtr f) { if(f) { f.func()(23, "string"); @@ -136,15 +136,15 @@ std::string call_callback_a2(mrubybind::func_ptr f return "call_callback_a2 called\n"; } -std::string call_callback_a1_int(mrubybind::func_ptr f) { +std::string call_callback_a1_int(mrubybind::FuncPtr f) { std::stringstream s; s << "call_callback_a1_int return this ->" << f.func()(23); return s.str(); } -mrubybind::func_ptr old_f; +mrubybind::FuncPtr old_f; -void set_old_f(mrubybind::func_ptr f) { +void set_old_f(mrubybind::FuncPtr f) { old_f = f; } @@ -162,13 +162,13 @@ class Callbacker a = 5; } - int func_test(mrubybind::func_ptr f) + int func_test(mrubybind::FuncPtr f) { f.func()(a); return a; } - std::string func_a2_string(mrubybind::func_ptr f) { + std::string func_a2_string(mrubybind::FuncPtr f) { return f.func()(48, "str"); } }; diff --git a/mrubybind_types_generated.h b/mrubybind_types_generated.h index 43be37d..3d25c92 100644 --- a/mrubybind_types_generated.h +++ b/mrubybind_types_generated.h @@ -6,38 +6,38 @@ // callback R(P0) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0){ + return make_FuncPtr(d, [=](P0 a0){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 1, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0){ + return make_FuncPtr(d, [=](P0 a0){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0)}; mrb_yield_argv(mrb, v, 1, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -45,38 +45,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1){ + return make_FuncPtr(d, [=](P0 a0, P1 a1){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 2, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1){ + return make_FuncPtr(d, [=](P0 a0, P1 a1){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1)}; mrb_yield_argv(mrb, v, 2, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -84,38 +84,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 3, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2)}; mrb_yield_argv(mrb, v, 3, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -123,38 +123,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 4, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3)}; mrb_yield_argv(mrb, v, 4, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -162,38 +162,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 5, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4)}; mrb_yield_argv(mrb, v, 5, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -201,38 +201,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 6, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5)}; mrb_yield_argv(mrb, v, 6, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -240,38 +240,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5, P6) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 7, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6)}; mrb_yield_argv(mrb, v, 7, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -279,38 +279,38 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5, P6, P7) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 8, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7)}; mrb_yield_argv(mrb, v, 8, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -318,38 +318,38 @@ struct Type > : public TypeFuncBa // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 9, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8)}; mrb_yield_argv(mrb, v, 9, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; @@ -357,38 +357,38 @@ struct Type > : public TypeFu // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; return Type::get(mrb, mrb_yield_argv(mrb, v, 10, a)); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template -struct Type > : public TypeFuncBase { +struct Type > : public TypeFuncBase { static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static func_ptr get(mrb_state* mrb, mrb_value v) { + static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); - return make_func_ptr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ + return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ MrubyArenaStore mas(mrb); mrb_value a[] = {Type::ret(mrb, a0), Type::ret(mrb, a1), Type::ret(mrb, a2), Type::ret(mrb, a3), Type::ret(mrb, a4), Type::ret(mrb, a5), Type::ret(mrb, a6), Type::ret(mrb, a7), Type::ret(mrb, a8), Type::ret(mrb, a9)}; mrb_yield_argv(mrb, v, 10, a); }); } - static mrb_value ret(mrb_state* mrb, func_ptr p) { + static mrb_value ret(mrb_state* mrb, FuncPtr p) { // don't call. - throw std::runtime_error("don't call Type >::ret"); + throw std::runtime_error("don't call Type >::ret"); (void)mrb; (void)p; return mrb_nil_value(); } }; From ef6a307346ef493235bbfceefb2eaf9e2d3e2b9d Mon Sep 17 00:00:00 2001 From: dycoon Date: Sat, 22 Mar 2014 11:36:23 +0900 Subject: [PATCH 067/103] double reference bug fixed. --- codegen/mrubybind_types.1.h | 6 ++++++ examples/main.cc | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 4ba77e7..f373522 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -121,6 +121,12 @@ template class Deleter{ Deleter(mrb_state* mrb, mrb_value v){ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + mrb_value a = mrb_ary_new(mrb); + mrb_ary_push(mrb, a, v); + v = a; + } mrb_hash_set(mrb, avoid_gc_table, v, v); v_ = v; } diff --git a/examples/main.cc b/examples/main.cc index c0a1d56..aa99b6c 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -346,7 +346,9 @@ void MrubyRefTest(mrb_state* mrb){ } mrubybind::load_string(mrb, - "set_mruby_ref \"test3\"\n" + "set_mruby_ref \"3test\"\n" + "s = \"aaa\"\n" + "set_mruby_ref_pair s, s\n" "set_mruby_ref_pair :s, :s\n" ); // From 8b17b0a6cae0507eb9035ea636fed638c3ec852c Mon Sep 17 00:00:00 2001 From: dycoon Date: Sat, 22 Mar 2014 13:37:43 +0900 Subject: [PATCH 068/103] restore deleted codes. --- codegen/mrubybind.3.h | 49 +++++ examples/Makefile | 2 +- examples/a.out | Bin 3601668 -> 3602180 bytes mrubybind.cc | 262 ++++++++++++++----------- mrubybind.h | 433 +++++++++++++++++++++++++++++++++++++----- 5 files changed, 583 insertions(+), 163 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index c3f0ab3..f0d5aac 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -39,6 +39,29 @@ class MrubyBind { mrb_cptr_value(mrb_, (void*)new_func_ptr), ClassBinder::ctor); } + + // Bind class.(no new func) + template + void bind_class(const char* module_name, const char* class_name) { + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + mrb_value mod = mrb_obj_value(mod_); + if(module_name){ + mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + } + mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value new_func_ptr_v = mrb_nil_value(); + mrb_value nparam_v = mrb_fixnum_value(0); + Type::class_name = class_name; + mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, + class_name_v, new_func_ptr_v, nparam_v); + } + + template + void bind_class(const char* class_name) { + bind_class(NULL, class_name); + } // Bind instance method. template @@ -64,6 +87,29 @@ class MrubyBind { struct RClass* klass = GetClass(class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } + + // Bind custom method. + template + void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + mrb_value mod = mrb_obj_value(mod_); + if(module_name){ + mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + } + mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); + mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); + mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); + mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); + mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM - 1); + mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, + mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + } + + mrb_state* get_mrb(){ + return mrb_; + } + mrb_value get_avoid_gc_table(){ + return avoid_gc_table_; + } private: void Initialize(); @@ -83,9 +129,12 @@ class MrubyBind { mrb_state* mrb_; RClass* mod_; + mrb_value avoid_gc_table_; int arena_index_; }; +MrubyRef load_string(mrb_state* mrb, std::string code); + } // namespace mrubybind #endif diff --git a/examples/Makefile b/examples/Makefile index 547a8d0..24fba96 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -7,6 +7,6 @@ all: a.out clean: rm -rf *.o a.out -a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind_types.h ../mrubybind.inc ../mrubybind.dat +a.out: main.cc ../mrubybind.cc ../mrubybind.h ../mrubybind.inc ../mrubybind.dat g++ -g -std=c++11 -o a.out -Wall -Wextra main.cc ../mrubybind.cc $(INC) $(LIB) diff --git a/examples/a.out b/examples/a.out index e69e348dfe64a896a0a115ee3e5f1043a7563a75..92eb2fce2dc11252fdcdc67cd25a30f0fa794794 100644 GIT binary patch delta 183578 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 {2i6Ix79e=$fTb9K858J304<>yO3bzUWm%pM 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�F;OQ^ zq{aEpJ!Xv$DuBBK;FrWfn+ttQZOMn0xm515&81GTxzq`m%VrSU<`O}l^r&erX)u>a zZ7y|*MU>fgxQT^pfkSP4&)rP*Ig!>jl?r~{`Ydq_g(X)^MA}~Zj)%6C8SrwO@``OK z>imcQ*EZ!P@Ol%xOxvg%Y#ULRwJG#*UB_vpaRHzeN%x#xNn@q=G>A{ zOPlR>R>#n9(brN=OZr?BEbcXs>;veGkSqQW{s}LAugOacZ~_QldvhAiXy+yT z`hohz>J`6QhL`weh)4tAwJuPz;l0TYGQ96_otg}900_ndbTZl%Fg*GeN|hugDrsPP zth#W*9o6mM@U8%0CW-%AOZ4fxJ|9>%C*HDcE-l#RRPU4S*w&tO`Z!EY6U%^!;bXPb zJ9P|dk<{%c-6idB+k+f`j+eY?SyTmH>A0(g!tVVKJI}+_*;qe;8A{@t}D}$#beOghR&g5=RuGoq|bDe*$ zwZ(IU9(CGlK43|&I)#D!38Zlp&xhh1={{+{e}mJe`*~xW%=@UstHI%iB)w~D?q>U* z^QKzqr4i1^)K_I&H7xla3GoE7dRh=t!H>VM}z8g{$o(K~Bke$=L0( zh5O?F2jMUnZgJ!?>CW2HY2oM@Q&!hSNzU3%66A#JjdI!q#p_nO!G6*l)V(|C33vLG z=3acVpfi_$7L(AxJp3)IDBE(Jx9m6EE9Eq*Sz|#u2@t4RSh&gBPt~Zi3a@rYq;5p$ zHUK`Rga0&d#8pw+F5OQ^fZ0yu!kDV$w*CBwYEQg1UOvFusBQNydN6=rQXI`9pY|*= zfgAeSUU@}-Mw=z~I8ybV&myFt>&&+xa~`l_LzJF6I^j4vZTg;)^a0KTpIUWh z4g#-SXVmJ?uq^aH)epPCPsm}-Fo(t$IdmZ}XU3NmGJPC$3DVYud?1jvUC5V}apOvP zat{jm1W3OCXf@OI7O45a0lLqUuXfJQ2vs{jM+-IiARamd;0POtp**a{&D>lfE$go40=>zhpNkUkXC|1F#rg zD$c!SU3Q?|8<5lTOR0#tg%Ti3sg}JC2{GYb>+0%th&dOam1gdEbftAX?7qylcV8;y zD@#yT_ki*-fX)OReW=l|&poWN-9{JvMUA0fxx-`5f%ta-p2ov}5+7f$F{$XK)TBK) zFwuewX84g1F&1zI(xqqIQ4!A~Y?B$T;?LlI%2)95`dc~=YxGm9gybqg$W!vk8y#Yk zy)xDRs2PJk;$*E%5fU-1MY$~YVohc1Wh+w@hb#&U-ZY*}_u+rFyzd}Z6QNGsVHY6s zEIIeh&&3oQg|dTzMX-D{KN$LF9?J1(KpbNL?`SqdaMg+W9XB zJl3WVF01HGp$KbJ2vZMlCd;`M7lr2Giji(mA}VpQ5}@TImt*l{ETCo3#@6`vgjkPi zMFVrWqB8;q+N4&6L0hF>`Pv;_G8aLdmt#nVbcpwChY^wsfg)DQnE9}sRdDWR;;TCd zBIey2a%gJ`+GScqbk^<-xrLYLs^o2zw1v|~^|_cf*>@JzE{#R>y@&4&0>JSy)_zIJ zqSWx-HalQmudstQRO(d;@h4VT==C?b;$?71I%eraZ>U(Wutp_?QV{ZVP=@|HOAM7_ zI&X~N7M(X#FV|<$MhTYdlTH5s^5>V}On6kYP;--lP`I|!hWAe#i~Eo`e+-BpY%+2|Nt&X;ck&nZL%8WsyZ5ei>gb=tE_Z^xt=q(JGfZ+E)jKuRfwchM ztC!_n!|}##AFGqR3IP)UY%52uLwBcbZ_EHr8deh89G&j1AbA4t_q9@OCG=?q^B|ck zgcf7TGg-J?A?9lA1iyVowY}=oyQ5Q8`O=fsyzkJ5bbdcXj0XIjxnEMkyb!y99k7!n z?4X5M`bO?8$E?>}?*j)sCPyEJzS3*1L65msp+9y!0`eCD@5xwtPe(7T+AV*TyzhN; zC3R(*OO5y*pEmjl)RzE$NpY!=YdeSHjKyg=6aO0&I2s&>r2@1{$R)fK;h1#7tii=tp!NyV0v<+bTNV%kBv}CAU;(dT zX;(A>t~-D&fL1|uqO`zkTL7Wi0*I@+AwAur#??)~%9r|hmRQ9N+inDW63oRfi7}f& zYj(g4%0S*1sL>g3D7ZwKJhF!)d0@Z|BbN9jiIrkfq& z99B?VTxu5(%uW6a-2+B)j^kh_9yn?yu%avKevBOh02>J{fNC*lUDq}eLbH)LiLLTY zO^;Fc)k`0yE|N^oA@<&24t_~Y*+4w(fPwrQ>%gXgRG~PF>~UIjW1!CfG;eYVFGV;e4}L-|MuNKe zS9iT$Evm5m3Ghpbpl##=IN(bsxLiQZ#t?*F4bY6pCA<^^6XPmvBkfjXM8@>6n~k*y z+yKDlOqGiL4b8?G_}C)e39^W4AgS3P94x{$78W5-V*wYy7C~#7I#F71wJn0sY!Sp& zFSycQHLF{iYGvBT1AI63_Y`@JK3J}; zLa)PGR-q>R?)G&5hSq%91}bHTX;>&sLaZ(TEik!AU@THL(uJzB64Kx`{O)SrN-QfM`~x+r4B>YJ{F0ck96z&z+SjG6 zLqskVrA0mfvVUCVp9-=B*9%?fTu;e9ZEz;kW>f#OAT~J6RCAYm=jD9#5(W5F z%Mp(VaSPu28ps-K4L*|rS}n9D8+cw~or6MnD1SF1bYa2xvk1=yeHH=lekDPLr`Di6 zD?ooIK$j=YtWk3cKjVXtw`J|!nQ5K@^n4y7ngaZiVo*U;%lLH;u@{qd56jgJp}7Dp zSIs%P+IG?1G@$~aE3ZUREMnAepqLc@y>Xb2iyl74y$y*AqUJG#E z>xjE}<(Z?p^^!Z**B`aGM4^SyF;6pgoP|PC^@mDtIIqFTqOw3g&C+(8rKAZ^1 z6E448tzP@f9brrW-`dVj_)kk!-+!U^8y=1_diZ_?vcp$bO4ct)Bv>InAjJ+?Npp5! zso~8jSz-sc-RbDZs2O)UMz8~>T`Av4LBu}bx&WYUkY*8Acu=7omTLdkFDi8SN>4lz zrIF&R0_)T>WV)1)eoSEqT+k~%*~ln*OkoT5X!T@2s{ELOV!zXSntBfNF@>3U%d>oTmgvCIj|ZYRaFGYm&3BI*xb(KWQ}uTkF^NsT zw$Fmy7e*eY>!TUPEFNvDk57d_VC#beGnTJu8U0co}nAJxK zSk-`#oGP)X#`BSQCIz!1IzS><#C(H;BLMD9DORxLK`$&=qF2hhLcneaqD%+iT?Cpp zY2oSEiTT0;&64yB3lxkTQ5vdA+w_6HidtC$#fY>I0rz!)35Ejj@LYQgJCNTTcF+Oa zx-Ag)8@zqaTItc8=?cdFf46nFqsH?gUw=c!KEn4XxPAlhOG-oAc?kSa95x-{piS0; za=<0a&f_@{cHW#Fu=9?8S$3Yz^p>5^-9dK##S9^GCt7yi_*=7}Xnu2CdiueSq`V{o z?EHyBA&yM2?0g&oZ969qC~Z3*#eS#vJGCp+h->y_fVP2)JfOYYsL!guLXDKf@0iql zH-tP)YFhP=-)gI#S_@X~{tnxn0BsvIKMS^M3PDtS`Wb~@DevwKtL_KfaDX-piUAu) z2ZE+>@#;h^BRpary!Qh9vfp>=d@ZAqZwGvAzQoBgUqUi_qOF$eyJ6gk*_<}t&nWPF z(|jpbu!yGl;(ZWHM4XliMFbCGbOFG6X}YI{9CKr1+k9zqr_GnbAv&d@&%u1sF};=V zr!dQgS0Z3*fR$eoZ?@s4>_G0?vV&~6K}&?~gV%k|N|h#j|EUdc{hsEC!+nL|`WnD5 zDGhDI?^#lO!YH!gHosXm{0#@fhJRrPY`D?ymJNr1k$GAOjm@}SWW#S^k^9&2mJOc; z1(z00zmCf<`oWKa@{$O!;e};FOarlQt5ePg*)VxPY1?oT`<>oD)PuE+xCXfa+FCC1 zfcC7~UfXDv_#6kBHcK7~lBUgWI8Qd)Vdz2NzX51lpqXN@xl#yX;VXZbq2Yo{Cd~CO z;KF~f%7kK|%+CQybIDlG9FdCYVIntL-9a`G;Fo`$SL?%JwR7QPJrG07Y6;1y5G}Uv zhe+XCX<6+m;I;#}(WO|yk_N2SlC)BG3j??J5aUMxtd{1W+G<->1gw^(oZ4zB966vg z>?1nu)N^&vmyG=pI}rer3*N5*5gY6&b|7P4v4aeDO)G@m0qT7Koghs>|DO#u(B`6X zu9CBUwCAkhsxZQ6;%oL3Cbxx_icEL)1ZVE>xC=EU=q&^;$-b&pTWrSbT z>K9x)1DIU=lGw6wKhF+iYzsS_7^uI5laQye`GxWPHI9jhH4UH>CYSIMr(<&1FY4nc zqhIPa_}&8eCDGC#tWvI`&Cg@-ege=@Y4a1(z4Z%id1iJ?`xOUH0e(qj6zgO87N&mF zI$Gai9D~qF0Ieo+5ta8db<}Ot_pO2dQ-HmTtG5LSeT9jg=AoyL6R5PX#e1W<#e1(K z=0*M{Ns)=y zDQpZ&F|EuxmvIL|srq38d%Yx&SsjbXe{L_5#ic0kF?GHk)b|s@*?eifrd78MsD+ZI zlM8uHXE9qKiP&U@>F@%%5Hx|U)ZaK13cJJ(D9n2d1YY9g{S^Q3ofy1u_iNWIahNM> z{2w6=#f(3!k|h@%**rjt7i&t@WA%+#-_!a`A6^bj$KC&_ha73+v zQ8(&4rZlhMeD|js*1%}(Yktw>{Cy9**(x9;*a$BnPsu;;aEKoE5r8|a7}s{vG3as% zArXUW65Y#Lz+TMD`(1VffZ|ZC)vUeWcSHh}vOnf`;!(tT8KCQcwY$ZaQwS}*HzRJ9 zydQ3w@x}UZ_OwHeSdGB~+9wpxw?uV`Y6P)@UUB-F9aLjq!(&a3CI}q>;O$G=xZ*X9 zz`TqeZ?f*G=!u!Wr(#ach`D}mBNeZ0sEaGyE|oeiy_>JgU~81S6(sLpF$HY40MAWq zYj!}+&g`HK(uSDyxG?F_H^ZX;3NkeEK(%H^x;xCA$MDTC1i)C;yhCoMnjdSped9T% zX?Wy8OgveS8Bz_yqhs?m4DTy8yripyNVW}cKB6xHu;CGbWq1^~973xpLKH#ht6BY( zAdR;#f{_nt+m?9zFO}*sTDrsWb&j*rG(vb(p~qklj^b0NqI2?-YXiXmHJ-MjE& zylsUmtr#B%Ss@`2!?MCB*$XSY?J_H*INAz{HNKL_R=5T8G4U$m90q7Bw079o3JEQ| zwL6m)u7jIqXmKhx&T!|~kxtPVfXhb+VAI>h4l=!$@$i+SH$o=?*z{<#j7={vsiKFl zEYs7IDs6h^w5qYh@YHCc=6N&1RNLJ27QPL(&3y#67p}+}A2J1=ZEi3-AmG*PAe+00 zW4)^}@6a}v;h=)y2RC{%jDijPel1Ha3+V5M~xT$i`wYn>dRJg0``2aIkHRJkXqNV<&&&4%Bx_Hoj4a z6^Nu){2%5>rg@PEkq*iy5MIN)4qa|u4(PdBcEfz&q-|ci5&Z~&3!VrrH?M^iZE)rW z(;wZY)vZMWo1H6pkhX1J^=moR4Tszf)q=+8T?a9#*{}_&rJiaGBl7{tX*qiadRIb% z4;D9pJS7LrcZgxOk$q&vIMXFyWQ0Tv%g8=qFN|!|WkyDEw2={OuQMJ0E9IY<-iRL& zr%sqd%#q@=A=X~VIB+0kl?&r%aHO{!S`Ds(()U`MF1{6uLB!=$1R@>N zT|h{VNyroO(Q+x0a2#1bX1vu*Vv;bPCN~q_2EtSF#o1CEfh_g8TdXz-ALAIBs6Kb2XY)rRh8AeEs`4w1Tlk`TEKq_#90lM9wkGWI3QCKXDI+E}> z9sqf&WRu!zXA`4)pND~42f)n){D++-vO(? z&%UUtQ<$3A)Tq-XB-|-t0O<6X4fyS12k~3}HYR-i5SjN7h%RFxzf;oYJm(CY(mq6gGe@o-Xe6WF!|vL7J8Ht3Y^G1)jm8c?D4&oDY~;QT?F16=`>p{5*Ia-%$2q_Z);{W^({mw z8**S8Hx{TG(>RJio0>!mn<6i5YMPTcy{Y*RbGT~RVKcrl2!V9l{47`;0qACQP92{u z5$4k~w~>k$W7%i}JDfDbISy*Cp62XF)0|`Bjx(u+TQ37zyC^ z;qN2(X8g3Pc~-y`LSuMyThbL`4&sr9I=`xZ1C@JA`dHPzIc)0-Fmyy+iK$;wg52nI zVh75)KRY-xwGqjyht6ZOh3H~urac0B0=OswL+3zd2K7T`t_Q`PQO=$^H&+-G((9{s zW@uDsXT}^BA`P7xyi{wx#A=_|^xZPr`l@R~w^MWiu-0m%eXW;n$IfWN1JbuOgL3fRpKDBv(V zSOE_sl2?x;W{<=TuHM#C&Nc+>1F!-DBZ)BsRB9_DChs(Yz6a?1>TktT^DsIW`E}QG zijDx5<_cYB2D(l=ztnfy`87LFa1P{G^|`Tbv%o=J--?k|u^&VlXReqI_R@jpTsLF~ za^0LA)VmnF(RN4GM;ivXUoMNpR|4T$D5*yh56D$O=%$UXcf>#10EcqXh)gLgn^i87 zj5H^GID#;<3i3;eCktTsBNA1Tq@jBs3w=fRSQmRPfwecp=(+q1)krNU3pF736K3cG{fV1QOXxyanSn|Mfg`>Xi;Q8b#}$GK6RkI-!ZUN{Ui zn}n{>Y+7xc(_Ea=YlgbjL{CO*hPu_nnxS6#LO+86$MHY-um?3iC**tR>c?T+k%KTS zSzO?B$CQfQa9HCGLULbENHm!Z|D+MiP4^&!_8_5s1Jm?w3JffV5t1YR5v^9WHR7gC zv#2O>ll?G4GF1i~m2v_`qK*gP{1m{4J*d^ZY+6+Sv}x?3@^Q{VWHlmV1QR0 z?#1^|ZS{I%&6p>H)JsT?_`Qx;nnV%n+~*LbcEkx*M3TqSI3XR2v8d;50avB`oK$`X zobLlz8`QR6wjfYLc_lbv(+7NQqlICL~8} z3`eD0{cota0?q>f&N=lP!E@iHQ9{(vaZtx{ND}LLDm=~bM(qKI+Rl~uPdXl}QZtM! zwYpbSoH}w(dc?FAlPyK(Hgt;RfWIe)<7|k|ioSy#Q1pZBfTFvDfj+wQETf?4SJ|Nz z{Ye2U`b}k|8}-K@1AkWSYB(&_5|Z;yNGNUn6jItP4>-gYTWOK;R>UA}6Oto-*ihY? zjs|0pMMWKrrCLHVRXsQ=W%Gxi+9EjL0B~NZi@I#~S3|QwUDzQ>oad=a>9F1{V1Szx z_)nT08c)_c*Ecr7DHZ|#&e|_2Sytm5c0i4HvIA<&&$raLl2K6ObL@Z`Ps#8_4l!V@ zH7BbC`*xTri7d>Fq0g*>yvc$(w-;oNXG~sU5wA*M#`cASNICQOtG*qvPZHZGIO_ef z0j7hsfHONsTFszYr-SG?-agF1a0-sP)a!v$0Nthb2*i3&CgBx=*aO)>Es`vh+08DN zttjN6)!kwlggVyp*`-AV9fZ--N&IX~8evud6aNQhmhmqRLGHXHfOp3yxbY|x5JcVY z7}aM<`e?PS6I$hm8au@k_8T8Usa#v$@^jci&SnbT{qgJ0vH`IyF zM)-(%iB54Z0Ne54Kav}ISmIJv1pfyDhUnPQb}q>gqsI;cMHr}t7x-LTgB zE-_(76q6WX*Y6y5zDuoLzwoA*k|F23>qj0~A^G*L-x;L27~`#3koJ`P>1QdHAZBma ziCl3Dh`DVU0Lk<`yFXA1C5EGSTB%7ZL;P)z&0QX>;c}+q1XeQ&yENvh?4XY zEAQ?2S1td*$YER;YY*^A(ESL|qbza-wg73sfus(~xjxX}4q@>$3tfK?YzjVvfPdH& zoP&iyYzm&2;-?a8Q?RGkR#Jr|Par4Q6x2#Gm4;10_G6!AR?lWsm#_Z|N*swu69Bs4 z$R)hnkgqD)&&wvTw1+XO+qb~~0`NuTk#5*gX34map&Ee%8d} zX~fzH@Jr&ME#PanLlj}hvk8~u7r@&VK%QU=7!gi$a#(;L!eWKn;}DAwQ(M5eW~K$a z3mLTqBm%Wi`e+=qkVhUC>jjdi1A1E^9{^3j0w!`OEMO8l$O0%yFLCl#<6pHLj83+N zy$kFE-C=;X0CEK^KrU6XSB+iZe8l^Q0)LPTd{jN0_k?XHu};l(1LV=UOm9lG7TGBzBF0uHhORNiAI2eV#v`RKk(RChUf@jV zoz==L?9LGMlpNH_A(o*I=)z8IVHWmU$fFDU7sOvEX*{-&M?e2q3_vMwzc~ zNt|wvnAplGrULwOTT6AQ9}0N|e0Cv|C%BNiTxAyWatMSIu@mtXY2;iNa^2QuAt&^; z3fYhN3*~AMFXX|P#d(1w;(%rr$WfpPD&+bcj6(LXg9@3F^b#xY)A&~{t8ff%ODC(4 zJA&?RfG%Wm1qzwQgj~oUg8Yhw{38PXsgQSZArHF7A^x0c74l*5w+op(fvi->aIGY} zkhRiK$dm&d8=QyXSvBH(2hhbsF5#Vza~V}Wc?=%f`Oh0%IFL_*ZL!bvc-lBcQ-EJm zd|lczh+PLD2LS@?YLqs`u~-gB!!aQj_7<>`f{u6wf@TA7O&9+ii;L;ehZ^*B810-b z!Xu!1Du|xOL=9<7^fHhi0JI1+&Z039E@=$mVGwz6En|oz8sWX4@+zNd6EyBhtxorh z%$jE{)!f+DDINm&C2>Yx{c<}yfZ5Lu8X`q)g+V?6vgZLhX>#F^3mT1M@}ai0`kkp3 zy_(*c7t;q!+hZ+(4{hfZR|EW#;_D^CUc_!PkaGb6c0tNKCa-Q6#ItI!5vpcp8sWX_ zwZ}{pfVcb+m)KRy=eA+9+1i56Bz@o7cf91`gj^?w)PyUGkOi^gQCL}4b`@DI>zzmsJFvgK{?@lr1*U zvEKw#jgH+?F3|=l*X-7{a{r-Iua@2SIYjDiOSuQZ;zxibP=qZJELL4L+=xqXbaaYH zfK~vxgtv$_`D2F8yZhbr9=b8`fU(x+3!vKq@JouX^*Qzs^!X0FCjkL=HT1cqV-Qc$ zXI8S!v!atz+yU@QVxn7w{f8Z*%Pz}!A3^9F0G%C@HAuhlBcR__o&VOS{)7k%gZorV zzeF3PU$aNm`u&Igv|8SL#35V|NE>e^Sj+@i0@XC$KM$J5d!8L+yyI5_bqiuF0B9YN z3-gyM2aI=SXHrk%!=H2v9W+O@!TXU~-Frb(3BX1>{%dvLL#$52djSw&RYTpCnxC4V zZ5Vyiy5K+x0IylvOtPsr917$lfM!CSD;*BV6VbB>Yjr+7x~LDbjRfC=z&!!*ONxgA z@XM>&LHBpVwqpy@Uh3Zp{9b@o54lKm?`X7s)$$pT?m=aGoGWN(SEuL(;FbQsB$v=N zn)6TEVqrpX_oW9cdZ}MG=jKwsZqBjPKfkG3JrYxsQQ(pb&~lKA<#>hVn6k$q&Z0Te zay*8>N&w3dm}(KaMhmD}QTrJzhHd~&F?0h6F?@QOg>8k8c-a?E8pjvjT0a+ti9;~)igH{}S7TnSyHmT6X0M{PMEhOT6$7`l={j1GF# z%6tFCWYz`}XaWeBbv${6cP>{GM|Z25)VVqVl>~cUXyd1VVlKchDLOKMN730q@0)sY zXOPyn?gM5uKy%iv!1C5Tun4^2)t!b}6>8CVBXs54Mh{fjj`vJjrF}Cun0KTTiRKR8y+tvfh+NaQO_l*(#q2eVn2K;FrXibF`5i z!0ccL>|}_>N+za1CDT?d`XjxsqUq3#(%Y=*&^Mq98$d}DXHL33JAmoI z4oZ3wnMVxBx&w65WO8=WwAExMO*B^0VFSoK9?1I$xC;Ob*zuo}Nn!^uZP`J|eAf@j zgbs9yRsfw0*@2x5?Yr2?5RH}0g#mW)Wvh0drbmqbs=~_Q0nmK~z)}YObJ9`l049MQ zWQBdF!wR9{-+_r5WTmd(@35_~N`5s^&AZ+h9a9XF3IM*~tC_-vbl5<3?x!?o%(7|L zoc=h-PMf4EE63QI^HHXr_dicZvgy^^vZ%PAHE{F0bJ6_C0HeQBN%mDX^uQzQcd zRMm1nQr-iVCUe8v1EE6zy6>v!t2X8tG44sg+!u^Jo@aCz^CU34gRq<~tzncG3fDAA zL1^NHw+XhcDrG`4a`--Q-vD$Db&C{~!*>SjCWkVo4oot_V{RDY6gLC>lA`K-nN)Z+ zGE_~-H^Rrsp*Wlc2oT{JOeD7g>e1QqBD4cQXN%G$R@L%-Pz?apSkC-lP?QBxsU7*q z=Dol?6NJ4in-mn3&G)D(ZwIatptGqvlAvt9FjUvt(#gh%m}`eQ#bf{$E0`0NTo6HD zHo8egKFjFNg7!iU`fB+z5*>z$uQOYBIMx*aIn1 z+1bD>3Bq2MSqciu?CaD#t^;m6KxbBu0)jHTd^lxx1{{@* z;xcVF6=nJ!2u{@?s+J!kxpE9fbT)rRXvhdFo0P83=A6%@NC1`2W;`ec1W~C)Q<2RH zz}y^!y)2s)6qL9}0O*t01h;~APYwENc>&2MW0gy1`y@iY2I$h=k*G!%qJ}y~Iz?-MjlHqZ z=-}%Q%%mXfW!a=4JDb&VINmmDgT_t2_~S$1LOU)sms-6$K;;HiJj=TV6fggc>SNiy z5X(l_gRCBty$h00FC!~IE(v7|P$~cDgSzt4(dcH#|oL05t32$`_UykIJ z?WIOWR0|h&G-5fSO`v!uI5zHgb0QcD*B+(X%`jpnhmNMPJB~Hc*xg){T_On!S;&vo zu_e~>vb6?#H?|=hO+k|exJ)+MZiy$nC0qFD;60aeJW}~ay^M$!*|wO+K>TGeBflix zJYsJ%T3uBHF`JDs#iXf@Ehb@u#WdGMto?vzY5T4pXhs1p6O*<9;|Xtx*=h`nxwLM^ zs1{YWY!^UL`|6zE9h@?h?| zcxjh9p754z!>-mUq^)W$<7KvhG1oXnOMsm{ETD4ADC6R*)uLhuI2Gacx~MH6VS@!U zmq7LIZ>8+J3j*E+nkB*9wSaW%HJYt)7k?3ye)}`fLda8!VxD?Af~V8JUkoaO^4QPjBqESOgieM-n!`!c)_b zPsuLb9O7hgme1r7IqvUP=8=RA=264Suw9*ir5fyBYB91c7D2|~k%SFqQNtKcN#EDM z;X~Qj?$bOTvUt$Khp7#ZBy2E`8s&9L9{2#X*dEp_-nUo;Dbyng8_dE|XivUGTP?R# zIz-Yg>!rOvK^-@qG=j&rNvpa&4O(Zzs^Kl8dZ~Fg7%|PefpV-xO|?{02d#P%^*Ocu z1}rdCfbe09m^7t{gVvvk*jzrr&}88boZQ3Wklu9JjF|6Pu}McdcF>jp#WvS~5W8TD zL%e~5@H+NSdP$Q&4yD4PA(`C$%zkf&{s8s3JUpit;tCn zIrN+r`k*7H|0vaBmJuCNcX0#NdzR54p>C$^^O*zeTbvsv7CUB^&7L$jr>tNK=3I4E z=`5q6to!PHvy9pf=lFQsy=}4<-@N$i$xcQ@Xh`mnETJ3+6D{;NvyCRsw5IUpwTX^a z=e|r!P<`eYG0xsNIiYb?z1?wyb1OB+_)z{!-EgBZ!kOL%;foJ>%|*#5SZgwxWfjSGzE z(a{4fp-RikNXV<~Y?_F%R@|9+6+|$>&YOvt$Q)+TEDoi5EL+WJ6xmTWP*>e!wDZL* zXok+fl>=rX=3nH7Cm&@Pb1x_4%9)fmt3bru$7HUYDMfixMa=ya76D&j5yBRd&y8r) z^2#R7o+4r%AVf5x&Ypr~Ma+Zb_qcM(XO>PW&YOuSi-=uV(m=%Cg@+nVFWLrIK0Fl3>G8Lq zfL?IBT!nK)ta~Gz5w4kFW_*XCnADM^p5b3$71LE(R)BBmT}5u;npK{cKSOx3i|~yGCw#0K&q(sR;4LV|2m06-;mR)* zp3xOp-*&^P>Bf*Z8eXPjpT|{JFe`s{f$&^&8v+wtWmHPSGq$S_8BKB(6wjKC@7a3B z-G$I(SAh;4Pugrj(v;7hB|O)KBe0EYN+G@>IN@HnQ<0qn2<*i1ExhbL84Oyp;>e#j ztF$0rc-jOIMMWj~Q-r5OVr|kxGyHEjp_aP1&}i=SOl^b}S=V$t4)2-v5m*aXo=HAE z5`<1D-c!Via+Q^ol;^-Zle`hGf(p1xsu0KRnp#vcDG%Se@sv_wM7zpMN^xtU2#J;v zfyY$>wdW&tQQj<2&7zV?aOD^I;I)wDgiLbHESWsJsK7$bCS)=SsU+V*%^?&ir>wAe zs)f9fkZoLfWo3DDEnEfRQeD&XW=*qDa|xB;qK`0Hu32+uPAajH^9VW2HKU-cxS%LUXHj@= z@8SbG+cm8quM~3Jc^;}7>O1BJViYl(K??9FyX1LQQZL70yA4&&SaZk&7%B z6yqz6_x^&Q$=a8bpH~XhePl(`OjP0I3gO{uT;x&7D3S*kA%dFJEV4lx&my8McTFYb z6&2$4iDxm@uL@UQdCAPe{G6ZwmAA-f7~^?}5})Uqnx9iX4HiDFqzE-bEnZ~A#d;nl zZud|aYD{TPSzdWz2?BR5GU~^8R4MAalwpfv5I$vgQIYU0D^+b$B9lTq%S+XWl*pJm zo<}s1bCF9OZP++wu;)=qZi#DV!AvM-MFeX3GSV<-YGoccu5eMSlLnmdtZInx)vkhp z75N3FNW0i7nzdcj;graRKF`xs9P3IDhkUBAp0{U^m-Taky8r0ezpu%egka0 z97UE_gq)P1hCD|^n_RO&|NI0rCtF0LR8Qv)Xhqb~)ZDPa#fBdRO~#c1RDpF`|6BFr}`n^IYbcVN={Qe~W;)Kpjf>Sxn_k^a$9YH?-Au=MbTd7v zWb#}Qmv9QnM0k3;A#z+JqH?ofaVp~>BWZe^o8+TTAJYdYPu1R zt4HcZzkrg6t4}3C4Ry(sDI!koc*uxP^bDY;FPzE_Eo(s;$~dpQ0Fn=)X1tC%+9JNb z8rCv$fEuyHNC@%d98xc~jO?#AE-?nz_q;HeT1SoyU7_3csK|#g@`>wCeUPgdJtK;_ ze3ppo{wLjFc5%zDJx&Cd>lE6Jrgbv+!W6kqGzmVVU@mzou}Bf^ znnNvZTzBd*Jg%8}vu2p_5?qDFT~KVCU=mvTiI61W^&}+Tu&&o28PJ@e73L1QVHBZ+ zYce%3qMu8`Q{ie1jT!HoZE}@eKlbj&GpzoHt9vs~O6; z%9jwk0~X*aMlVbym*8oLItf45`-C|1IXpDnNoe>n0-UbGSp_$UgaoSWE>~$uNs&ls zq>UNv8yGYuJ8)xUfo>upk(fuL_d%xbR2zJrHq{kPoKt&!TMpSzN+D|6a~N553AiOFrbEhkxgv zrS(ryJk^YUmW|+_<#YMxkyZTTd-N#(uK1pRR@cEp#i@ypx8a{BhVjo+v-s!P<@~dL zC;z-q#XlP`=|zN%&G_e~{`~WD9{+5b$3L&EY`>iZ6nb=B)D438t}g2uE- zi>#wAtT197Nxy4M@?(bAk#tFWR;5K6s^l@uRg=`wv`DXd`7xuuBdL~JoF0i!%cg_f zw~rZ(9ZBIDlf2Ss1=2<7k;!V-N=%ZI)Z&%K5JyrBg~zCjjL7<`)+!^(k(8h@zKqCv zDtna????hI(d@~HY@n8{GCYX9ah1{9k<>y5{DgSECYxw}m)bOS7a3^N4wv{RjUMw# zZJM6TKOM(7$kz$qw7^g2r}(D}&MLu&YDGWY-{YSim-we=OAhNDi`t#qw9f_h^`knO z+O$74IjKzt^x>Zw1LyH?=2WK1dXRqxV_gO`Lr(M0upLY?{44&ssy-t}^x~h9*z*PD zs9N}Gk%Ix1HR__4Ho4QZL?OEVk%Dqf9y&?&?iA^1mpq)Be9?`t$s@+1<(mX(osC_S zcn;~FGdw46@?=QvY)_WOtPARA4hVj=KpQy$lB_aCyYjp zovL$Ygc2OJrNM{Yj&xBl#gM#fYwvajN-KMr^(0 zZb`_Ivl!!BJ%?|ivY#?q6f}8-47fi}u`sqS>p`}ThA?tM$0W=n##2ekfeo4o5t&1E zK@J?<818%@q?ZF%H-&rhd~)~v9`unn$UmW72b`@}bN(2sPCaEbY!NwEwzL9x~s22iEE6(V^c~W&ZN;2Qg)`e<#EK!Bx>PCQIv|529g&JvWOt1 zo_w1)uSNWLLdUPA#0ATpGIuYc$-%{?C9_0|+PMZ-R8yMB<%l2#E<;dC1@YAxOS$KAoo^~D- zLvlvvVDvw;5aWN*Ts^vLA?<3F;9ZPblV{46eGDU?vZS=%X-=~dU_?h>#(E~qG zJtGs<$*0kDq^R*dBU`Bs>#(qvqDHPWI^yR;3SPU;XfB(pq+XFt)c5PqvZSb-UXe+v z?K7~i=4u(?r#{2cKJ0}Lxiw8u|XZ!|RPo;Bj( zHu|7pI+^!q8gYvB z&nNxyCGrg~7_~hquSj_gWq1M5`Xy*ojLD*6S4Ur9(ZAI{wO=%vA$t24S@>(UZ{CY& zx>MBS@HI;LL&}S-P~@#mKJf>L*=WtITF0xqfqAytV6;KJu^U*VJ2x0D;d@^Dk_JUK zRaKjf(4`xp`V+j^NlQ&`z1zpd5O7B)<270;-t2} zWVA)RZ(d@`n3tKP-^=Wq`7)Q+V=o)&AUXOnt9|(3$cFf4C5td`aAdR^z6m9sqBagj zN#42%jaG_Uw#i7w&-P6$+LxP{TfJ9U-tMokZ^|p2{6pHeL;sx7B=t6H%FRqNZ8OWX zWHU3{u^FST6m@B{(E&fHud-Pezsjbt=2bL?DeC=KSC{FgrsaYeWymC zEq!q-*NTH%jm}6ebeqv1KZ~+q+L-7N4@!CpV8Kla;x^V-_J2u z=0rADv-fk1NB48?j_&8&4a-Ga)aYHNx<41ubKYemUi>a=XV1H=$B+X?xoq)j#Q{_k zU(5D&aS?nV^-nE3(Hu)sPs1yYqGh*Z=!|p^*s>${+-5f&e|pwLWab$yRFMVPkpy)_>NzVJN^+dsvt5ZzO@Lehp8SBVG)m3TS`kXtj98aYt{RR(JZ62Gc0A8CYW6e zfhLRA^}~KciWH@^WO5EK7PO8I8}fw|Q?k%Mx2~mbC`8Ge2KKm<9ZW_5HB%yOdfHaDf(2G(I{_6% zED$LNkg8%qMX-S=)kaGwq9PU$v7jiRV59i`&dlz;0e%0^m*+XTv!~73DQD`=JOtDP zg{pbdT^NyY+Wxa2wc@0^P5p$w?bUlhkSALbuG`-RIfeI;aOYDCR1?^8fR(UaeC+;O z+~pc}Pd~hlI(o=e_!%1%`$J81|3+{)aPT-32iMpZ_h?#MfcINwP)LgZ6wcK}Ek1Qu z^|srzfY0?@1osG3rH#QxyWgJjK9P*@+ z>om$-%J!D0(O8KTy7zN;0e<#=?jDMt>R-6KXQxEjM8E({sH02CGbqJVFo%*7Z{yA< z<0j1*pN~1eX;^K>EMx(u%Tp3;-(fzaUl;7p)KciBFWj-EDRDOO2R4g&-QNq%?9$I1 zF>W$1*iF(>{>g!=S2kKZ#uzC(0 zJ*sfJmJ+6(f=A1$$^G6GmqNKlk1Z`60aGH?bK>aYd_2Xdr|i)ai$;#ZvqwG8n>C3S z!6p}tC_e zfnsb?v6>1_=_)?QiK|G{yn^AJ4?V;~17(61;%9VW@d%0St*}T_9C;!!{S_u~^vKfU zVkJ6Ip|r8ZC57X$00aYz#1yF=M@^EPZ{(9Ub&6 zsGgVT<{9|CXDRWl+oMpgQJb^wE|EJy7W=_pE@hbcHClJpJwS2oq#I{ZN%j#AcpDzJ zk7Me84o6UlP`V#p9IUIDyJ_Iyaq&bfyN$?$8m@tk{_3co}N-?)2wRyb_h zpqwO4n{^XaLmI~@4<0G;8+RnF`^G)ZE%6QEaXm{}=K)+n{SCT(pvBTqyOBy`rs;9? zRc^{^)Yh^T{4Iko2#SNutpowjD-)R-lWGD5tc z11+Y3;l4^tte_WKhAQ;~#8TkbNg9p*$?cKqJ?H#!CuULHYL7=hH}YN zM{tx>-)W?#-2+fIoC~M1qx2-xhLMg?T71zRA}VOrMfA!pkmG0f2p4ChcxjZTy$bMN z2&aLQ^%k`EXSdfWNi~YlF9LWk(BD71r$DUa7xxSs7`IIUqcq@hkt2czTyi@YU2m#> zmqM2;as<<`?v6lL&=^f~1C(8#htvA0mh9Gl9Ek>(*VUkJVx9|}ejieUY0$Iv943`^ zUUpXtlc_2T(EeP-^MM6?d2Vk}?O_g+7YZx8-Pf#SKYIt;=wGof#Dq=lhZ+u zUvtljl%zHju+|Pxc0^PB@7VVwDc=EmMNw$?@9tHY#T)R4`;l<@9{srw9n^)&Zn;O( z(RU+4oCUB^te%9$WPrCOP59IOu+8S68~BCjgMYanHAPdCAv#Wpmb@Pk>Ria8ho)%S zF#tq2{_S4Gq7AOQ7eRE#b@vkdbh+Vv6hEKba6f^cqMPo=@$=_RiCl0C+G}#U^iQe- z?c0_1n};I8<4Rcj;hCCt9N<+<8_-(|IzVNAxr->ZX-05leNLwSvotLapwgo8@-%(E zBK!p8?><7)Gl_=R~$~%!K8E`t$tT+O9vLgc{SQcKv0>Js4!+;whnuF4OphDmo`d z(_np-nF_<;-h(n|h*C%SmXdsg@+%&#sGk2ZefW2co3%u4E!rZFSEi+LM>w( zlQ&FXVc|av)0exY!Hs2FkMbav`Ly?=h%waT6ejY24A&hN^Q~~dl2sAff>-Z$Iu66SIbihR* zO>=QDvQ4`J#v49n)?+e1E17G9xu?aO_Xyf5fV9&i6}Pw_jS4#VteBo~>5+B#9XzaA zTPWt1bLUx64pu|e9TtBBG;$If73Wlp3X5!M^JRB_6o z<&pZUBA+@(>2ne{BOT|y_czKkPXuUQHrT^RYz@J`ZQH+%(yxhjYuS{?#Q-?a(EY-* z6r2oRW zJbu#T+-^nV$EZ3JI#d+VS5@`z3z%lm!f@MdMyQY30o&7E%&dG*| z*TC==GaaEt9{pu;gql{vJAXhwRnyF$)2RJy)D>k^>l%7>@aERg zpG8zbHTCE4w1s~@p#HV==f#oj|J2gQ3X!vYY#n`QAbt;f^@@NXem~D=w7#K!JWPf8 zg}YPP4a^d*Y@~nUlGr*(56@?cbcIPzHr7un0Y##jY5MnwYrhWiF zo-F+X{G7|uE0ntLmO-8TmqUA-=!acL*o@y8EC1!tlTG!5aWd*kyd3|Cd5L&!x)SJk zJ)Wa3dIO~j;Qg11p3U{>QdXh$Ie}^ty2vJ;1>>8{EHyvPk)CCSrU?^3x_P$m0i@5d-PG_U!F|zR$`;rzWSl?8hG_2_RXOi zW9XN@dQ5$GJA>8ke*<2#G3;-fuBB^0N{Q)tEUhk)uh7XbrY$4i- z(6?z{j-E#w`s?CPp)6Y#usr(`fb?9sDc3Rc($y$ME)@a zhC~NI3Dzt%Fk5l zEtMWcqhroPa@d-OeDMnmiU8gbXoal4(Ow{qSxC=VZlCy{NiIDD(vLp!BtK=|U%&=_ z$=aMOG?Pi@oaLE3ePY6VAQpnYRPr#3lvXUy(%C$H4E0KN*d=51SDKatkfteJR(A-D zqv-QgM;Mjl>mfmGyJtSnYo5nk<7T|~PJoGjT}Bct3?T-}b)onau^Xu3C z8JoqlbA;XphdVk(>NVomAaVWU`ibW>Z4SW8XwOsBW2D~O`vSt^Q(({eDN@QB%>M@b zElHz8BXv)L6yEArjKRG38%@gsKrs*IYm)0(qb?8T?J?=Onv7vF$g33#;@(PQM(IPu z8ag;iA8gz1Am`8SL{qAj!|vh<8}ZV44CMh{&@q%Z>Bm;3RZ;Y?Z!r`HF#WnuzIr!D zkdx<2MGj2v3irJkf|X#i@-J6$5~nB zzNU_9iIV4O(6{(_q`d=qwBk(EPGCg+dEp@O(s9%Bg~Q_f^;>n_CRNZ!QerLRjAbENY_ z%;$(Fz_(KJQc;QC61nnRi9U)edCocZ8b4TQ@-uNf^Wy_@?lF0QYYI zFQYxfoaPkXL`>owP0tL<9|^P=_A`bv0E>wgShapO@DEuuHIPus(*ndw;Gec=p7H*O z;R;>{evhQlBNO#eQ8FU$FYpfl714O7Ihi*R(_%|_GH?7OJ;XN1NvkiqTdbIfx|loA zVW-a~p>|GjvTsn>C2$Q+o_H1WFTpy1cM1)dtmiA_Z$SK|kcTGgB`iAO7gKakYe%T^ z3ZGp@Nd!Q2>lA&Om_l`@>Lo!kokr5Ssrth~Q#j4!wB6LiN|V2mMb3Fup7(usnqJUk z7N>zVgE#UwO`8btGS)NSPdbMSrZw#`A88>CovugQW;xZ2-MoyHn7${AI2xEc;w-*9y(#0mi3{V=PEZ|FQ3s8S1!>2}0xjaMJB z(B^nGIp!MeyXL4$3uo$$A`*t%{{Vwpk)Zcy>J7t>vUK+Ldhkg{XHRx=!7PI}VVDtqU-|F&9v|TS+K*gt4v3#Eq#W*=?2q37w#pyOP9M$EJ7V*N zO}hur=-hN>DxR%JObm5;sU!$x!dK>w?m7j0W{5g92&;T^r zw-o*89KAzmD4x6jCFu!s^{P$Wc-ERvNAEKH)>Po<1H6n>#yu`1DOfxK{8}IF292Mq zM+Zs17+N$}Z(&@+TiygiFox<%!43Lsu6~y!+zn)ZA0dY7lg0P3G$(`Bn+h9Xtbk zd|s+IPj4K_^D*KHVAuL6HEH}jy^*4P0_@j5ikDuUr?)JXx>-=m*OGY-qS<{g4u$l^ z8z`iY?fD;tRQd|Dka7X{71D_in-1^}WS!RZ&O%_8T3ETbW0uk28DhP})71HTLmfr( zJRVh%%(u4-(P-OWj#xT6Uk_no%uPR01Zlp)96_%8^l;|5w-U$l?@f+Q_vt;E_;Dp- zexW2rk|V|lqwdv>Scd>h^;=d9^z(gsYdvA8eT)y4Yex#HNL}~qL3*o1-d;b{zR|}) z#rNy?8qgE+kEJJH_9B;8#~mCMD;)>IQ^yBt*n`h|3sULO1NuYBsZS0T!0?DDbsZ0d zlBOpk_!MvC%vg<@mP!*|!@B$<3-qa}D>z+~>SMAxbrUa%m_h6Tv4T7v8B`AqCR9i_O&3RaFY;!-Z*#BAQNT3djbhmKR z{HuC3N_*Q-TIP0Vhp;}r!rC3SZuQubnfVwjvu%o@T;N?%U^*0shlkQ|#FsbMil z*0o`fToFNMcOtJh^l%2zV@vc`o4GFrtO*yI{4B%$2Y5(40->eO{?^0`tzU%^SoP8E2?xAi=u?K z8sM$V`(T*nIl=pVR*Sj0-Dl*sFC1IQ8@yh&Sj?urebO)uZ?;%0hxRHHF>GDGTCdre zU(0ib&FfPiwZBR)Awr^sRu$ltG&OKx3lu|NA?kzJ`VIyPds0ub9dXesU+E2~*DIOb z$n~Kk!X=aHBA9kX`dYn)fJ2>C)#p&#tkYM*p%#*wL4sKbxM3rA4*$`oYhu5rF`0wu<4Q&A_1g!w;L< zkSO=EAC@e;kHWK7dB*RDkL}7FP9?`2F|7ZZr(9mCWqQ53hJmCzrv6{&T$RZO&P$NbHyCtkLW4soKjR z&#Hm!@-chfV+qSai|6z?bh(?;Nf!rX2FKN}X|b}PsodwPvwY>D9`(40EelIt(8I%I zh4y>y%1k|bIK9+sGv4GMm(O)qrXRQJ&LG7||7_LUxX?C~qE1+C!z}8xO|Qu<#%q98X zPB$G}sfR|I{j9%zT)FmHbhfE8iF(=%CvDgr5foFuHh0F*_%!fGfU%V7u3cKDM^MSj zjvS8cWF-#nBdxov<4FD=u~T~3PDc&+la8rAe-i$h-VXjGxuMUW@c8UM{Yn4SOir)= zvv2kk#sbn`ux0QUHK_VQXHp)&pS#~7v;wA&Xp4cF=_9fbw0y)2m|^zMYzSIDVhN*_ zkEk!Xm5+E1Xv;^Se^!k)G>NQ5L*H>k=`CPsK{$9&sw&U;l^F#=VZ7aoPgBMcWM2)V5rbU&B)+Ul32ncIfGJ zd9Nd|Iy1h08>43pb6b7@>aywBTj;1sP0VhpQ?+00)CYyh@w30C$Ey^nzu%D>8iS;D zWI^Zvo!P0kh(PTgiAU8jqq=YFU7cKS-vQ37w>1B4J<5iPDxGqbO;Y9_cn2xfV9(UimVmY4>ZHF|>9UwoE7n+O|ti z=lUn(X}L4AKh55as%KKmcI!W)4|JrtzYnxT@YW!24={%;tY@|)nSG$sK!0nI%s$X%Pn_%n{SCbA1My^s)W~}V z_uN96a=lusKNarN>x!lH_&zN+k0oDZ`5(`8)ASnWF)=3Pg-_UU&8vB93fbZehp zO>`m8etng#i+lNFMkng^QYKRRLx)axy^Fc8E^dk!3Vk>CG@`?#sO)6)qsH%H$Qk{f z9x1wP_r9kO=Pt%a**=%B>V17HT*8pHK9|74|LGE9X>g!{Pg2SqDXMqTBv+f+Mrdh} z_1w=X^nZGbp5Tz)0uivc$e`>V#@w;WTNL(1{Hk-oIcqwO$B>$)XO zjuj69O-;UD2URb(27_-wG_u3-u_TxSzpWMelddIrLC;7eKqW8J zkG3AwyF~j)o?cA1{7TtJj`_6Y82pN4Xa<_8K>3w@$Mh$|WOeZSmFgk~aey@KN9;@SH+CZ^nU`4j!Q zDyAB4@jG$V9LOF=#wT0+qo?$oAjLx|pXr0RrF|b|)N1VMnt#Hjq1^BoDJM^A^|N?# z?aU(@;%lXd)4GB42(E%=o=5QaX|s$c(9bbO2CYBkaH;bMJXAabcaE)vh{Y|*Z!U1rTZIAvBH@OpPEH}xVJ~x?yhctlqdrnHrO|}K5yM^`q%p_~RcA$ke z2XU)JZl4lr{iVJoeexfOy|XzctTzx!oxD4m(P})X-8tgJ2Nqvp#K+co$~hL_h;I?Z zSF;L9lgltty>G<#B8YqMV4z38(v!qa+VYjY20wS7(J7qeE05n&s8M8Qt{l46kty-k zy+V5rpknfm;W$n?hMTTPPZ^xxzj&UiUN|9JAEH$%bjAZ){chFJ0oxIX%Re}_$gUXG`$-Q2BGKz?PrbUQ_pbUh-U7R*HILwecN|ZZ zJY;o}S}-OHr(b?_RH0cHbxbT+oSvP`ZaK^(uayR_2F~cX$)hZ#9EGXbHy~?A8-8@O zqn;NX&Pa|lz6diR9Buhh|NI%3 zPje6!3^V6Wrt(YrX4!+=hy1sCa1UPA3sE{7kM)(#KQ8MnQ95noe5I2o!~e5%X3(N5 zdVFdW^#9+*v6(fE099&OP;AGD{Omj<5c9UjruoWaf6R`X<*_S*R(b3LW6W{EIaq3y z$I*;d<*}9IR^@R%&{lbr>X~{qSQ&5~q}wKMs}YFR>HJ0%n$+K90n7ePABmEI zQfLzUuEUTZ@T%E_|Aw{4k2^WzsTdgWVRTS{A2}S5x(Y5}?0@ey*+gR;(3Cb@)4T9s zK>Udf|8;)Xn}U7V?|MI1GMAsnU{a-$7OxCi^SkaO*B^RBw2#R%l{u|KcICR>l1l#2 z$T%xSc zU*i7OJ0n5l@SxGU%=MIT9fNi&VvP0gl;D-e-ovV)-CjmAinH4=T-b75cQ}2l+IloC zxioBZt(wq%`MSQbibZtn)I(-j%^-97 zn!z$W5Ww4?>w(n_J_pRJ78cu{m}HI?_5)pRk<8J;eQ`;0v~Ui1Ia=V9lo~y`wELF+ zVl1Z_rcFm;wxY`YV)IO)y#eqpp!xskF}4Ld?cRrZ^;iGVlY`h)PYXKzk6z7IPp4}8 z^=?#h%fPu3w;aauIfg^jTmGoASk$9x!gwZ3virvdarCV)8dS zz>V6DxjwfsH^6uXZlm!$pW9%m|8yI2)G#wOpVQ?3Y{eRaL$+d2rN#&7+12K+ta@Sg zvCb2SN(~S=GtB|Q6eOVOL5dKxJjgZJWqJ@df|dsfpYQV^LnOEIAT@xly3J}J{mR!dtA@E;`oP`T&B~;2m=#3Rg4srMmQFeU5*Vl2V({a zV*|+|#|HgF4Bu+d+3A^is-e4~uyQ;g&9NG~gotYkRAg!v@_4ARpWTgAh*5xC8A3l6 zec^DUjjIGN;Aw~#sN{53Mf_Cl?sdXo}bYY8>3zJFQ>($KGG&ss| z1Sx(hi87X(;}6rIV>>YI@maLtv{-(LHu~}=hxw=n=4w#S7^6Ec>3;4*<=T-jzA=ZR zTE-NfMQpZt>Hipbw713_-D8ca;t?7dYc%2EM*K2sxDkxuMj)Oxion~48)Zm{O2ds4 zu|`K8BjteC8YAJ$6g6KN__xDg+xf!^)AszTMo+o-K`#I0Y=5V!(M?2t(AcJRU16>X z25_?x5JA;E#vp^!c!x!inQ)9A_80@B`Gd=vWQy>EC!~o@qoY+(iqX(L>8_MJQf@IF zsb)-$+<%u%yKki_$2;RZ#~t)xBEIOvV6Z9ej5i(>2dGVg@pa_8t!-MtYLk_}I`rUs zzDD(p7+z=}70C;he^_L>JvhBB9jtE5H28yu1y7oSydA+amii|eLyT=8T(b!LnS^K4 z_74&br--g(Ew|)WdHX5Jc-45L3%2*JHP!KMNzV(kHQAUF$zP(6TxSyGXXz_@(zawH zj+W%=LuhLaW2uKXgDzNa^6(x}PXj(5EPY(@RNB_x86~HtX--X}zp-neO^e!KnT-d} zd-PpRjr=396P(!(MQDl!Cdni~+GpAjNJp705-ttU=)GMH|niC6c4I z@r1w!xwVZ2#;H7;HtH#pb1}d0Vro{$C=Ta&X^%p<_*D{kzPmrwt!tDS{0;r}r%fUG zL46?|scZBznvSt)`OlaHX)^1>Ia&UO5$nA?S#d+7z zXTU`;4h!>0FzsnU?nj(BUd=@tQjKP!KAlcAQj_$qOL8!?h||?Zj-Qg7KYhB^u*3G# z_^{iV!e@;%a#Fp9hNslo{K1#dC~`ySY^jb9<3XykH6PL?Iy{k#aJD>wL>?>VY~w#x z%-L2QD|RRmJUzue97OgZ!28%YaIq~Vwzv2cm~$4^vs99vLx<7XU;GL*z1z@;6i#aM zIacW#zKm}&?Tz44oh0@tL^$8ym$98a3f_zv_K} zmbX#!)%bj?UPTgucgf&eH4$vh%T4v>;SC$n%Z-g6?Ts5>d|A*h+nu#&Uz!ms8q?`C zBN0i_a4R|%{-lt@b!Y4KSfEZ)39*TTe7u^o&5Io5L&%(MUqx`RN`(nHtz#O%`xbB} zviE~Plvzm69!XJYumRW?O$yCOH^T8&GAS-0Oxx0p1R!Km0O3Vgrotm{VI`?+hLHqB z@BK)YFWzz*v^GN~T-gyMT*^+QAPuL{i#@HPg{O87)ZSV&J3Nl^*k9M}#fCBi%yV^VXhL(23| zq8_`Q9cj!iXJ}HNHo4j{yxb9Rf65ZApvLnZFq$cV{P7Doscusv!X=rmNG9HfBQq{h zX}!4%YqvYW6vd``-UpM1_d97VG!$H!qmpxA!ot@vXaUG~@~{z-TbsmvFef3W&3IGx zIKv&RC?4rp1K@2%SDP7&kg^-!{;!n9I-!-ayuZp!*O4>l0z0Vm!XZJb-<99;yL9m}>kwwtsIR;Fn zqqmY z2GY&W>EYC{l@TEpQOj1wWSes~<+V1Z)13EE!CJL8beD{RlTT~G`;y>`&LbD39X-3I z_oTYnhUd=xMKa|)EOgrjrBT^N2jtMgJ^z(Ma$QzA9bRQMb7&Q>)~XzO9#}JnYQ7`1 z`T*}Mz*#xe42bp?(({I-s2u78>`;^P?;NU58`@;npjIC`Luo-9!|i$pqMm9Nj%?z^d z6=t$c-8U`94+15zBt&>qT zjFoFGcsfW{iv*ISl}E9BQ_{(3Q)!k*CWMER(Cpx%Gpn`WSss-mJ*ZY^L$4yO!Pg6| zIvcBz5giZyS4Qx@5Hllq|B{&zr#Pr;${7UBjOh6u&PM`xzXQ(7hyoyrEu`n7q^OLT z3+%%t<=+|6l#cC3xpEzbFZ;F&YRYdA_0$J{rNmFBttXw)KF%WadEIrObRv>27!`ZJAN3I7Q|58xMEnwHCZ(2KnONpSh5(bw~Y>HXfmf z9>#0PmX=sb`ggBMt|BW3#tXk@w)Eqm%9gX}*INU&~2|p~f7=X6~YCPB%S~-jS0#2IU3(ib3#Y-lY zJK|oWKh1k2vlb=ZZ8(xy?AD*{N9Jy(FaEx*t$!-iP41Nmhn1eOae5}>$QUW!!8 zs)u4($IIY(jrrIFtp%@w%G^q%l1DRVQN2D!QZ%QL$G@i8g4Z;WJG~#xoIy);xUh?T zkVT4%0{a@TBa7a{H0QswXeTt8HHTM_%q;qVgDQ)7q0P*qhR1}K3Gki-&dQ?pK=ibb zp3{<|vS=uInsZ<(ji%X8K^xMx379A9Y6ZL`fcB zo$0`eno{;RPN(B4is7IWLK_Y6o}|V((nX=-v?tfp^k%f-YKD;zjD&~<$k*_&i01LrYo+v)^a+Zz zSdx5&xh#qe@Z?~6$wQ?x&{>1Q!Si2pWi5EFjEnSrnUiro5jrAU_GE_8h@mLg(vo^K zcc_t`d@K?#(G2!zFYqfRZg0j>q61!2hNITlIYTqB+?LomE;l%JW(8mAc{T41N4 z%+{9b=Nf6EEe**vYKHjuDA$`5L+|{8sgXBx4R2gp6Fw&GMUmF@XcVFhoR-g@=Hc>! zbh@64k#zbzFX&Y!kJD;q4B+bnf+vr|g+}>WhP;|dKH^|#En^Uy9LUsB#W_hn(*Cmb1ohI3H`8hVY1v5y*Fh*2khN4LY zxR@s+j}eKQZQO8qMjcGfm?9YWk{CX@cp5CEBRyw5>r>@bw0sQ#wK~3w*LTjSnc-qFYJYOJdw`c^gCq1r9gr zLr=ruP@X{phZ}Y9Gk>_z09s!eE|nh}Zp7i~C-oGbk0EX}rRE#8@Y7fQ%v3)c@{Q_1 z?&Y5hI-76QXqEYR*Dr*|S08vd;CUSXv@K#<{-k_dRh20(EaDpxB%w037&i)KQkw#d zpED`9056?Ma|@*6bp=McCv!R9cfmI$RFWE>pEns&7YmFUV0RT7HG(r&a=g>e(wPxP z6!j`JLSWjULL(In4;Mmv20aHp{2b<|OuB%dDj7$PpcLLsjYk-5<4Ej_(-Qb^SN*XB>t_A;OQqD;E4pZ^dDswd(#WyOb z_vS*XQUy1=Xqju6$`>tEN|l$yG#t2^KMIA7PK-2mL}#_+bKh|vNPf{cTx_I{Ud*Bm zql~EfS=l^O6o`wUig7v3_>o#x8%E%sHQelhQwMQJj=a`N%c3)*j2KT=J0`nuXV-Y# zw{g2dcac#wI;#US;FcON_?1$2kr6d8s}s`_gU1(+#0^nX3voazPGZgK%-EVT#t{?q z@^cG{Mi${3ovbc=6+~TJhgAvJm2vfgOLFrk<>DSUoS}&;PqJuBkr6#Qs~Z!&xN7G% zVt2--06U3~jh~S_38%srYFRxP-2j@{2qelRSkjYmsm$uf^cgJkc9lOH{>0Xy><0o{GK)Q39EGOS058jVB-fi_Zg;+xvJKxE)(2$oq8yK>EJl?sZ;7HwxE*aO*9-eJ6~kxajYguB!)er_*r-kgTr*yr+1eq_BU9_kcNRVP$T4zG8Z7m1Fnd zDh&JI;zw{?v$&L5L-@mTL~=u(@ceB`X0%C=;b)ET3s&|IN5I=(LvX6BfZd!urc7a48cZp%pnF)rYMG`VcCcB5t#JA5} z#Erga`dh%mVR_A7RaE_jml|)?L~_N6Kk%wq>+zw3-9y_Z8qw4m|J;kA#>0uMWg_u4 zdo`xT(42`zg6;IrbbJ;{cs%2J#3hN4OFn(cmGsr1jgz3SA^y2b5oKk4I4*D!^o^SY zeTRNg`f4$*Q(S%Vt6!hDlD-s6s$ z60_5ygVBve-M=7S_Sw>a&e#Bc@X_2D6Jj+PNCzQu#Vex0QLj5(% zXyO_#c!1Zey_8bkF`K{Nv~ObH*o<#vrnpzqJ+!wi zO52{E>A?x26Zr38nPi?#l!u$7^wnBlVDB)QQsx+maVx~^zkDx3l@e#AdfQhzq$Ngi zi8}>7l@n-{kM5uYAuf-d-AzNfG6yNOx)QB=s4J3Ovr)o3&c&MIJ7S|hzFjgtttc}Y z$Dr8H2VT66ZUq{CB-uc_Y++nDO*&WJHjOj?3VSSmx99Szz(sO@~brJ!x7rQ3lzzJ!Xe+|UzK8BurT6z&SP2+}LdyeF*O5c|n5ur_yYOMg? z?sTivXdPe=m(+A}wL-i1a^uVphxi=yly({)hXJ+?^NbFOdj&6ecjD|vK@Q=f^s(Tk zL$wL}RUYom$gEAR=fgLwxp8{|c;ClRhnAm7iwk1qVK-?X_L^Wrg7jCAZZ30T64kxW zNGW}6e z>h>F=@E?q=dh}{@Pn+)Ol?Yx$%#?R7*l!6seqTld&X{QG)iSfTOq(Gq9zaJK-;F$X*3}VS|0E;LFeZB_@NeUZ1~>wQ^NUpO}ZM6}6Ck6jdiP zRVtoKwHFw*y@$ERZ171*ukyU$PDC!7C9gvb`GnE$)3gOfLeMuHzCceRT=No#BZL*D z6wbsA!v#3YpYJHvLK+JCVgbg+11a=DjK9y)#>~u4c21*@sq{gNq<7KTRawb&EQ;bHuvG*q{((`FBOlj?8gsDuzIcUk zFNUy(R~U;LZp8Fa?GG@OP(_PlpYjr(a}md@_zeoo&7C@VIL4oR=Q$sXw2>Yl<1W#F z_L9*Z_t`sE8iU0TG-jnSMAW5&E3s{HEIC&h?Zjs4v&v{y=M&5ry)XC*g%89#p9$?k zYPQDXCb7ne>7frrbrg@l)MK<`l~Fr_XM#*r+A;cRm5~y$+>dJAmTImxvLg=oQJvb- zgw+td?niZNOV2PWHQJ|ZP+R(RwGm&pB~X0hHj+z(Lk zaY#$%04f9vvfW1oA3q;F#Fhbc7l2>WZI;)l#_F2T znZn!3;ggWqBo$`Rkc~#w(mi2IEe`xK9KhmOo@zr_Q*GmP^1@ zP{ZOaA$|)f#3(7mM{6GvJYQg|4qR`5GLu7Q1s}l`{L{KZ&V`I%4}3~|CX$lTG>z&H zHpI7%W4E{ojTutoKYooD zxDZYO;{u;XPD2krs>CZ7BN9|eeD-O>)$Sh2Kx!_C`Rj|x6A5>?NUj9Lj$@v4wNUOp_cT-;3JgoxyWC&S2DC(};O=Zw(O;Sd`O zs1U4#4M0k0Htj&eY-}3fj0~t@r9{X+GbQ$mlDvtyq8f+7sNn{BV%#sVl?Cq?6EWL_ z8|VvUXF%Oh93LAhg$;p? zvo)MR1RI|8+i=*lVV_V+wwCS|HNZGh=1Vj_z707-;&~&gw451iWu3neIJ0q*7E-}C zZ`;b+e<8*Lp@ke(CTAxd!EhktILC27tU;?Ea-tMrnXw^(8xfTAaC;E&cSSv{Of7RA z6dPddQrK`@8auA0Ot4bS>4tpbOR-6XV@Kdw8NCEXzX5@#{YHQ4vz9qA4;XSv@$M)+ zAU?up$RVGp=jThU7dp*01e84kgnFaT`HeVT`ITyFAz!j7<~x1W8)5UECLt)_X$3WX z!KfbhKI|_@%hqr}F%r8)EnkLzLla&wjM4`|d&Y0-d1dN=FEDqmO#Rk0{(v}*>9&yX zEXyrRzgL#N?z8j`V%StcJ*4~$vo%CCF>5hbzUH5=8 zE)D(Cv$eH;YcHGDnzmgrO|?w>^^Q{U+ij)d8XMNuOv2xHSe6|XZj4n!{?@()<_193 zJPxVWB;;?lPfO;ZcDXoNi;lmDsiiMB8_vNuV4mucw62Y_2>}&?)!>yY#3dQf(5muC zJ>-^_5Bh_Ee?@SMBS2)u1z?k7^>T3!9eWYm%MlIs_Pl6>45*)xt)XxuQ;$H$4>B&+ zDB~I@1BiWw3X2RXw1VXQC zS*JpNrF>Fmxwu$|CVXk6QP|6dvv~oS#{((^iz@Rzy$JK>0Qs0t6PxGZM=g1nR5HG< zw2TrjqN$%Z!WBp_zHCIav*AYWC_sf^d6||E$pAM5Iln<~O;9rcD%aRT4?k+je4c2z zh^oiNVbOJq;VxYS!dgIuU@56BRR%QeE5TDDAwgm?Qu;YNr}Pex?yhh3bhy9;l&zV2 zMg&LWWoN~{P5GIC0a-|@w>tJf-|D2 z#ACz*hgnPTEJr}u<+*zVd|7Qdn-x&@JRZkQ8eReyRo8UFXXm0Az-!B~bMtJiRJI)N zz|LK=4aK0LhMEe{oo35SO(COIR*arpzX9c zB~fT|zZAS`71C2^Qz8Bcz;D}awV$=$HqqC#JH?k6RcKF2roD7$i)<|xn#G#k;5z`Q z5Uh}E-B*H_yh8ej6JQ!BnZ5z(3P5%DIV3ymygc=l;8m}XK_aE4rCn4z9dAIMHXG0adAB*u&|YFH4fGY#7(HO{}6wYyra&sbMyxSKgta z+b%AFMS}6tPF_L#O8m;Q6UEF{DEYi+9Mu#IKiwg$oe{lM?czc{*(~G*(v&HtDZSVf zUT_P!UkuI8*7i$Nf>JTY15|!(yv%$sJZ`x-h6A zx!*AEqrLCBV!O9*eA|Hau0}Sk1E4~%Cf0pO@a-YCzCacMlwuX~E9Ofj%0&lqyQ1b^q9dPrFdFCLCco@ztzLp3OYZgIbnN-K}tnQ$= zzD#KIHg(o|NRAJv{hLP9(!W8LAL0eTn*A8qOxD5*87Ye%BhL%I6^{Q{zgQEKX45hO zs-T$T;9ZcMs0Akprbtn~ChjBAa+H)bCsFPJahOk(Lk-v`Ci5+LhlKNYyzXQmO9AS2 zIiw}?vCSt$VVaHhCb^@j)pjGY^V^`j52z3V#lVmL!He+TNiR2eOlQb@Jf58 zYe65|m?VpqvPe7tS^Ome#F~5%=ie#I7C|&4fGL$k`G!9JQ(3+a#Fy?AMcMu1Bjzc^ zjyn8^HSdAtYabhjkhol9rfZ>JekULCUVPh1@<{yqNbn_-{KuVi3~{q?I2u4DHkW;f zBftA{B~JvQDZpRJd5&SCRwc#eV7yANa^cRB^Mtf#2yP0h{3y8x26(ff@#^miZ_H84sG_Z+T@%g(`v*LGSq)ew{;6_&^^d>G075w$> zyv?1pVEG~~EkXX|))Hi-6y#5E58^65p&f&(nJ6VzTN1nvX^tlu+en*~;;0h;7q8!n z;NiB#VB05{851G<#CjPB*1i#^plKL1X~`^+%<-NVyg*mt?uhzl};i!(%oVXG@@UKwtI5EW{;4op-5D8 z8Zid4JLM`6hWlp)PXgEt`5aKTqjZnRADcI6l8k}(*F>6>=S$DZfweu#M63ksc+6}x z${WXg(I$E!irFEtm&XeW@ES`1sx0t$0j_iS!;+3g4XU3Tn@IbeTyzX(vNr+Vg~>{(zi`ybJdo0OYwJJkjU7gjmJKlWN?SU~X|fubXkW0AXG{ zLmpzg$R6XK(r2N8KVkp3mI}c!*vh(9hy)pc3H4jRddI4R%QMjWZC@l zckpIqE@Y(4Jw~1ve6dV+$IfQ+-^FNwsak+48Ei9N(bxVnMamw6>>4DbpGM48A`A6@sNy;_)qpwxE_68Ud6N74l_FGT(eyE?AHj z&rTb0mtWyJ$UG0I5Uha}o)>+&AmWcdlNM|C0{<64y-*Pi-EXvYx?5os0I-m+>^EXs zH36c756L0cm&~o&A<^R+tQ-hj0YF*FAuV}7ie|a!+KT2MGHR+1&W1J3w6|ZF-PwHU zSHSlcphB>`dTG82!*&3VUjqE<*pUN7o(YXRt2-d+W%f)T%a*brK zkAD()=O})Pc+ZHj?QTt9{)+je*6$f1rMp3ae>^9G`@jM7SMw-O2V{9FS%t!hKh-$= z0Y+J#_^<@4JTX$12}Yh5e5o`4bq0tvk=dBf2B?HqYcW<=Vp;%GY-OX7ihMcrd9i1K z6g3MwkHpAuEA`63Wk`b0S-v$7^Nejk&OZ{Yb|AJuH@ z(WKAesbc&o9iM}vN*l{`4#Ai5OHbDvKZeUknFcfP=$4OxT5@lcRM~x#|2`5$vX^10 zOa~5t~bubPIzKqS53*0n-Dk2mLQ*wVF@x)3T{H+ya?psGyX7* zh*xm7gTn{Nt_45fCV@!&=a|)1q*g6{`9mW%;ad?pFQ^aL_6e4fosBXX2;PVD<-hsR zXw!gSEtwDTNah1O&Wk3)RfI|S5o=y!VSrNGfqEY>ViG?CqF#Fo$zBegSQW<5^Fj66 z)4~HrvveMLoEK3%*Nnf{0a#mxROua(vI>mRLazsv($xb-jebh-l^s$J6Yngz211+f z6of0{o7HV^fp8q43IE6Fm%PoF z?Pu{iG^_&6=u3ytv#rw+?F^tou%z-}iYZ-=zdN_F+~-7a&AyHEpx`rB9(cC1)<-7P znT{0kI|}8S;HuQ^A;M2|kk8JB-O9zwM&dIoR-U5g0Oj|6uXXY3EpL7D~sKwmW+T|kG_I|Wg_52z3vaX{Him|grCA(&nv{*tJbSb~YX+6nVmJiTZKv#o5vY2lUuEQH&y zb&^|5PK$V;xPy*p4~eMnkpSNT6V~O<{!;_)WT~RbYpQCAw@PpT_rv(1K*NLC5qrNg z*BiOIiu1BsXVz_|b?>Y_geb(CRnW|*_54@wjANF)v&%Aox4B8JDvX5E3lNYVm5=r@ zU0xw0rORXFdBL|Q?m#rE)eP#2vyTAE1F^;a0r<24rbyAP5XD^76L{^Wz_kOYcjQSf z6matBe=8^&Co*^2MN+0$FT$e*m^Zq5akRP~t8eXzNKtPN0#RLI{E<5Lo_q2+Gc z7ZjO9XO9}AYU~B`A*qQ)dARX`h<%1*!uCdhSaXTS9K#0Y$Zk}2%&6f^>4vkQ0G8K& z_n1+q*>E6Ad`PSBg*<%+HkE>~2%v1@ke1A!@}CeT-PjU&U_f0OecT9bei78)0oa3p z|7^}7!N(=o?A@_q3Ggeav7Xr9Z&Y;al4GXko4#-zXs)lOq>30_$)+@GbGlSbXr zBM^{Ph!4TCdJT+}Z@{r15;M>k*e)O#-iw+0rD@EpvYS!dahk5V7P-yv41}W*){?)) z2U*EK@jsR*7ssIl!@xe1Gx&P?F1`BDnFFpw%H5q7PCuT+mWL@2D+Bmq!JZmv47yjp z$pG^29~lUQWgFSDSN~sO?*SN9(Y+7fnN7&1khYsf>gEz45MVcuP^5$wLXQm)ktV$( z0V!foIwAyAh7u5LfQS^4i+~`AN{z^iQba+Gs7Mvms36~SX7+9g{{CNdmbuTIbEch{ zIWzap4Cud9JT93s5A%IVETLpka*;&oN17-)Gfm>$p~waz^cSS0>4RMB4hLbCq?R#? z5w%vv_DBzsbVzzANfCI*!AFB}u`ly|DVgPyl37Hm%IP?xIFTIj<)O&h;-kZnVble? z7eH?yEbJklG?g)mNhW2I^dKoSr6&N|^yWrl)wGTl(x&QQ+yUoR8q4AZ#g|w;sA0%+ zfpnuY>YRplXz}xbL@JkdMEO_PKKZf;Ic;kmLn@6||7(?C9sjV>i=y{wTlI(vFg%WF zj@kPxI&FKh_HY2t!KwU{Pbo{tyO}4zoKBZKpJc=){ zgCk+U&czSD#{yt#$1w3rf81TuqFs)?$vg83v}~FEUXNl44NfYGUsPp`k|EQ-SbC77 zRpQ=RTbyGd7y`R{3d`xcgdDOZAh5e=bk5edkc`*=u{s~B;*OH>rGw4sVKqCDa(3$g zjG1KxnoCj@fMT+T%H2g>5|_@|8ssbn{%WPLBIrx(HWkk#DZv26?_Mg=^=n&wj)WC| zZHwjAdI<5gO&^xsgKHz;RHds0?SZ62Sc7fDDFij67PPBDs(V4ZoqIvM2xYx1j4JJq zeKZ<@d_J72BJyeJ`KSeqMm^MMgyT{4wp;d^AF}=glACZClJJXyh9o*52F5tv3c-0L z`3*@oz2Z`o<^1b;H2G2Bcp9#Z5x){wbQ{|AIv&r!$)SbLd6hjfp*}{jii?)={(Iaa z0Wg#wV2QL;n@Bb?@<#^paYnKB6-D3JrWen94AwE6e_Vw6#8t*9ayhDPk{+aam-LV= z{s1du$K;b0lK|;KuaA|7r?TXCNOsfUH0#qZ%JBgJhp5-1tztivO$OCJ<<3A|U} zuP@tWWDnA(u2;1Q9kGzag!sO?pE2IYnzD{~D5qJRt z_Cmlpc0@uW&auaS^7qfKR7$VNpDE-)m)YN>u>Ttr_+g`(`%`6i2_a zg@kr_f@?kC%Gg11@jF}G@G*Fp2B+d9)k4+57%14;R6dWkn#OF>sf;FZ3Zs{JP1xn zQ9iGfC#95@eZ;@t+eR0cgYKFXLtG@LoQ?cIRbz}yaztNh2(r^3tI<`ADu-m%gPat6 zEY9N~sZ^NdtlBclF1FUgvC_8S8~~@7eC)@uTF3-;N&NZ)&deDHg4u8?!DP7m^kK&t z_{D>fQH?yGn+GH-;b+0~16&y+36yvrVtU=}@Fpa;AJ_8W{)=|$FOh*X4c5}&Sm{e3 zTjfW3guOWe+OZ4Z?S3NVq%F2N8PTfu3p#D_TJ3na4XW>1&>0JTGDD>k^sPm18#1l< zRsBezdy2y1+&~f5H7B!6R<{D}SsC~1{n7uzRW|J@YS|_aN)NK}h4f&-6*28){UM<> zB%EVEihh@Dsl{Of-2E4wlWKNy1WJ`B@GzspRq3x894j4Sa?p+n;^?o1zC|E7=y3oZ zN6JTZ1T;-=2zN-nw+-D)Jf!e=_Xg4Fi_-C1&V~q(;IAeeE1d^s0q52Qk@geXO~jM# zbdqYx!R9zfDx3dm8768DBXXpNp2y-67^d_NLjnBeYyitLYBmsN&Ia&)HT`w5_9vUI zX%+-Dg;R+jA3iw4{xb9d|6@6;WOCixetIBqkcV`bxb_q5vgH7zT~^O$Tp&=EE0G^z zjUIur?1T4vNesJ;h^1Xd9;N0!(}@zIGi`P9Yw1LHoUMl6W0KJ%qDWjk6qzLQ?q&~^ zw)>D*2XbvUoHWV&Vku*k0@)=VmLBNLm(oK9^WPg(PJ2QFSn2;DA#adbDAY>5ulYmL z0`mrmXMV9gTC8Sy->&p6q$j{O!jF~Ipqvdpsi@NM4=bGkip3r(GLBVO^W+!4R2x8H z+(-2(tG8BCiNedaAa-8#ylku9?KbG52b)PIAL1poz{>hH7AK!kj-Qe?)<)-4&W^kX zl`SdICdd>u1jSPx{$b+iWn2AvWT)cmaS&hLr)ldK6u6g<=Yw#!ml)-PMVd>Z)~`5m z7IT7MahgWh5S-8p=Womq>SN5Pnx|K#|J`+vfFG$rw}r>Yc)GtQQO49oq)FS*#MCf5K**)hUT2g?gXd5l}X;YIn=)v?FfxS@h&*oTXSS8Y|B+JFP zmin`(K8zmR9mr^U{u-teCVyHwUEX+@(N&adz}ZrAJ_Tag*y%1x**P@<@@%!JV*JXb zK2OI)q`n;!os%cmi)F|3ve4=H;OK1x|HS zUIn=l1M-gRs(Sf^f7kKD_$a|_&C59I3V2DP+I3xVmh&Gs;(TSGPED@{so zFv3$JlNddCQ$C5&U7<)h$z4KLm13CIZ%LyUXKX*AjrADSBOyeVl#jVQNadPd zxYNPgk?RZGBh3Mmn2cI;q;V6QBhAyob;A~4lPKi4a)e!aAL;r6tmomBj*t<8In#j= zYAsQo(<*JW>o;s6Eyj)H+Eh4P(;{`VG`am_a80gTU60Qg2P`owQYn zClf!BtOt4Ss9N|7y2sXwdpB*dS<=4G)`F_=xHcXGKZvh^l;D8L_(k=qg~2+b$jVt510+&6UZ-zQw2soG&s_fqG4Ll!~7QsAXWRr8bGn>B9U@7#ZX1AnpBlBC@Z-8 zihMLqGkp7&ExmXxQDA;1jZN9;1^}sS5h%5Zy6ZLw=n)3NUAH}Ol||kCf0_drpbXLj z91R7>NQFz-H*YN_7yAmZ(84K<~CZsl_5Lv@>!zrKR4{BPeDA2}B zfz`%xtrnchCyus&yn%TD`glNpdG#2D_{ckPTGRGCSKwX{n~K0q9#(pZi^|>aeh-9x z`4doL30b=+vVONYoS%S{&ZBon@08^36|m|S_X^lvwh5~!jU?B!-)*&qW{-0hJq<6W zwi76mMIa`4R27O43|M)ARhb^%K+r{Nn;tKM9XHiS$fc{wo4D1)d$jJ z#rUc5+T*F;`CKAl_)=7QB2iBb5zD8DjB;Ya43){s2zE= z^h+rGldNF8>gmRI!tUF=2@L|<-uTE|BKiw-mLiIl1WA4_q>uX@k2Ptc8nfjPffY_FEr($ z2=yO7vw>jz#E%?4i5kQ5T_S|4&?B{C_u#2o@&7S)ma_?;GVS8N_U^uX7DQ}>QyMQ* zQ|OtWj-nHA5y5^&r{L0fkB_)?+eVT}6H(mgX_!B7 zWsJC#A@gMirga`~8Zr|R>M>;K0XcFH(|s6Sa~M&%Masz)9VF|uVb04?D~g0-NT#OxBR%HsF2`PE{xQNCng9qf;nnvv#Q=1ye?l zmLTvr9Oghig9f3M2Mr}mjq|;gvPC?th77IvDvNm995e79$@{%W8;Tny+yB_S6`D3_ zd4YR=_#OGRlFBvNjy=R4 zGPO|B`;z$lt}VO%^T3zDNrj^?WR*G*lqm3{rPF<5?w)Poy)>MM zvy722sj3U4hg6j=C*zNTY&e`(wx6ozPw|MYDNS%O{2tc9u7KkYxH9&rD87fohU!f9 zs6Zb^5577|_drPS7lRJV*j2^rZ zOk#A;m9PG)%s_uh-2WJzwmm7QxWN4}xBVH!0jH{+d{Teur0sHMfVMOG(X}$;y%D$= zPU^2`ra`DrPpRZkx27fn)KNw}tvX6gsV;StE~L<$WuU1ZVYQAR)oUPYBb=&R@@eUG z2=qy|_!;W_d(Z*a)zyG<=reOb$)ARgGU3V?@v8xa4&CN`0T#h|#rdcTz9F0DBlBX1 zsKA(09+@G};-xSgz9kc@xIHc@3l9&$sr*sWdp=03tLBi zN%#{853|IIbV;b$B;_hMCDL-8{34v4NzR)1DfqI38dR$?JxY0dUwlB4y&m@NKv7Bdpm! zkUI{c&%r6(pdBiS)RWT6EKs!-rQ~96kZ2lc4;}g;uoG}tmBlYq4DU9ihgA0&ENAly zJjOle{xX0bD);FsB3k9X%0lKR()W5Y#zguMfZ`?jqTkBgexhm>d;aKh2n&DSEs!26 z3oK(44QxD;hi`&Gg2F3fq0$38FH(AB>soON%^?}mYQd?LkWWjeqo_}^@aL%|%xbz9 z*daKauYh0GlIU1(ej1Ng;JmDUE$NWtpD3siiGPCZA)(V|aBU7;89OZ^t!O{5;^7lG zrN0!pPy1Io}V> z6Bo!m9+fN#H{ecq?0{5=koLP7~0$0XJ6xmWoSOtXht^miwDaqs`wZ|HL zq3;{ELU~RbK2?!T0D?R*<%_W)c6;(2Fvia&`6N(&vDH(0fD96AL+o+IP6W4rQ+X$! z902I>{&Gg=_%}m2&6f>&JOWq4$pOG)p%JQjIp4miv#Obhr&S;4?)p_97eKA%54=j^ z`)AkY+6@Sp_8jK7dq@&>2--7q@u>1nZ7Q6gxSwSR|U?b`V7>)ei@y>NIfk6)!{3rO5?Jbn+S z%32BbXz+1HJf_IDv>}}SP#4H{(8zh%1_p=8gj;4MdjBNkf;7*MJUC!i7dpGaii8Ap z=RFWO08S-^d|Em&oMid)xVR7z)kyAz2$iwFkAQt}m_*`N^;GZlLx#%mcot4cp?7pB z8Bo%jxn|<+aC=B$)_fe30f(*Z9^T2+=-L4s4ySmjIa8y<_mUlDJ9AI+J2Ilt(of1l zhagX*YcHHXG>8<(7UfvQ^ay*%!~6xVrNChe2v|_;WvrX@0O>6~G{GB)*$uA?vbJz4 zZrW}^FIxI*RmT%*&g@cN@Y#Ct(cd}2nQO4`Ax##^OQ3rTu8ff^8CfIgp%U<8biQG$ zB1S~ot9H5p0?UH`(kXqPMXHRi2^ zWKY9Vxx|SQ{k<}q4m0ZpDW=#hr`AGWIn%~E@MR+))#12h{LYC=%Anf~@loai)bL1P zZ^Fq=s*{Ij9;<+i$YXth%x5xns{4C^@pJ?nR|V6C`a#mbq6uS14svN>%>zi72gxSn zZ6JwsL22R<>^RWUDfaY#abn(aRu@6kZ9XFMUT*NPxMH)16t7+cErXLOng)-`g_)wo zK>jmD*c}dOXmmKMKzg8abEOAe>I&(>yO>v{Ck)x2gsBn#8q$7)Q`w=Z}M*# z-9Jq#{Q(icsl+IsSEXm6n?KG-h*nF^{%DAe79%wzP$(odwPK1+mJIt>NK8Of)3=Zeo`?IFVlEx{&AI4PMPd?e%3 zLJ&*kUno6FC?-Pk3AOR2^hg_U0PbkyuR_4va4JpY)6(gh$CIpN3E6S=!k&F^riQ2eT%mM((i0WV>}0M0AQ&nEm`$rH!o>`{4-g03%I86z$wWE_n@qwzQk zP6?s$$5aYJ%}%zjNRGEBx7h~h6F7WhiC?J+lcb023A#LvpTc7~oLgLHGzWUr(%+Au zf#j2yWFD7_oUFnr8KDZx6(smKSU?UMg@<=;J$9Iviwj9z<(;vP1JM z98eJY5PFuYT-;f{D-+T#QMMJNs&q z(9qesbGO;&VWylI(S)hje9_=lE;1l;G{=%O=@!o*FjhsbNKvy)ao^ z!Be3h+ra%9oYD{Ko_+c+e7}YurQh_0R{EV;ruw#9f$<0qADx4Q#sD8;`b0}~O2rKL zI7m(_GSM&99+z_+4|m~IAyIt9Th4YPF-bEE+*^2KR$@8^=cW?xq}sC|?hasr7gVg2 zJ$jw_7Na2OiF%QFgw<`1+|2{F8cyYotSrCWO%bj%`=l60DaQfVloz5`d67ZG#f{t9 z0V2zRoV*Kyor*}bav&!s@bE31N+ZcuIVnfPR+wo$WbOO`iquseD)FMjp8aSe0NuTy zV)f>Pf_!q)G8Q=*4y+hXCb5qKB zw&$huP)0#2Z(_f0w-rByXW5}pYoa2+vc}7dP*6$TrDu1WS3TQdc6AXBYsXTw8a>`O zMbNaxhD4w~Pu?26YY|8HD=EaCd5EhZge?)0|k2R>^o^ zjXNi_Cg2f4sILh3VyAkKa)j0Yz>do838JBJa^b%TENxZG^ifSB;id(Uw}w8dc`n(q z7Iq_?hrW!F2-#5&5U*ySqkaUzvRrA2+LIbWeN*Fpb!UE0b8{j#S)zwdkg6+85k6HD z&j|I3h_75Vua@8r)A1-*CF7ha!>4ZI8KJ&1D%H(J)Q#PfjO5qcIq|8Qct)tNh)Pvc zd<=DS46nLWGWwY^eCj5i5$Y?$uWk;r-L;ukKGGENx+%h^K;s#qz9P&5Z7#nUDrf&- z{3yrxp;ikHgZh$`;~qX#BcUAyXqxU3=ows-I<}@gwr0@l*b@lnSyEBdKC6cGEpMjS zR1@{x4uk_tVk#-OXurYj8Ta6Z{&prd6a0*Ib(OFg;9O&JQyD34p9Ox3%DspM?!|}j z`4e8|D(?NS^Xl5SCOegnVyE{XKKVK(hSah*DIU=#&%NJ1W3@%oYP^BnZn(XN^&K{5 zfEK%~8lKOi9~jkl(5SH(vXWCe0SUD9{iQ%lUkt-W1>!0#Eje|t3>xAeG-z1S&_PdW z$!RlX=omBfChObgp+}1Qc6mgzs9W=XV_!0ot(_>)eq&Lb`~mQ1Ttx$*v-fW?I>G*8 zu$I0JPrtEll4Lq0{>EB_5xG^e;ud=N2i_ulJEqDI`7`-%OFxtTsJ98{k@BIId?>up zS-UOX&9v7IxXp0c&DKnNinyC;4-5RAZGDG{aYa$}Mf2MB;J`oF9`)SFavR6v@2_pI zBevAGhqK#aUu}D1(AV55=`%&YI`%4I!$!B$rcZzNPnPWihgmCFJKPTtyjeWhGCM}h zt7DG_lyeQx7QwRYHgV@{Zg_a0B?O7AU@5psD0r(1xcICLh>`);8wl7&0X4z@Cq2C< zzR1gt6YaC4$lADlCwRN)pJlHFg8sNPC-{A_ILn@irGMM2mX%Dpmes>#@t4?vQ9D7UkrG1qE8h zqIPeK)%ENrQPAV++n1o8y3`Q+v+cQb$8V}g>zPwq+?W~_BUU=?F(BINv@ZowPFJzE z9=54Q-pn1S!dpy^iVnQZ9(O!}lCW|YRqp~1lZ?^qC z1g)7wLDj|b2KM22{O|?0$f~wJ;`&q^oVKE&Jrg2>UQ!}$!#fXe*sfj9#Qq~E3~Hx= zrAsccB#SkT>=~j_j$H?Kd%VI*ev3{MD|75kfjv~@gT?0BQ-RH0;EitSj3~P}l4}nG z{x&|}%eK!J{TkU*k=E&r>;r-FZf^8olhPZhkW^DM7 zC+j__rIDqMzv{+&P3*%T<9F-GK(Xj0dlV}$*1lwqeV^ZQiLL2z<3#NaF=711>qg@a zF~($mCznX4TRQE-ZoS?~^+iCn_&1F92V+)6^ZcetO!w0K;fOFw zPRHag<1dde&Wwq@{W71Erzl$l#znG4Mz_GYe#z`zu_ZljrseS~O0qFnj~o0D-#N}G zn-Dj~&O3HcJe%joMX*`MzWH(29^yZCRbcA3aZ#+c;rcc%^#R=5@nAyyb38Xxv|5tv zG?2nWF1<8(cF6{uVzckS7jQ5}v4tkKpGsjnNhH|8(MC4nm8JJ=5K+`zxsSNP{vU~Ni+C?<;K#Wq`oP9pTqbwBZ;T*k6Rl5v`K0c&!?0q z_AR}W!uf%>l>Fa%CuK2yR|buX7&B%hY2(;-+Bq0r3yn2>lAev^4PRD_C1aAJEzfRX zV&UF2hlrTy2r*8KNgD7gud_lCyzzK)6mNDyN&e;WS_ohCwhw98SIO}_ z>T3^G->UrMcRbXf<;4TijCj;fudg(&Qo^#gpX>OlFY~ds4}*(V}v(F=?n)vrl^F5=6fTGlE37k&t!n7Zu^sktsu}@?Hmhh%y^ygo;H|K-BD4MfBB_l&7om zg`fHm%^#8$CN9ne(Q8)}(F@yCP;-M9q%;fR2M#IHNRg7wgRd!qi6RAGSp9LtM@qjp zQ_|RQjw+(%_LO*j<%UQ8)T(^^=fZU=b&43Z7x6DVkP^inHr5?|7&gh+-z~L$2cG=B3W-e3 z2p3D1r$$>QhTy;w8VR<1mlA9oTArF6&r5$)R8XTZ@%*;bYL)_gyN?0IWuVz$NBCbq zDFP@{3O6E*kM^gIiRPCt6S~6kUX+{o-l^2I2-Zuam8UM}57~$eHJ$Zy>idzr_=Xbk z#9ygNym^d3Shlh0uhhi}y!LGsboWm65OL6!7R#THQ{mzEv=b5h%pby0o;pqJt(y_F z^eZ%k(bdze7Ds}NwZ5^wdRke1UiOa?0{sYI`e<4-UzF;RftsJyGi_ctU-z#ff_`N2 z9u7rtc}UvE7`}!HmgmS7{ko;L70)zAtEl#DS``0YS44fEO~X|ps{<9$^wP9Jykkuj zl&~u8Od78e;^A*6M(<5a=0DUiUfi3O)q>Xu_XM>iB@YoT@216AK5gbMwz+rH$}Rjv z1W`RHzF>~_thtfE9rc3w{wM`540i;H_d*>_SbcFd)KQCH^$mC~%+VCLgzX7)Wb%Y) z#nG{D2owV%90h@E^Dt`>kqa~I;^PR% zSboS&(Wj;(Qml`3G-od3Ql#U(U|txbBKfzPqrh^zH5dI?I%*nY6CJ}DZx*YLqyaUIy_H68hUojY(!Ek}OD zbqXAh`|a?G&T{Hwu^&d1@qI1Fa65lDiG&OjMsr77%Z-jQDYXokIcIV4>e4*NW)^8| z$#Xow`HB=p*}V#Kqnyh8g)N`y6pJ-!X>=rHQCsj!|NNdlclU zu3~>LM;D{8z){u8lkin31syANwB|b=q@X&+0}nb*S=m_;*$Z(_H9qR)*v^wx&<`y#5F;?5@K9=SD}a?ucT%txJ4&(lJJatwhlA!4zZ{ zORG9EjJYcvIT8H*1}ehzjgF42iZN=Vqj43!GDm?S+Z-KvjnQKCM#m75+BGHG_;q~!#7Rnxt)3h66 z(cg~PDmOvd-X`)cJM2z)h(VDLw7D5>v3eR}t}IK#jB3PXN40?85ia&!cEn&6;197D zkT`SM5hgyn?1(C^@FoPA@k_{Gtf61h|7P@#?jQUTnWo)gF|31app6oJm&Iru@bACi zQ5n6*=049Dl?H`R=b^B+p5tzbp+x&Up6aP&)8h<0x?~y61TjTHjI(@Lc)an-uZ|j3 zS)j3}!tpR~7nl~RqW@MF5=B<2Y%aJ9^J1mEd`HhzVz@-@iGLio~=?8rUYZwk8l$6m{ zQqsTXY`EhvHrz??5hqH%v?lJb>+f-EYCc|}YG~xGcIvUl7qR+HCJx2xP7#)%cQl43 z=wX(iLG=a)gj?DfQ<7ul2_)Ob1*s=pxOYI)KYj8k_H%r7F#KT z)Abs)N;w*LC|oqE0bG&QQpwVqv=8sM%+n74ar! z$j)yOGSlKG=NLy$7cgWs$0YmtT|jdzg6aCBe3nJ@)b%D^gk%dcY062|GKnRd*iM`w zXZg{>h7Nhmox5-p)XY6VYqJuogFosnzi{!5t|!%?&o<~Lo8*UrEDeXEll;XzjGzcWofiVyVF8tb#EuNTChmy)HbZaLGztX0 zJAvQ;iIH_rP*z(&Gd*GmauU^Df*d3{N<30SU&129Pc`%&?1E@nQ;$tqi;SsQg1|9y zHaHdrm~tb<_?mii_KVnBQ%~r+&qEps(k<9BYAM%PbER9+fQmK(dd0?u@?46Kpge-s z5>$^MQs$yMfNln3p;C_vC7@^ZO2FKz0PY5h$7<=xlHyJhfY(CAbG7tp^@&A`2e2)K z9kF(@ZnC~A|8w@>mzW*fmfi7`WP8P?5!3n@0KW#KI85CjG%Ez?QE{)99>+crUu5cu zB0E!0O*l#wSAQa!p{IGh69`g8gUXnlsb~KeRjnXjs;ilLGgEH6+Im{-2dFix(<`*P z#X~NZ*47;|!&lM)`j(MBtr9TZQ3+U|QVF=2RSCG$pb~H*6o79z7bXI5m$OXA8wp-O zT&tt+ljy+=ub><%!@LLpr6DM=SG}FqB-?+0)m>gzDXX-W7id7T!eRk@6v7T$I}PC- z(RckH)$6S3Wt5VvwJQOg>s11F*7pL;CVr}`*Q-g*t=0F6Lr6!p5CpPSQ|D2-BxO1A*6RPfGP<3g&-S2L{&i089(R^>?^YTMUd=e zsYR7w7pCQ?r$rHzM$N|`iZ`Jk)$k%j|N44sB<+p*dQ<#!p}yXLzrw^{`T9d*uv4Fb z1&5$88mRJ{i z^AK`fpf@dS;*d?MM6#l-MOCana;w>;3?)5(Aw;C+ zy4&d*(s5rP(w%KemyBx9uMmoqKa;E1mq5{F1?qubd6%R#{1V&y5;Le)_dfotV zJwUW=q&F%geX4j7(eAOJ=Wb?Gop&tIQ+VrU`I2;2_E-Yko} zkT}{%FObb337gm~m#eT>d1F&?Yc&V-W+1dwi4;v6>y9q6`}bGYI7ps855)6GrR8u# zP#Qst2+Aap1U*8K9H%5zgjnBL?`x-&IVoi?Kp(jr~~{#l5C_Zp>y28={)r;40?m5-&PFpeKfU zO`~`*_5s}$5)aWopF_1Ki&o8aN936*NPu@7ju+=2(3AYwEY0)=EM7EfraN6egpjj` zC0yk5+Wn*^fC>5URl&s+EN3O8QG-DfD$^Cc$|I_lvY%V zpmTFQ56OG6xn3V@@*g(W_pr~zm|=QM4-y-RGm!tUMttM{5w;ySNLcn$i3+Mt7N0_bWneKovqjW>mMla$ZK+8WqB5is4<5D@-->*U2eKp9VZWMpod`cO` zFD>x|KqdGb!7|&zX7Y|^{L^XJf&I5c8MDOr4)q*YJZ*$jcm3OBN_Ynu%FGqYjJMrJ zi11c=+rcEDfMPE92q5SYYMqA>jn&ay6+fXxgzl=0M#`bq)BDhPd8jD}uaZPLGDV1; zt@Hwzr>wOe8|pPrV?=suJp+STL2J__wO2WI3dMOrtf@@8Uy=UgLz<;XTehhrwO<=4 zb#@!C)bqGe1X91POnOg|X0(;0Pqu{>y;c6z?Y6sVoA&qV2M&eyZ!?=uC${zY<>(eOQp&bQaI*&Y#5pvQRlClyHky9F}H z*}*4hc?W$VxN3EjL674fJLPdGb_-GSaaU}tSldx|G^K_W*+zx9=Qjl95#%+vs4Rx! z8y(9x9OFSEl|_QM(-B4ehUoi1wnV)Sn_J&Dx6uP>n%=RYEp0xGT)$rg&&91?sQW+YXoeD?nog1WtBnzl^&2i zmkgeJe{j)$8O&mh$vyNNmSRenl@u9KmZ)hw<-0fK`z09p+)h0+Q5D`#)sqU`pX%cM zRE1Rc{#46Ms$y@HkB}bvlhvXU^G{f3>fyaql-7&Xd<1nna;<`(^OSsl=oE?fht7<_ zcf6Ib6O>pl85MFGRk+vOC8&TD#vfWn>g*4VrK3=@!|lzMuMH! z_xx|OzB+^tisfzXyq8TJ8=zO@L|c|m1ACz51q;^xgDrhMOaIYTEK8@A$PjB!xm+OE z_k*ig`ig&^)SLLN;Rhn$^Z^^z@H=Ado~t$d`VX9d0jO*`qL@yr_y6;QB$Lk~zemv5 z;>4Vt6qQ+o-4PU^FLxc6|Jd~*E-b8bSLc|S&$tvetDKM}X z4%1`VTJh#Ey(gpN zN02Ym=#hFYnI^hd2h%*UW~5$?Ea;JXqQ}gvJxcG6Is0>?^x<+*;26G;_URuY#Jy4a za%nEevhglAkZmC$@3bY-*f(0Q!eE+yIz~S##nD0Re&XI7tCu17MdPqc8!5Jq!(<>r zoF1niW>I48Q+g+WSD(^1V7Xt6*H<*9jIF;vuXKu~PhQDnpkph2#GWbY7Tm zP7o!X`Q_7blATD0d{rJ)D0OL+I&bGpq;vw8Pk&E2?dji%5HuE0&q`UPgROkCN@N6K z=pM>->I5lDI$g?VsHP}oUcEDf2+{g!eLyiqGxz?O*AV2@ClXnJjUJUErelbFrolu- z#{yM~c#?nbPHCZIe7u8)To9uZbSf1w9f0Fo#G>yc9s4)IZ>3mJqCy4#ioT-#%@#SPaSBB8B3_cUB2$4EPcgSXG z7O;DwMI|dCZ!uOCL#F7R>=Z&f<$VU(s^Zfr`g9pmi`3gY{8kmcrt0nF%3Nh_H6!p2 z-<~+V{1M{pR6RqM8g2AcdLjqQ2oe2^o*}1Jv>npN`17a>`pgn{qd{a&qLQU92QaD# z+DBMPwQ08>)$L+;-5BB-eH~MCE28!eiX?!x4^@J&9jG!yyL)`7D4QQqF?q*alGTse znZJ12MI(pFVm0Uz8Mejv4xI$iE*GEClpxx)QVF6>C_WIC674DRj+65JLj`HAXXupB zqz~JtRmN!3hcDTj-o-jxb)$E2#v9@ETD`;Ug&DIK*4VMI<{!UB&zg<{k4CrEw25$4 zwBKe;7uM%$t>m+&8*e^W>&r#a<4)mi{x3ne4+;CLK``!=SP+$2!Jj{6%#O}{t6lWg z8rYH=iMRJp!+~IH4bh@!W^DBSO8EX7#^9crIYH5_oM32`gtKDPBtt8wv8iun>*3MM zze9lKY8x#a4w9CCXRsrg(|NSz2Lx2R)<#Q*LxAN6r>}!(;qVM%S6n(g!v|z%!|u_9GkuRja?H8x%zTgSnge%=HOUpsJ%q%H~MGo_3ELV=gUf$`%?bRRb{u8*s8d{TDt zcM$OC@pf7%90=ue{1@%Crf}x-&{OTSr{LtXaqV)Q*~#hce+T1~lkKz%a0rmkeLzIS z^4VBw&6?3IyX8uXAvRxI42J;uoS%@d4TUqGkHCM*d^S4u%sL&FeTx_u#^q~Yz=2Rc z*Ne~B3gOJ>axh&}jJH-Aj||VMpUuZMHD;A&g&&Eo-_5RR58$hzPH^C;-_3Y)aNYS; z_=G~kHLC8F2cx^M1jRCZ*|P}$f};CMqyE0S-IMv>N5q`-bu*){96>-RG&cqg1Xqq2 z2hP{+Z{f?oFfuOI{UL79tcH2onI?JKc{qF1JX!Meqv!rNp4Rxk@zpJWx6IQ*^YXNo zaOU5@dU@KMIio7-8lx)eUAW4Jjuc%l)lX;B#kfoLM=;&^=2HE@zQqBkXr`eROTG^( za8!pMat+A9bYGhEzi_Y%)W*xz9mpLwB8LWT+I`3yKx*T-A>vXr|C5Lx#Q(5E(klIHS7Z1->^nDI%0^S$b9 zqnJF(nbYCJY(=1IY$x`if9{9;0;F#+Ix^I#qNxBf#19F?wL@c!KSw!#ufj%%t3}Sl zKpnl&O0o8BXN)N8T0cZ&O>mB6{lxMK&gP-ZrUz)~rZo$$ar$n8Ga+m^fL|jP z<158AWzGPRGSOKO`c(lsJQ>o}7&p;rN#Z#HPh6p3Z-fKZlr1AdgsV6Y|C+{>1<6=vdtN9RN3H6;;_m> zM8-y^10VIa--x6wGEQ%F{uRi#rihbUo#~B@pc2mvabL;#O|*E*EKqwc0S1YU-4q~S-=a${>bhQJR&ZeVH`T|#Kn)#_Y@_q|{;?N-(I)>SYaSZ*?5Z=XjWa<4hl7|-h|dR|8^riiK6og+dIyk(Le6Q8d} zL519Kwq-o6mnggm`FC-|p{mM8Dp5;sLjFP=C8=7}4Y7EetC~^sH|J3cPa7d_{|?a& zMcf}Kpl6MBf1rSP!yY2C0<8r5g{*%&(?$0RXLZ)hm|B6ruucOb-8B+ZRZQRDif4f$ z=x=9xoXXzqZ{qGZPVD>#LNAD~|8cet-Eq>4x~pLSIunfiJCxq8)5U_jpgJu!-vx7k z@#kIVql|BQQFOfr_^23n4{%T8gL?#*zbPV_E1mWWWyQFVBIYWS`Xq_? zC`5?;L6Wsk6e4`eSQmu|L*J?s<*tF&!V%?4plw2uYN*Xs5PItev%IIP@;+sw0{FS9 zu%hHxil`Ig8o|aJB8Fr&=uk-(whT#GJ>wwj49;IsYU7r5Fpg3^p{GbfIpf7#%LJsl z=g%rjWeJEV^y49>#AYHY2C1uYK$UAjA|#&s#gsTerEYs7G2NSBG8IZD>`VzwMlzcj zPbX6qb(<;5QV`=paWe(*YsM3)fJ5I{VzM<-abdrZti!+4P}JBj)S@Peda#2M{q-8L zHyuTaeM2dsP?7*0MLOK*qLcjhHcR=mbx87G#^+(QVW>|k_`7Eizjd#8w+50hUVKpl zNqE?3Uekqxzq%h2M`{6{A+FYPEn?e^X_>A}3m<%5tj_|BYhbbfyNt){x>x`|9w7R- z0Iw9!xd3MwQQ5BRmWbM&qTMxmu>*~ut&TclLie0ETXKKZDHr6rMq<0r`?;zUk*Jj2Y7sdQmklIUZYK6!iGMcw0sXyFa z+7?2KZDF^X(;yVm{##e1!Q&>b^gw37RHIbT@s(RAew@nG} zs$?z8ca5a2Mdy$jqgHztMxBePBEJLDa7GO4fHXLazdBGFCKZZ3odB1K3!RYRMMkI2 zu2qajJ}EAD0lZFB?F#B1#;UF;wJrmBm&wUv6(b4$*VHAACtq)9=LoGDzMOB4WLQIx4#d7FT zrVKu~`J&=}9n;CO^y7CkG=)2;?c$D&q2vgQg!Fpn} zi7kQxH#hngxl$SL5G1BgK+Rzn(nr&w-JecyRmTRTUnjUuN5om}?jk=y^&z97T}hHK z@2yU}KUD>pBTx7fFaNmQHeA4y_YnO8Q(lieR>k&36SdH}#>( zpl)njolNQZJ4A#}Mfr~tuBoo}Y^^bQD!QA9oG??sVAz5+RE`gcxM`>(m$7b|3**O1 zTykBE3>V^{M>UdNS?q{Wrdao4sO#<4VokB@Z+<>rlp?RJnbwdIhC-s;e2-_u`A!V1*1`N~28Q&SHf?2_=aS1zO_{BXgOn4dYSW#pvaL z&x*y%0Z%pVE_WqzKCP#yRtor#XkH2hm|z?)1$D%kUS^65Fw2WlS^hV}Oa^wFQ7QFY zjn+5H_+&LjkoJTKSp!M2qV5_`zF zOqw(lUUwDSyi7B;11i&V-$15YKW1h+Oqq7^Z@Th0Z#ho%T8GFxiD~N~xT{fhJ?Zg_ zFN=vA01p<+H@HTGt{G%9*Oj$n)Oyu%Lj(QzZF+KN#dp;N~P8~<)}4Q71bTVn7g z;O~ohn;^7`k?=0{#OpSRBbx!Q6jwI`u3=2uf=uwLJ4D4+zzapi{+Ve`mOhTB&kx7q;r67fbITe zN~Zo@Qf+$|7v?Va+%2a z7$oVey$QMeE|OG+!e1SD-6hV$r@3LgVWm&>%465`R!LfVQ@<*!+5V@eHKO_Cz-WDV zK&Et3A6;`fTLOp8XaI)+9LV_E)0N)F=5R?`mGvR=Y4$}*p({~}?cXTN+X;Rs&?$Ja z8Y4H`x2jS2ds>a+?33)jsJ)H<6RHVXVDITA1Z}f#@p^P(W5f8{E5}9aorZqxPx4?! zBboTQm7AD;g`1e{=P;4e-bX9L{62!#?F?<Ft&u}}76#weaYiu^(QUw)&FC;f;{ojA=t z(SNp9c*%jc{hyR4wT+PFs@9QIi(%2clC59!N_La9v4IAEN8mPJC(~&}0r!!>z45(< zv%eZ>4dJ6~uaNYo;Ml9vB-wun?1X_57G%ZWoRfUXcGo9tVH#Bj;9 z8?DQO)=|S`t#EeQ7*B`ME9|?h)`%5k`t(?C`oV9w>7Tee6s|xE6xy#@dmDc+laPbR zFSREIN6Vr1@xepoR(o@>UG8g74H+t@+Ur81Wf%LiA!l5v+(-8NLi6O$4_pX6A;XzC9+BFhARmg)j7Nt<%G)(<4qc?@{bslyRT(S4OyO4 z`epm<=tn$%?Ck=CfeQO}=hl9y8waY8!f+{aQ?!Y_*T?ILY(7 zHuOdNp^kIqA@5yo(l=|S=DuOS8yhOe*{yMLb#V<@x6yD2 zPSV@Q4H9pyfR!U|1Kp5gqrZ|?g&Ap%_M9+w@l6wg*UD9?H0GD_zY^7;D_9!VQ+{QC zn?|6%{ss0BL!XH*Qpw7!I~pyuJ@NQ5Sz4KO%j-z4lirY%vns1zv!L-0uFifZE?!=2 z50CeY7pgf|qsEmcxX3h9!_&mEYFU6iFTT@+Zzk!ahGhX{-T*_xvS9w;*|02}KbRVp zMe_%r24CqMx=E{;qqpNGxJX_{PC3x+L|=~gEB>x$o9F;dbg(8mToWCA{U;Y1GjQiy zn!O``zjyEds`EaLnh2_93Cq9c9&DeV5M5V01?sfA!RU74-u{gW{C`wZRIjZbRCh;J zOE&($Yg6ZFsp$XSQU}NVyQPGtNdYUTMSC_(3I;GWObQ3^X~>LTIWRh4<#4!9)-62h zF%4du)Qi-MzQq7BNhX5?=qV>5VhoHn{9Q-GyR8L>d?^11zbEH!bnqLl|BF57e_=03 z7UKQ>&3@y9|CDa1tB7_gE(e)kM zYTYpYriSkP2m%E6sfG@##vg6SJ-2e2{f|yjbxpH0yH;ff2#!_D7EmvuHMP<|l^L|A zF|AsbK~%oZkpH@Ok7fmqA}36Qm571dQ87hba?H|SuUgMV@Pd1}LLv%RWIr0uJ%*U9n|_Um0Imk(vsQ0G>S zzeJryvkPzJ3J*RJHe|iIDhIRnIjCKE{@Qtt<@saRb|JGW>k?$Ya|oJZNfYG`Qx2_# zvP+NZfmjO0m6yoyWA=TC!SXcwnM8m8UjMjD%Z_@jKl<>|8pMBt;O%JtD=|jiVvk4) zk-xI{P3j!*;@@q2T^h2!7JQrjwvS8;wl^p3l?&`S$-QN}eRXoE`DhdG2dB6q`)kQ@ zx~SjnkEKN0jVZ=X3BS9Eh2O6*?APDir0dPRUkn&WSqIU7!PHNH0R!y)Qex!*dud7p z8nhuLv2GdI`C{`9%H|-mD(fbmj;}|3A6S+38=ez@ZOHm?)%f42H8GO2$?c9^8>$s0 zCSPQ345j8GBit!xq8y3+;|_8()VS!G5Uq7uH$Mp(5JB)0*liD59yq{(jZHBv2m5^6t5xmE&IOVrZ4+xYloE!nvX}#It;N!_z?i<8Jr>OzeFR!*FE7Iv9STGTxqsEd*N?!%l*QUIKcV1$@j{3@IOY6xZpk5aDHcSWqvOherq)yFx=9uNz}jmvf*Hd@F8Vo#WM@a!fO^* z7Kg`-wIPL970;_Jttu|Eh0myEA0IVrU0!$0faK9ycdWz8FU;Ms=#%=XhGn|`imOYS z{1#i>+t^8djb$|(W94Wzm%tgep1^$e8UY`6wb>XZM>5wIfCLuPVvIt24rwuVjo&=$ z_PsiY)Th0k?G!t3sf){e`K>oR^?C{j8CWjeVJ#@!;ZEu8dlIn^VehmULtW0!zRfE9 zjJ{3J7!C3X=J5;^NGzU!%7zf=&q|*$Ms@gZ&h2~uLj`jgctblpKlk>%^z7~?s68f1zH!fegGZj zRNTJz6qPv3W^XZu%3rpw++tkdBEQIVTa7=;AG4pg8i&bOTl;J?ejw{^zs|l)F{ZU< z?=Z&8s7BRJ;{Z94y}Z+SL!Q8%*=0PUn{kBoEjIeH1-p$&x`&Q1uLr?@dAIRtSw7vm zXfH{*e1tu)2-p?-jk!AA-6O5v9xzUkWlz@sCF5Wh+tF+me!nr59ev3-1j0MKY;2WN z+3}Z+2jtAw`&x~4dfnWkY|d(9@7C1A#-DWZ3fA$6ak;#%b>Wuw*^li2XLjECfF%ZxV+N}{ zY4p(D7Nq67P8wTxo%CGW(d(l{dODE7zoIUgQdsMVA3V2v=sKsc-+%M$qVr$H;(qrG z)$Q-kvVZsNsJnicRZ{+obF2~2<-|W8Z2#|`A-e6s>>LrgJ@vZCNlkwdC}rV)!Cc#TmW{k|zzmb4lIPgyzdU_)lPcH>VjQ%H zZ6o+x13N|Vvn}iz!H^f2;V$5aV=NBPSofYLppqrsg@FB^vsuLO?M=3V;ER8;Z3J~j zc8Us22r@e~ReDvKi+f0ktv4E%!4BKYagYz4s#g>55vDTJLOSUHkiBWNgC zZ%{&YkI!Ep2hhK1eKx?2*7dUh4%}J40-)rt_1ggYxvsyg`02ddIQY_yHOk0F8JI~1 z^=AW1B-ptF%OPm@VU+|w^b>rW{Mk0j{}L|pUXkoF#AqXkC^+j`-7A*atJ#U zq(r-i#-4=#xv=mK!Txe6Gg*}|fJCbjJUcXD3rPCX@|u+7yc#LAQxZa|i{2FoNnh(k z+p;;@y|%o%bY^*RQ8=gLPkJhq>O7Ok2G_ER@|ofMkF&gB=(0j)YjQ$^y+~7DS#d#i zO$HTYSFDPUEj0P6!w5l2N+(*1D}-_z+GANnFqKFnJKGV3_3310n+l~u5aPu3b(%sbVM%72C2h!lTEpcLPU!F7W>p(<02x)stseBm*K@Rzl*j+sJ=n+;EqS)lH)|L=u zj7v$ln&>V`el;~xxYq(iXT2dn@<#|lHiPVP@s<2%

jl_WzUGE_((Fdavl;a=%@ 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ΠaXVR_Pw(wa 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%0D((Z~VT3A1 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 G^8X*WzsFnv diff --git a/mrubybind.cc b/mrubybind.cc index ed42d49..d04ed3d 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -5,133 +5,171 @@ #include "mruby/proc.h" #include "mruby/string.h" #include "mruby/variable.h" -#include "mruby/value.h" -#include "mruby/hash.h" namespace mrubybind { //#include "mrubybind.dat" #include const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x06,0xcc,0x00,0x00,0x07,0x6d,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x07,0x4f,0x30,0x30, +0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x7e,0x5e,0x00,0x00,0x09,0xe1,0x4d,0x41, +0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x09,0xc3,0x30,0x30, 0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xb5,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00, -0x00,0x12,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, +0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xda,0x00,0x01,0x00,0x02,0x00,0x05,0x00,0x00, +0x00,0x16,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, 0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, 0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, 0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x02,0x04,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x05,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, +0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x08,0xc0,0x00,0x81, +0x40,0x46,0x00,0x80,0x02,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x06,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, 0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, 0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, 0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, 0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x52,0x00,0x07,0x00, -0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x00,0x11,0x04, -0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40,0x03,0x80,0x41,0x21,0x03, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x4b,0x65,0x72, -0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x40,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x40,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80, -0x15,0x02,0x81,0x00,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f, +0x63,0x75,0x73,0x74,0x6f,0x6d,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, +0x00,0x52,0x00,0x07,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, +0x03,0x80,0x00,0x11,0x04,0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40, +0x03,0x80,0x41,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, +0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00, +0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, +0x00,0x00,0x01,0x2e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08, +0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, +0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, +0x40,0x15,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, +0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, +0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01, +0x01,0x37,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80, +0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, +0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, +0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00, +0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01, +0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00, +0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, +0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, +0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00, +0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, +0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x01,0x40, +0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, +0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c, +0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00,0x01,0x00, +0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01, +0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68, +0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00, +0x00,0x00,0x01,0x2c,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x08, +0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, +0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, +0x40,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00, +0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, +0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81, +0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, +0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, +0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01, +0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80, +0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61, +0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00, -0x00,0x00,0x07,0x0a,0x00,0x00,0x26,0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03, -0x80,0x00,0xa0,0x04,0x00,0x01,0x40,0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00, +0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b, +0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00, +0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00, +0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, +0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73, +0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, +0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01, +0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, +0x00,0x00,0x00,0x01,0x34,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x29,0x00, +0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02, +0x40,0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02, +0x01,0x80,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02, +0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03, +0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02, +0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02, +0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01, +0x80,0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03, +0x01,0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03, +0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01, +0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a, +0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, +0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20, +0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69, +0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61, +0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72, +0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62, +0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65, +0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00, +0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04, +0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, 0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x47,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x01,0x00,0x00,0x84,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69, -0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74, -0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x01,0x08,0x00,0x03,0x00,0x07,0x00, -0x00,0x00,0x00,0x00,0x1d,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00, -0x20,0x02,0x01,0x40,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00, -0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00, -0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40, -0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x00, -0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00, -0x06,0x03,0x01,0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29, -0x27,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72, -0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72, -0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72, -0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00, -0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41, -0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e, -0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00, -0x0d,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00, -0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00, -0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01, -0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63, -0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01, -0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15, -0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x10,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00, -0x00,0x21,0x00,0x08,0x00,0x26,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x02,0x01, -0x80,0x95,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00, -0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x00,0xa0,0x01,0x80, -0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x02,0x01,0x40,0x38,0x01,0x81, -0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x27,0x00,0x00, -0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00, -0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x07,0x00, -0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69, -0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72, -0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79, -0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00, -0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00, -0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65, -0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00, -0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00, -0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80,0x00, -0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73,0x73, -0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61,0x6c, -0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00, -0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00, -0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65,0x66, -0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x0a,0x00, -0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x26,0x01,0x80,0x40, -0x01,0x01,0x80,0x00,0x20,0x02,0x01,0x81,0x15,0x01,0x80,0x40,0xa0,0x01,0xc0,0x09, -0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x91,0x02,0x80,0x00,0x3d,0x03,0x01,0x01, -0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40, -0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80, -0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80, -0x3e,0x02,0x01,0x00,0xa0,0x01,0x80,0x80,0xa0,0x01,0x80,0x02,0x91,0x02,0x00,0x81, -0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80,0x40,0x01,0x02,0x01,0x40, -0x38,0x01,0x81,0xbf,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x27,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, +0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, +0x00,0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80, +0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73, +0x73,0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61, +0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05, +0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1, +0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65, +0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e, +0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80, +0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40, +0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x81,0x15,0x01,0x80, +0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80, +0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81, +0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00, +0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, +0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80, +0x03,0x11,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80, +0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01, +0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00, +0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75, +0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, +0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00, +0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02, +0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, +0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, +0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63, +0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08, +0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01, +0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21, +0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f, +0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f, +0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00, +0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01,0x40,0x00, +0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, +0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00, +0x00,0x01,0x3a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x08,0x00, +0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00, +0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x80, +0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02, +0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, +0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80, +0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0, +0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x81,0x40,0x95,0x02,0x01,0x01, +0x37,0x02,0x80,0x00,0x06,0x02,0x81,0x40,0xb7,0x03,0x00,0x40,0x01,0x02,0x80,0x40, +0xac,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40, +0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, +0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, 0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, 0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05, -0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72, -0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63, -0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08, +0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, +0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, +0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, +0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, +0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00, +0x08, }; const char Type::TYPE_NAME[] = "Fixnum"; @@ -233,11 +271,8 @@ void MrubyBind::Initialize() { mrb_intern_cstr(mrb_, untouchable_table)); } else { mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); - + mod_mrubybind_ = mrb_obj_value(mrubybind); - avoid_gc_table_ = mrb_hash_new(mrb_); - mrb_obj_iv_set(mrb_, (RObject*)mrubybind, - mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, ARGS_REQ(2) | ARGS_REST()); mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, @@ -252,7 +287,9 @@ void MrubyBind::Initialize() { } { - + avoid_gc_table_ = mrb_hash_new(mrb_); + mrb_obj_iv_set(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); mrubybind::MrubyBind b(mrb_); b.bind_class >("MrubyBind", "MrubyBindStatusPtr"); @@ -269,7 +306,7 @@ MrubyRef load_string(mrb_state* mrb, std::string code) RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); mrb->exc = NULL; - mrb_value r = mrb_load_string(mrb, + mrb_value r = mrb_load_string(mrb, code.c_str()); if(mrb->exc){ mrb_obj_iv_set(mrb, (RObject*)mrubybind, @@ -303,7 +340,7 @@ mrb_value MrubyRef::get_v() const{ if(v.get()){ return *(this->v.get()); } - return mrb_nil_value(); + return mrb_nil_value(); } bool MrubyRef::empty() const{ @@ -395,4 +432,5 @@ double MrubyRef::to_double() const{ } } + } // namespace mrubybind diff --git a/mrubybind.h b/mrubybind.h index ddab2fe..d7065f4 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,4 +1,3 @@ -<<<<<<< HEAD:mrubybind.h // Do not modify this file directly, this is generated /** * mrubybind - Binding library for mruby/C++ @@ -32,29 +31,261 @@ #include "mruby/data.h" //#include "mrubybind_types.h" #include "mruby/string.h" +#include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/hash.h" +#include "mruby/variable.h" #include - +#include +#include +#include #include +#include #define ASSERT(expr) assert(expr) namespace mrubybind { +extern const char* untouchable_table; +extern const char* untouchable_object; + +class MrubyArenaStore{ + mrb_state* mrb; + int ai; +public: + MrubyArenaStore(mrb_state* mrb) + { + this->mrb = mrb; + this->ai = mrb_gc_arena_save(mrb); + } + + ~MrubyArenaStore() + { + mrb_gc_arena_restore(mrb, ai); + } + +}; + +class MrubyBindStatus{ + +public: + + struct Data; + typedef std::shared_ptr Data_ptr; + typedef std::map Table; + + static Table& get_living_table(){ + static Table table; + return table; + } + + struct Data{ + mrb_state* mrb; + mrb_value avoid_gc_table; + + Data(){ + + } + ~Data(){ + + } + + mrb_state* get_mrb(){ + return mrb; + } + + mrb_value get_avoid_gc_table(){ + return avoid_gc_table; + } + + }; + + MrubyBindStatus(){ + + } + + MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ + + Table& living_table = get_living_table(); + data = std::make_shared(); + data->mrb = mrb; + data->avoid_gc_table = avoid_gc_table; + living_table[mrb] = data; + } + + ~MrubyBindStatus(){ + + Table& living_table = MrubyBindStatus::get_living_table(); + living_table.erase(data->mrb); + data->mrb = NULL; + + } + + static bool is_living(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb].get(); + } + return false; + } + + static Data_ptr search(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb]; + } + return Data_ptr(NULL); + } + + + +private: + std::shared_ptr data; +}; + +template class Deleter{ + MrubyBindStatus::Data_ptr mrbsp; + mrb_value v_; +public: + Deleter() + { + + } + + Deleter(mrb_state* mrb, mrb_value v){ + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + mrb_value a = mrb_ary_new(mrb); + mrb_ary_push(mrb, a, v); + v = a; + } + mrb_hash_set(mrb, avoid_gc_table, v, v); + v_ = v; + } + ~Deleter(){ + + } + void operator()(T* p) const { + if(mrbsp.get()){ + mrb_state* mrb = mrbsp->get_mrb(); + if(mrb){ + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + } + if(p){ + delete p; + } + } + +}; + +template using obj_ptr = std::shared_ptr; +//template using FuncPtr = std::shared_ptr >; + +template class FuncPtr{ + std::shared_ptr > p; +public: + FuncPtr(){ + + } + templateFuncPtr(std::function* pt, D d) : p(pt, d){ + + } + ~FuncPtr(){ + + } + std::shared_ptr >& ref(){ + return p; + } + std::function& func(){ + if(!p.get()){ + throw std::runtime_error("empty function."); + } + return *p.get(); + } + operator bool() { + if(!p.get()){ + return false; + } + return (bool)*p.get(); + } + void reset(){ + p.reset(); + } + template void reset(Y* y){ + p.reset(y); + } + template void reset(Y* y, D d){ + p.reset(y, d); + } + template void reset(Y* y, D d, A a){ + p.reset(y, d, a); + } +}; + +template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ + return Deleter(mrb, v); +} + +template obj_ptr make_obj_ptr(Deleter d, T t){ + T* pt = new T(); + *pt = t; + return obj_ptr(pt, d); +} + +template FuncPtr make_FuncPtr(Deleter > d, std::function t){ + std::function* pt = new std::function(); + *pt = t; + return FuncPtr(pt, d); +} + +template +struct Type; + +class MrubyRef{ + mrb_state* mrb; + std::shared_ptr v; +public: + + MrubyRef(); + MrubyRef(mrb_state* mrb, const mrb_value& v); + ~MrubyRef(); + + mrb_value get_v()const; + bool empty() const; + bool test() const; + bool obj_equal(const MrubyRef& r) const; + std::string to_s() const; + int to_i() const; + float to_float() const; + double to_double() const; + + MrubyRef call(std::string name){ + MrubyArenaStore mas(mrb); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 0)); + } + +#include "mrubybind_call_generated.h" + +}; + //=========================================================================== // C <-> mruby type converter. -template -struct Type { +//struct Type { //static int check(mrb_value v) = 0; //static int get(mrb_value v) = 0; //static mrb_value ret(mrb_state*, int i) = 0; -}; +//}; // Fixnum template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; @@ -62,7 +293,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static unsigned int get(mrb_value v) { return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } }; @@ -71,7 +302,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static float get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } }; @@ -80,7 +311,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static double get(mrb_value v) { return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } }; @@ -89,7 +320,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const char* get(mrb_value v) { return RSTRING_PTR(v); } + static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } }; @@ -97,7 +328,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -105,7 +336,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -113,7 +344,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_value v) { return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -122,7 +353,7 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value /*v*/) { return 1; } - static bool get(mrb_value v) { return mrb_test(v); } + static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } }; @@ -131,10 +362,61 @@ template<> struct Type { static const char TYPE_NAME[]; static int check(mrb_value v) { return mrb_voidp_p(v); } - static void* get(mrb_value v) { return mrb_voidp(v); } + static void* get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_voidp(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } }; +// Function +struct TypeFuncBase{ + static const char TYPE_NAME[]; +}; + +template +struct Type > :public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +template<> +struct Type > :public TypeFuncBase { + static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + mrb_yield(mrb, v, mrb_nil_value()); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// mruby value +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_value) { return 1; } + static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } + static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } +}; + + +#include "mrubybind_types_generated.h" + //=========================================================================== // Binder @@ -162,6 +444,35 @@ struct ClassBinder { template mrb_data_type ClassBinder::type_info = { "???", dtor }; +// Other Class +struct TypeClassBase{ + static const char TYPE_NAME[]; +}; + +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_value v) { + return mrb_type(v) == MRB_TT_DATA; + } + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + +// mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); @@ -204,9 +515,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(mrb);(void)(args);(void)(narg); - C* (*ctor)(void) = (C* (*)(void))new_func_ptr; - C* instance = ctor(); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(void) = (C* (*)(void))new_func_ptr; + C* instance = ctor(); + DATA_PTR(self) = instance; + } return self; } }; @@ -271,9 +584,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); - C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; - C* instance = ctor(ARG(mrb, 0)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; + C* instance = ctor(ARG(mrb, 0)); + DATA_PTR(self) = instance; + } return self; } }; @@ -338,9 +653,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); + DATA_PTR(self) = instance; + } return self; } }; @@ -405,9 +722,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + DATA_PTR(self) = instance; + } return self; } }; @@ -472,9 +791,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + DATA_PTR(self) = instance; + } return self; } }; @@ -539,9 +860,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + DATA_PTR(self) = instance; + } return self; } }; @@ -606,9 +929,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + DATA_PTR(self) = instance; + } return self; } }; @@ -673,9 +998,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + DATA_PTR(self) = instance; + } return self; } }; @@ -740,9 +1067,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + DATA_PTR(self) = instance; + } return self; } }; @@ -807,9 +1136,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + DATA_PTR(self) = instance; + } return self; } }; @@ -874,9 +1205,11 @@ struct ClassBinder { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - DATA_PTR(self) = instance; + if(new_func_ptr){ + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + DATA_PTR(self) = instance; + } return self; } }; @@ -1023,7 +1356,7 @@ class MrubyBind { mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM - 1); - mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, + mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } @@ -1039,8 +1372,8 @@ class MrubyBind { mrb_state* mrb_; mrb_value mod_mrubybind_; - mrb_value avoid_gc_table_; RClass* mod_; + mrb_value avoid_gc_table_; int arena_index_; }; From bad32c1eee252910edf24960827bd935aa71f894 Mon Sep 17 00:00:00 2001 From: dycoon Date: Sat, 22 Mar 2014 13:56:07 +0900 Subject: [PATCH 069/103] delete a.out. --- examples/a.out | Bin 3602180 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/a.out diff --git a/examples/a.out b/examples/a.out deleted file mode 100644 index 92eb2fce2dc11252fdcdc67cd25a30f0fa794794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602180 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 z 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
8V)O{E8Kr#r+1c%=}4*F!`}#F+ygi6afX`w*uY zBb6jA29G3x_l=kVZ@F0OfOmi#eACUCd(;Kb@Agk0ExG!^>t&|vu}H(d$im5}bJUS+#|5#J{P`cDxnd@GalFg?Xi4S?{)PO4%wA zYbeJ69~M?A?;({l{5TvaN%O3;m1&+;CBnkO8gWenZ|_-m!hvT!1%YRMEW$i%gIKRa z;l@trBP{$36P~rrJP~--J|apY&K%DoakhC@0&zSGsU&H!XOSe&>i)L#ti8lq$Fr_f z=B7Q1d(`h)D<${m-mw!%v3iH-g|SB7+&jKg9xPEA*6Y>;fM3kq?Nu%ty&SD<8}I!d z`q4|x6dS$t6i50d~yr_|l_BGTH(aG}0OYH+;yPa0rIzy-3DsNBUVhCN+H0 z##IxP(`lT>RZrPq<{D#MCdNTt!EJerd>6qsRQlZI3fQc_xaeI!a;V9hs5WGd@x5}* zF$(7UkaLx|=7P3&jHb#k$7l_KV;mvE9OJ)Ybs?ue`f!Z?FyR=JAaIP!MU+IGIgUZ% zYIBShh~pSYB}t1NgCse|_hKgGB*j|CF%EvOKF8o5bsght_gauyMV9E`moqKnDC>< zcZtAa2a70)IK9QnYy|qO#2b&6$BrF|I2J=HNm^_%l4P-BJs9Cf7mL+dtjvXjK&u`V z%G|WYxN*G}OVP4A?;8f+c%^!KFf*)>cCD#=f1Z9hk32O+wkH^EBb!oyy5p231fn}6S9w)s9Bc5ry`O)CKyqW-kII9yg;)4eelzLLem~mQUc%nyWL?E} z7HpX}BJCAwTZ9Vxm*Qn%Z}YMK;v50z#(%VJ#e8glZdQtqi4zagI&Z`kwMbhwI6fq_b6C* zl3+YUX>UtelEm_Ey81^~<&`2@-YsIFh+{?A!57C!*l;W#e>B=4V4?Opc2Hpt6{+x z^Q-A3gv7bG>A7dUBq$W!bUcHYTC&#O=%Xswy zUiNJW_WEti9DJ%;QY_3@)RvmkodK@D~ZDY~(E)%q%X*=%~!2VjV$hs1m8e@F+2M z`P382qwp6+c~${=d0Uf3I7YL7Y>VD zt6}b`BaRWPxp=yDA{7!a7OOwDfZHg+a3H_x$*G<3&z(P41H-wtOI#?OW#20;EiWot zEn+CdJ0fO?NWxaWL09+csyt5>ULm4wLlK>MM{f_QT7;@Uiu935tu!m`do=K#-WK4?<{NLktm6n3iEeRE__%>zY0f-r>b*d z8AI`6(CKH|7d~XmAZ%gihX1G_E_}2w=v&2nLAZzU^lxRI;eK{eHx6+)-3~=z*OMbf zJ2)S*Q|opxAp%j8tU%P%1)|IuHAEo)E~tW6naR}13QO~GmzJ7ubjK)_%1n~j{zF~ie!Vy7 z>Rjcw|4Au|M>fp+?^ph1{{4#zk!3RbYRTH8#C#Dp%9|^$OK}DNNV)_L9wpv_V37Bv z2pi@-AXfE3>RQ(hmp;1I4KUHQHoad21HJu4lti4-P|qGE7E8SGsS+Ri5aM*MNF_;& zM+YRy^S&1|o$DK7#c8sKdab^$r*q}D^>wZmIEPD8{Y#+l2ka}8ltkB2;KXFicK25% zceTDugnxIf)^ztUY2#_b%ICs$Ji2qU-RZs8#EzdCeIB0i`#JLWptpij&|eFLZLF89 zFvk#zo$>Y?q@WC|^(bm7ma@I%xScR|QxO+qKXS`k>*{u0mA4o1nuye|5@arX3rYDB z2I<4Uj2o*fjvA@&T2jN6IYJ@7i?!+Vn? z`cvE5(X+lU#tE3dYmxP;-%+PTbwKO^PgjT~3Q`^hzb7$M{mh7k^QW=~EzJ_4PM!2orckG0Fkj5GT6Zee$Y~?@VNQ zPvVoYchAJlk}uQg62acGS6LSk$B0OhTRu=%XJf_@BJ!#RcIIH!KO{R7*%paIko`_+ zGsKkMX>ECMjf1v;&w8bP5+_F2IS3KnIYu8Cqz;h`MxPY1FiS6}chJQFR{3jTmTr+&}qKx5tnBmJM zTZ3$i#NCS2X84`Olpdyx9K)9?0mHv8Hmj_E!gT#(IQ`e68Sl`HE`h51MO;FMR@UFmx8?WK39zby|Q*w5RaIf2Z~MKma<(FEa1 zX0kGISDWp(JT0>QNx8OnjG0mRV6#2L05?b0G{m;QMQX79W09KLPLCym)QM8X`26jN%|j{APu-|IO7c^b7mvi#Z`CP+ zg8Z@8;4-+m26Nh|@f^Y&gr}LoS4(h)&<(4<$^ds-E^v;K*kpax>AumNWZmm=-}~p1 ziHYe_P!e57-D{!psrUWL%<;MCxg@XZq#(7cxTxClh%4jZLAt;4ay?sB8)a3?49|w2 zaYhhMvkHw9yNy_??;jg^;miI?qq8IlbELA*r)Or>+N2bzA{-n zoSqmfh1T1VnIzHocBxy$L@j5DBd3;8w=eD5$ttc7<0d7>?HN39Vkf854j-W-<}(MO z{BEb4tdq!RDo$Aa;~7zHez#ZCdD?YHoH|aM6VlVq276uo7nP7TkUtCUBMlGeiO

9+#lmzXVD`_LDfZ5Z8DesN{?2&-2)#{ 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

A9pnPlgv36 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

AURF6 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 z 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 z zZYN-%fLRjN7%EuJT$PIo%I+0qcMI))^U;Rmq2{at!nZ!l2Ku&#J!q6^+`=X9l@m!8favNByAYDAnxDv>BZMz zwnNgOUUk--#7cwXRk2!4D=pq{C$01_mo4-~fmY6^N-OA`y1v~9$-Y_Z6-nO`XgL9; zecr1^4l|2}dm`Kq$#%LGbjiBDKqJWwpVR$|-wVV7{n^MA>qy;a*i9fQXm2A^z*@A{M z-q$7jrhqTCMgjBuh1&g9K2XqLG*FDC1#${nGsq{U-Tvodgg8=^d#aB15Qpb*Ro&BB zT_7(YZvSMP^%xb;3{p3ESVe9I$-r65>i*9ff{b;vir)?_P`nTKawm6m8GUNW%bnR% zkC!{MM;$MBa(9s{N>lS{@X7NVmW1p%&TMl!HaMN#nLT2eo!2lsuVHqoAzxppfJim! zJWi1wrAUuaq(>;yUu`7rhPa*{@{Q9Vw-yv#0A{vaP95O4tyhY*Xc_F(j)Y|krlsDpG~h5B{?}Lg5qPFd7atQ zmwBDpGnRSzW0iTG*^`uc`SX%_oos6CTk64io!L{7d7asVka?YtOC>)0m}k#8xDjPG zKi7K9%5DXJBw+<_h85U{*o3U$BZUW3w3!|st{ZLZ2$Tv?Y~ky9Wv_Q;{$J0YXB0O8 za*wz5+p~11KpsIyoAb&9wdBVFC6{M4I|xL2tohjct0Fs7h6-8tVstl-OAjk#iSEf0 z-D8QKu5*Q{JtTs|s}-`RR6Tjt^&xjf!&R24k#$0}0&#LkutL@aJ)K$Bd-CTr#XXNtbt-j&dD=4 zCm*VF@(j+&hw7YssLsigHYZQooP4Ox$%pD38$F?mYgx+XS)^-iWz*Bj)Cfn433ZZfb-wJvZ<9xp^~+U%#B8fFBOc z0F6>7$g;N+VsGo1GAOo5w^WLu-J7?mH*ZsK-lpEXO}%-Wdh<5*=56ZD+ti!4sW)#^ zZ{DWjPRpZeNKa@J=uLszG_w=p?ZCfAQ}xGTx_?d0tA&<=VoPUQ<4#(_(lIk{!puDC znRz(HEs+N_`Kz+k6!EDnlDT`hKqQE1%%!%EHL-oI!=Aczb}j5XeC~@|*rcQO%d#0P z8&)OoSIoY>uy1#xeBGKYD=c*?0PSip%nwUn$Vho%xh&(DC<7>MUtHmK!?ARAg*tnB7LtE>6@cSUzbG|8%l@ocj9`j z@5%pW;eHcNe`>8ti!9QA3hchpV5x0js%6l|0^=8UXV4R?@Fol9ha7ah?+?;2SH5n-QG zp{S)sWt!t{jn`E3ol;g@`*$wG6u3`Gs8?P1t312Cu1WsV_)VMX-7V>fy(dG`TAb zl8*zG3C@IC9+>K^HzHYF2uGwh5XHDW6p9^%Vn=a?%%{AYpDD+8ne!?(cbfAwr;v^} zY5QeDw;EXn-66276;`P^ScQNsj^H!3jM{=URRe3LK-qaDNt3(6Ao(COvC(}uZ+|VE z@ht5vh81m{^Wf0)+&DYo{Pi}kk5BKtdA<;x&@Ca!(9SY=bw zu;=NdR*S+uU!)70)b?$p&wj&F0KUrX+Y9@4H_8`_&7_5;_F2#bBWob)?{mr)o@=y> z=JcuW)o1hiB%R^oMObl;cV@QS^G3}+dOs!`-vuk(kvLEqN19ejBrn!%qxWYrLtca& zWvpcQE3qC8hM=2Fn!0?pSg#4}tTtJ)AWwDRe>*cNgZ42p4TTp~Ea^p^EP_>4T*Fvx zpqmBe+Xoc#t?j;5^719Iwi0N|0R?G_kQX@*3R2M5jZCfUR&jwkVB#ge@5ZY`L-hhs z7Ah}<@)A+jXFXy)DNrb&AWflQzk(T*K|z|D@l~BWs{X z1nRpdI(d2@OBD%;y8M;oT^0kJx|&#m%l z?f&&8e7ju5kE=y}FT0JGy*e*@-?$%qyANo$hj!cM`m>DvK%uJ#K$8Ua5nKq;C%$_Y z>5fIZUy*q@i+X7tU*TNt?$j4Oo$k;Ih0C;Tt|POpEsQo$?9iEchtABM%uF4sCDY@= z32~7E@OXiiFA&X?CWsCc7sOlk;u0xcDXzyUu1A?Cv`q$w2;hNFFb8R3QRyfXk2Son ziOX1>8Awo*>%CWyf;x;$UH+P4em^w9YgkHe60Rc1&fnLo_=`r?!zw-!SfKDK zdaCqqV!aZip!bYStJrON-Ef*fHGp{OP|e{DG~RC(d7SRn^WK+8UJK@(V3EAt%ezY= zJ=VX-{BOY%D0r&k-o`gLvaC+X9|TtYom5x~L`e7>L&=GlNMg-Vmgog}YRIxRLc26<5@2 zlN$P~2<>TPg+l~4rsa1caEo$nb$zPkEuyyrz`W+#*2r+ zY0Y2ylLGJl1^>0ee_P={O>X@6H>c%Rp%8Q#PcQM9vQ)n@Al~kTzstz4n7pH zSc3Y+4{B&qMP-4W|2G`Y$_l%;4cew_{PI)=Aqqd&677; zS_heC`RhVs0?BKnXW0Z!#|jj?OxorznQCnK&^k8S=3jG;uagAnYtCKy4l!p4)F{wQ zBdefa3&QVV_(uxzSdso#Ku0f3&WpsnJd7M%6KE!Yju$9fUEL6;2EKlk$1*&CuG!dCgH#2EFD7>YtpQ(WOvcSIF9AeK<7}pIk z$|dgR&$?{d&pxbE1@UgOHk_9`vyXwi+{s5hczM7ik85o3LavtA7lg=_@tJUZ+`g%haSrsqmRlJ;6@p4{8(K@d}3#4aKq~}qjI~VEEi}ct|t!#U7>*kKEnd-9uAcSUNpHtvy7~Q$iJ=|UkuMcg_@sc7R{)7Gy2r` z2KK4s@oFr2)BDu-Hc6kRF{t{~_jWI?fjY>>Y#GF-i?XS7qT2o)fpX~vyr0kO_?Z^P z83OVNenKD%P_K~{Ua($EfCewuu(d$*K_vE;e7V6JrpW(OyQ1pq|HQ=2RhKm@*zSe1ahpFs_!%|-)=)=FdAo?ZD_KbXG=Mn#|Y2_<1=5@DW51v z%ewo(z&nS}K=8Q-c;NNzLxok)#sXXUAhrp7KHR`Ncc}ZD{>|=ol`1^&zQGK1kigtQ z%np3e2S(O%&zv5^2hysGs^lzLQ3<%)JhU&&!=mDRNzGo>%&MS}fw3*%(9#OgA8s0z zBZOWFBxtDJw61z}nm?g9>4rA)Y9Izt zHj^*YVmT=+n4nekSrlE}f`$wDDF*)xp4k4GyX^WGdp_HuDN-nQ6pCrV=2L#p3g}Vr z5@uA!XsFf$HP?;M@Zjx3f~HyNFGNjRN8zQQ58`8rea7SMK3)wy(b`=GbsJd&@k)h;(G#87hsdAk%sx5( zL?^YpVU^ZET#%WCJ3l$P(HM6pBHe{Z9AK4Af;ChvRcm#;MTZ_fk(4czr6{HAF4Km> zXWH#}tUlmHt-MRUcHP){pBq6Qf|orGFMBXvZf*tjxR1sNXim9s`g4St#Qwfa|>3*}-9Jl}e%KFv-B8~T0+3hV-VHS^2tb5@_xA20n0A8ssz99w@(9|~ z+WL&DJ>8sCsOZ8#7A;HTW?xCpG-=Ii%XR>y3(aGpo3_%K((Mr}UOMfQQmeiUjKXuq zX!`91G=C?cqoNMqd-A;Kw*njVjzDLUd8Lii!p*I*Y1rT)uu}B{r7_I37GSkDJ+^;O z)~IW;V}XB>zV;yfOu!N-Nl+{oiYbV~O|_7w$`6z6S?0M6y1~c_=w?9}FHm=wpbR=@ zb!x4EP7nkgsPBEj1fUCyEQ2l)G>$v!JlXuUgRU~Ndack+fuzD?t(I!xw~Ak!Ws80h zeOnQIM;?7!H_mP|zipuP%x?$i%K{>6>xMc!2teMfwr;3Xg8)Pb!J-Hz-52p-Sf7e$ zYMwpVZj~=#qyY6n`p`z}z}>z$@UvCS{5)Y#61n@&?R}7JqL^u$y351Q zR>y6kR0FT!w@;j(soo>iIp(PLh7j$@=3gPL6w)+zKa#;JX3(*o(Ds3>3k5f6NTb+K zY~8$>S6WU)uqtDa!hK#wN@)B|gqh4grkIXR|rvMkzIT*A!wj|L7_|LZaPlAH{R{R`eppsAAw@0mk& zM-#V!b`t1|+jh6>tlby5%tG7|v_S_6)-0WNRzF_-*OghMnlH{!W0>{f*gLHc75b9? z>qCWpr33p=@wwB7ig$M(DxOJQ2ly!HL)&w`xpF`TwPZDX$DQ-D%dXp`_Piity|4B! zs|IR8{-)5FK>l3lFM;&9rQkIlESvKM8lo&1XfV#>Um>j)(sW4qz6^dSNM|+*R~w`0 z%!cOW0#yt`N2|uPu4_cx9{8ZUjITr6hax@=d=CW|ftBiiQmhwDYXO!L*zm69y;4J6 zV;l?oXFCPbM~&6~YoVZ6E)-L?3OCh4nkr{~Ug)ObZP-H28GY(AM%gz5=~5)H6??z z9*z@;d`#%&KyJI9zSBe??qs2NU3#=|&<8n{+0?W=X4RL^pV2YgQTiwFMfCpsfYr>+KIp zA&lsDceaPc9>RVH^H=;{jq|e6n zM~db;fv$8~(n}36_qM*OY$<0rm36Ps{6M<(-BP??pqfF!rlYXwC~VTf44YpHTH~+V zKtCdo56}|=_2BM#6`w1Xr)Bs;@B>=e;;#|F`xbN=6yi^-(?L?YG&FRA&;!AS;r(|T zel-vYRPz~Hj7BYP#h^?h1y2{4d9|>q7K&+#qj;t%mb-*P?PYA6)qNo;qcbBgw*sl;G^x0CdQmr0S%`k&2Y%UYVm&Bfn_mOUfl}%ko($Rtm*Rp_p2R;%EUm0iR;t%NX?t zw4i`q5QKcbCW>m&cXxR{u^(qX(hMkAsaB7vF%fX7N%?$H=rbczKHVlu(-c+2mZyf_ zrG*~yszu-3<>|nFAM=sYQLs|29#dmF;8K&)Q5E`*ktrQ+ zlcnQgRkYBfmrwL7q;S1Jv#jB$=lsl9X(JtC1R4vVRgJ8I)(BkCa6vfSLG59JDrnCn z@T&0_EZcL-_HHb97c|u!blX7gtS#LrK1|&6%_e0P)_DS*0t{bZ;u`3}$o5darScf# zjpzoSAyDn0vjq0C5CrbBs77q8vy(s>0ks>Mx^SwLr(nVLYp6cAt>Meu5975noH#(5|Z-4)3*o&_E|GUTkG$;RQV13v3e<=M= zJFO{%Wz?~U2(l%6oQji;)poPcZGqH(`#W3zCkwPTT3P>oEqGF(?*@I!d8P05E0yjO z$T8@CfhJIk%Mssh;)6g@e3*;Bv{dI-3ii_ja31yDv&>ymbU9#JhpG~a`JPhU_hxhp=H7l z$h!o(>>5ZJ`avZsidC||8DhO=X)J>dR1?Ftu%JRa3j0`EYM_0iZhJQrmf3xvx25}G z@C%CB1fi_-6gE|_>SOiS=TaOb7bAlkw_Qv{*x4|=Ma8=twVb8bpf+e-yLYK>)QRg5pO8aNbc7Sv3bx3Z7ImzU83@p zLG13FCAEzaT^q!p>jb&=rz$T#pdlD%No^parGgl=tRS~OPUSO#*z0!InzH_2;KThs zytd!GYx@mEeAc;}?z-xjQsl0cHuIO{;nhYj&Z06ze-C2NTtObgPP+fFmmo{0v!pf* z(bs|))F#NSZ&CT~AodnGOP#R}oq_m1fprGNLqQ)jQ;@q`U6X5lK^Ba&q_z^GO@kP; zxgfW`MCB`k*n@GF)P^IvHi$vj33BUCRbE_)&gyoS)K){ZR1kxf739{(seF16d)>}b zB9>|0{EJ0@N$s^p)t4emGh)kDo>;n%uP#w4?JrPJM+zMsNSFRj#itutOKUY7HiX#5 z9}GT2pj);VbV1w|1>oPi0OI8+aL1XK(V3Tvb1$PaFBf-ZUN~*oU*={1%*&;@m;Ey@ zm*!s5Z_8y~%9)pmxtDV0Wn%6nEfJZQeKRkUaxeR4UMA&U_FYJeM!A>8OXIKZVxVUk z9_5~rFw4)V+}lvwh{~WXjjVw1tsdOn>rfA#n@764`!_-6dw2IeL>}sb)>3ssi?*U` zM5E_r*JE!SBN$Y=R%0;yQNBsgT56lnQkl?li|F5GrON|T+NY!ek}Viy^Z&FPy+PTVDmyA! zF`%hk9gVCWxPLH8P&4udY$sy(dR<^4-14NFVYeKPoM zu=glVTS|+dKrTVA8d-Z?Xm`C9n4L?m66-;emXY=b(%p2cc!RMjAT;uJA-+YhRcWlY z$SM8UD5vyW?ZX8(%dy%lCAa@kUTm9$)L~(@gSw1N_sfxf%~%J4(6D6`;;c}ZoU)Jd zo&vQSG|tF$4TGYFVaK8YobJ zpsJCz(L$F8@=Bqb1NjS~-v-j{H&Jm1W0gTD>$(ASL*RmfO&UPEibVzeOG|u~#>`n_ zV3yzUou=}yj8{BiuPj?C)dY$cbh(kWD}?S3q(^q9ir+O>8H9!+15FBCP_Rjnt)?^j zaDkkImKzG0j=yV*wQi7tmNjX*OYxlrSr>}+U@-8g&R$UK&4si2nftOEqBYc5HPG^c ze5fp@@*oqJK|wsmjZ0^WcUBOCjvLm{uye#ZFGxYhnzZ7^e^`(;N32y$E5)~micN;F z4qi~}cw^N-V+46C4pI3C6PH0jT(sgz@%}21$NvW!EPg;O*^{hax0Sz`+X#qmIgt00htn>c(o5UXlW3L=mlM`5d zIQdxO#jK7pDAZ9j|48wU3t~`@k!kQ9ui_0s>Ji+uq88niXi;^v(D*>+(hsDeBuq<5 zz$7w@jWJ{1yfDov3uE5Uz`R#}l~_=8U#$GN-``@ZfC!b;79poLek{$;1g)j^2`xHT zp>l%2%igqU(s@Uq7on$jbwg39>IadAAaM2d#KDy^acPPg=0c)!o82VdTOg;P5OmR3 z?}+zN5Q7d`8O_v=5Bik$m-2RIkfzng3;H-o8qeu|>Hz)RvTlk%{z2e3Nuak`Er~ts z;bLzjP}pevEs!pqCZCUnnnAx6ELJ+DtALYy59kp_$6IN&^eU}Vhp+9LgLf=rvtZxZWo<}nSx>lW17PwhN!b*mS2z95hA zI})EMP$NO-m}Z&*gH>!|ttnQ`v{J1rFQ|2(Sbfxbs>EjoC!i2iF)eQwZ(0z84qco0 zs-6nPUs_q9(+}vMcK@sj`b5CZ#P)8eZ)*o^GF#5f+CY~WSpf}}vPSdGT@dc0&3tSj zA0~o0T!4H1&YLLQo5YuVv5=jjVyj8=11Ytg88ffXg%RZUPMp&~XAeo!A9& zycNdk^INJ&0jo+h1lB;MLbUbHcRMnyr^<7C^`ut6nvB0XnX znnz|!GehK7L7sEUIB3ZEJ7RpU&Y`!ccZg1kbWZ3pILj-NydKK5zfsf2c&_PbAoZU& z4J1CM!Oe&2#%#ABCi^~-zZCeU2z`-mmqzhqk-Y-%3uqo}M6o+POKhx|Rp4I=bjSp~ zBG4?kp$pRzZbE(=@gi34=3%KZ9Q|9XmaCMXL)JWrFxZI)x zrV4aC(9h#zVRpO7&u;}W50I}2JP**n9+bq8+vpaOi@kRE&kM3NJ)T%8P0k{2wDFXs z$;EoJ*`*C>BDQA)q+oNIZzaIhy}~mhjgJv>iw>A7@-%%O9}BY^DL+RD)PSQ7FeaxkFdo3I+6hB4KSAz(&X?i$ z1%vF-V%UKw@1vV=k;i0fp?rW~a9rbz34``7=?mZ0)ZOBhHL<X9aj?ht8iM!Zh4A4`)eW|0eR$6amMBda7+p}@ zP)GO1M!?z9xOo_G4i_xPUG`RsLwIcq9R76zRcVvBMHeM#z`Hr{W9WeoZ9{iayUTBLdB!{P2^L)9=yXudvB-mBo*fS|mOAR6y%g9-+@T{;Fu!dD^= zm=6gWqlH5fTf>;tbPIng#-?iZrZJBTMAG>*M6>BHG9t&~y3H!G*-@ayADbRiY%gru z3!8SgA%_PESYp6On0*K6Xd^42i30n~KLmp{+dzMqSY>yL#w}KR6+|%kRpH)46}mu+ z%G*MVYce?Q}m+tnG!K52VM0^ylWsE-4@%5P0a&GYc`~ zdU6oYrI7e^ZRjHkF(lQwIInXX@pa`2!iokL(WM=QaHvxmyGmLi_KN$tR+1Tlczn0% zKpBgM3yM#~Al6*bV{g17@D}8nG=th3HR0Udy+%UCsMEurFS#wvq$5NKDNKMsQ0 zR48t$4b(lx4&CvKS%Ity6p_7k+4!52eGQE%<?v&o@cE73$8ZIE!;7tM>glXOb%gNma zg6w#5oQmfNSP{YhZQ^zut!385#mu)Py3WL9(2atyC=5Y+bAkMVs5VNx*}F^m3#L&+ z`HO*c>0y%MeL%@ZBP2eWN5+Zbe_zmAI<+)mu?b5-PY?`N`NYy%BUgh7gGRU#)zK0! zd!62JUDwcVTBG{rj?-}!8Z-54?>M)Y9&Tb>rsuAXl>Qo$Y2icr&_IIFZdy3&VvW$< z!8qn1Hy8MrgC4j>5<_l0ybybpf0CCs1X|hV$l_IjK9*TJbx7-4-4s3(ETN%3uGLs> zhWA|r>L?JVYUEtr`Lw_G$jol_^@{bOKqjDZx`!x}r;^FyV!+Hyo>FmF1+HxlR1wHz ze&?$q-U)oK@QYvgT+Q7@YTp;cYbeNp!);nLUh9yqSFDB(D%(gp>J$)3R8Qo0@CQp{ zlqr`{{xp!K_=j|L0TTnfwTau&d_A&Vbq|H}HxpM8e-KEQo+N4iM%H=5^-9^A1Z0

ZvE+G4xrpJn{1AY*l{TPj^9NN4h)>+7ksATcQHDzJ-<*>;w`K*bw#9j{=l zJUu9ga~ARmb3T3shC?WPBEu+$oVkMhAJ5fUgK-ltSOTp$)rmBg^eh zli+lL@&`gktu7u3-XP{(CQlbqw?-B*Bid0mS(99>W+06oCw6&_qc_s95J(QX)ySGl zk5}=eAO+oLWIBwad`FOirW;uUJrKC=X5Ec-r%|AF5;ReugXEdr5T6FVtA0_%osHFY zrO?j;>C#vJ`Clfkf=Zj1xW&brseFzg?p=`G0*w(al!v(5gW~PG zDQe7zA&>_M{9FJ%VMG!`?zMR#hQ3x1ts!S*;=GbI~t*7Ox&9pQN5`)4pIUmS9 znBk~U+Ch+1yskpU-Q#*gfflNM^3&fOpH>>nsf5C601A^cSWY zh`EDYFQ{2EP89t!K@>yYnu)0- zdTq$vujB^LJU3*4q}R@)R%Y&18XU1N~T# z*Vd!*TLOiv|MsUVwbBqx0e_?>a%qA02=oqx7;@)K9G#T*7jc+?+<@N~C5A zG#x@~Djq7(#<8WO_NN;zC9Y~UdqA8v7*XK;gEgqbtcqcMhRQDmG3ZZG44$U;%NgiS zK|VZZt2{U~8MKrDF?b&v`Y96|igi;E>wozBo>YEdYGu%ijTXvgX$^tibTmBN=;FO; zHFMP8L?@a?t4k$V6`FcqL5z~_*j8{S8a%5Dchf0snu>l zvs^n{mtc(*XbCMYMV3-%+X^&kL0=PK4n91vK_5r9S6WdyzGCC7Q^mSSAV;8Rkye5+ z;++!2ppT49V`H3(eHdS?ZaASa<2XJ{;A_GJ(OL*Ve-_wxA3(ek`1)^uXX`&Y14}2D zHectom0H)LbXDMV1&#{#x3>QG3bGOYp^Bdg^l6+Ygo?irB6YzFLPsW``GWA$1k@_Z zedcQ~6%P=^nGDH`UEbX?u)nW~znHpR9XVWxEm`E6O4xr3L|!d~Vb;^P%I0qZB?N?> zI<*CSu-R8YJIfF@c#`?5fba(!%&wa)ulSvAemgKa!KCT3dl9VA>lJSgS_cRkpW(te zOfXQ#%$0c%nl9te#|0hjKK4_&sd9I~Pw%Xp6yY{068{>Ogbwnte;}#hDuGtoqTQ)w zB$1DBYvvTMGhsPgCh<%KNw28?Y^8-J_9*tyu_F022Yj_agW@Mb_XiU6ga8ekY%P!m z2!DAV#z^h_s0t3w+BRQ=Y7n>MbYp?Wt80q%014_Cfwk3D8yY@Owu{?PlcxQ-Du+*2S3z?Gj4iM1FQVoMv}l0l8rcrwEj)RhKMn#j6^iFf!^G&r?P!S) z7RW8=_eR!c3*jl7DBtK)`fW)kG#bDRNaWIG^HBss>4@1>|nu8g&{ zx$-_6po8I?;UEk8iOz_5mmV(O5hgB!PBgL|G*Mt(3V~TemtHPrA8rx7Cm3XR_*?8< zD$4&7G(O&ibFjSUnv}mT;FgP-9;(7IO-htc6$}nlgjZ5wTqJ0$1I~{Hc^#B*6r?&l zVM~iSOfcBqj%x`W17j<}pun`Q*;oPDN<>+CZDPz{jrcW*+qHUoR@tc&z}c{ zui43$txX5(oeM$Eqs-^|(^7V|3U@RqQNA-*@=l+tTK*wuSnpu)sr-Ds;}iPZ8n0OI zDDT#!NBICj!!kxlH#R9!zN=Z$!&*uaEGN(m0d+`E6A!<)2QpXusVP=L@q39{z$8mE z1VlY~x_LL;Rgr%`$}d}l?r)@@=bZAhf;i0~ahI!nuCAg%odSO&5c*s}!zv1c0E-cg7n9#pkoh|; zs%1+r!}dc#b{2k4T2q&#Pwa*wQ*Bt0KoS^1Fl=raN5x_+-f5 z1Efp}2Ztxz;dR@-b9$oG>tI&^Iui z6yzMn@C2*S4kZN6GJh0Wx{q;7q*nCA+#Hh_>beyQs+LAGR|Nl2Wu zk~E!V`edd1A!wZ;XguA(`L1BW`yuW%Puz*p456jU-9h915V%c>M`NWdUaVr1 z7LPNA3FHHGOt>vnJX?Q4jBo1xN#^)c6?=?TdsgVPK=#vZ6z;!h@Z2M`q@DU}pq&JC zFZkTR_7*H9?>h^4aSM!CSt(u(+lA@{3J(y!7rc~8JQUvESZN-Lhy(Q2`8b)+OY^P?+`-eg&+AXY(lY}k^T|^@bTuL0>U+H@Ogm^q8ixXn*$p}m9W8ES=FhSN6u#1czERT0OtB4wowXYRb-i)!=|Z*76z7Wn z>s+}r0$E6gb8*OeF~Bg11Hjb|S5x@vOAU`@gtialjzS%QtOJSrGK+&oNylr5E2#mo8t^_tHI@4SXe~Yln#lcgNXH25^6w~eEO|x3cps~95lI`j` z$dtY+(0LHVf~7?cG&XQSw+ToNc$%@xpu3H%fSwSb0sf*k9k~OsL&+V8EnQsDAp(@8 zYk!yOe|R`w2K`iEBmQv_!SR>6XNhKWi3t!@uXFGY%@FI!ow+hZ$~Jj6^Xch2hts{F;VKNIno7a*3lCZ_doHUhU!03Qw5*);!cee;2?8v*~Ja1&ubc2I9M> z?F}V}BLd$m$xa%FL}waG?n@yYjI*Q6sKT3D7)rzK(eNNWn&@DZX|}m$HtlK6F($1R z(zHv^zVN8CLfr%{j~=@{xc3^rC)Ile@{MX}TUx`BUL#;&gYP!YGMa~)(==pg?>5F- zSh)Qq*~+A~BHWtCfOJ&>wSc!U%`%$T1kyEcRq-7Gy#?Ocjw-eNgld5V9V*BN%p7U% zW8zAoSvfFjDl_h$7xcbniXDYwT9m19n+4psZGTC&GHJE2O+A8iRe?28n6DGk8LQAt z&m#ENnNEQ&pzpB{YIp??iTOt}D}y%CsYX-itgiW5Ge5C)Gj+z3i%@k}Kank8Zyi5A z&7HRv%6xydfA~3krW{U}_KoJxpu;;)kb9ua6B|8Z3ZGXuzi`T0O`AQOAl~VM#`@r# zCCL3!K2{BE)P%#cfM&n&z9YyzP(EiNy6}D?X!H!{ZsX?dfb)=`xjuM&F?FL4ICB@G z4UZ0M)Na#F(4z&7TsWr-nrnO+o_5ei?N!8CQ;@ft@>YUo5Ae86+33MX$5k2~tEksx zWh1a9-lARcSBL$M-V?Kz_5s&-C#;*(+SNky<_}y22y!#A!_i*T;mNK z&tH3)%=hfYXCmP)si&@4*^|e#Bm-L2TWB?%4edcedmzwMPFFy? zkKu7DYODA8r@B6x7uFQk zz28VSN5FmfvuHFoQq`C~paDkAC3^n?BB6$AmH6 zMdG+8kRW`^FX$zK(lUJ<#9stD&`clKdYVo>lo)U(CI$wAoaG@f`f0pZ3r<7n+Lk z0qriJa~~|j>|MSb>on}{L>Bqc7kkT7h`n0mqH;Hod+uzlIit}6I(guOI1)!JLtej1WB{Ax*=3F_Ozw&rVb*5g$8 zmQ~nRD5jIsoszs^(n=vsO+@;HfF^=pGtF|LnVQIkNUzft->#s2@q_m51G-pSMs)jH z1>aNup#1SnUoCbsk!~dtqup(6r?xyVo0ZL`1Ditx>gvOUNQ=nAyu<6v#sb$;cM0VD zO`&DXQ{_@2Ix5!wSMyXU%u}vzmd$U?y!{VCA^3K0zYbBv^j~J)P9SdwvS>#-T4lAP zxacZTj7ch*wy?|;il3wEn8L#2!je^Zv`(3CjcEfdVVzPg+LijJ@R(S%jWa@axMe3I zRjfEq2xA3}8Z#K0o#>KC`-nMI4{XN^@|EgGDqkb8)o?vI;&HU*255JI@gepUG_Cir zh+|3JdCsh_hn_B0*yXXn=7nw)+$5zWylt?=~-&lEcf#WY?BV}}LYcqRQM+0LYu!Zu|S=_&%U3Esvu%Y|mj=7ExgVB104 zSqsPSOQfVpgLPl8@@&Z`1V^B#I?6LF)lp>QdV!8Kpy*-LB0T(3Ua$f`Y>ulSzMM^? z3N&1xIXSIsO%YTmzSk%6-&A+5oCTwbwD6z4Yc@dh3~&-nz8xPczXhbwl9N@9^RZ_B{Rb4(>pjW#EH;X?#Tw@rv;)Abp1% zRe|~gm_meS^fk~{&WE^9ApK8-R<#jV1AReYrVv{NKB#Vd)e12o@IhA?UsXXo75Jb( z8d(M%wXEfgp96Wu$QtMsBg>#i!&7+BCo53Bs(~1|q8WntYAoa5A>ymUV*%nW8o z+eJRa4%-_aG|I>t=ubOD6^K^^YAvYO$TDcIkrmK~0!8yg9pe5Sqv@|ith-YzKx`{e z2)hc6GO|_{T2X7DH3i~ofvQ?z7j?40_z-K3G*i$RBWn|P)jJUaQ-NsR%~U`~8(9OL z8MvVP1g5>(mvzfrpjfUK8os-cM+p5skf3*rtbyhQZYloVC;X5=y$*^C@1^;|dudv0 z-;Ek-)X>GW4GLs;M2o+4Q0}j#>L=TZd)tL zXRn}hpg>nEpg7~E)Vo&HXUqhuIbX?zXlpA(75mF-g;d<p{(+iUYl1!>^s>EL>umB+F4U<4TBEXjr+mQGZ zZ9h6qePl`ypIV1iKs+rqB?xvU8G}w!M+SWn>`LN;=vCuGgzcaW^o;t}_z*7&w53j} z^MiR5{w&ZS{!oYkAYUL>TG>pkXG`v+`p?8=*_C8s9fF@0G1m|+D@O^$IT|!3fnWsL z^BstdG;mA;v8|1w%90vEOWP=F2OVx?kYSt?jgiLG(HxN*6%M)mB7~qrY5c35(6M`7{QUS#^ zeo}qkxW=1PU*)C58vjFq@gaUBNCSZab3}?P`f>T4RL_>*Np+TA)?HEpW=S)5HgojP zCy#!~uWqwvFI%Z8>UrHV1=`m*Bw)V6(AV2su^@*7`s#I5DZ!Ie=Kx=7{*iTAFmRI zllbdu{Cw5MPYo2u&y+gED1lU1(H;mSM~*mf zF%ieglzK5%YMe~|zG-X-rwWb})+%2PWz1ONfM9%xFhFXcVd2oAr7#{EOv#T8GWJ7* z@i{hh3B(7nuo~Z2Sn;!gHlSQU14!dZ2VSW(`R3|0-HN~f)$F* zp?1A^ajET{g^-e!|NObj1i7X=Gc6P&fy7aN_N+am$1P zuPD$A1npvE+x|k|2;5`RD6LLi(+|5H9Cr5*$gCJp)rZo6s&Za^NkARoc>*mTpw;Za z+P1mS&PG;?Zm)7y>=sCu&K+v~R^=qe`3!GhE_mUlfpglo;HDJaRk@(sFFVBah;Q3QLb`0STqlRT}f8zOFo)9Ne^ai^PBw*`PK>Q+FV%ZlH40U}&u zbb#(u5={vrTxC?UtBh&3&+#?4ro{5lq1kVR(IVn*Gp!C0x0u2!PFpFCUlqp zaRM?v#Er(UfY^z&753|fpd(GmuUV|XrWBWtX?6A;t{_a3T|-Q(a}B}8133pXAx(>} zizlCHbtYV#Y18V(OsixwO_@tGt(wiWY4vP!O{+7bI9gjB%%(9TV}aQe5608#elRvQ zCebwl>)z`{#A!4wO``=y$-Dh+0MO@KYKmzr(Bt7%f~p^L#HH)Q1#J~{n1D=xPZ3B1 zbhVLfw+V%-+$vYOpDkkwAf}>1eX4F(p*Gd3{e+lx;?JlvN`*7=K$4djvjv31dKBd`?>|KC3MNh69_6l-OT>7f8kh zGhSSF5oWwdc9C{%AtKpH!Ub#<#KkK40keNdgVDt9A(G94qqImii*Qj{^({eMj@1k> zk$x44Hx_%Ab+H*}TqBAEagB(EUn`2ukmI@#HkeT-wvRZGKHkt^xUp`F?N@Rl{W=Z} zzj_lpUyHb6V>F7*SgZ*|f*6e$UN8LX-2)8{*JjmH{L^Y~w~g#-Fh8ic0BXxu}?%?dv5tiZ@)z^O2!o-ITZ>x{g3`($E0JJigu zLk%O4I>8+pcjk-%$Z)d)#C-yV54u`I&nme=1h+}701+3siFJs0vYAoOR=bIH&Ni%a zW>efVsc_GP;c68!VB<14F+T~&`_b{6+X+AJQ$02! zINc)fQ?4v~Yy*2Sbaqc2V#7@s5f#wy1f~QrOvhXCLEDCtZciPeGw?yzIUj=Ku=GJc z)vz%?5DXjfL2)ef*jQlQ5+B6z)AS+2qE!KLf6Mp~uWoDlpm+zWC+pG8tw*`-V+Ii1 z{80sTFK{z?^zbNwU~cOC^sjD+zgl7Z^g2YCvHE3a zh!?{2onD6s7blWH#QvF{^-s8-YH%bk!dOQUQft zYs-3Vy7k(Zt#`_x6OC*G#SWZahxnQC%b+;|%OgbS*mBmf)9ZBXBi6BPp!Wr)4-q=N z9mE1)t@5qQlE<+&4u$D96b`qc&<46lV4fft8+M-p;+H`(y$-<{*bcG~arjKHLu@Ee zETUrG>+WNTeEq^D;?IxJGGG?qe$X;#o!f?#7c2^UOpHJNVbJr)tm zG{l5Z_^cZuPLSz!i1lrPltBjztceiJ7z+%7WyflP;3ld$hKQ4Ddc73?{Oss2;B94J zSL2U$NX;$+ZO`;{7?uxw1%~TWg$gD;l3po^vdaCouLcz;Y}AL2izdJNYES>Jnoky zMG9{Snib)3=tzp3I(RJ8tjJ~5nJX>Ghj;7BnF9)U37Q?i<91A{>8rzaWu?`xSrOh9 z0{_5u=y5pLEJPa~3#wiT4ym?pp;&os%{;*X`z_HSkgTBj&&qJChckGJ#}7r#@%T-` zq{#XFSwXWRJkCr>k;1ajyLn+anft7&KLS-ZNHU~s`L9; z&5C|YD=BiR!|l{&MRpKY|7Jcsj+e;+g)uPipi%ThotwJ&pN< z!?llp+sinOPEIY2TCEyxjL#UzOB!&THHL*RIy1`fT$eO*ZxrWe z3vgFcx39TC*WVz{v<0{usGm0%H2VF%I*(3mq%sGx7{2O8wSa zEYdaxXe@fLetFQ?6fU$lfoLSp3n!WRhB%0DW1*Q3FYdz)`s~BBuvwoba)HpyhsQNs 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 z

JCG0fx`<=@pe%9GJx$i|wF{fHTk5Incp+668n&TW^tnEH8q-C1s)&0u;24~ssG z4!Pn*k9;Ad=hIERM{ZCt@xB>BMfXSH0rkdUv7l@6&%+2%zSESyQpe0;2yg2%1X6iM z%n*L-havo(=5LXpd#YT4jVbP6l+foe4hxi~5h4^Gpw&w;pGK+JN*O@za`)AMVY2y%)f4wjP zMSEX-vBV{929;)u{sccc42xW+frvC;ux7!By=vGl`h!yC&@AYBz@`e~ELX56M5-|Y z3yAJiy3iL2Yp zjlI(*wc~W3VzT)`_W^4#l=9wLMAW`PT*JAEYtR?p6xr8KG9U}4W+-N;yk6wijo9Hd zRg1&+sKXQ^x*dT!6Jnw}F~$0b2@I4tIl!TnE<)~>n$hXlQ(R|V)E9>l$!PDWXZ-yslxcwiw=6KA+-73^_pl- zbT#gm*LTrVGZQ7sxC%4B7bFbU4e~O)5=jyq_dl8$7^I>@3+Im!@8%weJ zMZ*uT`n>8+;73XVun_Q~HqfQf-C2!Z}KIMKx3ZH=rBbj+Sp#3_j=6LOp%MD zPPjWFRR`7;bmCYLs2GO8fnG&vL8|)i=V+61B&y#@rN~pSo#m3IWA=Eg)ypMGN0?|H zIqJ9D3L2nD(Mg9OOb9{+v}fPk$+)4ovb%|o0_L+fGqnQhr1S%&)5fu|(xl^JOgTQ} zq82407vzs>p`TWIx8zLe^c!Z%r&mj7+DdqCKBP)em92o{%5u6G2u+urTBXx%(QM_A zn}X5_83AW=95TOAbLKQJrE@;zxE#uIb9O9aAN+%C;*xMqc4A1dqDsJ8oV_rk2Z)my;Tg{52|5JDREQ66O-9PY7WG4sy7hgbeOlo;rln9R=|?=%;5axA|{u!T*!f) zW&+I?Pcx^SHUkFR6mpJ;7oR3`BVv81dX`5XOb~dQQ5O;o%JKs_(6Ay90-B=@#Mytw z0+sXaKT-7S=dZu~{2ABr9&V!%S+8IpI@~_pCaal>8c2rkZvN+L82$e97cv;d_tAVi zS;qh6Rn1s(7{3qz3Ey;`FW9v0eF1GD{CY-()#YLOlQEs(xkOy192mNJwY#5eRbuAS zgARJXs&)_u>$T&cmjMZ&AwoBu87{bi0N}V*%YmS>A*2A{!#TLA%p#{?=^7da%s}8@ z27(m_Fmfjqx~hou&YOr2lNN)s;r$-Eq(D{LK3&zR&YpQq0K9s?=56uZZ_w*tIr$#z zJGcX|9g*;(Uqj{>Z}W&7Rb&`p*j?-rsInn}zBu%C4S9Hwy=@+LZ*!-c-%dE7OKw3)fv^Dd z4iVmcA(Z$9Bz*9S2zfMJObDJS8i&+0m$v2@cds0Fu(Lp%`7{NbJ;>6myW9#XwvZl~ zn@Y|Ivs|Ui!6~wiV>oghY5L)WL^VN?|B}GEIn{~AJKx58$u{V8O+mARvmGv`n>?(O zS#&oY3A}|87g^!}?C~1Jak_#A?I)tCTp}q!BkICvjBAL+hPMs!?ZgMI>t^gvK?(ovJC96T&Pz^K2=VN+q>rTG&;bg8fPtwG9(qJmoG zQgnG?qYsgj-h#)Mq~pTfH11cd6V587LH2v)C$(26M{uaSFwEt^?23cmQ@a6sxNxa} z+*%$O4BivnCq58wM^_)OQms(x(<}pc7!EI{`}I~53AbUc9^I=P+`Py|w@rtgK!)D^+%PDDAh=D-mH}=wk1nHV4Kw2l7N(`($ zM95qvlI8nc$r2LD#b%Pw5ON2GB$_S9gl$f4U;Kx^APN{_p16O?%MJ$dUx&#e+D=w? zxUn?L9-aZyVv|_WWf!m=jd4?02OCCT_18&Dt#%#pT;6b{?5y@ayim7>=gE?e+R;AB zSI@vN)s5R<(~6DQ;#y_Yx2hMbdNBFw>$@emMMKr2EN=WFw{e=)1#EQ6K*dLgMity^ zP?<;#UExnw1gFlLF)y&3>`7a#-~qeem4Ra1-! zhKQHwl|$x0lKkbeRv#s^Y8K3kxQ&VRN85NFZ{rp2$`rgjWu-$ayGLt$R*gJd-$ZGa zWP7W+AX}>t0a8UuClkUza394o0a8}x2pj~R+A={Il~l8(Jpv;;rM@wkAzTH~esTw^ zU7_*eQ|&=v4yC6My!M+BvGR1y3*hwHp5;g zI6<*0yBPEtjH8|&(H}gVu=MTfQ!4zUSeIx!o&YH>txq_42{PQfcs03Q#8EOI{d2ed z9cInJ+sJ7j?m+D5!v=wF(84dZRZ<)DlyqWmr+fwo;ZYcMXJgN!Vh+SBQG8Y6X@_u( zO;Q1cWA2Yoks!S_Dmie@j%j;+-)RvewOKN(xT*Cg@QO3hWHL8KK;de7g z8??{PvjqhY#9xAMmO$m3hsxj!T}g6=(iIVFdCjG`uDlhIkWu{=ZB;;GVT1) zdv-}ik0%Y(3X5urUNyL9cQ{t3Q_j`f1<-4B+6T7P?!H@;tJ8g*aJ-(?t~{J;=D-Lv zsN@m0UOOzuwIg(0glGMBT@%N0BZ(@6N0*?7{I@nSaf)~3%cV`pDRb*eU0SC8;`CT1 zm2lA5%BHQhxon>tcQ$u#Q2R~i?nq34Q^hTgmuS}?VDni0z}-$!OG%+`zc7NO+14N| z)GkyZ?B<+maIoRbQYOW$51WF)l_3X-{Jo@f4H{Wfv#h)a}Zhtb!_z`qlivbTszz$yBDvZnjMxOlgZH>sk#ctvRs zlJyF;mpEFgDkrNc&S=G}JxX_vF+SVePj;$t(F$@C<@LwK%k3?Va5>q2f4P}#_b)GB zAY~O!yihcMv|h|q>6;f^g#s-0@eee&U9b1iZaP_sE~$}ddY>$2I4<@A_IWqDyXi}O zy4!EI>&?r-nVu*5<6qh7*|BY7K2-pR*>Xc*qw&tSvG|2hkI6>8&=XM)e)syz115Dh zRS(N-%c@Ad);+6-_3bxxyg@ypBg|wUPceQPQL;+*VjNR$Sy!EGZzp##Ah%f9`uHCC z4p)0rFQVJYcALao)oe}?#<<(SAri%t>3xJJbhi`Z z!@N0d=gY%tk$jIAPwE}++KXu<628BgnZYVDEjjbkCGN=f}%rx1GFv=St(h7Vd$o$ZxhWyMdC{k$3{0Eedq^|Nc^&``c9WJXbe0jomy(QN&=%Bg0GUB&5SlYo=~4^u6=7p^k4 ziHET3`P>o>10)BtxxfY`!b2GCDghPzuWr{f0Uyvj zZ=ndW+{eH=_rN&m9tp=pN6G3g;`p^_BTA#$L9~E0vhow6Fms8;1b_(=7OZBj8`^N{ zi7DKUIz?Zq2wg=vkbE_?Sj_YF!h`83`~4WEp({9vVaDz?K3+ zEaLrorLtuzCZW-VzTA=AfxWmQe)j!dvD+o&4^RLhSG;|JR2&dXX7OAPR3WIsOnj#p z{u0AXH6jc6x4wNP(sh+Yq#x+sR{9x5%ZM2xf1&7+dx7;PUX6}62UQ5!G77UbzMJamcKl6-jA(JChNv+cQ0FhDySk*(H$tu=GQKI+0SE?#L zED3O~Zrs*b@)fo71QEOQ|I(}@tK4--9kQE1jvPcEWLx_=E8s?7MS zgmznzP#Sw)FS2NoE35IiZKZ3 z)WC7?sL@13jY;>?y({d~BCx?NJy%ugh6!nAqDM^()?yVsU_P5Q=CEI@ z`srsitj%PvIW#Q`IG%1!y(J|@eXX8XNDr@`sRu4|MT#0GD-b5gS*(Q;GU_i$R+0cw z&Bziy?H)jls}lU0q?YrsjB`ex|vriR%ya(x@_g zp!kP+#E|8P)T7^{;Xxq532jriL-bzFdm&~#6~BpS;MsN{f9rSNbnxDL#`t7&>e02v zJk0w*;3BOeeZZCMdZV`S9s$sU{8&57t(w0qKm2AeT>H>pAKGwnd5j&Xr!RN)d(cluv^ zgl;E?#h$E9S`Foj-{U8Z6#U4Vp)Am!iH1;5DUhPfqNyPZ_ZgA;wO1XMgQ+!5anD#Z z!WSB&s3}VI$SqkSbtBcCEbz#ZuB*tBegMcLqq6V_gx<{0G*N&@j0RLH-s|11KhY$Z zpJ1Hx#(tm7)fkD;>0UJj^g6b>w`zsa7c(Q8sJ~*GXudHtk!q{K$&wtw-c{rd$Q%JX zh~`43NKDh8#ys9nB_i3~#b0_hG9?ypxzpj*qfxf`Nx{(pR~bF+boSc=fIOcpU=W&+ zjY0iX5(~Z5!pkZF(=Y}rF8@JlHUARdQJHFiU(;8rDZ}^NSc&S!Bn*SzsNYCUs~!b* z@Nn_k8ez3^NOp>Sd}sBV^$NQ3UYax5$^kNvTdsz2dq@`hWW`_UjW}6732}`%127Y| z$Y`zQ17(Oo6hR#?>(c~su7-5Yyj~<)}jGjD#LIu9%lS({OD7T={-L!5^ zQrw=gv#JLMD*XhFg%wa~>6$=Lu^@Q#=-Vw#2O5dY^r)iSfZ{U+6)J%84=LAdU@Dm> z+noj*Ju0Kxw>7|zNB1F@Xo^hrK%?bX2WM)gx5CCtk9vm~f=xxh0J0m277wc(fln6s z+mt@D60LrK6>+^(wAf(EZnvKL^%RKRTvXrg+1tR>@CMUyG9gM_-3$upVY?buf~A%$ zrQipci>F2=#YO6Th56NwX}oc28x`55&=1bUN(D$%X~b{w^I^W;F3qgu zZ?2I}$b7%d)B3V?ZS>|Ewq@mljl%+~xSZfJgMc4!`n<(c2i^Z0>wJW*By3H2Kw zcP4dR6NV*9hTY^CS0!=N{zxO0O^e3XPp?VQJ{ElI2%J>7SK1D1_XlQ z{Vl0*ph-$a!!HO$vk3M|E}O--hdW)EQ*EA*eS>Q*U~F5h?f1%Kbe8+F=&Ni8YN&Q} z>Jj`z4|Yn#2*bSQw)XEM9+OUl!CZz)E1BisK2$Wl~ zL}}g#yY>Z`?CoUwo%}iMgwUAs?nU(Uw0na4|A!$yPfy6VyV@<7Up_q@R`Cz=494(S zym@s&^;H2ZiBtk-|I^cYOFz-a(-YAxa?XHu5F@*d?~;`sG^$b&I~r8c**QiJwnIbH zmC(Z?+3nBN)TsV)vb)19>8JYzU-)_jC{XDm;svlF=qHZ$5mBTT&Q%NSe2K^y0zzva zRBb>EL;ysR>R-4Xm4%nuo71A{r8}$=cxUtjF6QC~s>E~D+bBjr1NpY@;~%r+EOEVt)Rb_KVmN3n zT*Z}$N<;;$>7wkJihl z-h%aONkBg%dP7$CO!K-5=#%+HtcWh*aB`7)R05NEWke$^zOhxMU&%fVYUrjh0k}P- zn8qKI0}s5JX%ol}ye8No@IaBMKtzGd5a0t$u#d*UoBC39PEweysfxUhRncs+pJ>Cs zjLG3*tu-Iw7qYCi!Dp^z(YA2bUr!k|6*`Ua&7u1loq0oaBVu_4#0o4ah z1g(_IK&4nZ*Y53PmrQx_40Ctx9<>Y*5{!M98csc?SH}v`q%Rs7ntXMvTet$xSf%SK z0a`y0g6W@HWY$l#L-bD)p7l?bo#{6LKn>hNQ~Q^Q@Vkk-X{y&+pQI^fUdg3`NJFt} zI7grPZgaSW#+NPE75!F{2gn(Pb=5c-X}?2Sk2RI!g4xq_4R=4|zthn)g1g{13U_oC zMfFBwZUu zA`V!A^e0}Ub(%*^b*OskX|ZO@7PW|w5f~I82T-+XOtO#e2@6TTwsf%wexiM?`q9q? z8y!@QC1PxJWn~7T3bW(^_5<~useoc#0qx2PThkh9D4s#!L*x$CQcH+7>3Mn3E2syl zioGf>zR7%}#z#%+66(X~XT08M8vaNnVnYy8qvvP25HT(AATgEA8?~) z`I)6`@l0{4khK;N8AYirnIeK#i6Qh0Vz?Ho!T9$tA=Q$Uw`5L0dK4`*rc5>fMDM~M zJH1!pF5*p00ZFHD(kUy9DTHLY`VP^Xn}v90x+RT|M2;Oce9ZVkG+#A<@L19SRG{n` zWJipS8b)xh`GA=-4VvPG2n|`qW^;s5158_JmDMoB#mt_x76L(E&sy{}fQUm)BI*Z$ z#tR6xFx)tyUX4^V0&Re*Lpn|FRuqA(8z0Cv0UxUL039Gz4Z<=^DRNYRIuH655Ql`x z-%S<=@_o^760LO?3MM&StD4>n)Z$yXqY+htCMlkpqH;~-rlvhhES7VPb79OFnkw|- zskj=Dagp4r_D#VZLSxRL@uUpYD`Q9SkWZJO$d{LqfJ!~YFeFYs2;Lv+tsdUe4gCG zLRa0at5?w=!gLl0)?WmIB2&Ghc})Ng`}x~|QKxI`#z|xLfB*`JH`-2f5+ z7vnbs3-eR|at*+2up-@>I+;w@tY`CY=t`zsR1q~q1!}}}Lcc|O<|k_FpYA;x(`D+d zT?HPE!$Ai<`@#SZpD+g`Fe{rmq!(k%;Wx_9#y^GV%g;|Zu!8}ZHlAjaC-L~`KOS~u z+qRXJ<|7|r=CO}{-KB|=|?^w|LLC zX)$^zshE%`Fdjtyz^O_6=+{g)#m`hvwB~R?6t33VJq=jaCKHrN*YB z%XQuSQm-rc;#0MpdtNu@+0=9yoeT2X0kW!2y;55XMo5Zwvz~vL%NQrEaTEotv)TgP zkuu$Rjk=f9i;y2x zFvZQ39`ICg(K`5VMRzQg=lH7ifl69QuCfESf`fw)-`OjbS(7VBAbO&HdfwhkF%XFH zWT_+v1mX)csn9saMa4MgzZPxM%I_xn;51pB$>iapaR3z71<1>z4eYiEM{ZMPnSyK; zH&^cY{xF}zPv?%aic$$L)2X$2xcwtu>3My@rJ^^moJ607{{tqk!U93h^e-)%kO|z{ z&XuoTSI{8|3bH9}#En1qwI0Em$Q^vu#s{SUnkw}cFs+#6_mfs!QS|)e#6lKgQ|IhcqrW93OP!>6vqTJ1*$t$oF|aFHv+@7QI`oBs6I{!y0gy^ z97tDz;}Gzg;iMnMa=E2Nbs~)^b*A{e=#_dhp;+4gJ$S7}3LK+k#Y3|=jX(q;u!mI! ziFFy7QO}73OzvI{UY=dP)gp|=KmL+!%9vIZ&7KhJxd8Xa5yzh>pMfi)u5{6Uv5oJj z3f|8VCc-Qfw^VEn_C%Am@d>QU?_1%k$eQ zJ1}+cDooLyslX8!^fr2Yec`H5*oLW+`qs|c|3bSEGap4apT}eYCg1Rj%`QI7*8hj6 z{(m?S0^5Qnibj=pQ9r1ek)MDIfHW+_^8?leo-_klfJ;|Fbh`>rRCC6{reAm^l+*z< z6^HQ<)R?fbng#;hjePhTT-=2Jq#R7<{ewYRQ?Of^68FozdvHbKC*c=+4EcCILQ^Qd z@Z}jFLuO~mECG&e<3|Jl^G~3X+CezpL3Cu3yu5hz=A4FUUcgBS$hzl8D!4~PhAhl0 zinS#4a$&bZs4HqYn!T?lHmkJ)I z+x>b8-zx~_<8;RlJliE~59>#Gr|<$phQo!7`8aNm#eX@tL?jMK$1Qz;&+@BWf<8eJ zaNoQEa$(y)DF0;i;p}I6UZo2NRj_}-wxZ~-1MqXHs!|z=BXE}R&-Y`!snio9@x~mX zW~y;`_KNZaMA0v79#HL2`^u}l0kPrWB#!IQu3czPs85y52;m0Y)7I7lPR?%4PkLj1 zZ`O~O?s@a-5@32W0GJ}}zcdxGC(TbpmCw!Z+cVq4%=JKf*j87bOY;HUGr#z^dHQ($ z^Os>X{QX0O3_MZv+xu(tpmshCfAcK`?Ghc-X;D};0DxXHZG8Fq^78!h#mg;+iWq{c zhz~XrAdiOsbu$*(liqyblO|hSjrZ1^86ACmNX9#4fWz&?k8o|h#7E+a^6~z1e}L6+ z^c!k?ExsohiHFoZ2-yv zVX;tWe*w*sNuNj8FbvZETtUbJd@nYWWIOuQ@+S6dmU5abU3)&*B=HoC1c7<1^|Rq< z?+}?F0$7eB#_8OYZ6As*>-w$mvMzvX{FPyKMLU{tpSV2&9f+2zX8;PS)9}_umy0OU z7{_A!sQfMnWTq4dGPwLgxI)M~2C+ZvI13wY(*CXF=7zn(M3MF=+E4DV)YqSI6&c;? zFo=i_U}s)EVDL;~nEEJc_2K60wb+`!k9SDzfAwj~S7AA1jiMqHC={sX?6GB66NOpx8l`61i1|;i ze9|RZrRXP1mG~NPr0qqn+xnCVWQnQLE4eqv@&1q1J&Zt$cs4X!^CM0<#@nBu9D79L z{~qG)lhS#4M?*~8QvjMK%c%{)4BpKXq~nt1Q8G>`LS0RPOXrCeCE#u%P{v%syINv1 zf?QsJG0?_54Wm8%Hgtx5uCLP@oSo*9 zf>(3lha4_!r8kU;Y->&;qJ3H2rseD~(Lj@hB@yv>oJB=Dj+oad6C@w+SyJ9m0v!lO zpVu{VC*#6Sd<6y4i9j)@porA7BDZiRi@8~o(eA@9@5i4JzWNJ1V#6Ol!Jk?>Rc{nY z`%#q9(tb&aq^Ff+q=Eb*uO`t>uB?r?{O!o{X4a=o5VsjbW^q?gzX52$v@h!32?L zX2%i)^k6C)@wj;=OghQUxswGbNie_}o(tweyQnK$eC~63vxQ`b|YRSr~w+!fu zn03S_PZ0+(q8r4O{q34YE;ZeMVi>=TFTs(a)enb4O@Q`{ZdM0k%7avL`KD>n+5AwP z1YY7hlRn&*T8Q%xut+EX7BNg0TFOZ4>}G?va6qjO@CLw?uKl2-(9GyKHLQC$#fmc> zJ8a|~n>0B0(HgF~Jv=y&jF#jfAS4GOoV^pa3Y?h+&4d=djgi=iGBMs3*e%AdqU$j? zfu$-k2{vOiF84e`TC8G*-DU;XHzc@{1uReAE4-z?Sl)X}7F(A0KH`c2Vd^NFb2CvU z_>z?L<%RFa1`2r>HnH3(<9dd=BJR(a@~=GQe`JO7POW)vrEzHj$>=~OmIMWD%G&M- zZ<(3r3yq#6_0W+d<l$xVX-)e8Qx^*T9Z0U|Edm1spTW$nsDYq1u>EqQ;d1f~ z);03?Kfwfsgf=R{uxpY$(~vNbHVNJ1T-QGOK_?w4{K`jU+wJisoU=1rZ-}%>bdPX! z56>R#hRI(CxMKoM-E1hbk`7?_#t}1+zzMudTD$@&GA3CaEGOTmO-#VAtnu~tarEXR z&J14dx1*2N8*>g$HWWl&+#>wPf;=_?+K}>=2%H*axY*}!1IGWaOiZ;O9-I#;EkJ`u z;Bkum6&P^aQ}Ou$3La}Hb@bT(PG<3Y@SB_U7x*3%Qgwc!Fb-0S&ucYTEMgjxV6L9V zfnE5dwj=PRjF(S{qfT>U9GSp$US$K3+`B{9(u*ix8N|f8lfmpBPjdHowf6o1@|!Zt zE25Eb6en}~5~Ay{K6ecQ?3D`|ImFvAB)zLkccNrI`sZ%@`?#Uc(HRF#NRC!9u*SQ|nA~!N`nSm){M0)R zKWHJOc`zz8!UPkP)4@m?)h?s)2GTxs1?}#?lK%d3a%i?uO7LMeMRdZvf31B75Jo5j zWDgU@BtV_?Z3D_c+rS6_Ypn9%zjmS&f_x$bXd(*ihaO}I_2bwIJu&STRgT}U%Bg!3 zY(S)NlUyPgYC>#*z!hXTSj&*C(9niS4+w!skfm>*ziknTuJ2B4a$95-;RB0?Ac#*^h}N&*~NTMXfwl67bbF={}1 z?0GaoO!`+O&d@P3Au(RWa}d~}5lA1)6dX?lqI`3aD3IIXY9a&+l-ptPc?aFMJurKiCKUGaI7k2N?gdYlH<^ zacpr5)M3jWh(S45Jdv+EEK?Pa+}&q7vJ5ZuC~Zcd#_FBf-gdBQ088BV`9C+#w@OGwCRd#i0)&`1r0* z7vy@olK~?9!JH4Qc<`>R9D=5%mF6R(kPMFnuUYJhjZ)%dv~dh5ss8;WWjHG?8K%1aoe*|AVbx zX%^&Jz;dLPmOgf#Y^kuHKV45iF0@v6ArV@1#pG+oJ$QpuXYq20bFdJf-rvMzdpH2b zd8_!Sh_&kFN40|U>l7ncM@C_oE^rWV`txiCKmU#*39}`t=KkM&Bt5@jlc@sDDo-3P zA=K`B-4PDE(s|jPBPUp&6T0({5U?m|Yt}=5>j^3z)`qiCMPe)LK+1UBL^B{ppJ&F) z3nR}LDy*;lW^EksKb?_YDVWV2!t3mbE|qtkY&&e>47U|hu=yoe#eNHuoCnU7TPS6V3nJZAck`j6eZ0^h5%%jF4n}(HR81<*jy@ zjd#CUkC}x7(Yf~sE`-JQGm^&tjN??y$H^+Lthx$CLAUri1C6l6>3tKh4zVp00orOv z;5X%4+&84Uu)+qiAz}!X2kgD`QaUo=jQNtF4c^EQPrfdgwMY)++US@Jx1Eakvf#BD zdyTeoWHj!+j>|~et%8$th?JyZ9J_47nIU|35Ikk5BqhYAOA6tpa^f!ITTiryw{+ME zPZovz(~oA@*sOHK7~UKB+u<~kQGa9^x6D5zgiwK+5b-r~H6ikM_)UdVP?3(Ua2Qrf zuum+YItrvn3S3+IsP6$;^jYhP{^jki^ttlEYvP#5)OHBFG- zG9Wjjcx?1zVpnPNs1dO)w=$ydXp?>%!Q~OqW<|8t>SO;j!1;A$EUOHH{CY|2%1AYM|0Gv{wox+z#xT?QE{>7DiC{o@B7@~97@<1Ol&67nIJn9NNsQ##kRZ}V zbWy8E26JitE-cDV-E;nNy-ua*8U1{diq35?3rn7@OWpto*^PF$2g-FMN2PECl7gpf zm-#nH>SZ7|V__aMEf?B(s94N;@JD7aokE&0P$MVexm1!68ao|PZU9=dB{)B$Y1kTK z-6?C^EAz!#!A3?^qDc#HVQC0vNyHnPk(&={ra7XL=f3L2yanJJ_T#K(}$$!;$CvPUsSZVou04Y|rDzx)4ju`FM?TiQ@Wa>NBD7Z+- zBrukAA;hyiPlU}`O`Q4Hgq90(Mi@e~;JXWCNCUJ^Sg0>L3dh*d^gHM|VkO5E~9e_1S zcde;82tWZcMHjI+r`mtuQ0xb#(1cV%3m{$>DHd|_qFR;rfAeHGb0rf7z7Mb~yew0o zgBgR=wLGTKK)14yoxi#`7HcJ>4D6hp-v--&!QxO}4Ux&vRvBxr$kl-x)w_tJwpgd(OHz*<_?Gxc9VgNRp!892ZG6e zPc!V;qXv<$ky{YZGe-5@em2EAzNRo+6!VB}wp|}*Qa%!>r9xbFQS4sU6ZXx}V&z8W zV*Dj1)UZ5C(xh?aS~{>Ez+-ZZ_mZj2Q4uMaE1eo$2MFZpgw7@>AHL4$^KP4^UpiM> z^}z;nn?$KUj3T3GLqVBB?k%TGc_cFBqOge-gfy2Q7iw;}Mh9MUL*#@dObAU>P-s&K z-?lLL<(UU7lHal;q2`h5a}|Q9X%qao!$2K)GegsYF& zdW*l@k8UuyGB|lIr zAm^Y-l=lUUmaP@35f<1c_*3F{myAG@Iy&Tlkt>0u zM9ngBL>!n;tv9ydiYSsKY0pH`lgPwKSU?&=jQkX6lgkT&wVorZ<7QJ3!(fuCa#E(k zQh67ttJ)Rurn}$qsgTv`I|~JzGKN}3P(63sIbQ%!5FL<>e+A>qV=Kjs&+}#@SAO3H zVQ(w^ua(SQO(pjuBOWA0NK2X4 zI8K()%Jo(k$Ehq86B|DOhlR@U&i75S+ge52pyr7Hk@v)*yMFvaCr&QkJckvM_e0$t3WxVw z?}R4@P-jfCP6cpW&|(?@*j@4+9u!?+u0%l+G76A1WF^W(hi6PB83=`k$HVckNKdUH zH39y)8A2gD@RexRC>Ld~`7{^;p=iu^AKW0X+Rr=OjTqA}7pM$9lL)CITtKH>=Tg!A zJLWqkcm=oU1j(v&5T1-D`lN@IlE9~lH0$)jN@%(IL>W1ue&*c^SFC<2o4>C`D?#9d z=Bej(w}ZulOel0aQt&s7q5vrJxIj_lmoJ}MK7Rx&htNr}C2FR*rM+3}APu>};TcS4 z?KMgpM@I%}dz=@6^LJ$M-nEWN6UMd znFTbH(wrBgQdF}l7ilWRuBr4@Cm387Z5y3bEMXjchQeH$6U-6I_+P(DOD zDIrNc7>Wvx2!-kQtg9l#ATYU|Lb7s2K&N#F*n@I*s?7!^KmVRMAuVU@%)U1+Q1MG8 zLEjzLCI`Cm+)F{Y{8C25W#>r=1-21}v@d|`lY`N8bBN~gWDhd}DTypDQAm^dJ+8Qk zI^S|)zUJtMW}%=+X9EKcwq*KVPUUA%r|V?~jKz9_+{!q$I=R~^dQDuQo}gcG+9)`O zoHPn}`QsWypotq43|RN;#rhGajuE+ovnh8APTwBg{rC~#Eb?xR+$PEXDSDs;JV2B@ z-dTVsu!(WLdPk3{iL{kz4epRh5@`ly@RPfT6{7Ctd~w*_tJCXCI%vC(b$HbM_uc+` zv{a|mYA>F5Xr|Cy9;~9tHS92okk^F3?;?X}l_=IqmO!enVt88AC^zcrU?k(fh2?z} zFA$*UEVo#2j46P@hMJJkl%Sk8cFpZAh(}=v#twUnUozfF8q%ja=>d$d5@Z>YU7qDd zDT+3Roi#s`)0DNcJj->FRwk#{*TLU*IfbMZOC=O?)*VSz)w?XUogXw=kxmTY5yMR; zJ0*R?*yKIcV{k@iPw7g%?9o$RjPW9lH&Ez3VAiAOe-Dx%R2`o9gY%{+tke)B1AzlZ zTS>7@ZtX!-Bs8E@a9Z$C6DvG$>SaSF6kc_yH)Z{kw-5LUam*T0=ce+^tMRW>*gCGG~3L5l1JJi(@nLho;=9fKF1ZCSUVhYCrr9#YmTo-d}W%q@&8SO_oR z-?^zWQXJi|)zRH;Wk`wKzW zH2+MsZ(de2sHw7hRIE&so`8GU#qxARF&PcS&?0|b2l(ma z)_ehJ1z`xGSzZVM5o2cnFd3{!1VwKp2qD?4tykd^+XSZLv44GCrnU1Nt60fns^th{`(gHeX=~ zb1?VFQ+!g{gft`+OY=>dM2UhZpt Date: Mon, 24 Mar 2014 13:28:52 +0900 Subject: [PATCH 070/103] rename callback - --- MIT-LICENSE.txt | 2 +- README.md | 164 ++++++++++++++++++++++++++++++++++++++--------- examples/main.cc | 32 ++++----- 3 files changed, 152 insertions(+), 46 deletions(-) diff --git a/MIT-LICENSE.txt b/MIT-LICENSE.txt index ba5ef3b..6f013c3 100644 --- a/MIT-LICENSE.txt +++ b/MIT-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2013 Keita Obo +Copyright (c) 2013 - 2014 Keita Obo, Kuroda Daisuke (Dycoon) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.md b/README.md index 4ba1336..111b5eb 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ mrubybind - Binding library for mruby/C++ mrubybind automatically creates C function/class-method binder for [mruby](https://github.com/mruby/mruby), using C++ template partial specialization. +require C++11. because it use std::function and lambda. ## Usage @@ -124,46 +125,151 @@ using C++ template partial specialization. } ``` -## Supported types -| C type | mruby type | -|---------------------|-------------------------| -| int, unsigned int | Fixnum | -| float, double | Float | -| const char*, string | String | -| bool | TrueClass or FalseClass | -| void* | Object | - -See [mrubybind.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind.h). - - - ### Call block from C++ code 1. define C++ function having callback function - std::string call_block(mrubybind::sp_mrb_func f) { - if(f) - { - f.func()(23); - } - return "called\n"; - } + ```c++ + std::string call_block(mrubybind::FuncPtr f) { + if(f) + { + f.func()(23); + } + return "called\n"; + } + ``` 2. Bind it using mrubybind: - #include "mrubybind.h" - - void install_square_function(mrb_state* mrb) { - mrubybind::MrubyBind b(mrb); - b.bind("call_block", call_block); - } + ```c++ + #include "mrubybind.h" + + void install_call_block_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("call_block", call_block); + } + ``` + +3. Call it from mruby: + + ```ruby + puts call_block { |a0| + puts "a0 = #{a0}" + } + ``` + +### Manage Registered Class Instance + +1. Define C++ function managing class instance: + + ```c++ + class ClassValue{ + public: + int a; + + ClassValue(){ + a = 7; + } + + ~ClassValue(){ + } + + void decriment(){ + a--; + } + }; + + std::shared_ptr create_class_value() + { + return std::shared_ptr(new ClassValue()); + } + + void class_value_increment(std::shared_ptr cv) + { + cv->a++; + } + + int class_value_get_a(std::shared_ptr cv) + { + return cv->a; + } + ``` + +2. Register class and bind function: + + ```c++ + #include "mrubybind.h" + + void install_class_value_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("create_class_value", create_class_value); + b.bind_class >("ClassValue"); + b.bind("class_value_increment", class_value_increment); + b.bind("class_value_get_a", class_value_get_a); + } + ``` + 3. Call it from mruby: - puts call_block { |a0| - puts "a0 = #{a0}" - } + ```ruby + cv = create_class_value\n" + puts "cv -> #{class_value_get_a(cv)}" + class_value_increment(cv) + puts "cv -> #{class_value_get_a cv}" + ``` + +### Refering to mruby object + +1. Recieve mruby object reference function: + + ```c++ + mrubybind::MrubyRef mruby_ref; + + void set_mruby_ref(mrubybind::MrubyRef r){ + mruby_ref = r; + } + ``` + +2. Bind it using mrubybind: + + ```c++ + #include "mrubybind.h" + + void install_mruby_ref_function(mrb_state* mrb) { + mrubybind::MrubyBind b(mrb); + b.bind("set_mruby_ref", set_mruby_ref); + } + ``` + +3. Send from mruby code: + + ```ruby + set_mruby_ref "3test" + ``` + +4. Manage reference of mruby object on C++: + + ```c++ + std::cout << "mruby_ref = " << mruby_ref.to_s() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.to_i() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.call("gsub", "te", "toa").to_s() << std::endl; + ``` + +## Supported types +| C++ type | mruby type | +|--------------------------|-------------------------| +| int, unsigned int | Fixnum | +| float, double | Float | +| const char*, string | String | +| bool | TrueClass or FalseClass | +| void* | Object | +| mrubybind::FuncPtr<...> | Proc | +| mrubybind::MrubyRef | Any Mruby Object | +| registered class | registered class | +See [mrubybind.h](https://github.com/ktaobo/mrubybind/blob/master/mrubybind.h). + # License MIT license. diff --git a/examples/main.cc b/examples/main.cc index aa99b6c..6305049 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -110,35 +110,35 @@ void UseModuleTest(mrb_state* mrb) { // -std::string call_callback(mrubybind::FuncPtr f) { +std::string call_block(mrubybind::FuncPtr f) { if(f) { cout << "pre f\n"; f.func()(); cout << "post f\n"; } - return "call_callback called\n"; + return "call_block called\n"; } -std::string call_callback_a1(mrubybind::FuncPtr f) { +std::string call_block_a1(mrubybind::FuncPtr f) { if(f) { f.func()(23); } - return "call_callback_a1 called\n"; + return "call_block_a1 called\n"; } -std::string call_callback_a2(mrubybind::FuncPtr f) { +std::string call_block_a2(mrubybind::FuncPtr f) { if(f) { f.func()(23, "string"); } - return "call_callback_a2 called\n"; + return "call_block_a2 called\n"; } -std::string call_callback_a1_int(mrubybind::FuncPtr f) { +std::string call_block_a1_int(mrubybind::FuncPtr f) { std::stringstream s; - s << "call_callback_a1_int return this ->" << f.func()(23); + s << "call_block_a1_int return this ->" << f.func()(23); return s.str(); } @@ -181,10 +181,10 @@ Callbacker* new_callbacker() void CallbackFunctionTest(mrb_state* mrb) { { mrubybind::MrubyBind b(mrb); - b.bind("call_callback", call_callback); - b.bind("call_callback_a1", call_callback_a1); - b.bind("call_callback_a2", call_callback_a2); - b.bind("call_callback_a1_int", call_callback_a1_int); + b.bind("call_block", call_block); + b.bind("call_block_a1", call_block_a1); + b.bind("call_block_a2", call_block_a2); + b.bind("call_block_a1_int", call_block_a1_int); b.bind("set_old_f", set_old_f); b.bind("call_old_f", call_old_f); @@ -194,17 +194,17 @@ void CallbackFunctionTest(mrb_state* mrb) { } mrubybind::load_string(mrb, - "v = call_callback do\n" + "v = call_block do\n" " puts \"?? called\n\"" "end\n" "puts v\n" - "puts call_callback_a1 { |a0|\n" + "puts call_block_a1 { |a0|\n" " puts \"a0 = #{a0}\"\n" "}\n" - "puts call_callback_a2 { |a0, a1|\n" + "puts call_block_a2 { |a0, a1|\n" " puts \"a0 = #{a0}, a1 = #{a1}\"\n" "}\n" - "puts call_callback_a1_int { |a0|\n" + "puts call_block_a1_int { |a0|\n" " puts \"a0 = #{a0}\"\n" "}\n" "puts \"Callbacker.new.func_test \" + Callbacker.new.func_test {|a0|\n" From 620d240cf71ca76e461eb500e970d3b1d7f51adc Mon Sep 17 00:00:00 2001 From: dycoon Date: Mon, 24 Mar 2014 15:45:42 +0900 Subject: [PATCH 071/103] add test. --- README.md | 10 +++- codegen/mrubybind.3.h | 5 ++ mrubybind.h | 5 ++ test/Makefile | 24 +++++--- test/class_value.cc | 125 ++++++++++++++++++++++++++++++++++++++++++ test/mruby_ref.cc | 51 +++++++++++++++++ test/test.sh | 17 +++++- 7 files changed, 226 insertions(+), 11 deletions(-) create mode 100644 test/class_value.cc create mode 100644 test/mruby_ref.cc diff --git a/README.md b/README.md index 111b5eb..0b2179d 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,11 @@ require C++11. because it use std::function and lambda. { return cv->a; } + + void class_value_decriment(std::shared_ptr cv) + { + cv->decriment(); + } ``` 2. Register class and bind function: @@ -207,16 +212,19 @@ require C++11. because it use std::function and lambda. b.bind_class >("ClassValue"); b.bind("class_value_increment", class_value_increment); b.bind("class_value_get_a", class_value_get_a); + b.bind_custom_method(NULL, "ClassValue", "decriment", class_value_decriment); } ``` 3. Call it from mruby: ```ruby - cv = create_class_value\n" + cv = create_class_value puts "cv -> #{class_value_get_a(cv)}" class_value_increment(cv) puts "cv -> #{class_value_get_a cv}" + cv.decriment + puts "cv -> #{class_value_get_a cv}" ``` ### Refering to mruby object diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index f0d5aac..a2aa3ab 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -103,6 +103,11 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } + + template + void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { + bind_custom_method(NULL, class_name, method_name, func_ptr); + } mrb_state* get_mrb(){ return mrb_; diff --git a/mrubybind.h b/mrubybind.h index d7065f4..d42ba39 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1359,6 +1359,11 @@ class MrubyBind { mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); } + + template + void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { + bind_custom_method(NULL, class_name, method_name, func_ptr); + } mrb_state* get_mrb(){ return mrb_; diff --git a/test/Makefile b/test/Makefile index 472a399..8a1c55b 100644 --- a/test/Makefile +++ b/test/Makefile @@ -8,7 +8,7 @@ MRUBYBIND_OBJ=mrubybind.o SRCS=$(wildcard *.cc) EXES=$(SRCS:%.cc=%) -CXXFLAGS=-Wall -Wextra -Werror +CXXFLAGS=-Wall -Wextra -Werror -g -std=c++11 -DEXIT_SUCCESS=0 -DEXIT_FAILURE=1 all: $(EXES) @@ -28,27 +28,33 @@ void: void.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) int: int.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) float: float.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) string: string.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) cptr: cptr.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) class: class.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) module: module.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) wrong_type: wrong_type.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) - + g++ -o $@ $^ $(LIB) $(CXXFLAGS) + +class_value: class_value.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) + +mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) + # diff --git a/test/class_value.cc b/test/class_value.cc new file mode 100644 index 0000000..f00ee5b --- /dev/null +++ b/test/class_value.cc @@ -0,0 +1,125 @@ + + +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +class ClassValue{ +public: + int a; + mrubybind::FuncPtr block; + + ClassValue(){ + std::cout << "ClassValue construct.\n"; + a = 7; + } + + ~ClassValue(){ + std::cout << "ClassValue destruct.\n"; + } + + void decriment(){ + a--; + } + + void set_block(mrubybind::FuncPtr block){ + this->block = block; + } + + std::string call_block(){ + return block.func()(a, "test"); + } +}; + +std::shared_ptr create_class_value() +{ + return std::shared_ptr(new ClassValue()); +} + +void class_value_increment(std::shared_ptr cv) +{ + cv->a++; +} + +int class_value_get_a(std::shared_ptr cv) +{ + return cv->a; +} + +void class_value_decriment(std::shared_ptr cv) +{ + cv->decriment(); +} + +std::weak_ptr convert_to_weak_class_value(std::shared_ptr cv){ + return cv; +} + +int weak_class_value_get_a(std::weak_ptr cv) +{ + if(auto ptr = cv.lock()){ + return ptr->a; + } + return 0; +} + +void class_value_set_block(std::shared_ptr cv, mrubybind::FuncPtr block) +{ + cv->set_block(block); +} + +std::string class_value_call_block(std::shared_ptr cv) +{ + return cv->call_block(); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("create_class_value", create_class_value); + b.bind_class >("ClassValue"); + b.bind_class >("WeakClassValue"); + b.bind("class_value_increment", class_value_increment); + b.bind("class_value_get_a", class_value_get_a); + b.bind_custom_method(NULL, "ClassValue", "decriment", class_value_decriment); + b.bind("convert_to_weak_class_value", convert_to_weak_class_value); + b.bind("weak_class_value_get_a", weak_class_value_get_a); + b.bind_custom_method("ClassValue", "set_block", class_value_set_block); + b.bind_custom_method("ClassValue", "call_block", class_value_call_block); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, + "puts \"start ClassPointerTest\"\n" + "cv = create_class_value\n" + "puts \"cv -> #{class_value_get_a(cv)}\"\n" + "class_value_increment(cv)\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.decriment\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.set_block do |a0, a1|\n" + " a1.to_s + a0.to_s\n" + "end\n" + "puts \"cv.call_block -> #{cv.call_block}\"\n" + "wk = convert_to_weak_class_value cv\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" + "cv = nil\n" + "puts \"GC\"\n" + "GC.start\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} + + diff --git a/test/mruby_ref.cc b/test/mruby_ref.cc new file mode 100644 index 0000000..c2bbdd8 --- /dev/null +++ b/test/mruby_ref.cc @@ -0,0 +1,51 @@ + +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +mrubybind::MrubyRef mruby_ref; +mrubybind::MrubyRef mruby_ref_a, mruby_ref_b; + +void set_mruby_ref(mrubybind::MrubyRef r){ + mruby_ref = r; +} + +void set_mruby_ref_pair(mrubybind::MrubyRef a, mrubybind::MrubyRef b){ + mruby_ref_a = a; + mruby_ref_b = b; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("set_mruby_ref", set_mruby_ref); + b.bind("set_mruby_ref_pair", set_mruby_ref_pair); + } + + int result_code = EXIT_SUCCESS; + mrubybind::load_string(mrb, + "set_mruby_ref \"3test\"\n" + "s = \"aaa\"\n" + "set_mruby_ref_pair s, s\n" + "set_mruby_ref_pair :s, :s\n" + ); + std::cout << "mruby_ref = " << mruby_ref.to_s() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.to_i() << std::endl; + std::cout << "mruby_ref = " << mruby_ref.call("gsub", "te", "toa").to_s() << std::endl; + std::cout << ":a == :a = " << mruby_ref_a.obj_equal(mruby_ref_b) << std::endl; + std::cout << "arena_index = " << mrb_gc_arena_save(mrb) << std::endl; + + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} + diff --git a/test/test.sh b/test/test.sh index 742ba5a..8daa17a 100755 --- a/test/test.sh +++ b/test/test.sh @@ -48,10 +48,25 @@ run class 'Foo::ctor(123) 99980001 Foo::dtor()' run module 'modfunc called: 1234' +run class_value 'start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' +run mruby_ref 'mruby_ref = 3test +mruby_ref = 3 +mruby_ref = 3toast +:a == :a = 1 +arena_index = 0' # Failure cases fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" -fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" +fail wrong_arg_num "ArgumentError: \`square': wrong number of arguments (2 for 1)" ################################################################ # All tests succeeded. From c0d3ca1666982267cc79e18fee7fe516d6b1c6c5 Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 26 Mar 2014 17:44:34 +0900 Subject: [PATCH 072/103] string management. --- codegen/mrubybind.3.cc | 263 +++++++++++++++++++++++++++++++++++++++++ mrubybind.cc | 4 +- 2 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 codegen/mrubybind.3.cc diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc new file mode 100644 index 0000000..4f39fdc --- /dev/null +++ b/codegen/mrubybind.3.cc @@ -0,0 +1,263 @@ + +const char Type::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Fixnum"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "Float"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "String"; +const char Type::TYPE_NAME[] = "Bool"; +const char Type::TYPE_NAME[] = "Voidp"; +const char Type::TYPE_NAME[] = "MrubyRef"; +const char TypeFuncBase::TYPE_NAME[] = "Func"; +const char TypeClassBase::TYPE_NAME[] = "CppClass"; + +const char* untouchable_table = "__ untouchable table __"; +const char* untouchable_object = "__ untouchable object __"; +const char* untouchable_last_exception = "__ untouchable last exception __"; + +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value) { + const char * argument_class_name = mrb_obj_classname(mrb, value); + mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S, argument %S(%S)", + mrb_str_new_cstr(mrb, argument_class_name), + mrb_str_new_cstr(mrb, required_type_name), + mrb_fixnum_value(parameter_index + 1), value); + return mrb_nil_value(); +} + +static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); +} + +static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value self_v; + mrb_value new_func_ptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); + return self; +} + +static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { + mrb_value binder; + mrb_value self_v; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); +} + +static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { + mrb_value binder; + mrb_value method_pptr_v; + mrb_value* args; + int narg; + mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); + typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); + BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); + return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); +} + +MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { + Initialize(); +} + +MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { + Initialize(); +} + +MrubyBind::~MrubyBind() { + mrb_gc_arena_restore(mrb_, arena_index_); +} + +void MrubyBind::Initialize() { + arena_index_ = mrb_gc_arena_save(mrb_); + mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); + RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); + if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind)) { + mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), + sym_mrubybind); + avoid_gc_table_ = mrb_obj_iv_get(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_table)); + } else { + mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); + + mod_mrubybind_ = mrb_obj_value(mrubybind); + mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, + ARGS_REQ(2) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, + ARGS_REQ(3) | ARGS_REST()); + mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, + ARGS_REQ(2) | ARGS_REST()); + mrb_irep* irep = mrb_read_irep(mrb_, binder); + if (irep != NULL) { + mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); + } + + { + avoid_gc_table_ = mrb_hash_new(mrb_); + mrb_obj_iv_set(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); + std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); + mrubybind::MrubyBind b(mrb_); + b.bind_class >("MrubyBind", "MrubyBindStatusPtr"); + mrb_value msbpv = Type >::ret(mrb_, mrbs); + mrb_obj_iv_set(mrb_, (RObject*)mrubybind, + mrb_intern_cstr(mrb_, untouchable_object), msbpv); + } + } +} + +MrubyRef load_string(mrb_state* mrb, std::string code) +{ + mrubybind::MrubyArenaStore mas(mrb); + + RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); + mrb->exc = NULL; + mrb_value r = mrb_load_string(mrb, + code.c_str()); + if(mrb->exc){ + mrb_obj_iv_set(mrb, (RObject*)mrubybind, + mrb_intern_cstr(mrb, untouchable_last_exception), mrb_obj_value(mrb->exc)); + r = mrb_nil_value(); + } + else{ + mrb_obj_iv_set(mrb, (RObject*)mrubybind, + mrb_intern_cstr(mrb, untouchable_last_exception), mrb_nil_value()); + } + + return MrubyRef(mrb, r); +} + +MrubyRef::MrubyRef(){ + +} + +MrubyRef::MrubyRef(mrb_state* mrb, const mrb_value& v){ + this->mrb = mrb; + mrb_value* p = new mrb_value(); + *p = v; + this->v = std::shared_ptr(p, set_avoid_gc(mrb, v)); +} + +MrubyRef::~MrubyRef(){ + +} + +mrb_value MrubyRef::get_v() const{ + if(v.get()){ + return *(this->v.get()); + } + return mrb_nil_value(); +} + +bool MrubyRef::empty() const{ + if(!v.get()){ + return true; + } + return false; +} + +bool MrubyRef::test() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + return mrb_test(v); + } + return false; +} + +bool MrubyRef::obj_equal(const MrubyRef& r) const{ + if(!empty() && !r.empty()){ + return mrb_obj_equal(mrb, get_v(), r.get_v()); + } + else{ + return empty() == r.empty(); + } +} + +std::string MrubyRef::to_s() const{ + if(v.get()){ + MrubyArenaStore mas(mrb); + mrb_value v = *(this->v.get()); + if(mrb_string_p(v)){ + return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); + } + else{ + v = mrb_funcall(mrb, v, "to_s", 0); + return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); + } + } + else{ + return ""; + } +} + +int MrubyRef::to_i() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_fixnum_p(v)){ + return mrb_fixnum(v); + } + else{ + v = mrb_funcall(mrb, v, "to_i", 0); + return mrb_fixnum(v); + } + } + else{ + return 0; + } +} + +float MrubyRef::to_float() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_float_p(v)){ + return mrb_float(v); + } + else{ + v = mrb_funcall(mrb, v, "to_f", 0); + return mrb_float(v); + } + } + else{ + return 0.0f; + } +} + +double MrubyRef::to_double() const{ + if(v.get()){ + mrb_value v = *(this->v.get()); + if(mrb_float_p(v)){ + return mrb_float(v); + } + else{ + v = mrb_funcall(mrb, v, "to_f", 0); + return (double)mrb_float(v); + } + } + else{ + return 0.0; + } +} + + +} // namespace mrubybind diff --git a/mrubybind.cc b/mrubybind.cc index d04ed3d..0b07b25 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -372,11 +372,11 @@ std::string MrubyRef::to_s() const{ MrubyArenaStore mas(mrb); mrb_value v = *(this->v.get()); if(mrb_string_p(v)){ - return std::string(RSTRING_PTR(v)); + return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } else{ v = mrb_funcall(mrb, v, "to_s", 0); - return std::string(RSTRING_PTR(v)); + return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } } else{ From a2905fb9d418ca2258f8c55bfee3a711eba11e4a Mon Sep 17 00:00:00 2001 From: dycoon Date: Thu, 27 Mar 2014 13:39:58 +0900 Subject: [PATCH 073/103] class name check --- codegen/gen_call_template.rb | 2 +- codegen/gen_template.rb | 2 +- codegen/gen_types_template.rb | 6 ++--- codegen/mrubybind_types.1.h | 34 ++++++++++++---------------- mrubybind.h | 32 +++++++++++++------------- mrubybind_call_generated.h | 2 +- mrubybind_types_generated.h | 42 +++++++++++++++++------------------ 7 files changed, 57 insertions(+), 63 deletions(-) diff --git a/codegen/gen_call_template.rb b/codegen/gen_call_template.rb index 26d12ea..a7e92b4 100644 --- a/codegen/gen_call_template.rb +++ b/codegen/gen_call_template.rb @@ -5,7 +5,7 @@ HEADER = <::get(mrb, args[i]) -\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) EOD diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index dd76bda..2f33da0 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -4,7 +4,7 @@ HEADER = <::get(mrb, args[i]) -\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) \#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} \#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb index 900991d..8bdde0b 100644 --- a/codegen/gen_types_template.rb +++ b/codegen/gen_types_template.rb @@ -4,7 +4,7 @@ HEADER = <::get(mrb, args[i]) -\#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) EOD @@ -14,7 +14,7 @@ // callback R(%PARAMS%) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](%ARGS%){ @@ -33,7 +33,7 @@ // callback void(%PARAMS%) template<%CLASSES%> struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](%ARGS%){ diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index f373522..d57ed0e 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -260,7 +260,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; @@ -268,7 +268,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } }; @@ -277,7 +277,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } }; @@ -286,7 +286,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } }; @@ -295,7 +295,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } }; @@ -303,7 +303,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -311,7 +311,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -319,7 +319,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -328,7 +328,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value /*v*/) { return 1; } + static int check(mrb_state*, mrb_value /*v*/) { return 1; } static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } }; @@ -337,15 +337,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; -<<<<<<< HEAD static int check(mrb_value v) { return mrb_cptr_p(v); } static void* get(mrb_value v) { return mrb_cptr(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } -======= - static int check(mrb_value v) { return mrb_voidp_p(v); } - static void* get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_voidp(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } ->>>>>>> call back. }; // Function @@ -355,7 +349,7 @@ struct TypeFuncBase{ template struct Type > :public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](){ @@ -372,7 +366,7 @@ struct Type > :public TypeFuncBase { template<> struct Type > :public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](){ @@ -391,7 +385,7 @@ struct Type > :public TypeFuncBase { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value) { return 1; } + static int check(mrb_state*, mrb_value) { return 1; } static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } }; @@ -433,8 +427,8 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_value v) { - return mrb_type(v) == MRB_TT_DATA; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && strcmp(mrb_obj_classname(mrb, v), class_name.c_str()) == 0; } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); diff --git a/mrubybind.h b/mrubybind.h index d42ba39..58189f1 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -284,7 +284,7 @@ class MrubyRef{ template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } }; @@ -292,7 +292,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } }; @@ -301,7 +301,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } }; @@ -310,7 +310,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } }; @@ -319,7 +319,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } }; @@ -327,7 +327,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -335,7 +335,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -343,7 +343,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_string_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } }; @@ -352,7 +352,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value /*v*/) { return 1; } + static int check(mrb_state*, mrb_value /*v*/) { return 1; } static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } }; @@ -361,7 +361,7 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_voidp_p(v); } + static int check(mrb_state*, mrb_value v) { return mrb_voidp_p(v); } static void* get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_voidp(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } }; @@ -373,7 +373,7 @@ struct TypeFuncBase{ template struct Type > :public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](){ @@ -390,7 +390,7 @@ struct Type > :public TypeFuncBase { template<> struct Type > :public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](){ @@ -409,7 +409,7 @@ struct Type > :public TypeFuncBase { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value) { return 1; } + static int check(mrb_state*, mrb_value) { return 1; } static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } }; @@ -451,8 +451,8 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_value v) { - return mrb_type(v) == MRB_TT_DATA; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && strcmp(mrb_obj_classname(mrb, v), class_name.c_str()) == 0; } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); @@ -480,7 +480,7 @@ mrb_value raise(mrb_state *mrb, int parameter_index, //#include "mrubybind.inc" // This file is generated from gen_template.rb #define ARG(mrb, i) Type::get(mrb, args[i]) -#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) // void f(void); diff --git a/mrubybind_call_generated.h b/mrubybind_call_generated.h index 3978a56..beee1d0 100644 --- a/mrubybind_call_generated.h +++ b/mrubybind_call_generated.h @@ -1,6 +1,6 @@ // This file is generated from gen_template.rb #define ARG(mrb, i) Type::get(mrb, args[i]) -#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) diff --git a/mrubybind_types_generated.h b/mrubybind_types_generated.h index 3d25c92..cf01129 100644 --- a/mrubybind_types_generated.h +++ b/mrubybind_types_generated.h @@ -1,13 +1,13 @@ // This file is generated from gen_template.rb #define ARG(mrb, i) Type::get(mrb, args[i]) -#define CHECK(i) {if(!Type::check(args[i])) return RAISE(i);} +#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) // callback R(P0) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0){ @@ -26,7 +26,7 @@ struct Type > : public TypeFuncBase { // callback void(P0) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0){ @@ -46,7 +46,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1){ @@ -65,7 +65,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1){ @@ -85,7 +85,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2){ @@ -104,7 +104,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2){ @@ -124,7 +124,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ @@ -143,7 +143,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2, P3) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3){ @@ -163,7 +163,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ @@ -182,7 +182,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2, P3, P4) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4){ @@ -202,7 +202,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ @@ -221,7 +221,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2, P3, P4, P5) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5){ @@ -241,7 +241,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5, P6) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ @@ -260,7 +260,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2, P3, P4, P5, P6) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6){ @@ -280,7 +280,7 @@ struct Type > : public TypeFuncBase { // callback R(P0, P1, P2, P3, P4, P5, P6, P7) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ @@ -299,7 +299,7 @@ struct Type > : public TypeFuncBase { // callback void(P0, P1, P2, P3, P4, P5, P6, P7) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7){ @@ -319,7 +319,7 @@ struct Type > : public TypeFuncBas // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ @@ -338,7 +338,7 @@ struct Type > : public TypeFuncBa // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8){ @@ -358,7 +358,7 @@ struct Type > : public TypeFun // callback R(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ @@ -377,7 +377,7 @@ struct Type > : public TypeFu // callback void(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) template struct Type > : public TypeFuncBase { - static int check(mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } static FuncPtr get(mrb_state* mrb, mrb_value v) { Deleter > d = set_avoid_gc >(mrb, v); return make_FuncPtr(d, [=](P0 a0, P1 a1, P2 a2, P3 a3, P4 a4, P5 a5, P6 a6, P7 a7, P8 a8, P9 a9){ From ee026eefd2b24b42459ed0512eebf70098442088 Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 23 Apr 2014 14:38:16 +0900 Subject: [PATCH 074/103] import updates. --- codegen/gen_template.rb | 152 ++- codegen/mrubybind.1.h | 3 + codegen/mrubybind.3.cc | 263 ------ codegen/mrubybind.3.h | 43 +- codegen/mrubybind_types.1.h | 17 +- examples/main.cc | 12 + mrubybind.cc | 273 ++---- mrubybind.h | 1747 +++++++++++++++++++++++++++++------ test/test.sh | 2 +- 9 files changed, 1730 insertions(+), 782 deletions(-) delete mode 100644 codegen/mrubybind.3.cc diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 2f33da0..d4bed4f 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -4,7 +4,9 @@ HEADER = <::get(mrb, args[i]) +\#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) \#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +\#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(i);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) \#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} \#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) @@ -17,9 +19,17 @@ struct Binder { static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; + mrb_value* targs; int narg; - mrb_get_args(mrb, "*", &args, &narg); + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_cptr(cfunc); @@ -33,9 +43,17 @@ struct Binder { static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* args; + mrb_value* targs; int narg; - mrb_get_args(mrb, "*", &args, &narg); + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_cptr(cfunc); @@ -51,14 +69,25 @@ static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - mrb_value* args; + mrb_value* targs; int narg; - mrb_get_args(mrb, "*", &args, &narg); + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } %ASSERTS% mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_cptr(cfunc); - C* instance = ctor(%ARGS%); - DATA_PTR(self) = instance; + if(ctor) + { + C* instance = ctor(%ARGS%); + DATA_PTR(self) = instance; + } return self; } }; @@ -71,9 +100,17 @@ struct ClassBinder { static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; + mrb_value* targs; int narg; - mrb_get_args(mrb, "*", &args, &narg); + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } %ASSERTS% C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); @@ -89,9 +126,17 @@ struct ClassBinder { static const int NPARAM = %NPARAM%; static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* args; + mrb_value* targs; int narg; - mrb_get_args(mrb, "*", &args, &narg); + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } %ASSERTS% C* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); @@ -102,6 +147,62 @@ } }; +EOD + +CUSTOM_METHOD_TMPL = < +struct CustomClassBinder { + static const int NPARAM = %NPARAM% - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance%ARGS1%); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = %NPARAM% - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance%ARGS1%); + return Type::ret(mrb, result); + } +}; + + EOD FOOTER = < params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%ARGS1%' => args.empty? ? '' : ', ' + args, + '%CLASSES0%' => classes, + '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, + '%ASSERTS%' => 'CHECKNARG(narg);' + asserts + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + print HEADER (0..MAX_PARAM).each do |nparam| print embed_template(FUNC_TMPL, nparam) print embed_template(METHOD_TMPL, nparam) + print embed_template_custom(CUSTOM_METHOD_TMPL, nparam) if nparam != 0 end print FOOTER diff --git a/codegen/mrubybind.1.h b/codegen/mrubybind.1.h index c2503ec..fc001bf 100644 --- a/codegen/mrubybind.1.h +++ b/codegen/mrubybind.1.h @@ -31,3 +31,6 @@ #include "mruby/proc.h" #include "mruby/variable.h" //#include "mrubybind_types.h" + +#include +#include diff --git a/codegen/mrubybind.3.cc b/codegen/mrubybind.3.cc deleted file mode 100644 index 4f39fdc..0000000 --- a/codegen/mrubybind.3.cc +++ /dev/null @@ -1,263 +0,0 @@ - -const char Type::TYPE_NAME[] = "Fixnum"; -const char Type::TYPE_NAME[] = "Fixnum"; -const char Type::TYPE_NAME[] = "Float"; -const char Type::TYPE_NAME[] = "Float"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "String"; -const char Type::TYPE_NAME[] = "Bool"; -const char Type::TYPE_NAME[] = "Voidp"; -const char Type::TYPE_NAME[] = "MrubyRef"; -const char TypeFuncBase::TYPE_NAME[] = "Func"; -const char TypeClassBase::TYPE_NAME[] = "CppClass"; - -const char* untouchable_table = "__ untouchable table __"; -const char* untouchable_object = "__ untouchable object __"; -const char* untouchable_last_exception = "__ untouchable last exception __"; - -mrb_value raise(mrb_state *mrb, int parameter_index, - const char* required_type_name, mrb_value value) { - const char * argument_class_name = mrb_obj_classname(mrb, value); - mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S, argument %S(%S)", - mrb_str_new_cstr(mrb, argument_class_name), - mrb_str_new_cstr(mrb, required_type_name), - mrb_fixnum_value(parameter_index + 1), value); - return mrb_nil_value(); -} - -static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); -} - -static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value self_v; - mrb_value new_func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); - return self; -} - -static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value self_v; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); -} - -static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); -} - -MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { - Initialize(); -} - -MrubyBind::MrubyBind(mrb_state* mrb, RClass* mod) : mrb_(mrb), mod_(mod) { - Initialize(); -} - -MrubyBind::~MrubyBind() { - mrb_gc_arena_restore(mrb_, arena_index_); -} - -void MrubyBind::Initialize() { - arena_index_ = mrb_gc_arena_save(mrb_); - mrb_sym sym_mrubybind = mrb_intern_cstr(mrb_, "MrubyBind"); - RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); - if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind)) { - mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind); - avoid_gc_table_ = mrb_obj_iv_get(mrb_, (RObject*)mrubybind, - mrb_intern_cstr(mrb_, untouchable_table)); - } else { - mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); - - mod_mrubybind_ = mrb_obj_value(mrubybind); - mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, - ARGS_REQ(2) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, - ARGS_REQ(2) | ARGS_REST()); - mrb_irep* irep = mrb_read_irep(mrb_, binder); - if (irep != NULL) { - mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); - } - - { - avoid_gc_table_ = mrb_hash_new(mrb_); - mrb_obj_iv_set(mrb_, (RObject*)mrubybind, - mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); - std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); - mrubybind::MrubyBind b(mrb_); - b.bind_class >("MrubyBind", "MrubyBindStatusPtr"); - mrb_value msbpv = Type >::ret(mrb_, mrbs); - mrb_obj_iv_set(mrb_, (RObject*)mrubybind, - mrb_intern_cstr(mrb_, untouchable_object), msbpv); - } - } -} - -MrubyRef load_string(mrb_state* mrb, std::string code) -{ - mrubybind::MrubyArenaStore mas(mrb); - - RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); - mrb->exc = NULL; - mrb_value r = mrb_load_string(mrb, - code.c_str()); - if(mrb->exc){ - mrb_obj_iv_set(mrb, (RObject*)mrubybind, - mrb_intern_cstr(mrb, untouchable_last_exception), mrb_obj_value(mrb->exc)); - r = mrb_nil_value(); - } - else{ - mrb_obj_iv_set(mrb, (RObject*)mrubybind, - mrb_intern_cstr(mrb, untouchable_last_exception), mrb_nil_value()); - } - - return MrubyRef(mrb, r); -} - -MrubyRef::MrubyRef(){ - -} - -MrubyRef::MrubyRef(mrb_state* mrb, const mrb_value& v){ - this->mrb = mrb; - mrb_value* p = new mrb_value(); - *p = v; - this->v = std::shared_ptr(p, set_avoid_gc(mrb, v)); -} - -MrubyRef::~MrubyRef(){ - -} - -mrb_value MrubyRef::get_v() const{ - if(v.get()){ - return *(this->v.get()); - } - return mrb_nil_value(); -} - -bool MrubyRef::empty() const{ - if(!v.get()){ - return true; - } - return false; -} - -bool MrubyRef::test() const{ - if(v.get()){ - mrb_value v = *(this->v.get()); - return mrb_test(v); - } - return false; -} - -bool MrubyRef::obj_equal(const MrubyRef& r) const{ - if(!empty() && !r.empty()){ - return mrb_obj_equal(mrb, get_v(), r.get_v()); - } - else{ - return empty() == r.empty(); - } -} - -std::string MrubyRef::to_s() const{ - if(v.get()){ - MrubyArenaStore mas(mrb); - mrb_value v = *(this->v.get()); - if(mrb_string_p(v)){ - return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); - } - else{ - v = mrb_funcall(mrb, v, "to_s", 0); - return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); - } - } - else{ - return ""; - } -} - -int MrubyRef::to_i() const{ - if(v.get()){ - mrb_value v = *(this->v.get()); - if(mrb_fixnum_p(v)){ - return mrb_fixnum(v); - } - else{ - v = mrb_funcall(mrb, v, "to_i", 0); - return mrb_fixnum(v); - } - } - else{ - return 0; - } -} - -float MrubyRef::to_float() const{ - if(v.get()){ - mrb_value v = *(this->v.get()); - if(mrb_float_p(v)){ - return mrb_float(v); - } - else{ - v = mrb_funcall(mrb, v, "to_f", 0); - return mrb_float(v); - } - } - else{ - return 0.0f; - } -} - -double MrubyRef::to_double() const{ - if(v.get()){ - mrb_value v = *(this->v.get()); - if(mrb_float_p(v)){ - return mrb_float(v); - } - else{ - v = mrb_funcall(mrb, v, "to_f", 0); - return (double)mrb_float(v); - } - } - else{ - return 0.0; - } -} - - -} // namespace mrubybind diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index a2aa3ab..e3556b5 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -44,18 +44,11 @@ class MrubyBind { template void bind_class(const char* module_name, const char* class_name) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_value mod = mrb_obj_value(mod_); - if(module_name){ - mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); - } - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_nil_value(); - mrb_value nparam_v = mrb_fixnum_value(0); Type::class_name = class_name; - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, - class_name_v, new_func_ptr_v, nparam_v); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(module_name, class_name, "initialize", + mrb_cptr_value(mrb_, NULL), + ClassBinder::ctor); } template @@ -91,17 +84,18 @@ class MrubyBind { // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { - mrb_value mod = mrb_obj_value(mod_); - if(module_name){ - mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); - } - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM - 1); - mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, - mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; + mrb_value original_func_v = mrb_str_new(mrb_, + reinterpret_cast(&func_ptr), + sizeof(func_ptr)); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } template @@ -121,11 +115,16 @@ class MrubyBind { // Returns mruby class under a module. struct RClass* GetClass(const char* class_name); + struct RClass* GetClass(const char* module_name, const char* class_name); // Utility for binding instance method. void BindInstanceMethod(const char* class_name, const char* method_name, mrb_value original_func_v, mrb_value (*binder_func)(mrb_state*, mrb_value)); + void BindInstanceMethod(const char* module_name, + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); // Mimic mruby API. // TODO: Send pull request to the official mruby repository. diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index d57ed0e..e6c34c3 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace mrubybind { @@ -241,8 +242,8 @@ class MrubyRef{ //=========================================================================== // C <-> mruby type converter. -template -struct Type { +//template +//struct Type { // Type name used for error message. // static const char TYPE_NAME[]; @@ -254,7 +255,7 @@ struct Type { // Converts type T value to mrb_value. //static mrb_value ret(mrb_state*, T i) = 0; -}; +//}; // Fixnum template<> @@ -337,8 +338,8 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_value v) { return mrb_cptr_p(v); } - static void* get(mrb_value v) { return mrb_cptr(v); } + static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } }; @@ -420,6 +421,12 @@ struct ClassBinder { template mrb_data_type ClassBinder::type_info = { "???", dtor }; +template +struct CustomClassBinder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + // Other Class struct TypeClassBase{ static const char TYPE_NAME[]; diff --git a/examples/main.cc b/examples/main.cc index 6305049..a08a460 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -145,11 +145,15 @@ std::string call_block_a1_int(mrubybind::FuncPtr f) { mrubybind::FuncPtr old_f; void set_old_f(mrubybind::FuncPtr f) { + std::cout << "set_old_f() pre" << std::endl; old_f = f; + std::cout << "set_old_f() post" << std::endl; } void call_old_f() { + std::cout << "call_old_f() pre" << std::endl; old_f.func()(); + std::cout << "call_old_f() post" << std::endl; } @@ -275,6 +279,11 @@ void class_value_decriment(std::shared_ptr cv) cv->decriment(); } +void class_value_add(std::shared_ptr cv, int n) +{ + cv->a += n; +} + std::weak_ptr convert_to_weak_class_value(std::shared_ptr cv){ return cv; } @@ -297,6 +306,7 @@ void ClassPointerTest(mrb_state* mrb){ b.bind("class_value_increment", class_value_increment); b.bind("class_value_get_a", class_value_get_a); b.bind_custom_method(NULL, "ClassValue", "decriment", class_value_decriment); + b.bind_custom_method(NULL, "ClassValue", "add", class_value_add); b.bind("convert_to_weak_class_value", convert_to_weak_class_value); b.bind("weak_class_value_get_a", weak_class_value_get_a); } @@ -309,6 +319,8 @@ void ClassPointerTest(mrb_state* mrb){ "puts \"cv -> #{class_value_get_a cv}\"\n" "cv.decriment\n" "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.add 4\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" "wk = convert_to_weak_class_value cv\n" "puts \"wk->#{weak_class_value_get_a wk}\"\n" "cv = nil\n" diff --git a/mrubybind.cc b/mrubybind.cc index 0b07b25..aa4f5fe 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -5,172 +5,12 @@ #include "mruby/proc.h" #include "mruby/string.h" #include "mruby/variable.h" +#include namespace mrubybind { //#include "mrubybind.dat" -#include -const uint8_t binder[] = { -0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0x7e,0x5e,0x00,0x00,0x09,0xe1,0x4d,0x41, -0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x09,0xc3,0x30,0x30, -0x30,0x30,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04, -0x00,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x00,0x00,0x4a, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42, -0x69,0x6e,0x64,0x00,0x00,0x00,0x00,0xda,0x00,0x01,0x00,0x02,0x00,0x05,0x00,0x00, -0x00,0x16,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x00,0xc0,0x00,0x80, -0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x02,0xc0,0x00,0x80, -0x80,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x04,0xc0,0x00,0x80, -0xc0,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x06,0xc0,0x00,0x81, -0x00,0x46,0x00,0x80,0x00,0x91,0x00,0x80,0x40,0x47,0x01,0x00,0x08,0xc0,0x00,0x81, -0x40,0x46,0x00,0x80,0x02,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x06,0x00,0x0f,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x66,0x75,0x6e,0x63,0x74, -0x69,0x6f,0x6e,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00, -0x00,0x0a,0x62,0x69,0x6e,0x64,0x5f,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x14,0x62, -0x69,0x6e,0x64,0x5f,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x6d,0x65,0x74, -0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f,0x73,0x74,0x61,0x74,0x69, -0x63,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x12,0x62,0x69,0x6e,0x64,0x5f, -0x63,0x75,0x73,0x74,0x6f,0x6d,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00, -0x00,0x52,0x00,0x07,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, -0x03,0x80,0x00,0x11,0x04,0x00,0x01,0x04,0x04,0x80,0xc0,0x01,0x05,0x00,0x01,0x40, -0x03,0x80,0x41,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x04,0x73,0x65,0x6e,0x64,0x00, -0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00, -0x00,0x00,0x01,0x2e,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08, -0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, -0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, -0x40,0x15,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0xc0,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, -0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x15,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, -0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x15,0x02,0x81,0x00,0x15,0x02,0x01, -0x01,0x37,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80, -0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00, -0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e, -0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00, -0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01, -0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00, -0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00, -0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64, -0x00,0x00,0x0a,0x63,0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00, -0x00,0x4b,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x07,0x0a,0x00,0x00,0x26, -0x03,0x80,0x40,0x01,0x04,0x00,0xc0,0x01,0x03,0x80,0x00,0xa0,0x04,0x00,0x01,0x40, -0x03,0x80,0x40,0x21,0x03,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, -0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c, -0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x47,0x00,0x01,0x00, -0x04,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x00,0x00,0x84,0x01, -0x80,0x01,0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68, -0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00, -0x00,0x00,0x01,0x2c,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x08, -0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40, -0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01, -0x40,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x07,0x19,0x01,0x80,0x00,0x06,0x02,0x00, -0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81, -0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x01,0x40,0x95,0x02,0x81, -0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80, -0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03,0x01, -0x00,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01, -0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80, -0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x00,0x29,0x60,0x69,0x6e,0x69,0x74,0x69,0x61, -0x6c,0x69,0x7a,0x65,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, -0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, -0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0d,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x74,0x6f,0x72,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b, -0x00,0x08,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00, -0x40,0x01,0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00, -0x40,0x21,0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09, -0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73, -0x73,0x5f,0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00, -0x01,0x00,0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01, -0x40,0x00,0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x01,0x00,0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64, -0x00,0x00,0x00,0x01,0x34,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x29,0x00, -0x08,0x00,0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02, -0x40,0x00,0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02, -0x01,0x80,0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02, -0x00,0x02,0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03, -0x00,0x00,0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02, -0x81,0x80,0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02, -0x81,0x80,0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01, -0x80,0xc0,0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x80,0x00,0x06,0x03, -0x01,0x40,0x95,0x02,0x01,0x01,0xb7,0x02,0x80,0x40,0x01,0x03,0x00,0x80,0x01,0x03, -0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40,0x38,0x01,0x81,0xff,0xa0,0x01, -0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0x27,0x3a, -0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66, -0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20, -0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69, -0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61, -0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72, -0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x09,0x4d,0x72,0x75,0x62, -0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0c,0x63,0x61,0x6c,0x6c,0x5f,0x69,0x6d,0x65, -0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x4b,0x00,0x08,0x00,0x0a,0x00,0x01,0x00, -0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01,0x04,0x80,0xc0,0x01,0x04, -0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21,0x04,0x00,0x00,0x29,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x67, -0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f,0x65,0x76,0x61,0x6c,0x00, -0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x80, -0x00,0x06,0x00,0x80,0x00,0x20,0x01,0x00,0x01,0x40,0x00,0x80,0x40,0x21,0x00,0x80, -0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x63,0x6c,0x61,0x73, -0x73,0x00,0x00,0x0d,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x65,0x76,0x61, -0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x05, -0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x95,0x01,0x80,0x01,0x40,0x00,0x80,0x00,0xa1, -0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x64,0x65, -0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x01,0x2e, -0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x08,0x00,0xa6,0x01,0x80, -0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00,0x03,0x00,0x40, -0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x81,0x15,0x01,0x80, -0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02,0x11,0x02,0x80, -0x00,0x3d,0x03,0x01,0x01,0x15,0x02,0x81,0x80,0x3e,0x03,0x00,0x00,0xbd,0x02,0x81, -0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80,0x3e,0x03,0x00, -0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x81,0x15,0x02,0x81,0x80,0x3e,0x03,0x00, -0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0,0xa0,0x01,0x80, -0x03,0x11,0x02,0x00,0x81,0x15,0x02,0x81,0x41,0x15,0x02,0x01,0x01,0x37,0x02,0x80, -0x40,0x01,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01, -0x40,0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00, -0x01,0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75, -0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74, -0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00, -0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02, -0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67, -0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77, -0x00,0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63, -0x61,0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x00,0x00,0x00,0x4b,0x00,0x08, -0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x26,0x04,0x00,0x40,0x01, -0x04,0x80,0xc0,0x01,0x04,0x00,0x00,0xa0,0x04,0x80,0x01,0x40,0x04,0x00,0x40,0x21, -0x04,0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x09,0x63,0x6f, -0x6e,0x73,0x74,0x5f,0x67,0x65,0x74,0x00,0x00,0x0a,0x63,0x6c,0x61,0x73,0x73,0x5f, -0x65,0x76,0x61,0x6c,0x00,0x00,0x00,0x00,0x3a,0x00,0x01,0x00,0x04,0x00,0x01,0x00, -0x00,0x00,0x05,0x00,0x80,0x00,0x06,0x01,0x01,0x00,0x15,0x01,0x80,0x01,0x40,0x00, -0x80,0x00,0xa1,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, -0x0d,0x64,0x65,0x66,0x69,0x6e,0x65,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00, -0x00,0x01,0x3a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x08,0x00, -0xa6,0x01,0x80,0x40,0x01,0x01,0x80,0x00,0x20,0x01,0x40,0x01,0x19,0x02,0x40,0x00, -0x03,0x00,0x40,0x00,0x97,0x02,0x3f,0xff,0x83,0x01,0x80,0x40,0xac,0x02,0x01,0x80, -0x95,0x01,0x80,0x80,0xa0,0x01,0xc0,0x09,0x19,0x01,0x80,0x00,0x06,0x02,0x00,0x02, -0x11,0x02,0x80,0x00,0x3d,0x03,0x01,0x00,0x95,0x02,0x81,0x80,0x3e,0x03,0x00,0x00, -0xbd,0x02,0x81,0x80,0x3e,0x03,0x00,0x40,0x01,0x03,0x00,0x00,0x20,0x02,0x81,0x80, -0x3e,0x03,0x00,0x01,0x3d,0x02,0x81,0x80,0x3e,0x03,0x01,0x80,0x95,0x02,0x81,0x80, -0x3e,0x03,0x00,0x01,0xbd,0x02,0x81,0x80,0x3e,0x02,0x01,0x40,0xa0,0x01,0x80,0xc0, -0xa0,0x01,0x80,0x03,0x11,0x02,0x00,0x80,0x95,0x02,0x81,0x40,0x95,0x02,0x01,0x01, -0x37,0x02,0x80,0x00,0x06,0x02,0x81,0x40,0xb7,0x03,0x00,0x40,0x01,0x02,0x80,0x40, -0xac,0x03,0x00,0x80,0x01,0x03,0x01,0x80,0xb7,0x02,0x80,0x40,0xac,0x02,0x01,0x40, -0x38,0x01,0x81,0xff,0xa0,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0x01, -0x60,0x00,0x00,0x1e,0x27,0x3a,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d, -0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73, -0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,0x01,0x29,0x00,0x00, -0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x21, -0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75, -0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00, -0x00,0x09,0x4d,0x72,0x75,0x62,0x79,0x42,0x69,0x6e,0x64,0x00,0x00,0x0a,0x63,0x61, -0x6c,0x6c,0x5f,0x63,0x66,0x75,0x6e,0x63,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00, -0x08, -}; + const char Type::TYPE_NAME[] = "Fixnum"; const char Type::TYPE_NAME[] = "Fixnum"; @@ -200,51 +40,20 @@ mrb_value raise(mrb_state *mrb, int parameter_index, return mrb_nil_value(); } -static mrb_value call_cfunc(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oo*", &binder, &func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, mrb_voidp(func_ptr_v), args, narg); -} - -static mrb_value call_ctorfunc(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value self_v; - mrb_value new_func_ptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooo*", &binder, &self_v, &new_func_ptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - binderp(mrb, self_v, mrb_voidp(new_func_ptr_v), args, narg); - return self; +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam) { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%S': wrong number of arguments (%S for %S)", + func_name, + mrb_fixnum_value(narg), + mrb_fixnum_value(nparam)); + return mrb_nil_value(); } -static mrb_value call_imethod(mrb_state *mrb, mrb_value /*self*/) { - mrb_value binder; - mrb_value self_v; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "ooS*", &binder, &self_v, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self_v, RSTRING_PTR(method_pptr_v), args, narg); -} -static mrb_value call_smethod(mrb_state *mrb, mrb_value self) { - mrb_value binder; - mrb_value method_pptr_v; - mrb_value* args; - int narg; - mrb_get_args(mrb, "oS*", &binder, &method_pptr_v, &args, &narg); - typedef mrb_value (*BindFunc)(mrb_state*, mrb_value, void*, mrb_value*, int); - BindFunc binderp = reinterpret_cast(mrb_voidp(binder)); - return binderp(mrb, self, RSTRING_PTR(method_pptr_v), args, narg); +void +MrubyBind::mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p) +{ + mrb_define_class_method(mrb, c, mrb_sym2name(mrb, mid), NULL, MRB_ARGS_ANY()); // Dummy registration. + mrb_define_method_raw(mrb, ((RObject*)c)->c, mid, p); } MrubyBind::MrubyBind(mrb_state* mrb) : mrb_(mrb), mod_(mrb_->kernel_module) { @@ -265,26 +74,10 @@ void MrubyBind::Initialize() { RClass* mrubybind = mrb_define_module(mrb_, "MrubyBind"); if (mrb_const_defined(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind)) { - mod_mrubybind_ = mrb_const_get(mrb_, mrb_obj_value(mrb_->kernel_module), - sym_mrubybind); avoid_gc_table_ = mrb_obj_iv_get(mrb_, (RObject*)mrubybind, mrb_intern_cstr(mrb_, untouchable_table)); } else { mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); - - mod_mrubybind_ = mrb_obj_value(mrubybind); - mrb_define_module_function(mrb_, mrubybind, "call_cfunc", call_cfunc, - ARGS_REQ(2) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_ctorfunc", call_ctorfunc, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_imethod", call_imethod, - ARGS_REQ(3) | ARGS_REST()); - mrb_define_module_function(mrb_, mrubybind, "call_smethod", call_smethod, - ARGS_REQ(2) | ARGS_REST()); - mrb_irep* irep = mrb_read_irep(mrb_, binder); - if (irep != NULL) { - mrb_run(mrb_, mrb_proc_new(mrb_, irep), mrb_top_self(mrb_)); - } { avoid_gc_table_ = mrb_hash_new(mrb_); @@ -300,6 +93,46 @@ void MrubyBind::Initialize() { } } +struct RClass* MrubyBind::GetClass(const char* class_name) { + mrb_value mod = mrb_obj_value(mod_); + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + return mrb_class_ptr(klass_v); +} + +struct RClass* MrubyBind::GetClass(const char* module_name, const char* class_name) { + mrb_value mod = mrb_obj_value(mod_); + if(module_name){ + mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + } + mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); + return mrb_class_ptr(klass_v); +} + +void MrubyBind::BindInstanceMethod( + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)) { + BindInstanceMethod(NULL, + class_name, method_name, + original_func_v, + binder_func); +} + +void MrubyBind::BindInstanceMethod(const char* module_name, + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)) +{ + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); +} + MrubyRef load_string(mrb_state* mrb, std::string code) { mrubybind::MrubyArenaStore mas(mrb); diff --git a/mrubybind.h b/mrubybind.h index 58189f1..1043128 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -29,7 +29,14 @@ #include "mruby.h" #include "mruby/class.h" #include "mruby/data.h" +#include "mruby/proc.h" +#include "mruby/variable.h" //#include "mrubybind_types.h" + +#include +#include +// Describe type conversion between C type value and mruby value. + #include "mruby/string.h" #include "mruby/proc.h" #include "mruby/array.h" @@ -39,9 +46,7 @@ #include #include #include -#include #include -#define ASSERT(expr) assert(expr) namespace mrubybind { @@ -274,10 +279,19 @@ class MrubyRef{ //=========================================================================== // C <-> mruby type converter. +//template //struct Type { + // Type name used for error message. + // static const char TYPE_NAME[]; + + // Returns whether the given mrb_value can be converted into type T. //static int check(mrb_value v) = 0; - //static int get(mrb_value v) = 0; - //static mrb_value ret(mrb_state*, int i) = 0; + + // Converts mrb_value to type T value. + //static T get(mrb_value v) = 0; + + // Converts type T value to mrb_value. + //static mrb_value ret(mrb_state*, T i) = 0; //}; // Fixnum @@ -361,9 +375,9 @@ struct Type { template<> struct Type { static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_voidp_p(v); } - static void* get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_voidp(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_voidp_value(mrb, p); } + static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } }; // Function @@ -444,6 +458,12 @@ struct ClassBinder { template mrb_data_type ClassBinder::type_info = { "???", dtor }; +template +struct CustomClassBinder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + // Other Class struct TypeClassBase{ static const char TYPE_NAME[]; @@ -475,21 +495,38 @@ template std::string Type::class_name = ""; // mrb_value raise(mrb_state *mrb, int parameter_index, const char* required_type_name, mrb_value value); +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); // Includes generated template specialization. //#include "mrubybind.inc" // This file is generated from gen_template.rb #define ARG(mrb, i) Type::get(mrb, args[i]) +#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) #define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(i);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) +#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} +#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) // void f(void); template<> struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - void (*fp)(void) = (void (*)(void))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(void) = (void (*)(void))mrb_cptr(cfunc); fp(); return mrb_nil_value(); } @@ -499,9 +536,21 @@ struct Binder { template struct Binder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); - R (*fp)(void) = (R (*)(void))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(void) = (R (*)(void))mrb_cptr(cfunc); R result = fp(); return Type::ret(mrb, result); } @@ -511,14 +560,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(mrb);(void)(args);(void)(narg); - if(new_func_ptr){ - C* (*ctor)(void) = (C* (*)(void))new_func_ptr; - C* instance = ctor(); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(void) = (C* (*)(void))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(); + DATA_PTR(self) = instance; } return self; } @@ -528,11 +590,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(void); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(); return mrb_nil_value(); } @@ -542,11 +616,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(mrb);(void)(args);(void)(narg); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(void); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(); return Type::ret(mrb, result); } @@ -556,9 +642,21 @@ struct ClassBinder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - void (*fp)(P0) = (void (*)(P0))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0) = (void (*)(P0))mrb_cptr(cfunc); fp(ARG(mrb, 0)); return mrb_nil_value(); } @@ -568,9 +666,21 @@ struct Binder { template struct Binder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); - R (*fp)(P0) = (R (*)(P0))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0) = (R (*)(P0))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0)); return Type::ret(mrb, result); } @@ -580,14 +690,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); - if(new_func_ptr){ - C* (*ctor)(P0) = (C* (*)(P0))new_func_ptr; - C* instance = ctor(ARG(mrb, 0)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0) = (C* (*)(P0))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0)); + DATA_PTR(self) = instance; } return self; } @@ -597,11 +720,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0)); return mrb_nil_value(); } @@ -611,23 +746,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1); template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - void (*fp)(P0, P1) = (void (*)(P0, P1))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1)); return mrb_nil_value(); } @@ -637,9 +849,21 @@ struct Binder { template struct Binder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - R (*fp)(P0, P1) = (R (*)(P0, P1))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1)); return Type::ret(mrb, result); } @@ -649,14 +873,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); - if(new_func_ptr){ - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); + DATA_PTR(self) = instance; } return self; } @@ -666,11 +903,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); return mrb_nil_value(); } @@ -680,23 +929,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2); template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return mrb_nil_value(); } @@ -706,9 +1032,21 @@ struct Binder { template struct Binder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return Type::ret(mrb, result); } @@ -718,14 +1056,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + DATA_PTR(self) = instance; } return self; } @@ -735,11 +1086,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return mrb_nil_value(); } @@ -749,23 +1112,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3); template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return mrb_nil_value(); } @@ -775,9 +1215,21 @@ struct Binder { template struct Binder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return Type::ret(mrb, result); } @@ -787,14 +1239,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + DATA_PTR(self) = instance; } return self; } @@ -804,11 +1269,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return mrb_nil_value(); } @@ -818,23 +1295,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4); template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return mrb_nil_value(); } @@ -844,9 +1398,21 @@ struct Binder { template struct Binder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return Type::ret(mrb, result); } @@ -856,14 +1422,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + DATA_PTR(self) = instance; } return self; } @@ -873,11 +1452,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return mrb_nil_value(); } @@ -887,23 +1478,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5); template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return mrb_nil_value(); } @@ -913,9 +1581,21 @@ struct Binder { template struct Binder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return Type::ret(mrb, result); } @@ -925,14 +1605,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + DATA_PTR(self) = instance; } return self; } @@ -942,11 +1635,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return mrb_nil_value(); } @@ -956,23 +1661,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6); template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return mrb_nil_value(); } @@ -982,9 +1764,21 @@ struct Binder { template struct Binder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return Type::ret(mrb, result); } @@ -994,14 +1788,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + DATA_PTR(self) = instance; } return self; } @@ -1011,11 +1818,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return mrb_nil_value(); } @@ -1025,23 +1844,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7); template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return mrb_nil_value(); } @@ -1051,9 +1947,21 @@ struct Binder { template struct Binder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return Type::ret(mrb, result); } @@ -1063,14 +1971,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + DATA_PTR(self) = instance; } return self; } @@ -1080,11 +2001,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return mrb_nil_value(); } @@ -1094,23 +2027,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return mrb_nil_value(); } @@ -1120,9 +2130,21 @@ struct Binder { template struct Binder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return Type::ret(mrb, result); } @@ -1132,14 +2154,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + DATA_PTR(self) = instance; } return self; } @@ -1149,11 +2184,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return mrb_nil_value(); } @@ -1163,23 +2210,100 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return mrb_nil_value(); } @@ -1189,9 +2313,21 @@ struct Binder { template struct Binder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, void* func_ptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))func_ptr; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return Type::ret(mrb, result); } @@ -1201,14 +2337,27 @@ struct Binder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); - if(new_func_ptr){ - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))new_func_ptr; - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - DATA_PTR(self) = instance; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + DATA_PTR(self) = instance; } return self; } @@ -1218,11 +2367,23 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return mrb_nil_value(); } @@ -1232,23 +2393,86 @@ struct ClassBinder { template struct ClassBinder { static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self, void* method_pptr, mrb_value* args, int narg) { - (void)(narg); CHECK(0); (void)(narg); CHECK(1); (void)(narg); CHECK(2); (void)(narg); CHECK(3); (void)(narg); CHECK(4); (void)(narg); CHECK(5); (void)(narg); CHECK(6); (void)(narg); CHECK(7); (void)(narg); CHECK(8); (void)(narg); CHECK(9); + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)method_pptr; + M mp = *(M*)RSTRING_PTR(cmethod); R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); return Type::ret(mrb, result); } }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return Type::ret(mrb, result); + } +}; + + #undef ARG #undef CHECK } // namespace mrubybind -#undef ASSERT - namespace mrubybind { //=========================================================================== @@ -1268,13 +2492,16 @@ class MrubyBind { // Bind function. template void bind(const char* func_name, Func func_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value func_name_v = mrb_str_new_cstr(mrb_, func_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "define_function", 5, mod, binder, func_name_v, - func_ptr_v, nparam_v); + mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer + mrb_symbol_value(func_name_s), // 1: function name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + if (mod_ == mrb_->kernel_module) + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + else + mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); } // Bind class. @@ -1282,31 +2509,20 @@ class MrubyBind { void bind_class(const char* class_name, Func new_func_ptr) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_voidp_value(mrb_, (void*)new_func_ptr); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, - class_name_v, new_func_ptr_v, nparam_v); + BindInstanceMethod(class_name, "initialize", + mrb_cptr_value(mrb_, (void*)new_func_ptr), + ClassBinder::ctor); } // Bind class.(no new func) template void bind_class(const char* module_name, const char* class_name) { struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - mrb_value mod = mrb_obj_value(mod_); - if(module_name){ - mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); - } - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::ctor); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value new_func_ptr_v = mrb_nil_value(); - mrb_value nparam_v = mrb_fixnum_value(0); Type::class_name = class_name; - mrb_funcall(mrb_, mod_mrubybind_, "bind_class", 5, mod, binder, - class_name_v, new_func_ptr_v, nparam_v); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(module_name, class_name, "initialize", + mrb_cptr_value(mrb_, NULL), + ClassBinder::ctor); } template @@ -1318,46 +2534,42 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)ClassBinder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(ClassBinder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_instance_method", 6, - mod, binder, class_name_v, method_name_v, method_pptr_v, nparam_v); + BindInstanceMethod(class_name, method_name, + method_pptr_v, ClassBinder::call); } // Bind static method. template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { - mrb_value mod = mrb_obj_value(mod_); - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(method_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM); - mrb_funcall(mrb_, mod_mrubybind_, "bind_static_method", 6, - mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + struct RClass* klass = GetClass(class_name); + mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { - mrb_value mod = mrb_obj_value(mod_); - if(module_name){ - mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); - } - mrb_value binder = mrb_voidp_value(mrb_, (void*)Binder::call); - mrb_value class_name_v = mrb_str_new_cstr(mrb_, class_name); - mrb_value method_name_v = mrb_str_new_cstr(mrb_, method_name); - mrb_value func_ptr_v = mrb_voidp_value(mrb_, reinterpret_cast(func_ptr)); - mrb_value nparam_v = mrb_fixnum_value(Binder::NPARAM - 1); - mrb_funcall(mrb_, mod_mrubybind_, "bind_custom_method", 6, - mod, binder, class_name_v, method_name_v, func_ptr_v, nparam_v); + mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; + mrb_value original_func_v = mrb_str_new(mrb_, + reinterpret_cast(&func_ptr), + sizeof(func_ptr)); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); } template @@ -1375,8 +2587,25 @@ class MrubyBind { private: void Initialize(); + // Returns mruby class under a module. + struct RClass* GetClass(const char* class_name); + struct RClass* GetClass(const char* module_name, const char* class_name); + + // Utility for binding instance method. + void BindInstanceMethod(const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + void BindInstanceMethod(const char* module_name, + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + + // Mimic mruby API. + // TODO: Send pull request to the official mruby repository. + void + mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + mrb_state* mrb_; - mrb_value mod_mrubybind_; RClass* mod_; mrb_value avoid_gc_table_; int arena_index_; diff --git a/test/test.sh b/test/test.sh index 8daa17a..af4ff35 100755 --- a/test/test.sh +++ b/test/test.sh @@ -66,7 +66,7 @@ arena_index = 0' # Failure cases fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" -fail wrong_arg_num "ArgumentError: \`square': wrong number of arguments (2 for 1)" +fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" ################################################################ # All tests succeeded. From 01ae4809aad371eb2b7f1f7cbcfa20d36aa4def0 Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 23 Apr 2014 14:43:24 +0900 Subject: [PATCH 075/103] add module to static binding. --- codegen/mrubybind.3.h | 11 +++++++++-- mrubybind.h | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index e3556b5..5df2cc0 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -69,7 +69,7 @@ class MrubyBind { // Bind static method. template - void bind_static_method(const char* class_name, const char* method_name, + void bind_static_method(const char* module_name, const char* class_name, const char* method_name, Method method_ptr) { mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { @@ -77,10 +77,17 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - struct RClass* klass = GetClass(class_name); + struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + bind_static_method(NULL, class_name, method_name, + method_ptr); + } + // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { diff --git a/mrubybind.h b/mrubybind.h index 1043128..b2cc887 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -2543,7 +2543,7 @@ class MrubyBind { // Bind static method. template - void bind_static_method(const char* class_name, const char* method_name, + void bind_static_method(const char* module_name, const char* class_name, const char* method_name, Method method_ptr) { mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { @@ -2551,10 +2551,17 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - struct RClass* klass = GetClass(class_name); + struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + bind_static_method(NULL, class_name, method_name, + method_ptr); + } + // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { From 5b06517b6ca685afa573d74d47831403ff0a9083 Mon Sep 17 00:00:00 2001 From: dycoon Date: Thu, 24 Apr 2014 11:01:04 +0900 Subject: [PATCH 076/103] memmove check. --- codegen/gen_template.rb | 28 +++- mrubybind.h | 300 ++++++++++++++++++++++++++++++---------- 2 files changed, 246 insertions(+), 82 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index d4bed4f..66c644f 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -25,7 +25,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -49,7 +51,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -75,7 +79,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -106,7 +112,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -132,7 +140,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -162,7 +172,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -187,7 +199,9 @@ std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; diff --git a/mrubybind.h b/mrubybind.h index b2cc887..5351200 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -519,7 +519,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -543,7 +545,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -569,7 +573,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -597,7 +603,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -623,7 +631,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -649,7 +659,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -673,7 +685,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -699,7 +713,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -727,7 +743,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -753,7 +771,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -780,7 +800,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -805,7 +827,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -832,7 +856,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -856,7 +882,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -882,7 +910,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -910,7 +940,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -936,7 +968,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -963,7 +997,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -988,7 +1024,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1015,7 +1053,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1039,7 +1079,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1065,7 +1107,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1093,7 +1137,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1119,7 +1165,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1146,7 +1194,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1171,7 +1221,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1198,7 +1250,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1222,7 +1276,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1248,7 +1304,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1276,7 +1334,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1302,7 +1362,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1329,7 +1391,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1354,7 +1418,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1381,7 +1447,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1405,7 +1473,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1431,7 +1501,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1459,7 +1531,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1485,7 +1559,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1512,7 +1588,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1537,7 +1615,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1564,7 +1644,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1588,7 +1670,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1614,7 +1698,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1642,7 +1728,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1668,7 +1756,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1695,7 +1785,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1720,7 +1812,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1747,7 +1841,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1771,7 +1867,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1797,7 +1895,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1825,7 +1925,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1851,7 +1953,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1878,7 +1982,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1903,7 +2009,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1930,7 +2038,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1954,7 +2064,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -1980,7 +2092,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2008,7 +2122,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2034,7 +2150,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2061,7 +2179,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2086,7 +2206,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2113,7 +2235,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2137,7 +2261,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2163,7 +2289,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2191,7 +2319,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2217,7 +2347,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2244,7 +2376,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2269,7 +2403,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2296,7 +2432,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2320,7 +2458,9 @@ struct Binder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2346,7 +2486,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2374,7 +2516,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2400,7 +2544,9 @@ struct ClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2427,7 +2573,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; @@ -2452,7 +2600,9 @@ struct CustomClassBinder { std::vector args; mrb_get_args(mrb, "*|&", &targs, &narg, &block); args.resize(narg); - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } if(mrb_test(block)){ args.push_back(block); narg++; From 1ea9544f9231a7598268f4dd096d498d91750e7d Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 29 Apr 2014 14:55:08 +0900 Subject: [PATCH 077/103] add const. --- codegen/mrubybind_types.1.h | 6 +++--- mrubybind.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index e6c34c3..18af9b0 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -164,16 +164,16 @@ template class FuncPtr{ ~FuncPtr(){ } - std::shared_ptr >& ref(){ + const std::shared_ptr >& ref() const{ return p; } - std::function& func(){ + std::function& func() const{ if(!p.get()){ throw std::runtime_error("empty function."); } return *p.get(); } - operator bool() { + operator bool() const { if(!p.get()){ return false; } diff --git a/mrubybind.h b/mrubybind.h index 5351200..d9923fc 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -201,16 +201,16 @@ template class FuncPtr{ ~FuncPtr(){ } - std::shared_ptr >& ref(){ + const std::shared_ptr >& ref() const{ return p; } - std::function& func(){ + std::function& func() const{ if(!p.get()){ throw std::runtime_error("empty function."); } return *p.get(); } - operator bool() { + operator bool() const { if(!p.get()){ return false; } From 005bf0e21c14d0facd8302bc2315754e5fd1c1ac Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 30 Apr 2014 13:14:38 +0900 Subject: [PATCH 078/103] add living checker. --- codegen/mrubybind_types.1.h | 15 ++++++++++----- mrubybind.cc | 9 +++++++++ mrubybind.h | 15 ++++++++++----- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 18af9b0..de1f6bf 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -133,6 +133,9 @@ template class Deleter{ } ~Deleter(){ + } + mrb_state* get_mrb(){ + return mrbsp->mrb; } void operator()(T* p) const { if(mrbsp.get()){ @@ -153,13 +156,14 @@ template using obj_ptr = std::shared_ptr; //template using FuncPtr = std::shared_ptr >; template class FuncPtr{ + mrb_state* mrb; std::shared_ptr > p; public: FuncPtr(){ } templateFuncPtr(std::function* pt, D d) : p(pt, d){ - + mrb = d.get_mrb(); } ~FuncPtr(){ @@ -167,6 +171,9 @@ template class FuncPtr{ const std::shared_ptr >& ref() const{ return p; } + bool is_living() const{ + return MrubyBindStatus::is_living(mrb); + } std::function& func() const{ if(!p.get()){ throw std::runtime_error("empty function."); @@ -221,6 +228,7 @@ class MrubyRef{ MrubyRef(mrb_state* mrb, const mrb_value& v); ~MrubyRef(); + bool is_living() const; mrb_value get_v()const; bool empty() const; bool test() const; @@ -230,10 +238,7 @@ class MrubyRef{ float to_float() const; double to_double() const; - MrubyRef call(std::string name){ - MrubyArenaStore mas(mrb); - return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 0)); - } + MrubyRef call(std::string name); #include "mrubybind_call_generated.h" diff --git a/mrubybind.cc b/mrubybind.cc index aa4f5fe..4e0f3ac 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -169,6 +169,10 @@ MrubyRef::~MrubyRef(){ } +bool MrubyRef::is_living() const{ + return MrubyBindStatus::is_living(mrb); +} + mrb_value MrubyRef::get_v() const{ if(v.get()){ return *(this->v.get()); @@ -265,5 +269,10 @@ double MrubyRef::to_double() const{ } } +MrubyRef MrubyRef::call(std::string name){ + MrubyArenaStore mas(mrb); + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 0)); +} + } // namespace mrubybind diff --git a/mrubybind.h b/mrubybind.h index d9923fc..4c981e5 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -170,6 +170,9 @@ template class Deleter{ } ~Deleter(){ + } + mrb_state* get_mrb(){ + return mrbsp->mrb; } void operator()(T* p) const { if(mrbsp.get()){ @@ -190,13 +193,14 @@ template using obj_ptr = std::shared_ptr; //template using FuncPtr = std::shared_ptr >; template class FuncPtr{ + mrb_state* mrb; std::shared_ptr > p; public: FuncPtr(){ } templateFuncPtr(std::function* pt, D d) : p(pt, d){ - + mrb = d.get_mrb(); } ~FuncPtr(){ @@ -204,6 +208,9 @@ template class FuncPtr{ const std::shared_ptr >& ref() const{ return p; } + bool is_living() const{ + return MrubyBindStatus::is_living(mrb); + } std::function& func() const{ if(!p.get()){ throw std::runtime_error("empty function."); @@ -258,6 +265,7 @@ class MrubyRef{ MrubyRef(mrb_state* mrb, const mrb_value& v); ~MrubyRef(); + bool is_living() const; mrb_value get_v()const; bool empty() const; bool test() const; @@ -267,10 +275,7 @@ class MrubyRef{ float to_float() const; double to_double() const; - MrubyRef call(std::string name){ - MrubyArenaStore mas(mrb); - return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), 0)); - } + MrubyRef call(std::string name); #include "mrubybind_call_generated.h" From 92f33c0b876f3778129c954040282e6e175f5432 Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 7 May 2014 11:25:24 +0900 Subject: [PATCH 079/103] many bind arena cost get better. --- codegen/mrubybind.3.h | 7 +++ mrubybind.h | 7 +++ test/Makefile | 3 + test/many_bind.cc | 127 ++++++++++++++++++++++++++++++++++++++++++ test/test.sh | 11 ++++ 5 files changed, 155 insertions(+) create mode 100644 test/many_bind.cc diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 5df2cc0..cf086b5 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -12,12 +12,14 @@ class MrubyBind { // Bind constant value. template void bind_const(const char* name, T v) { + MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } // Bind function. template void bind(const char* func_name, Func func_ptr) { + MrubyArenaStore store(mrb_); mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer @@ -33,6 +35,7 @@ class MrubyBind { // Bind class. template void bind_class(const char* class_name, Func new_func_ptr) { + MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(class_name, "initialize", @@ -43,6 +46,7 @@ class MrubyBind { // Bind class.(no new func) template void bind_class(const char* module_name, const char* class_name) { + MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); Type::class_name = class_name; MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); @@ -60,6 +64,7 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { + MrubyArenaStore store(mrb_); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); @@ -71,6 +76,7 @@ class MrubyBind { template void bind_static_method(const char* module_name, const char* class_name, const char* method_name, Method method_ptr) { + MrubyArenaStore store(mrb_); mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer @@ -91,6 +97,7 @@ class MrubyBind { // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + MrubyArenaStore store(mrb_); mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; mrb_value original_func_v = mrb_str_new(mrb_, reinterpret_cast(&func_ptr), diff --git a/mrubybind.h b/mrubybind.h index 4c981e5..8a646e1 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -2641,12 +2641,14 @@ class MrubyBind { // Bind constant value. template void bind_const(const char* name, T v) { + MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } // Bind function. template void bind(const char* func_name, Func func_ptr) { + MrubyArenaStore store(mrb_); mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer @@ -2662,6 +2664,7 @@ class MrubyBind { // Bind class. template void bind_class(const char* class_name, Func new_func_ptr) { + MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(class_name, "initialize", @@ -2672,6 +2675,7 @@ class MrubyBind { // Bind class.(no new func) template void bind_class(const char* module_name, const char* class_name) { + MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); Type::class_name = class_name; MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); @@ -2689,6 +2693,7 @@ class MrubyBind { template void bind_instance_method(const char* class_name, const char* method_name, Method method_ptr) { + MrubyArenaStore store(mrb_); mrb_value method_pptr_v = mrb_str_new(mrb_, reinterpret_cast(&method_ptr), sizeof(method_ptr)); @@ -2700,6 +2705,7 @@ class MrubyBind { template void bind_static_method(const char* module_name, const char* class_name, const char* method_name, Method method_ptr) { + MrubyArenaStore store(mrb_); mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); mrb_value env[] = { mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer @@ -2720,6 +2726,7 @@ class MrubyBind { // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + MrubyArenaStore store(mrb_); mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; mrb_value original_func_v = mrb_str_new(mrb_, reinterpret_cast(&func_ptr), diff --git a/test/Makefile b/test/Makefile index 8a1c55b..5257d0c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -57,4 +57,7 @@ class_value: class_value.o $(MRUBYBIND_OBJ) mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) $(CXXFLAGS) +many_bind: many_bind.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(CXXFLAGS) + # diff --git a/test/many_bind.cc b/test/many_bind.cc new file mode 100644 index 0000000..509efac --- /dev/null +++ b/test/many_bind.cc @@ -0,0 +1,127 @@ + +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +class ClassValue{ +public: + int a; + mrubybind::FuncPtr block; + + ClassValue(){ + std::cout << "ClassValue construct.\n"; + a = 7; + } + + ~ClassValue(){ + std::cout << "ClassValue destruct.\n"; + } + + void decriment(){ + a--; + } + + void set_block(mrubybind::FuncPtr block){ + this->block = block; + } + + std::string call_block(){ + return block.func()(a, "test"); + } +}; + +std::shared_ptr create_class_value() +{ + return std::shared_ptr(new ClassValue()); +} + +void class_value_increment(std::shared_ptr cv) +{ + cv->a++; +} + +int class_value_get_a(std::shared_ptr cv) +{ + return cv->a; +} + +void class_value_decriment(std::shared_ptr cv) +{ + cv->decriment(); +} + +std::weak_ptr convert_to_weak_class_value(std::shared_ptr cv){ + return cv; +} + +int weak_class_value_get_a(std::weak_ptr cv) +{ + if(auto ptr = cv.lock()){ + return ptr->a; + } + return 0; +} + +void class_value_set_block(std::shared_ptr cv, mrubybind::FuncPtr block) +{ + cv->set_block(block); +} + +std::string class_value_call_block(std::shared_ptr cv) +{ + return cv->call_block(); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + int i; + for(i = 0 ; i < 100 ; i++){ + b.bind("create_class_value", create_class_value); + b.bind_class >("ClassValue"); + b.bind_class >("WeakClassValue"); + b.bind("class_value_increment", class_value_increment); + b.bind("class_value_get_a", class_value_get_a); + b.bind_custom_method(NULL, "ClassValue", "decriment", class_value_decriment); + b.bind("convert_to_weak_class_value", convert_to_weak_class_value); + b.bind("weak_class_value_get_a", weak_class_value_get_a); + b.bind_custom_method("ClassValue", "set_block", class_value_set_block); + b.bind_custom_method("ClassValue", "call_block", class_value_call_block); + } + + std::cout << "arena_index = " << mrb_gc_arena_save(mrb) << std::endl; + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, + "puts \"start ClassPointerTest\"\n" + "cv = create_class_value\n" + "puts \"cv -> #{class_value_get_a(cv)}\"\n" + "class_value_increment(cv)\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.decriment\n" + "puts \"cv -> #{class_value_get_a cv}\"\n" + "cv.set_block do |a0, a1|\n" + " a1.to_s + a0.to_s\n" + "end\n" + "puts \"cv.call_block -> #{cv.call_block}\"\n" + "wk = convert_to_weak_class_value cv\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" + "cv = nil\n" + "puts \"GC\"\n" + "GC.start\n" + "puts \"wk->#{weak_class_value_get_a wk}\"\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} \ No newline at end of file diff --git a/test/test.sh b/test/test.sh index af4ff35..7abb425 100755 --- a/test/test.sh +++ b/test/test.sh @@ -58,6 +58,17 @@ wk->7 GC ClassValue destruct. wk->0' +run many_bind 'arena_index = 2 +start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' run mruby_ref 'mruby_ref = 3test mruby_ref = 3 mruby_ref = 3toast From 53246f92c541908f480a9ec8da31b8222a875029 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 9 May 2014 14:01:23 +0900 Subject: [PATCH 080/103] CHECKSHIFT bug fixed. --- codegen/gen_template.rb | 2 +- mrubybind.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 66c644f..07c0197 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -6,7 +6,7 @@ \#define ARG(mrb, i) Type::get(mrb, args[i]) \#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) \#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -\#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(i);} +\#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} \#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) \#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} \#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) diff --git a/mrubybind.h b/mrubybind.h index 8a646e1..9ea4936 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -508,7 +508,7 @@ mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); #define ARG(mrb, i) Type::get(mrb, args[i]) #define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) #define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(i);} +#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} #define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) #define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} #define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) From db44605e9ee2096182136cbb81d448e1b1540512 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 9 May 2014 14:20:00 +0900 Subject: [PATCH 081/103] ease class type check. --- codegen/mrubybind_types.1.h | 4 ++-- mrubybind.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index de1f6bf..8b7d519 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -439,8 +439,8 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA && strcmp(mrb_obj_classname(mrb, v), class_name.c_str()) == 0; + static int check(mrb_state*, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA; } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); diff --git a/mrubybind.h b/mrubybind.h index 9ea4936..5e589ea 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -476,8 +476,8 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA && strcmp(mrb_obj_classname(mrb, v), class_name.c_str()) == 0; + static int check(mrb_state*, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA; } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); From ecf3a635e32e6c828ae0efd547e9fdec80d1424f Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 9 May 2014 16:10:51 +0900 Subject: [PATCH 082/103] class conversion check --- codegen/mrubybind.3.h | 8 ++++ codegen/mrubybind_types.1.h | 24 ++++++++++- mrubybind.h | 32 +++++++++++++- test/Makefile | 27 ++++++------ test/class_convert.cc | 84 +++++++++++++++++++++++++++++++++++++ 5 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 test/class_convert.cc diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index cf086b5..4ca3712 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -49,6 +49,7 @@ class MrubyBind { MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); Type::class_name = class_name; + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), @@ -116,6 +117,13 @@ class MrubyBind { void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { bind_custom_method(NULL, class_name, method_name, func_ptr); } + + //add convertable class pair + void add_convertable(const char* class_name_first, const char* class_name_second) + { + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); + } mrb_state* get_mrb(){ return mrb_; diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 8b7d519..26d3446 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -47,8 +47,11 @@ class MrubyBindStatus{ } struct Data{ + typedef std::map > ClassConvertableTable; + mrb_state* mrb; mrb_value avoid_gc_table; + ClassConvertableTable class_convertable_table; Data(){ @@ -65,6 +68,22 @@ class MrubyBindStatus{ return avoid_gc_table; } + void set_class_conversion(const std::string& s, const std::string& d, bool c){ + class_convertable_table[s][d] = c; + } + + bool is_convertable(const std::string& s, const std::string& d) + { + auto fs = class_convertable_table.find(s); + if(fs != class_convertable_table.end()){ + auto fd = fs->second.find(d); + if(fd != fs->second.end()){ + return fd->second; + } + } + return false; + } + }; MrubyBindStatus(){ @@ -439,8 +458,9 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state*, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); diff --git a/mrubybind.h b/mrubybind.h index 5e589ea..988ae94 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -84,8 +84,11 @@ class MrubyBindStatus{ } struct Data{ + typedef std::map > ClassConvertableTable; + mrb_state* mrb; mrb_value avoid_gc_table; + ClassConvertableTable class_convertable_table; Data(){ @@ -102,6 +105,22 @@ class MrubyBindStatus{ return avoid_gc_table; } + void set_class_conversion(const std::string& s, const std::string& d, bool c){ + class_convertable_table[s][d] = c; + } + + bool is_convertable(const std::string& s, const std::string& d) + { + auto fs = class_convertable_table.find(s); + if(fs != class_convertable_table.end()){ + auto fd = fs->second.find(d); + if(fd != fs->second.end()){ + return fd->second; + } + } + return false; + } + }; MrubyBindStatus(){ @@ -476,8 +495,9 @@ struct TypeClassBase{ template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state*, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); } static T get(mrb_state* mrb, mrb_value v) { (void)mrb; return *(T*)DATA_PTR(v); @@ -2678,6 +2698,7 @@ class MrubyBind { MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); Type::class_name = class_name; + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), @@ -2745,6 +2766,13 @@ class MrubyBind { void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { bind_custom_method(NULL, class_name, method_name, func_ptr); } + + //add convertable class pair + void add_convertable(const char* class_name_first, const char* class_name_second) + { + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); + } mrb_state* get_mrb(){ return mrb_; diff --git a/test/Makefile b/test/Makefile index 5257d0c..bf698cd 100644 --- a/test/Makefile +++ b/test/Makefile @@ -24,40 +24,43 @@ test: $(EXES) mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -c -o $@ $(INC) $(CXXFLAGS) $< -void: void.o $(MRUBYBIND_OBJ) +void: void.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) -int: int.o $(MRUBYBIND_OBJ) +int: int.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -float: float.o $(MRUBYBIND_OBJ) +float: float.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -string: string.o $(MRUBYBIND_OBJ) +string: string.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -cptr: cptr.o $(MRUBYBIND_OBJ) +cptr: cptr.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) -class: class.o $(MRUBYBIND_OBJ) +class: class.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -module: module.o $(MRUBYBIND_OBJ) +module: module.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -wrong_type: wrong_type.o $(MRUBYBIND_OBJ) +wrong_type: wrong_type.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) +wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -class_value: class_value.o $(MRUBYBIND_OBJ) +class_value: class_value.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) +mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) -many_bind: many_bind.o $(MRUBYBIND_OBJ) +many_bind: many_bind.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc + g++ -o $@ $^ $(LIB) $(CXXFLAGS) + +class_convert: class_convert.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc g++ -o $@ $^ $(LIB) $(CXXFLAGS) # diff --git a/test/class_convert.cc b/test/class_convert.cc new file mode 100644 index 0000000..971f9d6 --- /dev/null +++ b/test/class_convert.cc @@ -0,0 +1,84 @@ +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +class TA{ + int num; +public: + TA(){ + num = 1; + } + + virtual int get_num(){ + return num; + } + +}; + +class TB : public TA{ + int num2; +public: + TB(){ + num2 = 2; + } + + virtual int get_num(){ + return num2; + } + +}; + +std::shared_ptr create_a() +{ + return std::make_shared(); +} + +std::shared_ptr create_b() +{ + return std::make_shared(); +} + +int get_num_a(std::shared_ptr a) +{ + return a->get_num(); +} + +int get_num_b(std::shared_ptr b) +{ + return b->get_num(); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind_class >("TA"); + b.bind_class >("TB"); + b.bind_static_method("TA", "create", create_a); + b.bind_static_method("TB", "create", create_b); + b.bind_static_method("TA", "get_num", get_num_a); + b.bind_static_method("TB", "get_num", get_num_b); + b.add_convertable("TA", "TB"); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, + "a = TA.create\n" + "b = TB.create\n" + "puts \"TA -> a = #{TA.get_num a}\"\n" + "puts \"TB -> b = #{TB.get_num b}\"\n" + "puts \"TA -> b = #{TA.get_num b}\"\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} + From a65b7be795a855cdc44314197cd49428e18ed06c Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 3 Jun 2014 14:23:38 +0900 Subject: [PATCH 083/103] increase argment limit. test makefile bug fixed. --- codegen/gen_call_template.rb | 118 +- codegen/gen_template.rb | 572 +-- codegen/gen_types_template.rb | 164 +- mrubybind.h | 7007 ++++++++++++++++++++------------- test/Makefile | 132 +- 5 files changed, 4686 insertions(+), 3307 deletions(-) diff --git a/codegen/gen_call_template.rb b/codegen/gen_call_template.rb index a7e92b4..773e629 100644 --- a/codegen/gen_call_template.rb +++ b/codegen/gen_call_template.rb @@ -1,59 +1,59 @@ - - -MAX_PARAM = 10 - -HEADER = <::get(mrb, args[i]) -\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) - -EOD - -TMPL = <MrubyRef call(%ARGS%){ - MrubyArenaStore mas(mrb); - //%ASSERTS% - return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), %ARG_VALS%)); - } - -EOD - -FOOTER = <::ret(mrb, a#{i})"}).join(', ') - end - - table = { - '%PARAMS%' => params, - '%NPARAM%' => nparam.to_s, - '%ARGS%' => args, - '%CLASSES%' => classes, - '%ASSERTS%' => asserts, - '%ARG_VALS%' => arg_vals, - } - - return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} -end - -print HEADER -(1..MAX_PARAM).each do |nparam| - print embed_template(TMPL, nparam) -end -print FOOTER + + +MAX_PARAM = 17 + +HEADER = <::get(mrb, args[i]) +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +EOD + +TMPL = <MrubyRef call(%ARGS%){ + MrubyArenaStore mas(mrb); + //%ASSERTS% + return MrubyRef(mrb, mrb_funcall(mrb, *(this->v.get()), name.c_str(), %ARG_VALS%)); + } + +EOD + +FOOTER = <::ret(mrb, a#{i})"}).join(', ') + end + + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%CLASSES%' => classes, + '%ASSERTS%' => asserts, + '%ARG_VALS%' => arg_vals, + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +print HEADER +(1..MAX_PARAM).each do |nparam| + print embed_template(TMPL, nparam) +end +print FOOTER diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 07c0197..52016fa 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -1,286 +1,286 @@ - -MAX_PARAM = 10 - -HEADER = <::get(mrb, args[i]) -\#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) -\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -\#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} -\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) -\#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} -\#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) - -EOD - -FUNC_TMPL = < -struct Binder { - static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_cptr(cfunc); - fp(%ARGS%); - return mrb_nil_value(); - } -}; - -// R f(%PARAMS%); -template -struct Binder { - static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_cptr(cfunc); - R result = fp(%ARGS%); - return Type::ret(mrb, result); - } -}; - -// C* ctor(%PARAMS%); -template -struct ClassBinder { - static const int NPARAM = %NPARAM%; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(%ARGS%); - DATA_PTR(self) = instance; - } - return self; - } -}; - -EOD - -METHOD_TMPL = < -struct ClassBinder { - static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(%PARAMS%); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(%ARGS%); - return mrb_nil_value(); - } -}; - -// class C { R f(%PARAMS%) }; -template -struct ClassBinder { - static const int NPARAM = %NPARAM%; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(%PARAMS%); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(%ARGS%); - return Type::ret(mrb, result); - } -}; - -EOD - -CUSTOM_METHOD_TMPL = < -struct CustomClassBinder { - static const int NPARAM = %NPARAM% - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(%PARAMS%); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance%ARGS1%); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = %NPARAM% - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - %ASSERTS% - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(%PARAMS%); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance%ARGS1%); - return Type::ret(mrb, result); - } -}; - - -EOD - -FOOTER = < params, - '%NPARAM%' => nparam.to_s, - '%ARGS%' => args, - '%CLASSES0%' => classes, - '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, - '%ASSERTS%' => 'CHECKNARG(narg);' + asserts - } - - return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} -end - -def embed_template_custom(str, nparam) - if nparam == 0 - params = 'void' - args = '' - classes = '' - asserts = '' - else - params = (0...nparam).map {|i| "P#{i}"}.join(', ') - args = (1...nparam).map {|i| "ARGSHIFT(mrb, #{i}, #{i - 1})"}.join(', ') - classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') - asserts = (1...nparam).map {|i| " CHECKSHIFT(#{i}, #{i - 1});"}.join('') - end - - table = { - '%PARAMS%' => params, - '%NPARAM%' => nparam.to_s, - '%ARGS%' => args, - '%ARGS1%' => args.empty? ? '' : ', ' + args, - '%CLASSES0%' => classes, - '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, - '%ASSERTS%' => 'CHECKNARG(narg);' + asserts - } - - return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} -end - -print HEADER -(0..MAX_PARAM).each do |nparam| - print embed_template(FUNC_TMPL, nparam) - print embed_template(METHOD_TMPL, nparam) - print embed_template_custom(CUSTOM_METHOD_TMPL, nparam) if nparam != 0 -end -print FOOTER - -# + +MAX_PARAM = 17 + +HEADER = <::get(mrb, args[i]) +\#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +\#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) +\#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} +\#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) + +EOD + +FUNC_TMPL = < +struct Binder { + static const int NPARAM = %NPARAM%; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(%PARAMS%) = (void (*)(%PARAMS%))mrb_cptr(cfunc); + fp(%ARGS%); + return mrb_nil_value(); + } +}; + +// R f(%PARAMS%); +template +struct Binder { + static const int NPARAM = %NPARAM%; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(%PARAMS%) = (R (*)(%PARAMS%))mrb_cptr(cfunc); + R result = fp(%ARGS%); + return Type::ret(mrb, result); + } +}; + +// C* ctor(%PARAMS%); +template +struct ClassBinder { + static const int NPARAM = %NPARAM%; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(%PARAMS%) = (C* (*)(%PARAMS%))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(%ARGS%); + DATA_PTR(self) = instance; + } + return self; + } +}; + +EOD + +METHOD_TMPL = < +struct ClassBinder { + static const int NPARAM = %NPARAM%; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(%ARGS%); + return mrb_nil_value(); + } +}; + +// class C { R f(%PARAMS%) }; +template +struct ClassBinder { + static const int NPARAM = %NPARAM%; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(%ARGS%); + return Type::ret(mrb, result); + } +}; + +EOD + +CUSTOM_METHOD_TMPL = < +struct CustomClassBinder { + static const int NPARAM = %NPARAM% - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance%ARGS1%); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = %NPARAM% - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + %ASSERTS% + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(%PARAMS%); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance%ARGS1%); + return Type::ret(mrb, result); + } +}; + + +EOD + +FOOTER = < params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%CLASSES0%' => classes, + '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, + '%ASSERTS%' => 'CHECKNARG(narg);' + asserts + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +def embed_template_custom(str, nparam) + if nparam == 0 + params = 'void' + args = '' + classes = '' + asserts = '' + else + params = (0...nparam).map {|i| "P#{i}"}.join(', ') + args = (1...nparam).map {|i| "ARGSHIFT(mrb, #{i}, #{i - 1})"}.join(', ') + classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') + asserts = (1...nparam).map {|i| " CHECKSHIFT(#{i}, #{i - 1});"}.join('') + end + + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%ARGS1%' => args.empty? ? '' : ', ' + args, + '%CLASSES0%' => classes, + '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, + '%ASSERTS%' => 'CHECKNARG(narg);' + asserts + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +print HEADER +(0..MAX_PARAM).each do |nparam| + print embed_template(FUNC_TMPL, nparam) + print embed_template(METHOD_TMPL, nparam) + print embed_template_custom(CUSTOM_METHOD_TMPL, nparam) if nparam != 0 +end +print FOOTER + +# diff --git a/codegen/gen_types_template.rb b/codegen/gen_types_template.rb index 8bdde0b..905c90b 100644 --- a/codegen/gen_types_template.rb +++ b/codegen/gen_types_template.rb @@ -1,82 +1,82 @@ - -MAX_PARAM = 10 - -HEADER = <::get(mrb, args[i]) -\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) - -EOD - -TYPE_TMPL = < -struct Type > : public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](%ARGS%){ - MrubyArenaStore mas(mrb); - mrb_value a[] = {%ARG_VALS%}; - return Type::get(mrb, mrb_yield_argv(mrb, v, %NPARAM%, a)); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -// callback void(%PARAMS%) -template<%CLASSES%> -struct Type > : public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](%ARGS%){ - MrubyArenaStore mas(mrb); - mrb_value a[] = {%ARG_VALS%}; - mrb_yield_argv(mrb, v, %NPARAM%, a); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -EOD - - -FOOTER = <::ret(mrb, a#{i})"}.join(', ') - args = (0...nparam).map {|i| "P#{i} a#{i}"}.join(', ') - - table = { - '%PARAMS%' => params, - '%NPARAM%' => nparam.to_s, - '%ARG_VALS%' => arg_vals, - '%CLASSES%' => classes, - '%ARGS%' => args, - } - - return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} -end - -print HEADER -(1..MAX_PARAM).each do |nparam| - print embed_template(TYPE_TMPL, nparam) -end -print FOOTER - + +MAX_PARAM = 17 + +HEADER = <::get(mrb, args[i]) +\#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +\#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) + +EOD + +TYPE_TMPL = < +struct Type > : public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](%ARGS%){ + MrubyArenaStore mas(mrb); + mrb_value a[] = {%ARG_VALS%}; + return Type::get(mrb, mrb_yield_argv(mrb, v, %NPARAM%, a)); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// callback void(%PARAMS%) +template<%CLASSES%> +struct Type > : public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](%ARGS%){ + MrubyArenaStore mas(mrb); + mrb_value a[] = {%ARG_VALS%}; + mrb_yield_argv(mrb, v, %NPARAM%, a); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +EOD + + +FOOTER = <::ret(mrb, a#{i})"}.join(', ') + args = (0...nparam).map {|i| "P#{i} a#{i}"}.join(', ') + + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARG_VALS%' => arg_vals, + '%CLASSES%' => classes, + '%ARGS%' => args, + } + + return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} +end + +print HEADER +(1..MAX_PARAM).each do |nparam| + print embed_template(TYPE_TMPL, nparam) +end +print FOOTER + diff --git a/mrubybind.h b/mrubybind.h index 988ae94..8965bf1 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,2815 +1,4194 @@ // Do not modify this file directly, this is generated -/** - * mrubybind - Binding library for mruby/C++ - * - * Usage: - * 1. Prepare a function which you want to call from mruby: - * > int square(int x) { return x * x; } - * - * 2. Create MrubyBind instance: - * > MrubyBind b(mirb) - * - * 3. Bind a function: - * > b.bind("square", square); - * - * 4. You can call it from mruby: - * > puts square(1111) #=> 1234321 - * - * There are other methods to bind constant/class/instance method in - * MrubyBind. Please see the definition of MrubyBind - * (the bottom of this file), or README. - */ -#ifndef __MRUBYBIND_H__ -#define __MRUBYBIND_H__ - -#ifndef __cplusplus -#error mrubybind can be used from C++ only. -#endif - -#include "mruby.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/proc.h" -#include "mruby/variable.h" -//#include "mrubybind_types.h" - -#include -#include -// Describe type conversion between C type value and mruby value. - -#include "mruby/string.h" -#include "mruby/proc.h" -#include "mruby/array.h" -#include "mruby/hash.h" -#include "mruby/variable.h" -#include -#include -#include -#include -#include - -namespace mrubybind { - -extern const char* untouchable_table; -extern const char* untouchable_object; - -class MrubyArenaStore{ - mrb_state* mrb; - int ai; -public: - MrubyArenaStore(mrb_state* mrb) - { - this->mrb = mrb; - this->ai = mrb_gc_arena_save(mrb); - } - - ~MrubyArenaStore() - { - mrb_gc_arena_restore(mrb, ai); - } - -}; - -class MrubyBindStatus{ - -public: - - struct Data; - typedef std::shared_ptr Data_ptr; - typedef std::map Table; - - static Table& get_living_table(){ - static Table table; - return table; - } - - struct Data{ - typedef std::map > ClassConvertableTable; - - mrb_state* mrb; - mrb_value avoid_gc_table; - ClassConvertableTable class_convertable_table; - - Data(){ - - } - ~Data(){ - - } - - mrb_state* get_mrb(){ - return mrb; - } - - mrb_value get_avoid_gc_table(){ - return avoid_gc_table; - } - - void set_class_conversion(const std::string& s, const std::string& d, bool c){ - class_convertable_table[s][d] = c; - } - - bool is_convertable(const std::string& s, const std::string& d) - { - auto fs = class_convertable_table.find(s); - if(fs != class_convertable_table.end()){ - auto fd = fs->second.find(d); - if(fd != fs->second.end()){ - return fd->second; - } - } - return false; - } - - }; - - MrubyBindStatus(){ - - } - - MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ - - Table& living_table = get_living_table(); - data = std::make_shared(); - data->mrb = mrb; - data->avoid_gc_table = avoid_gc_table; - living_table[mrb] = data; - } - - ~MrubyBindStatus(){ - - Table& living_table = MrubyBindStatus::get_living_table(); - living_table.erase(data->mrb); - data->mrb = NULL; - - } - - static bool is_living(mrb_state* mrb){ - Table& living_table = get_living_table(); - if(living_table.find(mrb) != living_table.end()){ - return living_table[mrb].get(); - } - return false; - } - - static Data_ptr search(mrb_state* mrb){ - Table& living_table = get_living_table(); - if(living_table.find(mrb) != living_table.end()){ - return living_table[mrb]; - } - return Data_ptr(NULL); - } - - - -private: - std::shared_ptr data; -}; - -template class Deleter{ - MrubyBindStatus::Data_ptr mrbsp; - mrb_value v_; -public: - Deleter() - { - - } - - Deleter(mrb_state* mrb, mrb_value v){ - mrbsp = MrubyBindStatus::search(mrb); - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); - if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ - mrb_value a = mrb_ary_new(mrb); - mrb_ary_push(mrb, a, v); - v = a; - } - mrb_hash_set(mrb, avoid_gc_table, v, v); - v_ = v; - } - ~Deleter(){ - - } - mrb_state* get_mrb(){ - return mrbsp->mrb; - } - void operator()(T* p) const { - if(mrbsp.get()){ - mrb_state* mrb = mrbsp->get_mrb(); - if(mrb){ - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_hash_delete_key(mrb, avoid_gc_table, v_); - } - } - if(p){ - delete p; - } - } - -}; - -template using obj_ptr = std::shared_ptr; -//template using FuncPtr = std::shared_ptr >; - -template class FuncPtr{ - mrb_state* mrb; - std::shared_ptr > p; -public: - FuncPtr(){ - - } - templateFuncPtr(std::function* pt, D d) : p(pt, d){ - mrb = d.get_mrb(); - } - ~FuncPtr(){ - - } - const std::shared_ptr >& ref() const{ - return p; - } - bool is_living() const{ - return MrubyBindStatus::is_living(mrb); - } - std::function& func() const{ - if(!p.get()){ - throw std::runtime_error("empty function."); - } - return *p.get(); - } - operator bool() const { - if(!p.get()){ - return false; - } - return (bool)*p.get(); - } - void reset(){ - p.reset(); - } - template void reset(Y* y){ - p.reset(y); - } - template void reset(Y* y, D d){ - p.reset(y, d); - } - template void reset(Y* y, D d, A a){ - p.reset(y, d, a); - } -}; - -template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ - return Deleter(mrb, v); -} - -template obj_ptr make_obj_ptr(Deleter d, T t){ - T* pt = new T(); - *pt = t; - return obj_ptr(pt, d); -} - -template FuncPtr make_FuncPtr(Deleter > d, std::function t){ - std::function* pt = new std::function(); - *pt = t; - return FuncPtr(pt, d); -} - -template -struct Type; - -class MrubyRef{ - mrb_state* mrb; - std::shared_ptr v; -public: - - MrubyRef(); - MrubyRef(mrb_state* mrb, const mrb_value& v); - ~MrubyRef(); - - bool is_living() const; - mrb_value get_v()const; - bool empty() const; - bool test() const; - bool obj_equal(const MrubyRef& r) const; - std::string to_s() const; - int to_i() const; - float to_float() const; - double to_double() const; - - MrubyRef call(std::string name); - -#include "mrubybind_call_generated.h" - -}; - -//=========================================================================== -// C <-> mruby type converter. - -//template -//struct Type { - // Type name used for error message. - // static const char TYPE_NAME[]; - - // Returns whether the given mrb_value can be converted into type T. - //static int check(mrb_value v) = 0; - - // Converts mrb_value to type T value. - //static T get(mrb_value v) = 0; - - // Converts type T value to mrb_value. - //static mrb_value ret(mrb_state*, T i) = 0; -//}; - -// Fixnum -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } - static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } - static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } -}; - -// float -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } -}; - -// double -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } -}; - -// String -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } - static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -// Boolean -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value /*v*/) { return 1; } - static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } - static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } -}; - -// Raw pointer -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } - static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } -}; - -// Function -struct TypeFuncBase{ - static const char TYPE_NAME[]; -}; - -template -struct Type > :public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](){ - MrubyArenaStore mas(mrb); - return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -template<> -struct Type > :public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](){ - MrubyArenaStore mas(mrb); - mrb_yield(mrb, v, mrb_nil_value()); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -// mruby value -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value) { return 1; } - static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } - static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } -}; - - -#include "mrubybind_types_generated.h" - -//=========================================================================== -// Binder - -// Template class for Binder. -// Binder template class is specialized with type. -template -struct Binder { - // Template specialization. - //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; -}; - -// Template class for Binder. -// Binder template class is specialized with type. -template -struct ClassBinder { - static struct mrb_data_type type_info; - static void dtor(mrb_state*, void* p) { - C* instance = static_cast(p); - delete instance; - } - - // Template specialization. - //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { -}; -template -mrb_data_type ClassBinder::type_info = { "???", dtor }; - -template -struct CustomClassBinder { - // Template specialization. - //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; -}; - -// Other Class -struct TypeClassBase{ - static const char TYPE_NAME[]; -}; - -template struct Type :public TypeClassBase { - static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA && - MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); - } - static T get(mrb_state* mrb, mrb_value v) { - (void)mrb; return *(T*)DATA_PTR(v); - } - static mrb_value ret(mrb_state* mrb, T t) { - RClass* cls; - mrb_value v; - cls = mrb_class_get(mrb, class_name.c_str()); - v = mrb_class_new_instance(mrb, 0, NULL, cls); - DATA_TYPE(v) = &ClassBinder::type_info; - T* nt = new T(); - *nt = t; - DATA_PTR(v) = nt; - return v; - } -}; - -template std::string Type::class_name = ""; - -// -mrb_value raise(mrb_state *mrb, int parameter_index, - const char* required_type_name, mrb_value value); -mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); - -// Includes generated template specialization. -//#include "mrubybind.inc" -// This file is generated from gen_template.rb -#define ARG(mrb, i) Type::get(mrb, args[i]) -#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) -#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} -#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} -#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) -#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} -#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) - -// void f(void); -template<> -struct Binder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(void) = (void (*)(void))mrb_cptr(cfunc); - fp(); - return mrb_nil_value(); - } -}; - -// R f(void); -template -struct Binder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(void) = (R (*)(void))mrb_cptr(cfunc); - R result = fp(); - return Type::ret(mrb, result); - } -}; - -// C* ctor(void); -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(void) = (C* (*)(void))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(void) }; -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(void); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(); - return mrb_nil_value(); - } -}; - -// class C { R f(void) }; -template -struct ClassBinder { - static const int NPARAM = 0; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(void); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(); - return Type::ret(mrb, result); - } -}; - -// void f(P0); -template -struct Binder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0) = (void (*)(P0))mrb_cptr(cfunc); - fp(ARG(mrb, 0)); - return mrb_nil_value(); - } -}; - -// R f(P0); -template -struct Binder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0) = (R (*)(P0))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0); -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0) = (C* (*)(P0))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0) }; -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0) }; -template -struct ClassBinder { - static const int NPARAM = 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 1 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 1 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1); -template -struct Binder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1); -template -struct Binder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1); -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1) }; -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1) }; -template -struct ClassBinder { - static const int NPARAM = 2; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 2 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 2 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2); -template -struct Binder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2); -template -struct Binder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2); -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2) }; -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2) }; -template -struct ClassBinder { - static const int NPARAM = 3; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 3 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 3 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3); -template -struct Binder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3); -template -struct Binder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3); -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3) }; -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3) }; -template -struct ClassBinder { - static const int NPARAM = 4; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 4 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 4 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4); -template -struct Binder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4); -template -struct Binder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4); -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4) }; -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4) }; -template -struct ClassBinder { - static const int NPARAM = 5; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 5 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 5 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5); -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5) }; -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5) }; -template -struct ClassBinder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 6 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 6 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4, P5, P6); -template -struct Binder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6); -template -struct Binder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6); -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; -template -struct ClassBinder { - static const int NPARAM = 7; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 7 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 7 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5, P6); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct Binder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct Binder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; -template -struct ClassBinder { - static const int NPARAM = 8; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 8 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 8 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct Binder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct Binder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; -template -struct ClassBinder { - static const int NPARAM = 9; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 9 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 9 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); - return Type::ret(mrb, result); - } -}; - - -// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct Binder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - return mrb_nil_value(); - } -}; - -// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct Binder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - return Type::ret(mrb, result); - } -}; - -// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { - DATA_TYPE(self) = &ClassBinder::type_info; - DATA_PTR(self) = NULL; - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); - if(ctor) - { - C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - DATA_PTR(self) = instance; - } - return self; - } -}; - -// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - return mrb_nil_value(); - } -}; - -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; -template -struct ClassBinder { - static const int NPARAM = 10; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); - C* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); - return Type::ret(mrb, result); - } -}; - - -// custom method -template -struct CustomClassBinder { - static const int NPARAM = 10 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); - return mrb_nil_value(); - } -}; - -template -struct CustomClassBinder { - static const int NPARAM = 10 - 1; - static mrb_value call(mrb_state* mrb, mrb_value self) { - mrb_value* targs; - int narg; - mrb_value block = mrb_nil_value(); - std::vector args; - mrb_get_args(mrb, "*|&", &targs, &narg, &block); - args.resize(narg); - if(narg > 0){ - ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); - } - if(mrb_test(block)){ - args.push_back(block); - narg++; - } - CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); - P0* instance = static_cast(DATA_PTR(self)); - mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); - M mp = *(M*)RSTRING_PTR(cmethod); - R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); - return Type::ret(mrb, result); - } -}; - - -#undef ARG -#undef CHECK - -} // namespace mrubybind - -namespace mrubybind { - -//=========================================================================== -// MrubyBind - utility class for binding C functions/classes to mruby. -class MrubyBind { -public: - MrubyBind(mrb_state* mrb); - MrubyBind(mrb_state* mrb, RClass* mod); - ~MrubyBind(); - - // Bind constant value. - template - void bind_const(const char* name, T v) { - MrubyArenaStore store(mrb_); - mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); - } - - // Bind function. - template - void bind(const char* func_name, Func func_ptr) { - MrubyArenaStore store(mrb_); - mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer - mrb_symbol_value(func_name_s), // 1: function name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - if (mod_ == mrb_->kernel_module) - mrb_define_method_raw(mrb_, mod_, func_name_s, proc); - else - mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); - } - - // Bind class. - template - void bind_class(const char* class_name, Func new_func_ptr) { - MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - BindInstanceMethod(class_name, "initialize", - mrb_cptr_value(mrb_, (void*)new_func_ptr), - ClassBinder::ctor); - } - - // Bind class.(no new func) - template - void bind_class(const char* module_name, const char* class_name) { - MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - Type::class_name = class_name; - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - BindInstanceMethod(module_name, class_name, "initialize", - mrb_cptr_value(mrb_, NULL), - ClassBinder::ctor); - } - - template - void bind_class(const char* class_name) { - bind_class(NULL, class_name); - } - - // Bind instance method. - template - void bind_instance_method(const char* class_name, const char* method_name, - Method method_ptr) { - MrubyArenaStore store(mrb_); - mrb_value method_pptr_v = mrb_str_new(mrb_, - reinterpret_cast(&method_ptr), - sizeof(method_ptr)); - BindInstanceMethod(class_name, method_name, - method_pptr_v, ClassBinder::call); - } - - // Bind static method. - template - void bind_static_method(const char* module_name, const char* class_name, const char* method_name, - Method method_ptr) { - MrubyArenaStore store(mrb_); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - struct RClass* klass = GetClass(module_name, class_name); - mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); - } - - template - void bind_static_method(const char* class_name, const char* method_name, - Method method_ptr) { - bind_static_method(NULL, class_name, method_name, - method_ptr); - } - - // Bind custom method. - template - void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { - MrubyArenaStore store(mrb_); - mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; - mrb_value original_func_v = mrb_str_new(mrb_, - reinterpret_cast(&func_ptr), - sizeof(func_ptr)); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - original_func_v, // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - struct RClass* klass = GetClass(module_name, class_name); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); - } - - template - void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { - bind_custom_method(NULL, class_name, method_name, func_ptr); - } - - //add convertable class pair - void add_convertable(const char* class_name_first, const char* class_name_second) - { - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); - } - - mrb_state* get_mrb(){ - return mrb_; - } - mrb_value get_avoid_gc_table(){ - return avoid_gc_table_; - } - -private: - void Initialize(); - - // Returns mruby class under a module. - struct RClass* GetClass(const char* class_name); - struct RClass* GetClass(const char* module_name, const char* class_name); - - // Utility for binding instance method. - void BindInstanceMethod(const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)); - void BindInstanceMethod(const char* module_name, - const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)); - - // Mimic mruby API. - // TODO: Send pull request to the official mruby repository. - void - mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); - - mrb_state* mrb_; - RClass* mod_; - mrb_value avoid_gc_table_; - int arena_index_; -}; - -MrubyRef load_string(mrb_state* mrb, std::string code); - -} // namespace mrubybind - -#endif +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ +#ifndef __MRUBYBIND_H__ +#define __MRUBYBIND_H__ + +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" +#include "mruby/proc.h" +#include "mruby/variable.h" +//#include "mrubybind_types.h" + +#include +#include +// Describe type conversion between C type value and mruby value. + +#include "mruby/string.h" +#include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/hash.h" +#include "mruby/variable.h" +#include +#include +#include +#include +#include + +namespace mrubybind { + +extern const char* untouchable_table; +extern const char* untouchable_object; + +class MrubyArenaStore{ + mrb_state* mrb; + int ai; +public: + MrubyArenaStore(mrb_state* mrb) + { + this->mrb = mrb; + this->ai = mrb_gc_arena_save(mrb); + } + + ~MrubyArenaStore() + { + mrb_gc_arena_restore(mrb, ai); + } + +}; + +class MrubyBindStatus{ + +public: + + struct Data; + typedef std::shared_ptr Data_ptr; + typedef std::map Table; + + static Table& get_living_table(){ + static Table table; + return table; + } + + struct Data{ + typedef std::map > ClassConvertableTable; + + mrb_state* mrb; + mrb_value avoid_gc_table; + ClassConvertableTable class_convertable_table; + + Data(){ + + } + ~Data(){ + + } + + mrb_state* get_mrb(){ + return mrb; + } + + mrb_value get_avoid_gc_table(){ + return avoid_gc_table; + } + + void set_class_conversion(const std::string& s, const std::string& d, bool c){ + class_convertable_table[s][d] = c; + } + + bool is_convertable(const std::string& s, const std::string& d) + { + auto fs = class_convertable_table.find(s); + if(fs != class_convertable_table.end()){ + auto fd = fs->second.find(d); + if(fd != fs->second.end()){ + return fd->second; + } + } + return false; + } + + }; + + MrubyBindStatus(){ + + } + + MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ + + Table& living_table = get_living_table(); + data = std::make_shared(); + data->mrb = mrb; + data->avoid_gc_table = avoid_gc_table; + living_table[mrb] = data; + } + + ~MrubyBindStatus(){ + + Table& living_table = MrubyBindStatus::get_living_table(); + living_table.erase(data->mrb); + data->mrb = NULL; + + } + + static bool is_living(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb].get(); + } + return false; + } + + static Data_ptr search(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb]; + } + return Data_ptr(NULL); + } + + + +private: + std::shared_ptr data; +}; + +template class Deleter{ + MrubyBindStatus::Data_ptr mrbsp; + mrb_value v_; +public: + Deleter() + { + + } + + Deleter(mrb_state* mrb, mrb_value v){ + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + mrb_value a = mrb_ary_new(mrb); + mrb_ary_push(mrb, a, v); + v = a; + } + mrb_hash_set(mrb, avoid_gc_table, v, v); + v_ = v; + } + ~Deleter(){ + + } + mrb_state* get_mrb(){ + return mrbsp->mrb; + } + void operator()(T* p) const { + if(mrbsp.get()){ + mrb_state* mrb = mrbsp->get_mrb(); + if(mrb){ + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + } + if(p){ + delete p; + } + } + +}; + +template using obj_ptr = std::shared_ptr; +//template using FuncPtr = std::shared_ptr >; + +template class FuncPtr{ + mrb_state* mrb; + std::shared_ptr > p; +public: + FuncPtr(){ + + } + templateFuncPtr(std::function* pt, D d) : p(pt, d){ + mrb = d.get_mrb(); + } + ~FuncPtr(){ + + } + const std::shared_ptr >& ref() const{ + return p; + } + bool is_living() const{ + return MrubyBindStatus::is_living(mrb); + } + std::function& func() const{ + if(!p.get()){ + throw std::runtime_error("empty function."); + } + return *p.get(); + } + operator bool() const { + if(!p.get()){ + return false; + } + return (bool)*p.get(); + } + void reset(){ + p.reset(); + } + template void reset(Y* y){ + p.reset(y); + } + template void reset(Y* y, D d){ + p.reset(y, d); + } + template void reset(Y* y, D d, A a){ + p.reset(y, d, a); + } +}; + +template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ + return Deleter(mrb, v); +} + +template obj_ptr make_obj_ptr(Deleter d, T t){ + T* pt = new T(); + *pt = t; + return obj_ptr(pt, d); +} + +template FuncPtr make_FuncPtr(Deleter > d, std::function t){ + std::function* pt = new std::function(); + *pt = t; + return FuncPtr(pt, d); +} + +template +struct Type; + +class MrubyRef{ + mrb_state* mrb; + std::shared_ptr v; +public: + + MrubyRef(); + MrubyRef(mrb_state* mrb, const mrb_value& v); + ~MrubyRef(); + + bool is_living() const; + mrb_value get_v()const; + bool empty() const; + bool test() const; + bool obj_equal(const MrubyRef& r) const; + std::string to_s() const; + int to_i() const; + float to_float() const; + double to_double() const; + + MrubyRef call(std::string name); + +#include "mrubybind_call_generated.h" + +}; + +//=========================================================================== +// C <-> mruby type converter. + +//template +//struct Type { + // Type name used for error message. + // static const char TYPE_NAME[]; + + // Returns whether the given mrb_value can be converted into type T. + //static int check(mrb_value v) = 0; + + // Converts mrb_value to type T value. + //static T get(mrb_value v) = 0; + + // Converts type T value to mrb_value. + //static mrb_value ret(mrb_state*, T i) = 0; +//}; + +// Fixnum +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } +}; + +// float +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } +}; + +// double +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } +}; + +// String +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } + static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +// Boolean +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value /*v*/) { return 1; } + static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } + static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } +}; + +// Raw pointer +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } +}; + +// Function +struct TypeFuncBase{ + static const char TYPE_NAME[]; +}; + +template +struct Type > :public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +template<> +struct Type > :public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + mrb_yield(mrb, v, mrb_nil_value()); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// mruby value +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value) { return 1; } + static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } + static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } +}; + + +#include "mrubybind_types_generated.h" + +//=========================================================================== +// Binder + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct Binder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct ClassBinder { + static struct mrb_data_type type_info; + static void dtor(mrb_state*, void* p) { + C* instance = static_cast(p); + delete instance; + } + + // Template specialization. + //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { +}; +template +mrb_data_type ClassBinder::type_info = { "???", dtor }; + +template +struct CustomClassBinder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + +// Other Class +struct TypeClassBase{ + static const char TYPE_NAME[]; +}; + +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + } + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + +// +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value); +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); + +// Includes generated template specialization. +//#include "mrubybind.inc" +// This file is generated from gen_template.rb +#define ARG(mrb, i) Type::get(mrb, args[i]) +#define ARGSHIFT(mrb, i, j) Type::get(mrb, args[j]) +#define CHECK(i) {if(!Type::check(mrb, args[i])) return RAISE(i);} +#define CHECKSHIFT(i, j) {if(!Type::check(mrb, args[j])) return RAISE(j);} +#define RAISE(i) raise(mrb, i, Type::TYPE_NAME, args[i]) +#define CHECKNARG(narg) {if(narg != NPARAM) RAISENARG(narg);} +#define RAISENARG(narg) raisenarg(mrb, mrb_cfunc_env_get(mrb, 1), narg, NPARAM) + +// void f(void); +template<> +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(void) = (void (*)(void))mrb_cptr(cfunc); + fp(); + return mrb_nil_value(); + } +}; + +// R f(void); +template +struct Binder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(void) = (R (*)(void))mrb_cptr(cfunc); + R result = fp(); + return Type::ret(mrb, result); + } +}; + +// C* ctor(void); +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(void) = (C* (*)(void))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(void); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(); + return mrb_nil_value(); + } +}; + +// class C { R f(void) }; +template +struct ClassBinder { + static const int NPARAM = 0; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(void); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(); + return Type::ret(mrb, result); + } +}; + +// void f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0) = (void (*)(P0))mrb_cptr(cfunc); + fp(ARG(mrb, 0)); + return mrb_nil_value(); + } +}; + +// R f(P0); +template +struct Binder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0) = (R (*)(P0))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0); +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0) = (C* (*)(P0))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0) }; +template +struct ClassBinder { + static const int NPARAM = 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1) = (void (*)(P0, P1))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1); +template +struct Binder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1) = (R (*)(P0, P1))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1); +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1) = (C* (*)(P0, P1))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1) }; +template +struct ClassBinder { + static const int NPARAM = 2; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2) = (void (*)(P0, P1, P2))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2); +template +struct Binder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2) = (R (*)(P0, P1, P2))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2); +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2) = (C* (*)(P0, P1, P2))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2) }; +template +struct ClassBinder { + static const int NPARAM = 3; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3) = (void (*)(P0, P1, P2, P3))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3); +template +struct Binder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3) = (R (*)(P0, P1, P2, P3))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3); +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3) = (C* (*)(P0, P1, P2, P3))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3) }; +template +struct ClassBinder { + static const int NPARAM = 4; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4) = (void (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4); +template +struct Binder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4) = (R (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4); +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4) = (C* (*)(P0, P1, P2, P3, P4))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4) }; +template +struct ClassBinder { + static const int NPARAM = 5; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5); +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5) = (C* (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5) }; +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6) = (void (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6); +template +struct Binder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6) = (R (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6); +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6) = (C* (*)(P0, P1, P2, P3, P4, P5, P6))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6) }; +template +struct ClassBinder { + static const int NPARAM = 7; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct Binder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7); +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7) }; +template +struct ClassBinder { + static const int NPARAM = 8; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct Binder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8); +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8) }; +template +struct ClassBinder { + static const int NPARAM = 9; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct Binder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9) }; +template +struct ClassBinder { + static const int NPARAM = 10; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); +template +struct Binder { + static const int NPARAM = 11; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); +template +struct Binder { + static const int NPARAM = 11; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); +template +struct ClassBinder { + static const int NPARAM = 11; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) }; +template +struct ClassBinder { + static const int NPARAM = 11; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) }; +template +struct ClassBinder { + static const int NPARAM = 11; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 11 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 11 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); +template +struct Binder { + static const int NPARAM = 12; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); +template +struct Binder { + static const int NPARAM = 12; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); +template +struct ClassBinder { + static const int NPARAM = 12; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) }; +template +struct ClassBinder { + static const int NPARAM = 12; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) }; +template +struct ClassBinder { + static const int NPARAM = 12; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 12 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 12 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); +template +struct Binder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); +template +struct Binder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); +template +struct ClassBinder { + static const int NPARAM = 13; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) }; +template +struct ClassBinder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) }; +template +struct ClassBinder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 13 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 13 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); +template +struct Binder { + static const int NPARAM = 14; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); +template +struct Binder { + static const int NPARAM = 14; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); +template +struct ClassBinder { + static const int NPARAM = 14; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) }; +template +struct ClassBinder { + static const int NPARAM = 14; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) }; +template +struct ClassBinder { + static const int NPARAM = 14; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 14 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 14 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); +template +struct Binder { + static const int NPARAM = 15; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); +template +struct Binder { + static const int NPARAM = 15; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); +template +struct ClassBinder { + static const int NPARAM = 15; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14) }; +template +struct ClassBinder { + static const int NPARAM = 15; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14) }; +template +struct ClassBinder { + static const int NPARAM = 15; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 15 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 15 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); +template +struct Binder { + static const int NPARAM = 16; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); +template +struct Binder { + static const int NPARAM = 16; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); +template +struct ClassBinder { + static const int NPARAM = 16; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15) }; +template +struct ClassBinder { + static const int NPARAM = 16; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15) }; +template +struct ClassBinder { + static const int NPARAM = 16; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 16 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 16 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14)); + return Type::ret(mrb, result); + } +}; + + +// void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); +template +struct Binder { + static const int NPARAM = 17; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); CHECK(16); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16) = (void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15), ARG(mrb, 16)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); +template +struct Binder { + static const int NPARAM = 17; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); CHECK(16); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16) = (R (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15), ARG(mrb, 16)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); +template +struct ClassBinder { + static const int NPARAM = 17; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { + DATA_TYPE(self) = &ClassBinder::type_info; + DATA_PTR(self) = NULL; + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); CHECK(16); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + C* (*ctor)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16) = (C* (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16))mrb_cptr(cfunc); + if(ctor) + { + C* instance = ctor(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15), ARG(mrb, 16)); + DATA_PTR(self) = instance; + } + return self; + } +}; + +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16) }; +template +struct ClassBinder { + static const int NPARAM = 17; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); CHECK(16); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15), ARG(mrb, 16)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16) }; +template +struct ClassBinder { + static const int NPARAM = 17; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); CHECK(13); CHECK(14); CHECK(15); CHECK(16); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12), ARG(mrb, 13), ARG(mrb, 14), ARG(mrb, 15), ARG(mrb, 16)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 17 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); CHECKSHIFT(16, 15); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14), ARGSHIFT(mrb, 16, 15)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 17 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); CHECKSHIFT(16, 15); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14), ARGSHIFT(mrb, 16, 15)); + return Type::ret(mrb, result); + } +}; + + +#undef ARG +#undef CHECK + +} // namespace mrubybind + +namespace mrubybind { + +//=========================================================================== +// MrubyBind - utility class for binding C functions/classes to mruby. +class MrubyBind { +public: + MrubyBind(mrb_state* mrb); + MrubyBind(mrb_state* mrb, RClass* mod); + ~MrubyBind(); + + // Bind constant value. + template + void bind_const(const char* name, T v) { + MrubyArenaStore store(mrb_); + mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); + } + + // Bind function. + template + void bind(const char* func_name, Func func_ptr) { + MrubyArenaStore store(mrb_); + mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer + mrb_symbol_value(func_name_s), // 1: function name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + if (mod_ == mrb_->kernel_module) + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + else + mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); + } + + // Bind class. + template + void bind_class(const char* class_name, Func new_func_ptr) { + MrubyArenaStore store(mrb_); + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(class_name, "initialize", + mrb_cptr_value(mrb_, (void*)new_func_ptr), + ClassBinder::ctor); + } + + // Bind class.(no new func) + template + void bind_class(const char* module_name, const char* class_name) { + MrubyArenaStore store(mrb_); + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + Type::class_name = class_name; + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(module_name, class_name, "initialize", + mrb_cptr_value(mrb_, NULL), + ClassBinder::ctor); + } + + template + void bind_class(const char* class_name) { + bind_class(NULL, class_name); + } + + // Bind instance method. + template + void bind_instance_method(const char* class_name, const char* method_name, + Method method_ptr) { + MrubyArenaStore store(mrb_); + mrb_value method_pptr_v = mrb_str_new(mrb_, + reinterpret_cast(&method_ptr), + sizeof(method_ptr)); + BindInstanceMethod(class_name, method_name, + method_pptr_v, ClassBinder::call); + } + + // Bind static method. + template + void bind_static_method(const char* module_name, const char* class_name, const char* method_name, + Method method_ptr) { + MrubyArenaStore store(mrb_); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); + } + + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + bind_static_method(NULL, class_name, method_name, + method_ptr); + } + + // Bind custom method. + template + void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + MrubyArenaStore store(mrb_); + mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; + mrb_value original_func_v = mrb_str_new(mrb_, + reinterpret_cast(&func_ptr), + sizeof(func_ptr)); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); + } + + template + void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { + bind_custom_method(NULL, class_name, method_name, func_ptr); + } + + //add convertable class pair + void add_convertable(const char* class_name_first, const char* class_name_second) + { + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); + } + + mrb_state* get_mrb(){ + return mrb_; + } + mrb_value get_avoid_gc_table(){ + return avoid_gc_table_; + } + +private: + void Initialize(); + + // Returns mruby class under a module. + struct RClass* GetClass(const char* class_name); + struct RClass* GetClass(const char* module_name, const char* class_name); + + // Utility for binding instance method. + void BindInstanceMethod(const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + void BindInstanceMethod(const char* module_name, + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + + // Mimic mruby API. + // TODO: Send pull request to the official mruby repository. + void + mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + + mrb_state* mrb_; + RClass* mod_; + mrb_value avoid_gc_table_; + int arena_index_; +}; + +MrubyRef load_string(mrb_state* mrb, std::string code); + +} // namespace mrubybind + +#endif diff --git a/test/Makefile b/test/Makefile index bf698cd..f6117e6 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,66 +1,66 @@ - -INC=-I $(MRUBY)/include -I .. -LIB=-L $(MRUBY)/build/host/lib -lmruby - -MRUBYBIND_SRCDIR=.. -MRUBYBIND_OBJ=mrubybind.o - -SRCS=$(wildcard *.cc) -EXES=$(SRCS:%.cc=%) - -CXXFLAGS=-Wall -Wextra -Werror -g -std=c++11 -DEXIT_SUCCESS=0 -DEXIT_FAILURE=1 - -all: $(EXES) - -clean: - rm -rf *.o $(EXES) - -test: $(EXES) - ./test.sh - -%.o: %.cc - g++ -c -o $@ $(INC) $(CXXFLAGS) $< - -mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -c -o $@ $(INC) $(CXXFLAGS) $< - -void: void.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) - -int: int.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -float: float.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -string: string.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -cptr: cptr.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) - -class: class.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -module: module.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -wrong_type: wrong_type.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -class_value: class_value.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -many_bind: many_bind.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -class_convert: class_convert.o $(MRUBYBIND_OBJ) $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -o $@ $^ $(LIB) $(CXXFLAGS) - -# + +INC=-I $(MRUBY)/include -I .. +LIB=-L $(MRUBY)/build/host/lib -lmruby + +MRUBYBIND_SRCDIR=.. +MRUBYBIND_OBJ=mrubybind.o + +SRCS=$(wildcard *.cc) +EXES=$(SRCS:%.cc=%) + +CXXFLAGS=-Wall -Wextra -Werror -g -std=c++11 -DEXIT_SUCCESS=0 -DEXIT_FAILURE=1 + +all: $(EXES) + +clean: + rm -rf *.o $(EXES) + +test: $(EXES) + ./test.sh + +%.o: %.cc + g++ -c -o $@ $(INC) $(CXXFLAGS) $< + +mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc + g++ -c -o $@ $(INC) $(CXXFLAGS) $< + +void: void.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +int: int.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +float: float.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +string: string.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +cptr: cptr.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +class: class.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +module: module.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +wrong_type: wrong_type.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +class_value: class_value.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +many_bind: many_bind.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +class_convert: class_convert.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + +# From 381689431a097c236e6cbd249f4ff5251da46cc8 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 27 Jun 2014 15:21:35 +0900 Subject: [PATCH 084/103] can use class reference. --- codegen/mrubybind.3.h | 333 ++++++------ codegen/mrubybind_types.1.h | 1002 ++++++++++++++++++----------------- mrubybind.h | 25 + test/Makefile | 2 + test/reference.cc | 61 +++ 5 files changed, 768 insertions(+), 655 deletions(-) create mode 100644 test/reference.cc diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 4ca3712..b477f7a 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -1,166 +1,167 @@ - -namespace mrubybind { - -//=========================================================================== -// MrubyBind - utility class for binding C functions/classes to mruby. -class MrubyBind { -public: - MrubyBind(mrb_state* mrb); - MrubyBind(mrb_state* mrb, RClass* mod); - ~MrubyBind(); - - // Bind constant value. - template - void bind_const(const char* name, T v) { - MrubyArenaStore store(mrb_); - mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); - } - - // Bind function. - template - void bind(const char* func_name, Func func_ptr) { - MrubyArenaStore store(mrb_); - mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer - mrb_symbol_value(func_name_s), // 1: function name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - if (mod_ == mrb_->kernel_module) - mrb_define_method_raw(mrb_, mod_, func_name_s, proc); - else - mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); - } - - // Bind class. - template - void bind_class(const char* class_name, Func new_func_ptr) { - MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - BindInstanceMethod(class_name, "initialize", - mrb_cptr_value(mrb_, (void*)new_func_ptr), - ClassBinder::ctor); - } - - // Bind class.(no new func) - template - void bind_class(const char* module_name, const char* class_name) { - MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - Type::class_name = class_name; - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); - MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); - BindInstanceMethod(module_name, class_name, "initialize", - mrb_cptr_value(mrb_, NULL), - ClassBinder::ctor); - } - - template - void bind_class(const char* class_name) { - bind_class(NULL, class_name); - } - - // Bind instance method. - template - void bind_instance_method(const char* class_name, const char* method_name, - Method method_ptr) { - MrubyArenaStore store(mrb_); - mrb_value method_pptr_v = mrb_str_new(mrb_, - reinterpret_cast(&method_ptr), - sizeof(method_ptr)); - BindInstanceMethod(class_name, method_name, - method_pptr_v, ClassBinder::call); - } - - // Bind static method. - template - void bind_static_method(const char* module_name, const char* class_name, const char* method_name, - Method method_ptr) { - MrubyArenaStore store(mrb_); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); - struct RClass* klass = GetClass(module_name, class_name); - mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); - } - - template - void bind_static_method(const char* class_name, const char* method_name, - Method method_ptr) { - bind_static_method(NULL, class_name, method_name, - method_ptr); - } - - // Bind custom method. - template - void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { - MrubyArenaStore store(mrb_); - mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; - mrb_value original_func_v = mrb_str_new(mrb_, - reinterpret_cast(&func_ptr), - sizeof(func_ptr)); - mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); - mrb_value env[] = { - original_func_v, // 0: c function pointer - mrb_symbol_value(method_name_s), // 1: method name - }; - struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); - struct RClass* klass = GetClass(module_name, class_name); - mrb_define_method_raw(mrb_, klass, method_name_s, proc); - } - - template - void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { - bind_custom_method(NULL, class_name, method_name, func_ptr); - } - - //add convertable class pair - void add_convertable(const char* class_name_first, const char* class_name_second) - { - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); - } - - mrb_state* get_mrb(){ - return mrb_; - } - mrb_value get_avoid_gc_table(){ - return avoid_gc_table_; - } - -private: - void Initialize(); - - // Returns mruby class under a module. - struct RClass* GetClass(const char* class_name); - struct RClass* GetClass(const char* module_name, const char* class_name); - - // Utility for binding instance method. - void BindInstanceMethod(const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)); - void BindInstanceMethod(const char* module_name, - const char* class_name, const char* method_name, - mrb_value original_func_v, - mrb_value (*binder_func)(mrb_state*, mrb_value)); - - // Mimic mruby API. - // TODO: Send pull request to the official mruby repository. - void - mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); - - mrb_state* mrb_; - RClass* mod_; - mrb_value avoid_gc_table_; - int arena_index_; -}; - -MrubyRef load_string(mrb_state* mrb, std::string code); - -} // namespace mrubybind - -#endif + +namespace mrubybind { + +//=========================================================================== +// MrubyBind - utility class for binding C functions/classes to mruby. +class MrubyBind { +public: + MrubyBind(mrb_state* mrb); + MrubyBind(mrb_state* mrb, RClass* mod); + ~MrubyBind(); + + // Bind constant value. + template + void bind_const(const char* name, T v) { + MrubyArenaStore store(mrb_); + mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); + } + + // Bind function. + template + void bind(const char* func_name, Func func_ptr) { + MrubyArenaStore store(mrb_); + mrb_sym func_name_s = mrb_intern_cstr(mrb_, func_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)func_ptr), // 0: c function pointer + mrb_symbol_value(func_name_s), // 1: function name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + if (mod_ == mrb_->kernel_module) + mrb_define_method_raw(mrb_, mod_, func_name_s, proc); + else + mrb_define_class_method_raw(mrb_, mod_, func_name_s, proc); + } + + // Bind class. + template + void bind_class(const char* class_name, Func new_func_ptr) { + MrubyArenaStore store(mrb_); + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(class_name, "initialize", + mrb_cptr_value(mrb_, (void*)new_func_ptr), + ClassBinder::ctor); + } + + // Bind class.(no new func) + template + void bind_class(const char* module_name, const char* class_name) { + MrubyArenaStore store(mrb_); + struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + Type::class_name = class_name; + Type::class_name = class_name; + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); + MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); + BindInstanceMethod(module_name, class_name, "initialize", + mrb_cptr_value(mrb_, NULL), + ClassBinder::ctor); + } + + template + void bind_class(const char* class_name) { + bind_class(NULL, class_name); + } + + // Bind instance method. + template + void bind_instance_method(const char* class_name, const char* method_name, + Method method_ptr) { + MrubyArenaStore store(mrb_); + mrb_value method_pptr_v = mrb_str_new(mrb_, + reinterpret_cast(&method_ptr), + sizeof(method_ptr)); + BindInstanceMethod(class_name, method_name, + method_pptr_v, ClassBinder::call); + } + + // Bind static method. + template + void bind_static_method(const char* module_name, const char* class_name, const char* method_name, + Method method_ptr) { + MrubyArenaStore store(mrb_); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + mrb_cptr_value(mrb_, (void*)method_ptr), // 0: method pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); + } + + template + void bind_static_method(const char* class_name, const char* method_name, + Method method_ptr) { + bind_static_method(NULL, class_name, method_name, + method_ptr); + } + + // Bind custom method. + template + void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { + MrubyArenaStore store(mrb_); + mrb_value (*binder_func)(mrb_state*, mrb_value) = CustomClassBinder::call; + mrb_value original_func_v = mrb_str_new(mrb_, + reinterpret_cast(&func_ptr), + sizeof(func_ptr)); + mrb_sym method_name_s = mrb_intern_cstr(mrb_, method_name); + mrb_value env[] = { + original_func_v, // 0: c function pointer + mrb_symbol_value(method_name_s), // 1: method name + }; + struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + struct RClass* klass = GetClass(module_name, class_name); + mrb_define_method_raw(mrb_, klass, method_name_s, proc); + } + + template + void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { + bind_custom_method(NULL, class_name, method_name, func_ptr); + } + + //add convertable class pair + void add_convertable(const char* class_name_first, const char* class_name_second) + { + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_first, class_name_second, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(class_name_second, class_name_first, true); + } + + mrb_state* get_mrb(){ + return mrb_; + } + mrb_value get_avoid_gc_table(){ + return avoid_gc_table_; + } + +private: + void Initialize(); + + // Returns mruby class under a module. + struct RClass* GetClass(const char* class_name); + struct RClass* GetClass(const char* module_name, const char* class_name); + + // Utility for binding instance method. + void BindInstanceMethod(const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + void BindInstanceMethod(const char* module_name, + const char* class_name, const char* method_name, + mrb_value original_func_v, + mrb_value (*binder_func)(mrb_state*, mrb_value)); + + // Mimic mruby API. + // TODO: Send pull request to the official mruby repository. + void + mrb_define_class_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p); + + mrb_state* mrb_; + RClass* mod_; + mrb_value avoid_gc_table_; + int arena_index_; +}; + +MrubyRef load_string(mrb_state* mrb, std::string code); + +} // namespace mrubybind + +#endif diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 26d3446..588eb38 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -1,489 +1,513 @@ -// Describe type conversion between C type value and mruby value. - -#include "mruby/string.h" -#include "mruby/proc.h" -#include "mruby/array.h" -#include "mruby/hash.h" -#include "mruby/variable.h" -#include -#include -#include -#include -#include - -namespace mrubybind { - -extern const char* untouchable_table; -extern const char* untouchable_object; - -class MrubyArenaStore{ - mrb_state* mrb; - int ai; -public: - MrubyArenaStore(mrb_state* mrb) - { - this->mrb = mrb; - this->ai = mrb_gc_arena_save(mrb); - } - - ~MrubyArenaStore() - { - mrb_gc_arena_restore(mrb, ai); - } - -}; - -class MrubyBindStatus{ - -public: - - struct Data; - typedef std::shared_ptr Data_ptr; - typedef std::map Table; - - static Table& get_living_table(){ - static Table table; - return table; - } - - struct Data{ - typedef std::map > ClassConvertableTable; - - mrb_state* mrb; - mrb_value avoid_gc_table; - ClassConvertableTable class_convertable_table; - - Data(){ - - } - ~Data(){ - - } - - mrb_state* get_mrb(){ - return mrb; - } - - mrb_value get_avoid_gc_table(){ - return avoid_gc_table; - } - - void set_class_conversion(const std::string& s, const std::string& d, bool c){ - class_convertable_table[s][d] = c; - } - - bool is_convertable(const std::string& s, const std::string& d) - { - auto fs = class_convertable_table.find(s); - if(fs != class_convertable_table.end()){ - auto fd = fs->second.find(d); - if(fd != fs->second.end()){ - return fd->second; - } - } - return false; - } - - }; - - MrubyBindStatus(){ - - } - - MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ - - Table& living_table = get_living_table(); - data = std::make_shared(); - data->mrb = mrb; - data->avoid_gc_table = avoid_gc_table; - living_table[mrb] = data; - } - - ~MrubyBindStatus(){ - - Table& living_table = MrubyBindStatus::get_living_table(); - living_table.erase(data->mrb); - data->mrb = NULL; - - } - - static bool is_living(mrb_state* mrb){ - Table& living_table = get_living_table(); - if(living_table.find(mrb) != living_table.end()){ - return living_table[mrb].get(); - } - return false; - } - - static Data_ptr search(mrb_state* mrb){ - Table& living_table = get_living_table(); - if(living_table.find(mrb) != living_table.end()){ - return living_table[mrb]; - } - return Data_ptr(NULL); - } - - - -private: - std::shared_ptr data; -}; - -template class Deleter{ - MrubyBindStatus::Data_ptr mrbsp; - mrb_value v_; -public: - Deleter() - { - - } - - Deleter(mrb_state* mrb, mrb_value v){ - mrbsp = MrubyBindStatus::search(mrb); - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); - if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ - mrb_value a = mrb_ary_new(mrb); - mrb_ary_push(mrb, a, v); - v = a; - } - mrb_hash_set(mrb, avoid_gc_table, v, v); - v_ = v; - } - ~Deleter(){ - - } - mrb_state* get_mrb(){ - return mrbsp->mrb; - } - void operator()(T* p) const { - if(mrbsp.get()){ - mrb_state* mrb = mrbsp->get_mrb(); - if(mrb){ - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_hash_delete_key(mrb, avoid_gc_table, v_); - } - } - if(p){ - delete p; - } - } - -}; - -template using obj_ptr = std::shared_ptr; -//template using FuncPtr = std::shared_ptr >; - -template class FuncPtr{ - mrb_state* mrb; - std::shared_ptr > p; -public: - FuncPtr(){ - - } - templateFuncPtr(std::function* pt, D d) : p(pt, d){ - mrb = d.get_mrb(); - } - ~FuncPtr(){ - - } - const std::shared_ptr >& ref() const{ - return p; - } - bool is_living() const{ - return MrubyBindStatus::is_living(mrb); - } - std::function& func() const{ - if(!p.get()){ - throw std::runtime_error("empty function."); - } - return *p.get(); - } - operator bool() const { - if(!p.get()){ - return false; - } - return (bool)*p.get(); - } - void reset(){ - p.reset(); - } - template void reset(Y* y){ - p.reset(y); - } - template void reset(Y* y, D d){ - p.reset(y, d); - } - template void reset(Y* y, D d, A a){ - p.reset(y, d, a); - } -}; - -template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ - return Deleter(mrb, v); -} - -template obj_ptr make_obj_ptr(Deleter d, T t){ - T* pt = new T(); - *pt = t; - return obj_ptr(pt, d); -} - -template FuncPtr make_FuncPtr(Deleter > d, std::function t){ - std::function* pt = new std::function(); - *pt = t; - return FuncPtr(pt, d); -} - -template -struct Type; - -class MrubyRef{ - mrb_state* mrb; - std::shared_ptr v; -public: - - MrubyRef(); - MrubyRef(mrb_state* mrb, const mrb_value& v); - ~MrubyRef(); - - bool is_living() const; - mrb_value get_v()const; - bool empty() const; - bool test() const; - bool obj_equal(const MrubyRef& r) const; - std::string to_s() const; - int to_i() const; - float to_float() const; - double to_double() const; - - MrubyRef call(std::string name); - -#include "mrubybind_call_generated.h" - -}; - -//=========================================================================== -// C <-> mruby type converter. - -//template -//struct Type { - // Type name used for error message. - // static const char TYPE_NAME[]; - - // Returns whether the given mrb_value can be converted into type T. - //static int check(mrb_value v) = 0; - - // Converts mrb_value to type T value. - //static T get(mrb_value v) = 0; - - // Converts type T value to mrb_value. - //static mrb_value ret(mrb_state*, T i) = 0; -//}; - -// Fixnum -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } - static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } - static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } - static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } -}; - -// float -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } -}; - -// double -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } - static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } - static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } -}; - -// String -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } - static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } - static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } - static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } -}; - -// Boolean -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value /*v*/) { return 1; } - static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } - static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } -}; - -// Raw pointer -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } - static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } - static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } -}; - -// Function -struct TypeFuncBase{ - static const char TYPE_NAME[]; -}; - -template -struct Type > :public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](){ - MrubyArenaStore mas(mrb); - return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -template<> -struct Type > :public TypeFuncBase { - static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } - static FuncPtr get(mrb_state* mrb, mrb_value v) { - Deleter > d = set_avoid_gc >(mrb, v); - return make_FuncPtr(d, [=](){ - MrubyArenaStore mas(mrb); - mrb_yield(mrb, v, mrb_nil_value()); - }); - } - static mrb_value ret(mrb_state* mrb, FuncPtr p) { - // don't call. - throw std::runtime_error("don't call Type >::ret"); - (void)mrb; (void)p; return mrb_nil_value(); - } -}; - -// mruby value -template<> -struct Type { - static const char TYPE_NAME[]; - static int check(mrb_state*, mrb_value) { return 1; } - static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } - static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } -}; - - -#include "mrubybind_types_generated.h" - -//=========================================================================== -// Binder - -// Template class for Binder. -// Binder template class is specialized with type. -template -struct Binder { - // Template specialization. - //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; -}; - -// Template class for Binder. -// Binder template class is specialized with type. -template -struct ClassBinder { - static struct mrb_data_type type_info; - static void dtor(mrb_state*, void* p) { - C* instance = static_cast(p); - delete instance; - } - - // Template specialization. - //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { -}; -template -mrb_data_type ClassBinder::type_info = { "???", dtor }; - -template -struct CustomClassBinder { - // Template specialization. - //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; -}; - -// Other Class -struct TypeClassBase{ - static const char TYPE_NAME[]; -}; - -template struct Type :public TypeClassBase { - static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { - return mrb_type(v) == MRB_TT_DATA && - MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); - } - static T get(mrb_state* mrb, mrb_value v) { - (void)mrb; return *(T*)DATA_PTR(v); - } - static mrb_value ret(mrb_state* mrb, T t) { - RClass* cls; - mrb_value v; - cls = mrb_class_get(mrb, class_name.c_str()); - v = mrb_class_new_instance(mrb, 0, NULL, cls); - DATA_TYPE(v) = &ClassBinder::type_info; - T* nt = new T(); - *nt = t; - DATA_PTR(v) = nt; - return v; - } -}; - -template std::string Type::class_name = ""; - -// -mrb_value raise(mrb_state *mrb, int parameter_index, - const char* required_type_name, mrb_value value); -mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); - -// Includes generated template specialization. -//#include "mrubybind.inc" +// Describe type conversion between C type value and mruby value. + +#include "mruby/string.h" +#include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/hash.h" +#include "mruby/variable.h" +#include +#include +#include +#include +#include + +namespace mrubybind { + +extern const char* untouchable_table; +extern const char* untouchable_object; + +class MrubyArenaStore{ + mrb_state* mrb; + int ai; +public: + MrubyArenaStore(mrb_state* mrb) + { + this->mrb = mrb; + this->ai = mrb_gc_arena_save(mrb); + } + + ~MrubyArenaStore() + { + mrb_gc_arena_restore(mrb, ai); + } + +}; + +class MrubyBindStatus{ + +public: + + struct Data; + typedef std::shared_ptr Data_ptr; + typedef std::map Table; + + static Table& get_living_table(){ + static Table table; + return table; + } + + struct Data{ + typedef std::map > ClassConvertableTable; + + mrb_state* mrb; + mrb_value avoid_gc_table; + ClassConvertableTable class_convertable_table; + + Data(){ + + } + ~Data(){ + + } + + mrb_state* get_mrb(){ + return mrb; + } + + mrb_value get_avoid_gc_table(){ + return avoid_gc_table; + } + + void set_class_conversion(const std::string& s, const std::string& d, bool c){ + class_convertable_table[s][d] = c; + } + + bool is_convertable(const std::string& s, const std::string& d) + { + auto fs = class_convertable_table.find(s); + if(fs != class_convertable_table.end()){ + auto fd = fs->second.find(d); + if(fd != fs->second.end()){ + return fd->second; + } + } + return false; + } + + }; + + MrubyBindStatus(){ + + } + + MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ + + Table& living_table = get_living_table(); + data = std::make_shared(); + data->mrb = mrb; + data->avoid_gc_table = avoid_gc_table; + living_table[mrb] = data; + } + + ~MrubyBindStatus(){ + + Table& living_table = MrubyBindStatus::get_living_table(); + living_table.erase(data->mrb); + data->mrb = NULL; + + } + + static bool is_living(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb].get(); + } + return false; + } + + static Data_ptr search(mrb_state* mrb){ + Table& living_table = get_living_table(); + if(living_table.find(mrb) != living_table.end()){ + return living_table[mrb]; + } + return Data_ptr(NULL); + } + + + +private: + std::shared_ptr data; +}; + +template class Deleter{ + MrubyBindStatus::Data_ptr mrbsp; + mrb_value v_; +public: + Deleter() + { + + } + + Deleter(mrb_state* mrb, mrb_value v){ + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + mrb_value a = mrb_ary_new(mrb); + mrb_ary_push(mrb, a, v); + v = a; + } + mrb_hash_set(mrb, avoid_gc_table, v, v); + v_ = v; + } + ~Deleter(){ + + } + mrb_state* get_mrb(){ + return mrbsp->mrb; + } + void operator()(T* p) const { + if(mrbsp.get()){ + mrb_state* mrb = mrbsp->get_mrb(); + if(mrb){ + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + } + if(p){ + delete p; + } + } + +}; + +template using obj_ptr = std::shared_ptr; +//template using FuncPtr = std::shared_ptr >; + +template class FuncPtr{ + mrb_state* mrb; + std::shared_ptr > p; +public: + FuncPtr(){ + + } + templateFuncPtr(std::function* pt, D d) : p(pt, d){ + mrb = d.get_mrb(); + } + ~FuncPtr(){ + + } + const std::shared_ptr >& ref() const{ + return p; + } + bool is_living() const{ + return MrubyBindStatus::is_living(mrb); + } + std::function& func() const{ + if(!p.get()){ + throw std::runtime_error("empty function."); + } + return *p.get(); + } + operator bool() const { + if(!p.get()){ + return false; + } + return (bool)*p.get(); + } + void reset(){ + p.reset(); + } + template void reset(Y* y){ + p.reset(y); + } + template void reset(Y* y, D d){ + p.reset(y, d); + } + template void reset(Y* y, D d, A a){ + p.reset(y, d, a); + } +}; + +template Deleter set_avoid_gc(mrb_state* mrb, mrb_value v){ + return Deleter(mrb, v); +} + +template obj_ptr make_obj_ptr(Deleter d, T t){ + T* pt = new T(); + *pt = t; + return obj_ptr(pt, d); +} + +template FuncPtr make_FuncPtr(Deleter > d, std::function t){ + std::function* pt = new std::function(); + *pt = t; + return FuncPtr(pt, d); +} + +template +struct Type; + +class MrubyRef{ + mrb_state* mrb; + std::shared_ptr v; +public: + + MrubyRef(); + MrubyRef(mrb_state* mrb, const mrb_value& v); + ~MrubyRef(); + + bool is_living() const; + mrb_value get_v()const; + bool empty() const; + bool test() const; + bool obj_equal(const MrubyRef& r) const; + std::string to_s() const; + int to_i() const; + float to_float() const; + double to_double() const; + + MrubyRef call(std::string name); + +#include "mrubybind_call_generated.h" + +}; + +//=========================================================================== +// C <-> mruby type converter. + +//template +//struct Type { + // Type name used for error message. + // static const char TYPE_NAME[]; + + // Returns whether the given mrb_value can be converted into type T. + //static int check(mrb_value v) = 0; + + // Converts mrb_value to type T value. + //static T get(mrb_value v) = 0; + + // Converts type T value to mrb_value. + //static mrb_value ret(mrb_state*, T i) = 0; +//}; + +// Fixnum +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, int i) { return mrb_fixnum_value(i); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_fixnum_p(v) || mrb_float_p(v); } + static unsigned int get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_fixnum_p(v) ? mrb_fixnum(v) : mrb_float(v); } + static mrb_value ret(mrb_state*, unsigned int i) { return mrb_fixnum_value(i); } +}; + +// float +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static float get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, float f) { return mrb_float_value(mrb, f); } +}; + +// double +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_float_p(v) || mrb_fixnum_p(v); } + static double get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_float_p(v) ? mrb_float(v) : mrb_fixnum(v); } + static mrb_value ret(mrb_state* mrb, double f) { return mrb_float_value(mrb, f); } +}; + +// String +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const char* get(mrb_state* mrb, mrb_value v) { (void)mrb; return RSTRING_PTR(v); } + static mrb_value ret(mrb_state* mrb, const char* s) { return mrb_str_new_cstr(mrb, s); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_string_p(v); } + static const std::string get(mrb_state* mrb, mrb_value v) { (void)mrb; return std::string(RSTRING_PTR(v), RSTRING_LEN(v)); } + static mrb_value ret(mrb_state* mrb, const std::string& s) { return mrb_str_new(mrb, s.c_str(), s.size()); } +}; + +// Boolean +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value /*v*/) { return 1; } + static bool get(mrb_state* mrb, mrb_value v) { (void)mrb; return mrb_test(v); } + static mrb_value ret(mrb_state* /*mrb*/, bool b) { return b ? mrb_true_value() : mrb_false_value(); } +}; + +// Raw pointer +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value v) { return mrb_cptr_p(v); } + static void* get(mrb_state*, mrb_value v) { return mrb_cptr(v); } + static mrb_value ret(mrb_state* mrb, void* p) { return mrb_cptr_value(mrb, p); } +}; + +// Function +struct TypeFuncBase{ + static const char TYPE_NAME[]; +}; + +template +struct Type > :public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + return Type::get(mrb, mrb_yield(mrb, v, mrb_nil_value())); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +template<> +struct Type > :public TypeFuncBase { + static int check(mrb_state*, mrb_value v) { return mrb_type(v) == MRB_TT_PROC; } + static FuncPtr get(mrb_state* mrb, mrb_value v) { + Deleter > d = set_avoid_gc >(mrb, v); + return make_FuncPtr(d, [=](){ + MrubyArenaStore mas(mrb); + mrb_yield(mrb, v, mrb_nil_value()); + }); + } + static mrb_value ret(mrb_state* mrb, FuncPtr p) { + // don't call. + throw std::runtime_error("don't call Type >::ret"); + (void)mrb; (void)p; return mrb_nil_value(); + } +}; + +// mruby value +template<> +struct Type { + static const char TYPE_NAME[]; + static int check(mrb_state*, mrb_value) { return 1; } + static MrubyRef get(mrb_state* mrb, mrb_value v) { (void)mrb; return MrubyRef(mrb, v); } + static mrb_value ret(mrb_state*, MrubyRef r) { return r.get_v(); } +}; + + +#include "mrubybind_types_generated.h" + +//=========================================================================== +// Binder + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct Binder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + +// Template class for Binder. +// Binder template class is specialized with type. +template +struct ClassBinder { + static struct mrb_data_type type_info; + static void dtor(mrb_state*, void* p) { + C* instance = static_cast(p); + delete instance; + } + + // Template specialization. + //static void ctor(mrb_state* mrb, mrb_value self, void* new_func_ptr, mrb_value* args, int narg) { +}; +template +mrb_data_type ClassBinder::type_info = { "???", dtor }; + +template +struct CustomClassBinder { + // Template specialization. + //static mrb_value call(mrb_state* mrb, void* p, mrb_value* args, int narg) = 0; +}; + +// Other Class +struct TypeClassBase{ + static const char TYPE_NAME[]; +}; + +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + } + static T& get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + } + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + +// +mrb_value raise(mrb_state *mrb, int parameter_index, + const char* required_type_name, mrb_value value); +mrb_value raisenarg(mrb_state *mrb, mrb_value func_name, int narg, int nparam); + +// Includes generated template specialization. +//#include "mrubybind.inc" diff --git a/mrubybind.h b/mrubybind.h index 8965bf1..a5a640d 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -493,6 +493,30 @@ struct TypeClassBase{ static const char TYPE_NAME[]; }; +template struct Type :public TypeClassBase { + static std::string class_name; + static int check(mrb_state* mrb, mrb_value v) { + return mrb_type(v) == MRB_TT_DATA && + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + } + static T& get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); + } + static mrb_value ret(mrb_state* mrb, T t) { + RClass* cls; + mrb_value v; + cls = mrb_class_get(mrb, class_name.c_str()); + v = mrb_class_new_instance(mrb, 0, NULL, cls); + DATA_TYPE(v) = &ClassBinder::type_info; + T* nt = new T(); + *nt = t; + DATA_PTR(v) = nt; + return v; + } +}; + +template std::string Type::class_name = ""; + template struct Type :public TypeClassBase { static std::string class_name; static int check(mrb_state* mrb, mrb_value v) { @@ -4077,6 +4101,7 @@ class MrubyBind { MrubyArenaStore store(mrb_); struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); Type::class_name = class_name; + Type::class_name = class_name; MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", diff --git a/test/Makefile b/test/Makefile index f6117e6..b1e8ed3 100644 --- a/test/Makefile +++ b/test/Makefile @@ -63,4 +63,6 @@ many_bind: many_bind.o $(MRUBYBIND_OBJ) class_convert: class_convert.o $(MRUBYBIND_OBJ) g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) +reference: reference.o $(MRUBYBIND_OBJ) + g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) # diff --git a/test/reference.cc b/test/reference.cc new file mode 100644 index 0000000..45e5bcf --- /dev/null +++ b/test/reference.cc @@ -0,0 +1,61 @@ + +#include +#include +#include "mrubybind.h" + +#include +using namespace std; + +class V{ +public: + int a; + V(){ + a = 0; + } +}; + +V create_v() +{ + return V(); +} + +void add_v(V& v) +{ + v.a++; +} + +int v_a(V& v) +{ + return v.a; +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb);; + b.bind_class("V"); + b.bind("create_v", create_v); + b.bind("add_v", add_v); + b.bind("v_a", v_a); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, + "puts \"start ReferenceTest\"\n" + "v = create_v\n" + "add_v v\n" + "puts \"v_a = #{v_a v}\"\n" + "add_v v\n" + "puts \"v_a = #{v_a v}\"\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} + + From 77e957a4af4378657bfa86db37152e36fb0279dc Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 27 Jun 2014 15:26:45 +0900 Subject: [PATCH 085/103] add reference test. --- test/test.sh | 173 ++++++++++++++++++++++++++------------------------- 1 file changed, 88 insertions(+), 85 deletions(-) diff --git a/test/test.sh b/test/test.sh index 7abb425..882aa47 100755 --- a/test/test.sh +++ b/test/test.sh @@ -1,85 +1,88 @@ -#!/bin/bash - -################################################################ -# Test framework. - -function error_exit() { - echo -n -e "\033[1;31m[ERROR]\033[0;39m " - echo "$1" - exit 1 -} - -function run() { - echo -n "Testing $1 ... " - result=$(./$1) - code=$? - if [ $code -ne 0 ]; then - error_exit "exit status is not 0 [$code]" - fi - if [ "$result" != "$2" ]; then - error_exit "$2 expected, but got '$result'" - fi - echo ok -} - -function fail() { - echo -n "Testing $1 ... " - result=$(./$1) - code=$? - if [ $code -eq 0 ]; then - error_exit "Failure expected, but succeeded!" - fi - if [ "$result" != "$2" ]; then - error_exit "$2 expected, but got '$result'" - fi - echo ok -} - -################################################################ -# Test cases. - -run void 'dummy called' -run int '1234321' -run float '408.0' -run string '* Hello, mruby! *' -run cptr 'cptr test' -run class 'Foo::ctor(123) -690 -99980001 -Foo::dtor()' -run module 'modfunc called: 1234' -run class_value 'start ClassPointerTest -ClassValue construct. -cv -> 7 -cv -> 8 -cv -> 7 -cv.call_block -> test7 -wk->7 -GC -ClassValue destruct. -wk->0' -run many_bind 'arena_index = 2 -start ClassPointerTest -ClassValue construct. -cv -> 7 -cv -> 8 -cv -> 7 -cv.call_block -> test7 -wk->7 -GC -ClassValue destruct. -wk->0' -run mruby_ref 'mruby_ref = 3test -mruby_ref = 3 -mruby_ref = 3toast -:a == :a = 1 -arena_index = 0' - -# Failure cases -fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" -fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" - -################################################################ -# All tests succeeded. - -echo -n -e "\033[1;32mTEST ALL SUCCEEDED!\033[0;39m\n" +#!/bin/bash + +################################################################ +# Test framework. + +function error_exit() { + echo -n -e "\033[1;31m[ERROR]\033[0;39m " + echo "$1" + exit 1 +} + +function run() { + echo -n "Testing $1 ... " + result=$(./$1) + code=$? + if [ $code -ne 0 ]; then + error_exit "exit status is not 0 [$code]" + fi + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +function fail() { + echo -n "Testing $1 ... " + result=$(./$1) + code=$? + if [ $code -eq 0 ]; then + error_exit "Failure expected, but succeeded!" + fi + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +################################################################ +# Test cases. + +run void 'dummy called' +run int '1234321' +run float '408.0' +run string '* Hello, mruby! *' +run cptr 'cptr test' +run class 'Foo::ctor(123) +690 +99980001 +Foo::dtor()' +run module 'modfunc called: 1234' +run class_value 'start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' +run many_bind 'arena_index = 2 +start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' +run mruby_ref 'mruby_ref = 3test +mruby_ref = 3 +mruby_ref = 3toast +:a == :a = 1 +arena_index = 0' +run reference 'start ReferenceTest +v_a = 1 +v_a = 2' + +# Failure cases +fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" +fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" + +################################################################ +# All tests succeeded. + +echo -n -e "\033[1;32mTEST ALL SUCCEEDED!\033[0;39m\n" From 5862348e592b0a64f780ed20f9356e929e8910c5 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 27 Jun 2014 16:01:19 +0900 Subject: [PATCH 086/103] custom method binding reference --- codegen/gen_template.rb | 28 +- mrubybind.h | 1053 +++++++++++++++++++++++++++++++++++++-- test/reference.cc | 3 +- 3 files changed, 1040 insertions(+), 44 deletions(-) diff --git a/codegen/gen_template.rb b/codegen/gen_template.rb index 52016fa..bdf55f1 100644 --- a/codegen/gen_template.rb +++ b/codegen/gen_template.rb @@ -271,8 +271,34 @@ def embed_template_custom(str, nparam) '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, '%ASSERTS%' => 'CHECKNARG(narg);' + asserts } + + ts = str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} + + if nparam == 0 + params = 'void' + args = '' + classes = '' + asserts = '' + else + params = (0...nparam).map {|i| (i == 0) ? "P#{i}&" : "P#{i}"}.join(', ') + args = (1...nparam).map {|i| "ARGSHIFT(mrb, #{i}, #{i - 1})"}.join(', ') + classes = (0...nparam).map {|i| "class P#{i}"}.join(', ') + asserts = (1...nparam).map {|i| " CHECKSHIFT(#{i}, #{i - 1});"}.join('') + end - return str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} + table = { + '%PARAMS%' => params, + '%NPARAM%' => nparam.to_s, + '%ARGS%' => args, + '%ARGS1%' => args.empty? ? '' : ', ' + args, + '%CLASSES0%' => classes, + '%CLASSES1%' => classes.empty? ? '' : ', ' + classes, + '%ASSERTS%' => 'CHECKNARG(narg);' + asserts + } + + ts += str.gsub(/(#{table.keys.join('|')})/) {|k| table[k]} + + return ts end print HEADER diff --git a/mrubybind.h b/mrubybind.h index a5a640d..d58c3ca 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -894,6 +894,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 1 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1); template struct Binder { @@ -1091,6 +1148,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 2 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2); template struct Binder { @@ -1288,6 +1402,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 3 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3); template struct Binder { @@ -1485,6 +1656,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 4 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4); template struct Binder { @@ -1682,11 +1910,12 @@ struct CustomClassBinder { }; -// void f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; int narg; mrb_value block = mrb_nil_value(); @@ -1700,19 +1929,20 @@ struct Binder { args.push_back(block); narg++; } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); return mrb_nil_value(); } }; -// R f(P0, P1, P2, P3, P4, P5); -template -struct Binder { - static const int NPARAM = 6; - static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { +template +struct CustomClassBinder { + static const int NPARAM = 5 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; int narg; mrb_value block = mrb_nil_value(); @@ -1726,19 +1956,74 @@ struct Binder { args.push_back(block); narg++; } - CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); - mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); - R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); - R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3)); return Type::ret(mrb, result); } }; -// C* ctor(P0, P1, P2, P3, P4, P5); -template -struct ClassBinder { + +// void f(P0, P1, P2, P3, P4, P5); +template +struct Binder { static const int NPARAM = 6; - static mrb_value ctor(mrb_state* mrb, mrb_value self) { + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + void (*fp)(P0, P1, P2, P3, P4, P5) = (void (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return mrb_nil_value(); + } +}; + +// R f(P0, P1, P2, P3, P4, P5); +template +struct Binder { + static const int NPARAM = 6; + static mrb_value call(mrb_state* mrb, mrb_value /*self*/) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); + mrb_value cfunc = mrb_cfunc_env_get(mrb, 0); + R (*fp)(P0, P1, P2, P3, P4, P5) = (R (*)(P0, P1, P2, P3, P4, P5))mrb_cptr(cfunc); + R result = fp(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5)); + return Type::ret(mrb, result); + } +}; + +// C* ctor(P0, P1, P2, P3, P4, P5); +template +struct ClassBinder { + static const int NPARAM = 6; + static mrb_value ctor(mrb_state* mrb, mrb_value self) { DATA_TYPE(self) = &ClassBinder::type_info; DATA_PTR(self) = NULL; mrb_value* targs; @@ -1879,6 +2164,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 6 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6); template struct Binder { @@ -2076,6 +2418,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 7 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7); template struct Binder { @@ -2273,6 +2672,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 8 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8); template struct Binder { @@ -2470,6 +2926,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 9 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9); template struct Binder { @@ -2667,6 +3180,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 10 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); template struct Binder { @@ -2864,6 +3434,63 @@ struct CustomClassBinder { }; + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 11 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 11 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); template struct Binder { @@ -3061,6 +3688,63 @@ struct CustomClassBinder +struct CustomClassBinder { + static const int NPARAM = 12 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 12 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); template struct Binder { @@ -3145,10 +3829,67 @@ struct ClassBinder -struct ClassBinder { - static const int NPARAM = 13; +// class C { void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) }; +template +struct ClassBinder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return mrb_nil_value(); + } +}; + +// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) }; +template +struct ClassBinder { + static const int NPARAM = 13; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECK(0); CHECK(1); CHECK(2); CHECK(3); CHECK(4); CHECK(5); CHECK(6); CHECK(7); CHECK(8); CHECK(9); CHECK(10); CHECK(11); CHECK(12); + C* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + return Type::ret(mrb, result); + } +}; + + +// custom method +template +struct CustomClassBinder { + static const int NPARAM = 13 - 1; static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; int narg; @@ -3163,20 +3904,19 @@ struct ClassBinder(DATA_PTR(self)); + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); + P0* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); M mp = *(M*)RSTRING_PTR(cmethod); - (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); return mrb_nil_value(); } }; -// class C { R f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) }; -template -struct ClassBinder { - static const int NPARAM = 13; +template +struct CustomClassBinder { + static const int NPARAM = 13 - 1; static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; int narg; @@ -3191,20 +3931,21 @@ struct ClassBinder(DATA_PTR(self)); + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); + P0* instance = static_cast(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (C::*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); M mp = *(M*)RSTRING_PTR(cmethod); - R result = (instance->*mp)(ARG(mrb, 0), ARG(mrb, 1), ARG(mrb, 2), ARG(mrb, 3), ARG(mrb, 4), ARG(mrb, 5), ARG(mrb, 6), ARG(mrb, 7), ARG(mrb, 8), ARG(mrb, 9), ARG(mrb, 10), ARG(mrb, 11), ARG(mrb, 12)); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); return Type::ret(mrb, result); } }; + // custom method template -struct CustomClassBinder { +struct CustomClassBinder { static const int NPARAM = 13 - 1; static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; @@ -3223,7 +3964,7 @@ struct CustomClassBinder(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef void (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); M mp = *(M*)RSTRING_PTR(cmethod); mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); return mrb_nil_value(); @@ -3231,7 +3972,7 @@ struct CustomClassBinder -struct CustomClassBinder { +struct CustomClassBinder { static const int NPARAM = 13 - 1; static mrb_value call(mrb_state* mrb, mrb_value self) { mrb_value* targs; @@ -3250,7 +3991,7 @@ struct CustomClassBinder(DATA_PTR(self)); mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); - typedef R (*M)(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12); M mp = *(M*)RSTRING_PTR(cmethod); R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11)); return Type::ret(mrb, result); @@ -3455,6 +4196,63 @@ struct CustomClassBinder +struct CustomClassBinder { + static const int NPARAM = 14 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 14 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); template struct Binder { @@ -3652,6 +4450,63 @@ struct CustomClassBinder +struct CustomClassBinder { + static const int NPARAM = 15 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 15 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); template struct Binder { @@ -3849,6 +4704,63 @@ struct CustomClassBinder +struct CustomClassBinder { + static const int NPARAM = 16 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 16 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14)); + return Type::ret(mrb, result); + } +}; + + // void f(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); template struct Binder { @@ -4046,6 +4958,63 @@ struct CustomClassBinder +struct CustomClassBinder { + static const int NPARAM = 17 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); CHECKSHIFT(16, 15); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef void (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14), ARGSHIFT(mrb, 16, 15)); + return mrb_nil_value(); + } +}; + +template +struct CustomClassBinder { + static const int NPARAM = 17 - 1; + static mrb_value call(mrb_state* mrb, mrb_value self) { + mrb_value* targs; + int narg; + mrb_value block = mrb_nil_value(); + std::vector args; + mrb_get_args(mrb, "*|&", &targs, &narg, &block); + args.resize(narg); + if(narg > 0){ + ::memmove(&args[0], &targs[0], narg * sizeof(mrb_value)); + } + if(mrb_test(block)){ + args.push_back(block); + narg++; + } + CHECKNARG(narg); CHECKSHIFT(1, 0); CHECKSHIFT(2, 1); CHECKSHIFT(3, 2); CHECKSHIFT(4, 3); CHECKSHIFT(5, 4); CHECKSHIFT(6, 5); CHECKSHIFT(7, 6); CHECKSHIFT(8, 7); CHECKSHIFT(9, 8); CHECKSHIFT(10, 9); CHECKSHIFT(11, 10); CHECKSHIFT(12, 11); CHECKSHIFT(13, 12); CHECKSHIFT(14, 13); CHECKSHIFT(15, 14); CHECKSHIFT(16, 15); + P0* instance = static_cast(DATA_PTR(self)); + mrb_value cmethod = mrb_cfunc_env_get(mrb, 0); + typedef R (*M)(P0&, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16); + M mp = *(M*)RSTRING_PTR(cmethod); + R result = mp(*instance, ARGSHIFT(mrb, 1, 0), ARGSHIFT(mrb, 2, 1), ARGSHIFT(mrb, 3, 2), ARGSHIFT(mrb, 4, 3), ARGSHIFT(mrb, 5, 4), ARGSHIFT(mrb, 6, 5), ARGSHIFT(mrb, 7, 6), ARGSHIFT(mrb, 8, 7), ARGSHIFT(mrb, 9, 8), ARGSHIFT(mrb, 10, 9), ARGSHIFT(mrb, 11, 10), ARGSHIFT(mrb, 12, 11), ARGSHIFT(mrb, 13, 12), ARGSHIFT(mrb, 14, 13), ARGSHIFT(mrb, 15, 14), ARGSHIFT(mrb, 16, 15)); + return Type::ret(mrb, result); + } +}; + + #undef ARG #undef CHECK diff --git a/test/reference.cc b/test/reference.cc index 45e5bcf..fa58534 100644 --- a/test/reference.cc +++ b/test/reference.cc @@ -38,6 +38,7 @@ int main() { b.bind("create_v", create_v); b.bind("add_v", add_v); b.bind("v_a", v_a); + b.bind_custom_method("V", "a", v_a); } int result_code = EXIT_SUCCESS; @@ -47,7 +48,7 @@ int main() { "add_v v\n" "puts \"v_a = #{v_a v}\"\n" "add_v v\n" - "puts \"v_a = #{v_a v}\"\n" + "puts \"v_a = #{v.a}\"\n" ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); From 79c1c38d29576febce639a83a3c0ea4d2e6293be Mon Sep 17 00:00:00 2001 From: dycoon Date: Thu, 31 Jul 2014 18:54:56 +0900 Subject: [PATCH 087/103] add avoid gc test. --- mrubybind.h | 76 ++++++++++++++++++++++++------------------------ test/Makefile | 4 +++ test/avoid_gc.cc | 71 ++++++++++++++++++++++++++++++++++++++++++++ test/test.sh | 3 ++ 4 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 test/avoid_gc.cc diff --git a/mrubybind.h b/mrubybind.h index d58c3ca..2ec5631 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,40 +1,40 @@ // Do not modify this file directly, this is generated -/** - * mrubybind - Binding library for mruby/C++ - * - * Usage: - * 1. Prepare a function which you want to call from mruby: - * > int square(int x) { return x * x; } - * - * 2. Create MrubyBind instance: - * > MrubyBind b(mirb) - * - * 3. Bind a function: - * > b.bind("square", square); - * - * 4. You can call it from mruby: - * > puts square(1111) #=> 1234321 - * - * There are other methods to bind constant/class/instance method in - * MrubyBind. Please see the definition of MrubyBind - * (the bottom of this file), or README. - */ -#ifndef __MRUBYBIND_H__ -#define __MRUBYBIND_H__ - -#ifndef __cplusplus -#error mrubybind can be used from C++ only. -#endif - -#include "mruby.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/proc.h" -#include "mruby/variable.h" -//#include "mrubybind_types.h" - -#include -#include +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ +#ifndef __MRUBYBIND_H__ +#define __MRUBYBIND_H__ + +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" +#include "mruby/proc.h" +#include "mruby/variable.h" +//#include "mrubybind_types.h" + +#include +#include // Describe type conversion between C type value and mruby value. #include "mruby/string.h" @@ -5017,8 +5017,8 @@ struct CustomClassBinder +#include +#include "mrubybind.h" + +#include +using namespace std; + +typedef mrubybind::FuncPtr Func; + +Func f0; +Func f1; + +void set_f0(Func f) +{ + f0 = f; +} + +void set_f1(Func f) +{ + f1 = f; +} + +void clear_f0() +{ + f0.reset(); +} + +void call_f1() +{ + f1.func()(); +} + +int main() { + mrb_state* mrb = mrb_open(); + + { + mrubybind::MrubyBind b(mrb); + b.bind("set_f0", set_f0); + b.bind("set_f1", set_f1); + b.bind("clear_f0", clear_f0); + b.bind("call_f1", call_f1); + } + + int result_code = EXIT_SUCCESS; + mrb_load_string(mrb, + "puts \"start avoid_gc\"\n" + "def f\n" + " fa = Proc.new do\n" + " puts \"called!\"\n" + " end\n" + " set_f0 fa\n" + " set_f1 fa\n" + "end\n" + "f\n" + "clear_f0\n" + "GC.start\n" + "call_f1\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + } + + mrb_close(mrb); + return result_code; +} + + + + diff --git a/test/test.sh b/test/test.sh index 882aa47..58f23b9 100755 --- a/test/test.sh +++ b/test/test.sh @@ -77,6 +77,9 @@ arena_index = 0' run reference 'start ReferenceTest v_a = 1 v_a = 2' +run avoid_gc 'start avoid_gc +called!' + # Failure cases fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" From f0524abf2f47003eb13befdd6131f4cce29ed826 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 1 Aug 2014 14:57:21 +0900 Subject: [PATCH 088/103] avoid gc bug fixed. --- codegen/mrubybind_types.1.h | 27 ++++++++-- mrubybind.h | 103 +++++++++++++++++++++--------------- test/avoid_gc.cc | 23 ++++++-- 3 files changed, 103 insertions(+), 50 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 588eb38..4be2a59 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -142,12 +142,20 @@ template class Deleter{ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); - if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + if(mrb_test(s)){ + mrb_value a = s; + mrb_value nv = mrb_ary_ref(mrb, a, 1); + mrb_int n = mrb_fixnum(nv); + n++; + mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + } + else{ mrb_value a = mrb_ary_new(mrb); mrb_ary_push(mrb, a, v); - v = a; + mrb_ary_push(mrb, a, mrb_fixnum_value(1)); + s = a; + mrb_hash_set(mrb, avoid_gc_table, v, s); } - mrb_hash_set(mrb, avoid_gc_table, v, v); v_ = v; } ~Deleter(){ @@ -161,7 +169,18 @@ template class Deleter{ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_hash_delete_key(mrb, avoid_gc_table, v_); + mrb_value a = mrb_hash_get(mrb, avoid_gc_table, v_); + mrb_value nv = mrb_ary_ref(mrb, a, 1); + mrb_int n = mrb_fixnum(nv); + n--; + if(n <= 0) + { + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + else + { + mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + } } } if(p){ diff --git a/mrubybind.h b/mrubybind.h index 2ec5631..8a2f9bf 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,40 +1,40 @@ // Do not modify this file directly, this is generated -/** - * mrubybind - Binding library for mruby/C++ - * - * Usage: - * 1. Prepare a function which you want to call from mruby: - * > int square(int x) { return x * x; } - * - * 2. Create MrubyBind instance: - * > MrubyBind b(mirb) - * - * 3. Bind a function: - * > b.bind("square", square); - * - * 4. You can call it from mruby: - * > puts square(1111) #=> 1234321 - * - * There are other methods to bind constant/class/instance method in - * MrubyBind. Please see the definition of MrubyBind - * (the bottom of this file), or README. - */ -#ifndef __MRUBYBIND_H__ -#define __MRUBYBIND_H__ - -#ifndef __cplusplus -#error mrubybind can be used from C++ only. -#endif - -#include "mruby.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/proc.h" -#include "mruby/variable.h" -//#include "mrubybind_types.h" - -#include -#include +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ +#ifndef __MRUBYBIND_H__ +#define __MRUBYBIND_H__ + +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" +#include "mruby/proc.h" +#include "mruby/variable.h" +//#include "mrubybind_types.h" + +#include +#include // Describe type conversion between C type value and mruby value. #include "mruby/string.h" @@ -179,12 +179,20 @@ template class Deleter{ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); - if(mrb_test(v) && mrb_obj_equal(mrb, v, s)){ + if(mrb_test(s)){ + mrb_value a = s; + mrb_value nv = mrb_ary_ref(mrb, a, 1); + mrb_int n = mrb_fixnum(nv); + n++; + mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + } + else{ mrb_value a = mrb_ary_new(mrb); mrb_ary_push(mrb, a, v); - v = a; + mrb_ary_push(mrb, a, mrb_fixnum_value(1)); + s = a; + mrb_hash_set(mrb, avoid_gc_table, v, s); } - mrb_hash_set(mrb, avoid_gc_table, v, v); v_ = v; } ~Deleter(){ @@ -198,7 +206,18 @@ template class Deleter{ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_hash_delete_key(mrb, avoid_gc_table, v_); + mrb_value a = mrb_hash_get(mrb, avoid_gc_table, v_); + mrb_value nv = mrb_ary_ref(mrb, a, 1); + mrb_int n = mrb_fixnum(nv); + n--; + if(n <= 0) + { + mrb_hash_delete_key(mrb, avoid_gc_table, v_); + } + else + { + mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + } } } if(p){ @@ -5017,8 +5036,8 @@ struct CustomClassBinder Func; Func f0; Func f1; +Func f2; void set_f0(Func f) { @@ -21,14 +22,24 @@ void set_f1(Func f) f1 = f; } +void set_f2(Func f) +{ + f2 = f; +} + void clear_f0() { f0.reset(); } -void call_f1() +void clear_f1() +{ + f1.reset(); +} + +void call_f2() { - f1.func()(); + f2.func()(); } int main() { @@ -38,8 +49,10 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("set_f0", set_f0); b.bind("set_f1", set_f1); + b.bind("set_f2", set_f2); b.bind("clear_f0", clear_f0); - b.bind("call_f1", call_f1); + b.bind("clear_f1", clear_f1); + b.bind("call_f2", call_f2); } int result_code = EXIT_SUCCESS; @@ -51,11 +64,13 @@ int main() { " end\n" " set_f0 fa\n" " set_f1 fa\n" + " set_f2 fa\n" "end\n" "f\n" "clear_f0\n" + "clear_f1\n" "GC.start\n" - "call_f1\n" + "call_f2\n" ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); From 562cce44b2d94755ff7f4fdcd41fad5484cae441 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 1 Aug 2014 15:34:02 +0900 Subject: [PATCH 089/103] avoiding gc uses ovject id. --- codegen/mrubybind_types.1.h | 12 ++++++++---- mrubybind.h | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 4be2a59..3a85068 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -141,7 +141,9 @@ template class Deleter{ Deleter(mrb_state* mrb, mrb_value v){ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + mrb_int v_id = mrb_obj_id(v); + mrb_value id = mrb_fixnum_value(v_id); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, id); if(mrb_test(s)){ mrb_value a = s; mrb_value nv = mrb_ary_ref(mrb, a, 1); @@ -154,7 +156,7 @@ template class Deleter{ mrb_ary_push(mrb, a, v); mrb_ary_push(mrb, a, mrb_fixnum_value(1)); s = a; - mrb_hash_set(mrb, avoid_gc_table, v, s); + mrb_hash_set(mrb, avoid_gc_table, id, s); } v_ = v; } @@ -169,13 +171,15 @@ template class Deleter{ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value a = mrb_hash_get(mrb, avoid_gc_table, v_); + mrb_int v_id = mrb_obj_id(v_); + mrb_value id = mrb_fixnum_value(v_id); + mrb_value a = mrb_hash_get(mrb, avoid_gc_table, id); mrb_value nv = mrb_ary_ref(mrb, a, 1); mrb_int n = mrb_fixnum(nv); n--; if(n <= 0) { - mrb_hash_delete_key(mrb, avoid_gc_table, v_); + mrb_hash_delete_key(mrb, avoid_gc_table, id); } else { diff --git a/mrubybind.h b/mrubybind.h index 8a2f9bf..80f89b6 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -178,7 +178,9 @@ template class Deleter{ Deleter(mrb_state* mrb, mrb_value v){ mrbsp = MrubyBindStatus::search(mrb); mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, v); + mrb_int v_id = mrb_obj_id(v); + mrb_value id = mrb_fixnum_value(v_id); + mrb_value s = mrb_hash_get(mrb, avoid_gc_table, id); if(mrb_test(s)){ mrb_value a = s; mrb_value nv = mrb_ary_ref(mrb, a, 1); @@ -191,7 +193,7 @@ template class Deleter{ mrb_ary_push(mrb, a, v); mrb_ary_push(mrb, a, mrb_fixnum_value(1)); s = a; - mrb_hash_set(mrb, avoid_gc_table, v, s); + mrb_hash_set(mrb, avoid_gc_table, id, s); } v_ = v; } @@ -206,13 +208,15 @@ template class Deleter{ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_value a = mrb_hash_get(mrb, avoid_gc_table, v_); + mrb_int v_id = mrb_obj_id(v_); + mrb_value id = mrb_fixnum_value(v_id); + mrb_value a = mrb_hash_get(mrb, avoid_gc_table, id); mrb_value nv = mrb_ary_ref(mrb, a, 1); mrb_int n = mrb_fixnum(nv); n--; if(n <= 0) { - mrb_hash_delete_key(mrb, avoid_gc_table, v_); + mrb_hash_delete_key(mrb, avoid_gc_table, id); } else { From 547e704d23aa25fbb9298983073dcb0e83eede29 Mon Sep 17 00:00:00 2001 From: dycoon Date: Sun, 10 Aug 2014 12:20:28 +0900 Subject: [PATCH 090/103] remove binder.rb --- codegen/binder.rb | 59 ------------------------------------ mrubybind.h | 76 +++++++++++++++++++++++------------------------ 2 files changed, 38 insertions(+), 97 deletions(-) delete mode 100644 codegen/binder.rb diff --git a/codegen/binder.rb b/codegen/binder.rb deleted file mode 100644 index a0e0c5f..0000000 --- a/codegen/binder.rb +++ /dev/null @@ -1,59 +0,0 @@ -# This code is compiled by mrbc, -# and included into C code. - -module MrubyBind - def MrubyBind.define_function(mod, binder, func_name, func_ptr, nparam) - Kernel.send(:define_method, func_name) do |*args, &block| - if args.size + (block ? 1 : 0) != nparam - raise ArgumentError.new("`#{func_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, func_ptr, *(args + [block])) - end - end - - def MrubyBind.bind_class(mod, binder, class_name, new_func_ptr, nparam) - mod.const_get(class_name).class_eval do - define_method(:initialize) do |*args, &block| - if args.size + (block ? 1 : 0) != nparam - raise ArgumentError.new("`initialize': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_ctorfunc(binder, self, new_func_ptr, *(args + [block])) - end - end - end - - def MrubyBind.bind_instance_method(mod, binder, class_name, method_name, method_ptr, nparam) - mod.const_get(class_name).class_eval do - define_method(method_name) do |*args, &block| - if args.size + (block ? 1 : 0) != nparam - raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_imethod(binder, self, method_ptr, *(args + [block])) - end - end - end - - def MrubyBind.bind_static_method(mod, binder, class_name, method_name, method_ptr, nparam) - mod.const_get(class_name).class_eval do - self.class.instance_eval do - define_method(method_name) do |*args, &block| - if args.size + (block ? 1 : 0) != nparam - raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, method_ptr, *(args + [block])) - end - end - end - end - - def MrubyBind.bind_custom_method(mod, binder, class_name, method_name, method_ptr, nparam) - mod.const_get(class_name).class_eval do - define_method(method_name) do |*args, &block| - if args.size + (block ? 1 : 0) != nparam - raise ArgumentError.new("`#{method_name}': wrong number of arguments (#{args.size} for #{nparam})") - end - MrubyBind::call_cfunc(binder, method_ptr, *([self] + args + [block])) - end - end - end -end diff --git a/mrubybind.h b/mrubybind.h index 80f89b6..5a61dde 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -1,40 +1,40 @@ // Do not modify this file directly, this is generated -/** - * mrubybind - Binding library for mruby/C++ - * - * Usage: - * 1. Prepare a function which you want to call from mruby: - * > int square(int x) { return x * x; } - * - * 2. Create MrubyBind instance: - * > MrubyBind b(mirb) - * - * 3. Bind a function: - * > b.bind("square", square); - * - * 4. You can call it from mruby: - * > puts square(1111) #=> 1234321 - * - * There are other methods to bind constant/class/instance method in - * MrubyBind. Please see the definition of MrubyBind - * (the bottom of this file), or README. - */ -#ifndef __MRUBYBIND_H__ -#define __MRUBYBIND_H__ - -#ifndef __cplusplus -#error mrubybind can be used from C++ only. -#endif - -#include "mruby.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/proc.h" -#include "mruby/variable.h" -//#include "mrubybind_types.h" - -#include -#include +/** + * mrubybind - Binding library for mruby/C++ + * + * Usage: + * 1. Prepare a function which you want to call from mruby: + * > int square(int x) { return x * x; } + * + * 2. Create MrubyBind instance: + * > MrubyBind b(mirb) + * + * 3. Bind a function: + * > b.bind("square", square); + * + * 4. You can call it from mruby: + * > puts square(1111) #=> 1234321 + * + * There are other methods to bind constant/class/instance method in + * MrubyBind. Please see the definition of MrubyBind + * (the bottom of this file), or README. + */ +#ifndef __MRUBYBIND_H__ +#define __MRUBYBIND_H__ + +#ifndef __cplusplus +#error mrubybind can be used from C++ only. +#endif + +#include "mruby.h" +#include "mruby/class.h" +#include "mruby/data.h" +#include "mruby/proc.h" +#include "mruby/variable.h" +//#include "mrubybind_types.h" + +#include +#include // Describe type conversion between C type value and mruby value. #include "mruby/string.h" @@ -5040,8 +5040,8 @@ struct CustomClassBinder Date: Tue, 9 Sep 2014 11:54:42 +0900 Subject: [PATCH 091/103] mruby's hash is slow. I don't use hash on avoid gc tabel. --- codegen/mrubybind_types.1.h | 111 ++++++++++++++++++++++++++---------- mrubybind.cc | 2 +- mrubybind.h | 111 ++++++++++++++++++++++++++---------- test/avoid_gc.cc | 40 +++++++++++++ test/test.sh | 5 +- 5 files changed, 205 insertions(+), 64 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 3a85068..9be9a05 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -41,6 +41,26 @@ class MrubyBindStatus{ typedef std::shared_ptr Data_ptr; typedef std::map Table; + struct ObjectInfo + { + size_t ref_count; + size_t id; + + ObjectInfo() + { + this->ref_count = 0; + this->id = 0; + } + + ObjectInfo(size_t id) + { + this->ref_count = 1; + this->id = id; + } + }; + typedef std::map ObjectIdTable; + typedef std::vector FreeIdArray; + static Table& get_living_table(){ static Table table; return table; @@ -48,10 +68,13 @@ class MrubyBindStatus{ struct Data{ typedef std::map > ClassConvertableTable; + mrb_state* mrb; mrb_value avoid_gc_table; ClassConvertableTable class_convertable_table; + ObjectIdTable object_id_table; + FreeIdArray free_id_array; Data(){ @@ -68,6 +91,21 @@ class MrubyBindStatus{ return avoid_gc_table; } + size_t new_id() + { + return mrb_ary_len(mrb, avoid_gc_table); + } + + ObjectIdTable& get_object_id_table() + { + return object_id_table; + } + + FreeIdArray& get_free_id_array() + { + return free_id_array; + } + void set_class_conversion(const std::string& s, const std::string& d, bool c){ class_convertable_table[s][d] = c; } @@ -139,26 +177,35 @@ template class Deleter{ } Deleter(mrb_state* mrb, mrb_value v){ - mrbsp = MrubyBindStatus::search(mrb); - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_int v_id = mrb_obj_id(v); - mrb_value id = mrb_fixnum_value(v_id); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, id); - if(mrb_test(s)){ - mrb_value a = s; - mrb_value nv = mrb_ary_ref(mrb, a, 1); - mrb_int n = mrb_fixnum(nv); - n++; - mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); - } - else{ - mrb_value a = mrb_ary_new(mrb); - mrb_ary_push(mrb, a, v); - mrb_ary_push(mrb, a, mrb_fixnum_value(1)); - s = a; - mrb_hash_set(mrb, avoid_gc_table, id, s); + if(!mrb_immediate_p(v)) + { + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + auto& object_id_table = mrbsp->get_object_id_table(); + auto& free_id_array = mrbsp->get_free_id_array(); + if(object_id_table.find(mrb_basic_ptr(v)) == object_id_table.end()) + { + size_t new_id; + if(!free_id_array.empty()) + { + new_id = free_id_array.back(); + free_id_array.pop_back(); + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)new_id, v); + } + else + { + new_id = mrbsp->new_id(); + mrb_ary_push(mrb, avoid_gc_table, v); + } + object_id_table[mrb_basic_ptr(v)] = MrubyBindStatus::ObjectInfo(new_id); + } + else + { + object_id_table[mrb_basic_ptr(v)].ref_count++; + } } v_ = v; + } ~Deleter(){ @@ -170,21 +217,23 @@ template class Deleter{ if(mrbsp.get()){ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_int v_id = mrb_obj_id(v_); - mrb_value id = mrb_fixnum_value(v_id); - mrb_value a = mrb_hash_get(mrb, avoid_gc_table, id); - mrb_value nv = mrb_ary_ref(mrb, a, 1); - mrb_int n = mrb_fixnum(nv); - n--; - if(n <= 0) - { - mrb_hash_delete_key(mrb, avoid_gc_table, id); - } - else + mrb_value v = v_; + if(!mrb_immediate_p(v)) { - mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + auto& object_id_table = mrbsp->get_object_id_table(); + auto& free_id_array = mrbsp->get_free_id_array(); + auto& oi = object_id_table[mrb_basic_ptr(v)]; + oi.ref_count--; + if(oi.ref_count <= 0) + { + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, v); + free_id_array.push_back(oi.id); + object_id_table.erase(mrb_basic_ptr(v)); + } } + + } } if(p){ diff --git a/mrubybind.cc b/mrubybind.cc index 4e0f3ac..23c838c 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -80,7 +80,7 @@ void MrubyBind::Initialize() { mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); { - avoid_gc_table_ = mrb_hash_new(mrb_); + avoid_gc_table_ = mrb_ary_new(mrb_); mrb_obj_iv_set(mrb_, (RObject*)mrubybind, mrb_intern_cstr(mrb_, untouchable_table), avoid_gc_table_); std::shared_ptr mrbs = std::make_shared(mrb_, avoid_gc_table_); diff --git a/mrubybind.h b/mrubybind.h index 5a61dde..01317b4 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -78,6 +78,26 @@ class MrubyBindStatus{ typedef std::shared_ptr Data_ptr; typedef std::map Table; + struct ObjectInfo + { + size_t ref_count; + size_t id; + + ObjectInfo() + { + this->ref_count = 0; + this->id = 0; + } + + ObjectInfo(size_t id) + { + this->ref_count = 1; + this->id = id; + } + }; + typedef std::map ObjectIdTable; + typedef std::vector FreeIdArray; + static Table& get_living_table(){ static Table table; return table; @@ -85,10 +105,13 @@ class MrubyBindStatus{ struct Data{ typedef std::map > ClassConvertableTable; + mrb_state* mrb; mrb_value avoid_gc_table; ClassConvertableTable class_convertable_table; + ObjectIdTable object_id_table; + FreeIdArray free_id_array; Data(){ @@ -105,6 +128,21 @@ class MrubyBindStatus{ return avoid_gc_table; } + size_t new_id() + { + return mrb_ary_len(mrb, avoid_gc_table); + } + + ObjectIdTable& get_object_id_table() + { + return object_id_table; + } + + FreeIdArray& get_free_id_array() + { + return free_id_array; + } + void set_class_conversion(const std::string& s, const std::string& d, bool c){ class_convertable_table[s][d] = c; } @@ -176,26 +214,35 @@ template class Deleter{ } Deleter(mrb_state* mrb, mrb_value v){ - mrbsp = MrubyBindStatus::search(mrb); - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_int v_id = mrb_obj_id(v); - mrb_value id = mrb_fixnum_value(v_id); - mrb_value s = mrb_hash_get(mrb, avoid_gc_table, id); - if(mrb_test(s)){ - mrb_value a = s; - mrb_value nv = mrb_ary_ref(mrb, a, 1); - mrb_int n = mrb_fixnum(nv); - n++; - mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); - } - else{ - mrb_value a = mrb_ary_new(mrb); - mrb_ary_push(mrb, a, v); - mrb_ary_push(mrb, a, mrb_fixnum_value(1)); - s = a; - mrb_hash_set(mrb, avoid_gc_table, id, s); + if(!mrb_immediate_p(v)) + { + mrbsp = MrubyBindStatus::search(mrb); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + auto& object_id_table = mrbsp->get_object_id_table(); + auto& free_id_array = mrbsp->get_free_id_array(); + if(object_id_table.find(mrb_basic_ptr(v)) == object_id_table.end()) + { + size_t new_id; + if(!free_id_array.empty()) + { + new_id = free_id_array.back(); + free_id_array.pop_back(); + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)new_id, v); + } + else + { + new_id = mrbsp->new_id(); + mrb_ary_push(mrb, avoid_gc_table, v); + } + object_id_table[mrb_basic_ptr(v)] = MrubyBindStatus::ObjectInfo(new_id); + } + else + { + object_id_table[mrb_basic_ptr(v)].ref_count++; + } } v_ = v; + } ~Deleter(){ @@ -207,21 +254,23 @@ template class Deleter{ if(mrbsp.get()){ mrb_state* mrb = mrbsp->get_mrb(); if(mrb){ - mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); - mrb_int v_id = mrb_obj_id(v_); - mrb_value id = mrb_fixnum_value(v_id); - mrb_value a = mrb_hash_get(mrb, avoid_gc_table, id); - mrb_value nv = mrb_ary_ref(mrb, a, 1); - mrb_int n = mrb_fixnum(nv); - n--; - if(n <= 0) - { - mrb_hash_delete_key(mrb, avoid_gc_table, id); - } - else + mrb_value v = v_; + if(!mrb_immediate_p(v)) { - mrb_ary_set(mrb, a, 1, mrb_fixnum_value(n)); + mrb_value avoid_gc_table = mrbsp->get_avoid_gc_table(); + auto& object_id_table = mrbsp->get_object_id_table(); + auto& free_id_array = mrbsp->get_free_id_array(); + auto& oi = object_id_table[mrb_basic_ptr(v)]; + oi.ref_count--; + if(oi.ref_count <= 0) + { + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, v); + free_id_array.push_back(oi.id); + object_id_table.erase(mrb_basic_ptr(v)); + } } + + } } if(p){ diff --git a/test/avoid_gc.cc b/test/avoid_gc.cc index b72ae1e..6868322 100644 --- a/test/avoid_gc.cc +++ b/test/avoid_gc.cc @@ -37,6 +37,11 @@ void clear_f1() f1.reset(); } +void clear_f2() +{ + f2.reset(); +} + void call_f2() { f2.func()(); @@ -52,6 +57,7 @@ int main() { b.bind("set_f2", set_f2); b.bind("clear_f0", clear_f0); b.bind("clear_f1", clear_f1); + b.bind("clear_f2", clear_f2); b.bind("call_f2", call_f2); } @@ -75,6 +81,40 @@ int main() { if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); result_code = EXIT_FAILURE; + mrb_close(mrb); + return result_code; + } + + mrb_load_string(mrb, + "puts \"start avoid_gc 2\"\n" + "def f(&block)\n" + " fa = Proc.new do\n" + " clear_f2\n" + " GC.start\n" + " puts \"called!\"\n" + " yield\n" + " end\n" + " set_f0 fa\n" + " set_f1 fa\n" + " set_f2 fa\n" + " fa = nil\n" + "end\n" + "def g\n" + " f do\n" + " puts \"block called!\"\n" + " end\n" + "end\n" + "g\n" + "clear_f0\n" + "clear_f1\n" + "GC.start\n" + "call_f2\n" + ); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + result_code = EXIT_FAILURE; + mrb_close(mrb); + return result_code; } mrb_close(mrb); diff --git a/test/test.sh b/test/test.sh index 58f23b9..6d2f8d7 100755 --- a/test/test.sh +++ b/test/test.sh @@ -78,7 +78,10 @@ run reference 'start ReferenceTest v_a = 1 v_a = 2' run avoid_gc 'start avoid_gc -called!' +called! +start avoid_gc 2 +called! +block called!' # Failure cases From 15e75878b1d6e7b785ae145440feb098c0140595 Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 4 Nov 2014 12:56:22 +0900 Subject: [PATCH 092/103] license. --- MIT-LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIT-LICENSE.txt b/MIT-LICENSE.txt index 6f013c3..70568da 100644 --- a/MIT-LICENSE.txt +++ b/MIT-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2013 - 2014 Keita Obo, Kuroda Daisuke (Dycoon) +Copyright (c) 2013 - 2014 Keita Obo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From e79202d2ba254f311d9b07de7e55dbf48d471ed5 Mon Sep 17 00:00:00 2001 From: dycoon Date: Fri, 26 Dec 2014 09:49:55 +0900 Subject: [PATCH 093/103] add write barrier --- codegen/mrubybind.3.h | 3 +++ mrubybind.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index b477f7a..f241920 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -26,6 +26,7 @@ class MrubyBind { mrb_symbol_value(func_name_s), // 1: function name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); if (mod_ == mrb_->kernel_module) mrb_define_method_raw(mrb_, mod_, func_name_s, proc); else @@ -85,6 +86,7 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } @@ -110,6 +112,7 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); struct RClass* klass = GetClass(module_name, class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } diff --git a/mrubybind.h b/mrubybind.h index 01317b4..1a06ee3 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -5119,6 +5119,7 @@ class MrubyBind { mrb_symbol_value(func_name_s), // 1: function name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); if (mod_ == mrb_->kernel_module) mrb_define_method_raw(mrb_, mod_, func_name_s, proc); else @@ -5178,6 +5179,7 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, Binder::call, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } @@ -5203,6 +5205,7 @@ class MrubyBind { mrb_symbol_value(method_name_s), // 1: method name }; struct RProc* proc = mrb_proc_new_cfunc_with_env(mrb_, binder_func, 2, env); + mrb_field_write_barrier(mrb_, (RBasic *)proc, (RBasic *)proc->env); struct RClass* klass = GetClass(module_name, class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } From 21ce6eac67e88cf66e25f6d07bf36f48868d768f Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 30 Dec 2014 14:43:30 +0900 Subject: [PATCH 094/103] module name --- codegen/mrubybind.3.h | 26 ++++++++++++++++++++++---- mrubybind.h | 26 ++++++++++++++++++++++---- test/module.cc | 30 +++++++++++++++++++++++++++++- test/test.sh | 3 ++- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index f241920..16df408 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -48,10 +48,28 @@ class MrubyBind { template void bind_class(const char* module_name, const char* class_name) { MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - Type::class_name = class_name; - Type::class_name = class_name; - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); + + struct RClass * tc; + mrb_value mod = mrb_obj_value(mod_); + std::string name; + if(module_name){ + name = module_name; + name += "::"; + name += class_name; + tc = mrb_define_class(mrb_, name.c_str(), mrb_->object_class); + struct RClass * mdp = mrb_define_module(mrb_, module_name); + mod = mrb_obj_value(mdp); + mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + } + else + { + name = class_name; + tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + } + + Type::class_name = name; + Type::class_name = name; + MrubyBindStatus::search(mrb_)->set_class_conversion(name, class_name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), diff --git a/mrubybind.h b/mrubybind.h index 1a06ee3..7953468 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -5141,10 +5141,28 @@ class MrubyBind { template void bind_class(const char* module_name, const char* class_name) { MrubyArenaStore store(mrb_); - struct RClass *tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - Type::class_name = class_name; - Type::class_name = class_name; - MrubyBindStatus::search(mrb_)->set_class_conversion(class_name, class_name, true); + + struct RClass * tc; + mrb_value mod = mrb_obj_value(mod_); + std::string name; + if(module_name){ + name = module_name; + name += "::"; + name += class_name; + tc = mrb_define_class(mrb_, name.c_str(), mrb_->object_class); + struct RClass * mdp = mrb_define_module(mrb_, module_name); + mod = mrb_obj_value(mdp); + mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + } + else + { + name = class_name; + tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + } + + Type::class_name = name; + Type::class_name = name; + MrubyBindStatus::search(mrb_)->set_class_conversion(name, class_name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), diff --git a/test/module.cc b/test/module.cc index a70f614..df1db6e 100644 --- a/test/module.cc +++ b/test/module.cc @@ -5,6 +5,27 @@ #include "mrubybind.h" #include + +class ModClass { +public: + int a; + + ModClass(int a) + { + this->a = a; + } +}; + +std::shared_ptr create_mod_class(int a) +{ + return std::shared_ptr(new ModClass(a)); +} + +int mod_class_get_a(std::shared_ptr c) +{ + return c->a; +} + void modfunc(int v) { printf("modfunc called: %d\n", v); } @@ -18,13 +39,20 @@ int main() { mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); b.bind_const("FOO_VALUE", 1234); + + b.bind_class >("Mod", "ModClass"); + b.bind_static_method("Mod", "ModClass", "create", create_mod_class); + b.bind_custom_method("Mod", "ModClass", "get_a", mod_class_get_a); } if (mrb->arena_idx != arena) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } - mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)"); + mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" + "c = Mod::ModClass.create 4\n" + "puts \"c.get_a #{c.get_a}\"\n" + ); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); return EXIT_FAILURE; diff --git a/test/test.sh b/test/test.sh index 6d2f8d7..422b4c0 100755 --- a/test/test.sh +++ b/test/test.sh @@ -47,7 +47,8 @@ run class 'Foo::ctor(123) 690 99980001 Foo::dtor()' -run module 'modfunc called: 1234' +run module 'modfunc called: 1234 +c.get_a 4' run class_value 'start ClassPointerTest ClassValue construct. cv -> 7 From 9a3ee036c862fc437f0727d78c0625f57e236580 Mon Sep 17 00:00:00 2001 From: dycoon Date: Tue, 30 Dec 2014 16:41:46 +0900 Subject: [PATCH 095/103] self convertable. --- codegen/mrubybind.3.h | 2 +- mrubybind.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 16df408..059e35c 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -69,7 +69,7 @@ class MrubyBind { Type::class_name = name; Type::class_name = name; - MrubyBindStatus::search(mrb_)->set_class_conversion(name, class_name, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(name, name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), diff --git a/mrubybind.h b/mrubybind.h index 7953468..f8dc1fa 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -5162,7 +5162,7 @@ class MrubyBind { Type::class_name = name; Type::class_name = name; - MrubyBindStatus::search(mrb_)->set_class_conversion(name, class_name, true); + MrubyBindStatus::search(mrb_)->set_class_conversion(name, name, true); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); BindInstanceMethod(module_name, class_name, "initialize", mrb_cptr_value(mrb_, NULL), From a4f171d11bfef8fe8f510355acf5787b29780723 Mon Sep 17 00:00:00 2001 From: dycoon Date: Sat, 31 Jan 2015 15:10:34 +0900 Subject: [PATCH 096/103] module::class constant value --- codegen/mrubybind.3.h | 25 +++++++++++++++++++++++++ mrubybind.h | 25 +++++++++++++++++++++++++ test/module.cc | 2 ++ test/test.sh | 1 + 4 files changed, 53 insertions(+) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index 059e35c..c827e5a 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -15,6 +15,31 @@ class MrubyBind { MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } + + template + void bind_const(const char* module_name, const char* class_name, const char* name, T v) { + MrubyArenaStore store(mrb_); + + struct RClass * tc; + mrb_value mod = mrb_obj_value(mod_); + std::string cls_name; + if(module_name){ + cls_name = module_name; + cls_name += "::"; + cls_name += class_name; + tc = mrb_define_class(mrb_, cls_name.c_str(), mrb_->object_class); + struct RClass * mdp = mrb_define_module(mrb_, module_name); + mod = mrb_obj_value(mdp); + mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + } + else + { + cls_name = class_name; + tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + } + + mrb_define_const(mrb_, tc, name, Type::ret(mrb_, v)); + } // Bind function. template diff --git a/mrubybind.h b/mrubybind.h index f8dc1fa..cb745ce 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -5108,6 +5108,31 @@ class MrubyBind { MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } + + template + void bind_const(const char* module_name, const char* class_name, const char* name, T v) { + MrubyArenaStore store(mrb_); + + struct RClass * tc; + mrb_value mod = mrb_obj_value(mod_); + std::string cls_name; + if(module_name){ + cls_name = module_name; + cls_name += "::"; + cls_name += class_name; + tc = mrb_define_class(mrb_, cls_name.c_str(), mrb_->object_class); + struct RClass * mdp = mrb_define_module(mrb_, module_name); + mod = mrb_obj_value(mdp); + mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + } + else + { + cls_name = class_name; + tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + } + + mrb_define_const(mrb_, tc, name, Type::ret(mrb_, v)); + } // Bind function. template diff --git a/test/module.cc b/test/module.cc index df1db6e..0c2c861 100644 --- a/test/module.cc +++ b/test/module.cc @@ -41,6 +41,7 @@ int main() { b.bind_const("FOO_VALUE", 1234); b.bind_class >("Mod", "ModClass"); + b.bind_const("Mod", "ModClass", "CNST", 12345); b.bind_static_method("Mod", "ModClass", "create", create_mod_class); b.bind_custom_method("Mod", "ModClass", "get_a", mod_class_get_a); } @@ -51,6 +52,7 @@ int main() { mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" "c = Mod::ModClass.create 4\n" + "puts \"Mod::ModClass::CNST #{Mod::ModClass::CNST}\"\n" "puts \"c.get_a #{c.get_a}\"\n" ); if (mrb->exc) { diff --git a/test/test.sh b/test/test.sh index 422b4c0..f846ad8 100755 --- a/test/test.sh +++ b/test/test.sh @@ -48,6 +48,7 @@ run class 'Foo::ctor(123) 99980001 Foo::dtor()' run module 'modfunc called: 1234 +Mod::ModClass::CNST 12345 c.get_a 4' run class_value 'start ClassPointerTest ClassValue construct. From 3b8d30fca38864a910d286ef85a24f68bf731b33 Mon Sep 17 00:00:00 2001 From: dycoon Date: Wed, 1 Apr 2015 10:12:19 +0900 Subject: [PATCH 097/103] momory leak bug fixed --- codegen/mrubybind_types.1.h | 2 +- mrubybind.h | 2 +- test/module.cc | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index 9be9a05..ac9c091 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -227,7 +227,7 @@ template class Deleter{ oi.ref_count--; if(oi.ref_count <= 0) { - mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, v); + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, mrb_nil_value()); free_id_array.push_back(oi.id); object_id_table.erase(mrb_basic_ptr(v)); } diff --git a/mrubybind.h b/mrubybind.h index cb745ce..9e82b21 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -264,7 +264,7 @@ template class Deleter{ oi.ref_count--; if(oi.ref_count <= 0) { - mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, v); + mrb_ary_set(mrb, avoid_gc_table, (mrb_int)oi.id, mrb_nil_value()); free_id_array.push_back(oi.id); object_id_table.erase(mrb_basic_ptr(v)); } diff --git a/test/module.cc b/test/module.cc index 0c2c861..b45c237 100644 --- a/test/module.cc +++ b/test/module.cc @@ -34,7 +34,7 @@ int main() { mrb_state* mrb = mrb_open(); RClass* mod = mrb_define_module(mrb, "Mod"); - int arena = mrb_gc_arena_save(mrb); + //int arena = mrb_gc_arena_save(mrb); { mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); @@ -45,10 +45,10 @@ int main() { b.bind_static_method("Mod", "ModClass", "create", create_mod_class); b.bind_custom_method("Mod", "ModClass", "get_a", mod_class_get_a); } - if (mrb->arena_idx != arena) { - fprintf(stderr, "Arena increased!\n"); - return EXIT_FAILURE; - } + //if (mrb->arena_idx != arena) { + // fprintf(stderr, "Arena increased!\n"); + // return EXIT_FAILURE; + //} mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" "c = Mod::ModClass.create 4\n" From 621fd65b709e557aeda658a588912e56fa9fec4f Mon Sep 17 00:00:00 2001 From: Dycoon Date: Wed, 1 Apr 2015 21:33:50 +0900 Subject: [PATCH 098/103] arena check use mrb_gc_arena_savbe --- test/class.cc | 2 +- test/cptr.cc | 2 +- test/float.cc | 2 +- test/int.cc | 2 +- test/module.cc | 10 +++++----- test/string.cc | 2 +- test/test.sh | 2 +- test/void.cc | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/class.cc b/test/class.cc index c6c1c45..5fd62b7 100644 --- a/test/class.cc +++ b/test/class.cc @@ -39,7 +39,7 @@ int main() { b.bind_instance_method("Foo", "bar", &Foo::bar); b.bind_static_method("Foo", "baz", &Foo::baz); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } diff --git a/test/cptr.cc b/test/cptr.cc index 6324f83..e805881 100644 --- a/test/cptr.cc +++ b/test/cptr.cc @@ -19,7 +19,7 @@ int main() { b.bind("myopen", myopen); b.bind("mywrite", mywrite); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } diff --git a/test/float.cc b/test/float.cc index 18fb527..8c1f91c 100644 --- a/test/float.cc +++ b/test/float.cc @@ -14,7 +14,7 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("mul", mul); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } diff --git a/test/int.cc b/test/int.cc index d7fd84f..9d0ad23 100644 --- a/test/int.cc +++ b/test/int.cc @@ -14,7 +14,7 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("square", square); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } diff --git a/test/module.cc b/test/module.cc index b45c237..0e508be 100644 --- a/test/module.cc +++ b/test/module.cc @@ -34,7 +34,7 @@ int main() { mrb_state* mrb = mrb_open(); RClass* mod = mrb_define_module(mrb, "Mod"); - //int arena = mrb_gc_arena_save(mrb); + int arena = mrb_gc_arena_save(mrb); { mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); @@ -45,10 +45,10 @@ int main() { b.bind_static_method("Mod", "ModClass", "create", create_mod_class); b.bind_custom_method("Mod", "ModClass", "get_a", mod_class_get_a); } - //if (mrb->arena_idx != arena) { - // fprintf(stderr, "Arena increased!\n"); - // return EXIT_FAILURE; - //} + if (mrb_gc_arena_save(mrb) != arena) { + fprintf(stderr, "Arena increased!\n"); + return EXIT_FAILURE; + } mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" "c = Mod::ModClass.create 4\n" diff --git a/test/string.cc b/test/string.cc index 5f8e8e5..ca66461 100644 --- a/test/string.cc +++ b/test/string.cc @@ -17,7 +17,7 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("emphasize", emphasize); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } diff --git a/test/test.sh b/test/test.sh index f846ad8..6da3111 100755 --- a/test/test.sh +++ b/test/test.sh @@ -40,7 +40,7 @@ function fail() { run void 'dummy called' run int '1234321' -run float '408.0' +run float '408' run string '* Hello, mruby! *' run cptr 'cptr test' run class 'Foo::ctor(123) diff --git a/test/void.cc b/test/void.cc index 1873b5e..35f4f2e 100644 --- a/test/void.cc +++ b/test/void.cc @@ -14,7 +14,7 @@ int main() { mrubybind::MrubyBind b(mrb); b.bind("dummy", dummy); } - if (mrb->arena_idx != 0) { + if (mrb_gc_arena_save(mrb) != 0) { fprintf(stderr, "Arena increased!\n"); return EXIT_FAILURE; } From b64813d30c1af0c9497ccfa8425a69ccc2998d7e Mon Sep 17 00:00:00 2001 From: Dycoon Date: Mon, 20 Jul 2015 18:20:05 +0900 Subject: [PATCH 099/103] fix: test.sh on linux. --- test/test.sh | 192 +++++++++++++++++++++++++-------------------------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/test/test.sh b/test/test.sh index 6da3111..a3f79f4 100755 --- a/test/test.sh +++ b/test/test.sh @@ -1,96 +1,96 @@ -#!/bin/bash - -################################################################ -# Test framework. - -function error_exit() { - echo -n -e "\033[1;31m[ERROR]\033[0;39m " - echo "$1" - exit 1 -} - -function run() { - echo -n "Testing $1 ... " - result=$(./$1) - code=$? - if [ $code -ne 0 ]; then - error_exit "exit status is not 0 [$code]" - fi - if [ "$result" != "$2" ]; then - error_exit "$2 expected, but got '$result'" - fi - echo ok -} - -function fail() { - echo -n "Testing $1 ... " - result=$(./$1) - code=$? - if [ $code -eq 0 ]; then - error_exit "Failure expected, but succeeded!" - fi - if [ "$result" != "$2" ]; then - error_exit "$2 expected, but got '$result'" - fi - echo ok -} - -################################################################ -# Test cases. - -run void 'dummy called' -run int '1234321' -run float '408' -run string '* Hello, mruby! *' -run cptr 'cptr test' -run class 'Foo::ctor(123) -690 -99980001 -Foo::dtor()' -run module 'modfunc called: 1234 -Mod::ModClass::CNST 12345 -c.get_a 4' -run class_value 'start ClassPointerTest -ClassValue construct. -cv -> 7 -cv -> 8 -cv -> 7 -cv.call_block -> test7 -wk->7 -GC -ClassValue destruct. -wk->0' -run many_bind 'arena_index = 2 -start ClassPointerTest -ClassValue construct. -cv -> 7 -cv -> 8 -cv -> 7 -cv.call_block -> test7 -wk->7 -GC -ClassValue destruct. -wk->0' -run mruby_ref 'mruby_ref = 3test -mruby_ref = 3 -mruby_ref = 3toast -:a == :a = 1 -arena_index = 0' -run reference 'start ReferenceTest -v_a = 1 -v_a = 2' -run avoid_gc 'start avoid_gc -called! -start avoid_gc 2 -called! -block called!' - - -# Failure cases -fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" -fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" - -################################################################ -# All tests succeeded. - -echo -n -e "\033[1;32mTEST ALL SUCCEEDED!\033[0;39m\n" +#!/bin/bash + +################################################################ +# Test framework. + +function error_exit() { + echo -n -e "\033[1;31m[ERROR]\033[0;39m " + echo "$1" + exit 1 +} + +function run() { + echo -n "Testing $1 ... " + result=$(./$1) + code=$? + if [ $code -ne 0 ]; then + error_exit "exit status is not 0 [$code]" + fi + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +function fail() { + echo -n "Testing $1 ... " + result=$(./$1) + code=$? + if [ $code -eq 0 ]; then + error_exit "Failure expected, but succeeded!" + fi + if [ "$result" != "$2" ]; then + error_exit "$2 expected, but got '$result'" + fi + echo ok +} + +################################################################ +# Test cases. + +run void 'dummy called' +run int '1234321' +run float '408' +run string '* Hello, mruby! *' +run cptr 'cptr test' +run class 'Foo::ctor(123) +690 +99980001 +Foo::dtor()' +run module 'modfunc called: 1234 +Mod::ModClass::CNST 12345 +c.get_a 4' +run class_value 'start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' +run many_bind 'arena_index = 2 +start ClassPointerTest +ClassValue construct. +cv -> 7 +cv -> 8 +cv -> 7 +cv.call_block -> test7 +wk->7 +GC +ClassValue destruct. +wk->0' +run mruby_ref 'mruby_ref = 3test +mruby_ref = 3 +mruby_ref = 3toast +:a == :a = 1 +arena_index = 0' +run reference 'start ReferenceTest +v_a = 1 +v_a = 2' +run avoid_gc 'start avoid_gc +called! +start avoid_gc 2 +called! +block called!' + + +# Failure cases +fail wrong_type "TypeError: can't convert String into Fixnum, argument 1(1111)" +fail wrong_arg_num "ArgumentError: 'square': wrong number of arguments (2 for 1)" + +################################################################ +# All tests succeeded. + +echo -n -e "\033[1;32mTEST ALL SUCCEEDED!\033[0;39m\n" From 902d61045494fd264de10140bf9f0e9d5717764a Mon Sep 17 00:00:00 2001 From: Dycoon Date: Sun, 26 Jul 2015 14:19:36 +0900 Subject: [PATCH 100/103] travis script --- .travis.yml | 21 +++++++++++++++++++++ test/Makefile | 47 ++++++++++++++++++++++++----------------------- 2 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c95ac2e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: cpp +compiler: + - gcc-4.8 +script: + - cd codegen + - make + - cd .. + - git clone https://github.com/dycoon/mruby_dycoon.git + - cd mruby_dycoon + - make + - cd .. + - cd test + - MRUBY=../mruby_dycoon CXX=g++-4.8 make + - ./test.sh +install: + - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test + - sudo apt-get -qq update + - sudo apt-get -qq install g++-4.8 +notifications: + email: false + diff --git a/test/Makefile b/test/Makefile index 83de010..689dd74 100644 --- a/test/Makefile +++ b/test/Makefile @@ -8,6 +8,7 @@ MRUBYBIND_OBJ=mrubybind.o SRCS=$(wildcard *.cc) EXES=$(SRCS:%.cc=%) +CXX?= CXX CXXFLAGS=-Wall -Wextra -Werror -g -std=c++11 -DEXIT_SUCCESS=0 -DEXIT_FAILURE=1 all: $(EXES) @@ -19,54 +20,54 @@ test: $(EXES) ./test.sh %.o: %.cc - g++ -c -o $@ $(INC) $(CXXFLAGS) $< + $(CXX) -c -o $@ $(INC) $(CXXFLAGS) $< mrubybind.o: $(MRUBYBIND_SRCDIR)/mrubybind.cc - g++ -c -o $@ $(INC) $(CXXFLAGS) $< + $(CXX) -c -o $@ $(INC) $(CXXFLAGS) $< void: void.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) int: int.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) float: float.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) string: string.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) cptr: cptr.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) class: class.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) module: module.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) wrong_type: wrong_type.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) wrong_arg_num: wrong_arg_num.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + class_value: class_value.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) mruby_ref: mruby_ref.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + many_bind: many_bind.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + class_convert: class_convert.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + reference: reference.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + avoid_gc: avoid_gc.o $(MRUBYBIND_OBJ) - g++ -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) - + $(CXX) -o $@ $^ $(LIB) $(INC) $(CXXFLAGS) + # From 9887fe972dd7a432853a6e83bbb7c0b0f72847c2 Mon Sep 17 00:00:00 2001 From: Dycoon Date: Sun, 9 Aug 2015 19:08:16 +0900 Subject: [PATCH 101/103] add: layered module. --- codegen/mrubybind.3.h | 61 ++++++++++++--------------------------- examples/main.cc | 28 +++++++++--------- mrubybind.cc | 67 +++++++++++++++++++++++++++++++++++++++---- mrubybind.h | 61 ++++++++++++--------------------------- test/module.cc | 14 ++++++--- test/test.sh | 2 ++ 6 files changed, 125 insertions(+), 108 deletions(-) diff --git a/codegen/mrubybind.3.h b/codegen/mrubybind.3.h index c827e5a..cef16a1 100644 --- a/codegen/mrubybind.3.h +++ b/codegen/mrubybind.3.h @@ -15,29 +15,13 @@ class MrubyBind { MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } - + template void bind_const(const char* module_name, const char* class_name, const char* name, T v) { MrubyArenaStore store(mrb_); - - struct RClass * tc; - mrb_value mod = mrb_obj_value(mod_); - std::string cls_name; - if(module_name){ - cls_name = module_name; - cls_name += "::"; - cls_name += class_name; - tc = mrb_define_class(mrb_, cls_name.c_str(), mrb_->object_class); - struct RClass * mdp = mrb_define_module(mrb_, module_name); - mod = mrb_obj_value(mdp); - mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); - } - else - { - cls_name = class_name; - tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - } - + + struct RClass * tc = DefineClass(module_name, class_name); + mrb_define_const(mrb_, tc, name, Type::ret(mrb_, v)); } @@ -68,30 +52,20 @@ class MrubyBind { mrb_cptr_value(mrb_, (void*)new_func_ptr), ClassBinder::ctor); } - + // Bind class.(no new func) template void bind_class(const char* module_name, const char* class_name) { MrubyArenaStore store(mrb_); - - struct RClass * tc; - mrb_value mod = mrb_obj_value(mod_); + + struct RClass * tc = DefineClass(module_name, class_name); std::string name; if(module_name){ - name = module_name; - name += "::"; - name += class_name; - tc = mrb_define_class(mrb_, name.c_str(), mrb_->object_class); - struct RClass * mdp = mrb_define_module(mrb_, module_name); - mod = mrb_obj_value(mdp); - mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + name += module_name; + name += "::"; } - else - { - name = class_name; - tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - } - + name += class_name; + Type::class_name = name; Type::class_name = name; MrubyBindStatus::search(mrb_)->set_class_conversion(name, name, true); @@ -100,7 +74,7 @@ class MrubyBind { mrb_cptr_value(mrb_, NULL), ClassBinder::ctor); } - + template void bind_class(const char* class_name) { bind_class(NULL, class_name); @@ -133,14 +107,14 @@ class MrubyBind { struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } - + template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { bind_static_method(NULL, class_name, method_name, method_ptr); } - + // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { @@ -159,12 +133,12 @@ class MrubyBind { struct RClass* klass = GetClass(module_name, class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } - + template void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { bind_custom_method(NULL, class_name, method_name, func_ptr); } - + //add convertable class pair void add_convertable(const char* class_name_first, const char* class_name_second) { @@ -183,6 +157,9 @@ class MrubyBind { void Initialize(); // Returns mruby class under a module. + std::vector SplitModule(const char* module_name); + struct RClass* DefineModule(const char* module_name); + struct RClass* DefineClass(const char* module_name, const char* class_name); struct RClass* GetClass(const char* class_name); struct RClass* GetClass(const char* module_name, const char* class_name); diff --git a/examples/main.cc b/examples/main.cc index a08a460..c15e72f 100644 --- a/examples/main.cc +++ b/examples/main.cc @@ -26,7 +26,7 @@ void BindFunctionTest(mrb_state* mrb) { b.bind("emphasize", emphasize); } - mrubybind::load_string(mrb, + mrubybind::load_string(mrb, "puts square(1111)\n" "puts emphasize('Hello, mruby!')\n" ); @@ -69,7 +69,7 @@ void BindClassTest(mrb_state* mrb) { b.bind_static_method("Foo", "baz", &Foo::baz); } - mrubybind::load_string(mrb, + mrubybind::load_string(mrb, "foo = Foo.new(123)\n" "p foo\n" "p foo.bar(567)\n" @@ -197,7 +197,7 @@ void CallbackFunctionTest(mrb_state* mrb) { b.bind_instance_method("Callbacker", "func_a2_string", &Callbacker::func_a2_string); } - mrubybind::load_string(mrb, + mrubybind::load_string(mrb, "v = call_block do\n" " puts \"?? called\n\"" "end\n" @@ -241,18 +241,18 @@ void CallbackFunctionTest(mrb_state* mrb) { class ClassValue{ public: int a; - + ClassValue(){ std::cout << "ClassValue construct.\n"; std::cout.flush(); a = 7; } - + ~ClassValue(){ std::cout << "ClassValue destruct.\n"; std::cout.flush(); } - + void decriment(){ a--; } @@ -297,7 +297,7 @@ int weak_class_value_get_a(std::weak_ptr cv) } void ClassPointerTest(mrb_state* mrb){ - + { mrubybind::MrubyBind b(mrb); b.bind("create_class_value", create_class_value); @@ -310,8 +310,8 @@ void ClassPointerTest(mrb_state* mrb){ b.bind("convert_to_weak_class_value", convert_to_weak_class_value); b.bind("weak_class_value_get_a", weak_class_value_get_a); } - - mrubybind::load_string(mrb, + + mrubybind::load_string(mrb, "puts \"start ClassPointerTest\"\n" "cv = create_class_value\n" "puts \"cv -> #{class_value_get_a(cv)}\"\n" @@ -354,10 +354,10 @@ void MrubyRefTest(mrb_state* mrb){ mrubybind::MrubyBind b(mrb); b.bind("set_mruby_ref", set_mruby_ref); b.bind("set_mruby_ref_pair", set_mruby_ref_pair); - + } - - mrubybind::load_string(mrb, + + mrubybind::load_string(mrb, "set_mruby_ref \"3test\"\n" "s = \"aaa\"\n" "set_mruby_ref_pair s, s\n" @@ -369,7 +369,7 @@ void MrubyRefTest(mrb_state* mrb){ std::cout << "mruby_ref = " << mruby_ref.call("gsub", "te", "toa").to_s() << std::endl; std::cout << ":a == :a = " << mruby_ref_a.obj_equal(mruby_ref_b) << std::endl; std::cout << "arena_index = " << mrb_gc_arena_save(mrb) << std::endl; - + if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); } @@ -396,7 +396,7 @@ int main() { std::cout.flush(); throw; } - + mrb_close(mrb); return 0; diff --git a/mrubybind.cc b/mrubybind.cc index 23c838c..2ad6918 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -78,7 +78,7 @@ void MrubyBind::Initialize() { mrb_intern_cstr(mrb_, untouchable_table)); } else { mrb_const_set(mrb_, mrb_obj_value(mrb_->kernel_module), sym_mrubybind, mrb_obj_value(mrubybind)); - + { avoid_gc_table_ = mrb_ary_new(mrb_); mrb_obj_iv_set(mrb_, (RObject*)mrubybind, @@ -93,6 +93,61 @@ void MrubyBind::Initialize() { } } +std::vector MrubyBind::SplitModule(const char* module_name) +{ + std::vector splited; + if(!module_name){ + return splited; + } + std::string str(module_name); + std::string d("::"); + size_t c = 0, f, dsz = d.size(); + while((f = str.find(d, c)) != std::string::npos){ + splited.push_back(str.substr(c, f - c)); + c = f + dsz; + } + splited.push_back(str.substr(c, str.size() - c)); + return splited; +} + +struct RClass* MrubyBind::DefineModule(const char* module_name) +{ + std::vector modules = SplitModule(module_name); + struct RClass* last_module = nullptr; + for(size_t i = 0 ; i < modules.size() ; i++){ + auto m = modules[i]; + if(i == 0){ + last_module = mrb_define_module(mrb_, m.c_str()); + } + else{ + last_module = mrb_define_module_under(mrb_, last_module, m.c_str()); + } + } + return last_module; +} + +struct RClass* MrubyBind::DefineClass(const char* module_name, const char* class_name) +{ + struct RClass * tc; + mrb_value mod = mrb_obj_value(mod_); + std::string name; + if(module_name){ + name = module_name; + name += "::"; + name += class_name; + tc = mrb_define_class(mrb_, name.c_str(), mrb_->object_class); + struct RClass * mdp = DefineModule(module_name); + mod = mrb_obj_value(mdp); + mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); + } + else + { + name = class_name; + tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + } + return tc; +} + struct RClass* MrubyBind::GetClass(const char* class_name) { mrb_value mod = mrb_obj_value(mod_); mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); @@ -102,7 +157,7 @@ struct RClass* MrubyBind::GetClass(const char* class_name) { struct RClass* MrubyBind::GetClass(const char* module_name, const char* class_name) { mrb_value mod = mrb_obj_value(mod_); if(module_name){ - mod = mrb_obj_value(mrb_define_module(mrb_, module_name)); + mod = mrb_obj_value(DefineModule(module_name)); } mrb_value klass_v = mrb_const_get(mrb_, mod, mrb_intern_cstr(mrb_, class_name)); return mrb_class_ptr(klass_v); @@ -136,7 +191,7 @@ void MrubyBind::BindInstanceMethod(const char* module_name, MrubyRef load_string(mrb_state* mrb, std::string code) { mrubybind::MrubyArenaStore mas(mrb); - + RClass* mrubybind = mrb_define_module(mrb, "MrubyBind"); mrb->exc = NULL; mrb_value r = mrb_load_string(mrb, @@ -150,12 +205,12 @@ MrubyRef load_string(mrb_state* mrb, std::string code) mrb_obj_iv_set(mrb, (RObject*)mrubybind, mrb_intern_cstr(mrb, untouchable_last_exception), mrb_nil_value()); } - + return MrubyRef(mrb, r); } MrubyRef::MrubyRef(){ - + } MrubyRef::MrubyRef(mrb_state* mrb, const mrb_value& v){ @@ -166,7 +221,7 @@ MrubyRef::MrubyRef(mrb_state* mrb, const mrb_value& v){ } MrubyRef::~MrubyRef(){ - + } bool MrubyRef::is_living() const{ diff --git a/mrubybind.h b/mrubybind.h index 9e82b21..d55584d 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -5108,29 +5108,13 @@ class MrubyBind { MrubyArenaStore store(mrb_); mrb_define_const(mrb_, mod_, name, Type::ret(mrb_, v)); } - + template void bind_const(const char* module_name, const char* class_name, const char* name, T v) { MrubyArenaStore store(mrb_); - - struct RClass * tc; - mrb_value mod = mrb_obj_value(mod_); - std::string cls_name; - if(module_name){ - cls_name = module_name; - cls_name += "::"; - cls_name += class_name; - tc = mrb_define_class(mrb_, cls_name.c_str(), mrb_->object_class); - struct RClass * mdp = mrb_define_module(mrb_, module_name); - mod = mrb_obj_value(mdp); - mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); - } - else - { - cls_name = class_name; - tc = mrb_define_class(mrb_, class_name, mrb_->object_class); - } - + + struct RClass * tc = DefineClass(module_name, class_name); + mrb_define_const(mrb_, tc, name, Type::ret(mrb_, v)); } @@ -5161,30 +5145,20 @@ class MrubyBind { mrb_cptr_value(mrb_, (void*)new_func_ptr), ClassBinder::ctor); } - + // Bind class.(no new func) template void bind_class(const char* module_name, const char* class_name) { MrubyArenaStore store(mrb_); - - struct RClass * tc; - mrb_value mod = mrb_obj_value(mod_); + + struct RClass * tc = DefineClass(module_name, class_name); std::string name; if(module_name){ - name = module_name; - name += "::"; - name += class_name; - tc = mrb_define_class(mrb_, name.c_str(), mrb_->object_class); - struct RClass * mdp = mrb_define_module(mrb_, module_name); - mod = mrb_obj_value(mdp); - mrb_define_const(mrb_, mdp, class_name, mrb_obj_value(tc)); - } - else - { - name = class_name; - tc = mrb_define_class(mrb_, class_name, mrb_->object_class); + name += module_name; + name += "::"; } - + name += class_name; + Type::class_name = name; Type::class_name = name; MrubyBindStatus::search(mrb_)->set_class_conversion(name, name, true); @@ -5193,7 +5167,7 @@ class MrubyBind { mrb_cptr_value(mrb_, NULL), ClassBinder::ctor); } - + template void bind_class(const char* class_name) { bind_class(NULL, class_name); @@ -5226,14 +5200,14 @@ class MrubyBind { struct RClass* klass = GetClass(module_name, class_name); mrb_define_class_method_raw(mrb_, klass, method_name_s, proc); } - + template void bind_static_method(const char* class_name, const char* method_name, Method method_ptr) { bind_static_method(NULL, class_name, method_name, method_ptr); } - + // Bind custom method. template void bind_custom_method(const char* module_name, const char* class_name, const char* method_name, Func func_ptr) { @@ -5252,12 +5226,12 @@ class MrubyBind { struct RClass* klass = GetClass(module_name, class_name); mrb_define_method_raw(mrb_, klass, method_name_s, proc); } - + template void bind_custom_method(const char* class_name, const char* method_name, Func func_ptr) { bind_custom_method(NULL, class_name, method_name, func_ptr); } - + //add convertable class pair void add_convertable(const char* class_name_first, const char* class_name_second) { @@ -5276,6 +5250,9 @@ class MrubyBind { void Initialize(); // Returns mruby class under a module. + std::vector SplitModule(const char* module_name); + struct RClass* DefineModule(const char* module_name); + struct RClass* DefineClass(const char* module_name, const char* class_name); struct RClass* GetClass(const char* class_name); struct RClass* GetClass(const char* module_name, const char* class_name); diff --git a/test/module.cc b/test/module.cc index 0e508be..6fd1e6c 100644 --- a/test/module.cc +++ b/test/module.cc @@ -9,7 +9,7 @@ class ModClass { public: int a; - + ModClass(int a) { this->a = a; @@ -39,11 +39,14 @@ int main() { mrubybind::MrubyBind b(mrb, mod); b.bind("modfunc", modfunc); b.bind_const("FOO_VALUE", 1234); - - b.bind_class >("Mod", "ModClass"); + + b.bind_class >("Mod::Mod2", "ModClass"); b.bind_const("Mod", "ModClass", "CNST", 12345); b.bind_static_method("Mod", "ModClass", "create", create_mod_class); b.bind_custom_method("Mod", "ModClass", "get_a", mod_class_get_a); + b.bind_const("Mod::Mod2", "ModClass", "CNST", 12345); + b.bind_static_method("Mod::Mod2", "ModClass", "create", create_mod_class); + b.bind_custom_method("Mod::Mod2", "ModClass", "get_a", mod_class_get_a); } if (mrb_gc_arena_save(mrb) != arena) { fprintf(stderr, "Arena increased!\n"); @@ -52,7 +55,10 @@ int main() { mrb_load_string(mrb, "Mod.modfunc(Mod::FOO_VALUE)\n" "c = Mod::ModClass.create 4\n" - "puts \"Mod::ModClass::CNST #{Mod::ModClass::CNST}\"\n" + "puts \"Mod::ModClass::CNST #{Mod::Mod2::ModClass::CNST}\"\n" + "puts \"c.get_a #{c.get_a}\"\n" + "c = Mod::Mod2::ModClass.create 4\n" + "puts \"Mod::Mod2::ModClass::CNST #{Mod::Mod2::ModClass::CNST}\"\n" "puts \"c.get_a #{c.get_a}\"\n" ); if (mrb->exc) { diff --git a/test/test.sh b/test/test.sh index a3f79f4..b12e1b6 100755 --- a/test/test.sh +++ b/test/test.sh @@ -49,6 +49,8 @@ run class 'Foo::ctor(123) Foo::dtor()' run module 'modfunc called: 1234 Mod::ModClass::CNST 12345 +c.get_a 4 +Mod::Mod2::ModClass::CNST 12345 c.get_a 4' run class_value 'start ClassPointerTest ClassValue construct. From 2f5d5a0cce253fc26b35304f8fa6b180bd7d008b Mon Sep 17 00:00:00 2001 From: Dycoon Date: Sat, 22 Aug 2015 14:44:14 +0900 Subject: [PATCH 102/103] modify: define module can use class root. --- mrubybind.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/mrubybind.cc b/mrubybind.cc index 2ad6918..fe738a6 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -117,10 +117,22 @@ struct RClass* MrubyBind::DefineModule(const char* module_name) for(size_t i = 0 ; i < modules.size() ; i++){ auto m = modules[i]; if(i == 0){ - last_module = mrb_define_module(mrb_, m.c_str()); + if(mrb_const_defined_at(mrb_, mrb_obj_value(mrb_->object_class), mrb_intern_cstr(mrb_, m.c_str()))){ + mrb_value mdl = mrb_const_get(mrb_, mrb_obj_value(mrb_->object_class), mrb_intern_cstr(mrb_, m.c_str())); + last_module = mrb_class_ptr(mdl); + } + else { + last_module = mrb_define_module(mrb_, m.c_str()); + } } else{ - last_module = mrb_define_module_under(mrb_, last_module, m.c_str()); + if(mrb_const_defined_at(mrb_, mrb_obj_value(mrb_->object_class), mrb_intern_cstr(mrb_, m.c_str()))){ + mrb_value mdl = mrb_const_get(mrb_, mrb_obj_value(last_module), mrb_intern_cstr(mrb_, m.c_str())); + last_module = mrb_class_ptr(mdl); + } + else { + last_module = mrb_define_module_under(mrb_, last_module, m.c_str()); + } } } return last_module; From 9152a4cab38bb0676fbc47e41c9f957c7bfed353 Mon Sep 17 00:00:00 2001 From: dycoon Date: Sun, 18 Oct 2015 17:43:08 +0900 Subject: [PATCH 103/103] add: get_mrb to MrubyRef. --- codegen/mrubybind_types.1.h | 87 +++++++++++++++++++------------------ mrubybind.cc | 4 ++ mrubybind.h | 87 +++++++++++++++++++------------------ 3 files changed, 92 insertions(+), 86 deletions(-) diff --git a/codegen/mrubybind_types.1.h b/codegen/mrubybind_types.1.h index ac9c091..3cbc40a 100644 --- a/codegen/mrubybind_types.1.h +++ b/codegen/mrubybind_types.1.h @@ -25,7 +25,7 @@ class MrubyArenaStore{ this->mrb = mrb; this->ai = mrb_gc_arena_save(mrb); } - + ~MrubyArenaStore() { mrb_gc_arena_restore(mrb, ai); @@ -40,18 +40,18 @@ class MrubyBindStatus{ struct Data; typedef std::shared_ptr Data_ptr; typedef std::map Table; - + struct ObjectInfo { - size_t ref_count; + size_t ref_count; size_t id; - + ObjectInfo() { this->ref_count = 0; this->id = 0; } - + ObjectInfo(size_t id) { this->ref_count = 1; @@ -60,7 +60,7 @@ class MrubyBindStatus{ }; typedef std::map ObjectIdTable; typedef std::vector FreeIdArray; - + static Table& get_living_table(){ static Table table; return table; @@ -68,48 +68,48 @@ class MrubyBindStatus{ struct Data{ typedef std::map > ClassConvertableTable; - - + + mrb_state* mrb; mrb_value avoid_gc_table; ClassConvertableTable class_convertable_table; ObjectIdTable object_id_table; FreeIdArray free_id_array; - + Data(){ - + } ~Data(){ - + } - + mrb_state* get_mrb(){ return mrb; } - + mrb_value get_avoid_gc_table(){ return avoid_gc_table; } - + size_t new_id() { return mrb_ary_len(mrb, avoid_gc_table); } - + ObjectIdTable& get_object_id_table() { return object_id_table; } - + FreeIdArray& get_free_id_array() { return free_id_array; } - + void set_class_conversion(const std::string& s, const std::string& d, bool c){ class_convertable_table[s][d] = c; } - + bool is_convertable(const std::string& s, const std::string& d) { auto fs = class_convertable_table.find(s); @@ -121,30 +121,30 @@ class MrubyBindStatus{ } return false; } - + }; - + MrubyBindStatus(){ - + } MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ - + Table& living_table = get_living_table(); data = std::make_shared(); data->mrb = mrb; data->avoid_gc_table = avoid_gc_table; living_table[mrb] = data; } - + ~MrubyBindStatus(){ - + Table& living_table = MrubyBindStatus::get_living_table(); living_table.erase(data->mrb); data->mrb = NULL; - + } - + static bool is_living(mrb_state* mrb){ Table& living_table = get_living_table(); if(living_table.find(mrb) != living_table.end()){ @@ -152,7 +152,7 @@ class MrubyBindStatus{ } return false; } - + static Data_ptr search(mrb_state* mrb){ Table& living_table = get_living_table(); if(living_table.find(mrb) != living_table.end()){ @@ -160,9 +160,9 @@ class MrubyBindStatus{ } return Data_ptr(NULL); } - - - + + + private: std::shared_ptr data; }; @@ -173,7 +173,7 @@ template class Deleter{ public: Deleter() { - + } Deleter(mrb_state* mrb, mrb_value v){ @@ -205,7 +205,7 @@ template class Deleter{ } } v_ = v; - + } ~Deleter(){ @@ -232,8 +232,8 @@ template class Deleter{ object_id_table.erase(mrb_basic_ptr(v)); } } - - + + } } if(p){ @@ -314,12 +314,13 @@ class MrubyRef{ mrb_state* mrb; std::shared_ptr v; public: - + MrubyRef(); MrubyRef(mrb_state* mrb, const mrb_value& v); ~MrubyRef(); - + bool is_living() const; + mrb_state* get_mrb() const; mrb_value get_v()const; bool empty() const; bool test() const; @@ -328,9 +329,9 @@ class MrubyRef{ int to_i() const; float to_float() const; double to_double() const; - + MrubyRef call(std::string name); - + #include "mrubybind_call_generated.h" }; @@ -554,14 +555,14 @@ template std::string Type::class_name = ""; template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { + static int check(mrb_state* mrb, mrb_value v) { return mrb_type(v) == MRB_TT_DATA && - MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); } - static T get(mrb_state* mrb, mrb_value v) { - (void)mrb; return *(T*)DATA_PTR(v); + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); } - static mrb_value ret(mrb_state* mrb, T t) { + static mrb_value ret(mrb_state* mrb, T t) { RClass* cls; mrb_value v; cls = mrb_class_get(mrb, class_name.c_str()); diff --git a/mrubybind.cc b/mrubybind.cc index fe738a6..883b6ec 100644 --- a/mrubybind.cc +++ b/mrubybind.cc @@ -240,6 +240,10 @@ bool MrubyRef::is_living() const{ return MrubyBindStatus::is_living(mrb); } +mrb_state* MrubyRef::get_mrb() const{ + return this->mrb; +} + mrb_value MrubyRef::get_v() const{ if(v.get()){ return *(this->v.get()); diff --git a/mrubybind.h b/mrubybind.h index d55584d..8abbed3 100644 --- a/mrubybind.h +++ b/mrubybind.h @@ -62,7 +62,7 @@ class MrubyArenaStore{ this->mrb = mrb; this->ai = mrb_gc_arena_save(mrb); } - + ~MrubyArenaStore() { mrb_gc_arena_restore(mrb, ai); @@ -77,18 +77,18 @@ class MrubyBindStatus{ struct Data; typedef std::shared_ptr Data_ptr; typedef std::map Table; - + struct ObjectInfo { - size_t ref_count; + size_t ref_count; size_t id; - + ObjectInfo() { this->ref_count = 0; this->id = 0; } - + ObjectInfo(size_t id) { this->ref_count = 1; @@ -97,7 +97,7 @@ class MrubyBindStatus{ }; typedef std::map ObjectIdTable; typedef std::vector FreeIdArray; - + static Table& get_living_table(){ static Table table; return table; @@ -105,48 +105,48 @@ class MrubyBindStatus{ struct Data{ typedef std::map > ClassConvertableTable; - - + + mrb_state* mrb; mrb_value avoid_gc_table; ClassConvertableTable class_convertable_table; ObjectIdTable object_id_table; FreeIdArray free_id_array; - + Data(){ - + } ~Data(){ - + } - + mrb_state* get_mrb(){ return mrb; } - + mrb_value get_avoid_gc_table(){ return avoid_gc_table; } - + size_t new_id() { return mrb_ary_len(mrb, avoid_gc_table); } - + ObjectIdTable& get_object_id_table() { return object_id_table; } - + FreeIdArray& get_free_id_array() { return free_id_array; } - + void set_class_conversion(const std::string& s, const std::string& d, bool c){ class_convertable_table[s][d] = c; } - + bool is_convertable(const std::string& s, const std::string& d) { auto fs = class_convertable_table.find(s); @@ -158,30 +158,30 @@ class MrubyBindStatus{ } return false; } - + }; - + MrubyBindStatus(){ - + } MrubyBindStatus(mrb_state* mrb, mrb_value avoid_gc_table){ - + Table& living_table = get_living_table(); data = std::make_shared(); data->mrb = mrb; data->avoid_gc_table = avoid_gc_table; living_table[mrb] = data; } - + ~MrubyBindStatus(){ - + Table& living_table = MrubyBindStatus::get_living_table(); living_table.erase(data->mrb); data->mrb = NULL; - + } - + static bool is_living(mrb_state* mrb){ Table& living_table = get_living_table(); if(living_table.find(mrb) != living_table.end()){ @@ -189,7 +189,7 @@ class MrubyBindStatus{ } return false; } - + static Data_ptr search(mrb_state* mrb){ Table& living_table = get_living_table(); if(living_table.find(mrb) != living_table.end()){ @@ -197,9 +197,9 @@ class MrubyBindStatus{ } return Data_ptr(NULL); } - - - + + + private: std::shared_ptr data; }; @@ -210,7 +210,7 @@ template class Deleter{ public: Deleter() { - + } Deleter(mrb_state* mrb, mrb_value v){ @@ -242,7 +242,7 @@ template class Deleter{ } } v_ = v; - + } ~Deleter(){ @@ -269,8 +269,8 @@ template class Deleter{ object_id_table.erase(mrb_basic_ptr(v)); } } - - + + } } if(p){ @@ -351,12 +351,13 @@ class MrubyRef{ mrb_state* mrb; std::shared_ptr v; public: - + MrubyRef(); MrubyRef(mrb_state* mrb, const mrb_value& v); ~MrubyRef(); - + bool is_living() const; + mrb_state* get_mrb() const; mrb_value get_v()const; bool empty() const; bool test() const; @@ -365,9 +366,9 @@ class MrubyRef{ int to_i() const; float to_float() const; double to_double() const; - + MrubyRef call(std::string name); - + #include "mrubybind_call_generated.h" }; @@ -591,14 +592,14 @@ template std::string Type::class_name = ""; template struct Type :public TypeClassBase { static std::string class_name; - static int check(mrb_state* mrb, mrb_value v) { + static int check(mrb_state* mrb, mrb_value v) { return mrb_type(v) == MRB_TT_DATA && - MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); + MrubyBindStatus::search(mrb)->is_convertable(mrb_obj_classname(mrb, v), class_name); } - static T get(mrb_state* mrb, mrb_value v) { - (void)mrb; return *(T*)DATA_PTR(v); + static T get(mrb_state* mrb, mrb_value v) { + (void)mrb; return *(T*)DATA_PTR(v); } - static mrb_value ret(mrb_state* mrb, T t) { + static mrb_value ret(mrb_state* mrb, T t) { RClass* cls; mrb_value v; cls = mrb_class_get(mrb, class_name.c_str());

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�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%0D1ik;S~?Kx4@FF4r&J-w;<*a_Gr1oArbzdo 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ʘxNi!|-c1>1`xf3Nuq zF*k_1^lp>=z56Dkn?;J?3AR#K-uX9O>0bXGZ%{WaS@51oQy03K>XRbbrpa|Poijy} zULd$Vu%A?Qn_IEn6uP9%w|jHJ!GUG6{|PJ=pKoP#Q{B^n{kS?&SU2KE8mnS=vej$= zdx&(6GdxxN(6%Et3|GKThPP{4wqQOn8-#W5v&5!hdaRTUd{#E_dD(!OF&!H)Ar{dF zOo`%cK>1gRY~bCd>YrG*8x%EJq{H|A*!Tw3-D!<)q{cU>Y>qX)ks9APRJDf2H>hb- z>vkh`yFqc2L`spm-Jsi_wH7xH5QN4zQsWz`@$nd)sJfSZ+uAvMTGr0l(<6BYy(NTO-=fEJItR)B zcU{^_bJ)}7QGEJceKsc2iSKM3Gw0cH6JPyfxQiLax6!v7tFh17;*xSQ>vMYV{c!OYAM{%a z`jALBUKCxkqN|iQ!ODy6m=z5x7#3z&!SH{~Fy8*1E5lnXVgdYKq`ROloVv}a01gr% zCP3W+6u{?2h`nD*H;M#53 z8vr{XD0~)SlXNRt5AqjsV33T@y8+Q2($1Fymc zUIa1A&F*1Zcesa;)B}jk-Kj+%c?@d8+$&Oj0NYWyuA2tKRLsadAD8fNA{hgn|C_t> z4wtIB!v25=s93NU?7b^?C5n2Z7%`qZBX>;1*lR2}h**LcTkHmVzm}-jgC#LBme|XU zVnP%Z6%~zz#BMY}{odc&XYI4k+<{>7egAwu&+=V+?bUWY`;@s@Q|mz9uC6hjkeqal zN!ryl#*?xdPst1_+YQoxT zHT3huIa_7w#!++MMSbS=$;A0YEn6gPr*5#nyl^U#mS5iz1CC9PTW!6ljb{~VXKs76 zYHu*x47gdOlfy(0Tycl#eZ^f$kkLqH$(6FpgShEXT}A#9t|ZSDcMhlN*w*s)pg6tN ziX&T%s|Keswf00oIGojr!&zKy!xd??Mau|rnVk+ZJpIeMGCL!hXD^FonI!pRexRAh znX^ZC(X^r+-b!N9NW~Yp+-BT_VkGJfCPo(hlS& z&?)iEh-y9{NFDa*X z#zt&$YOk^ExI#)=9Lj5qIRh@KABe?zm%gQ_pNo{p_o8_=CfdYSp!lIF#$kP@yJ){6 zu_Of#)<=!Wo9LpfXsU~@kmz2K#)8IuYVC|ytUs#e9g!x+@c1y^g-OHaP^bMkbX<#O z_fgHJGp+3(YdZ?tc!4ZxTXpCX(KdG7CfZ9mp`{aGt6Y{$fURU1GLDvoC=S@4rPWun zfPXn_{gu~Wl536k9LH2<34i^T=L$>{cz;L$&pDEzfluvb_Lu^H>Q>y%Rw-M+Q?rZg|fLsTN#CmRGJ(WVSj^aY5SO>7N9~@z|zQ_tNgGBoGlI|Uo z{(DI{T3FOuBf%)ZFDc^RHx3U)Hc@FvqTwkVE7^mh(j0bSGKa6p^%Bu(%CY69-+HI_ zh`rPRT9uBv%M$NAR@owK@;nYYJ+SVC+8s<(`=Q{h!2U)+aJk{3%T{5l;qt<@C2{^^ zDYbauw6e7FXH54-qqx}IC^?7hp8H8e&lEY}D$l|5ZdY2|pY*DXoK)$AG_M1cS4cnZgG{W&%d=^swB8UYd!X9K+6!DguXS8k1LmIj7|>69WSwx6 zL>%B7Fb~Y{Rd7%D&#PemDN^qN*DaFEVeSx+NnAe;v=C3>Cg?skU1!K>=u;bosmAikM7tR>fR$2X+yf9wOi(Yt7%y!4-HESHF z@wy-{?0aEbJ13R!^TjeT|o^0MDcq*{RX!On&Ny_+57Rep(s<9c657JZ{r0W;V!(6O!$wzEz z!$(Y;0prEUST0N_`rir+0=;Ynx|&|L0=-MeT7llBW352%(y>;ccj;Iw(7SZ373f_$ z)(Z449cu-8myWeU+NnFKUnKmf0Ye}3tZdMkteB6ix%vG1s6k8ST_QJ0TJllDCl2hIsnwP0q5nCxIawjaf@ouUOkx7LuJZ2bDDPPoOw!U9-y%5O>o=IJm4CN*9Xv!iB! zwjY2sB&A6WUrdtwLJwYT$%js#)L_ETCz2MBCp0N0L@4H%#f3RZr1L7UjKY~5W(7+j z1M+z{#pc~{HrZ+bQ&9JbJv*6%ubaFbSXDF6;k*;3#7kut<&nli+z{Gk}pX6_~TFpnok5<`I!v3@}VOBTj7S zJyEBRnOXU$#ac%0O&hrkc*odwARokujbae9WUWoKk?5(N!yLoxBvQse!{z6Q$+w(| zw&nauf*73wn~(Aari;v5Kdsz+8BetC&AV}8>_$dB3~b*gJ7JCwefn+#=1h@%0_TYo z@7+f4^;hboa6za8@=5h>!v|LA(W{BAwpgYQW&CrPCXe#Jp_7+W~M@FnK>Q3x^Q})-tw(g*(#NVT}LU zHd@0N)RQ%Tl^X-Z{%=0GqI2bz9AH+r%$e)M4GZN)3>eo5^8gdZr-SP`m-3b#sNe#k zNNl=C=sGSIIL_D(V63Q@UiB>73CD$BmmV(pTy3PDT=b_m*sg!SjLCt1%UMQ~8!#LQ zqz~L?YzM~!7M`RmIt~c(4V=A-Nr4+gYSrWh4A(JfCx?dVjpWcUy}|YE#dcEyJ{OrW z%m=lZ^aB+$M5YNd_ip9^SV&}YnAH%pnm<%rIoynZyF_LLbLCHhT(CsA@=k8Ra2Zxx zl4H*FhF_5-Pfk438-8(?JURSKZ}@du^5h&ez2TQ^$&(||^oC!(B~MOAn$H)63%TUU zL1}u!uj!H}XQt_KeX;*?NY1zWv38WH0oR7U-Jgkt+zG>;~o7PCia#|x9z-f(S)TT9(p_DLIrmgh^LnOBMemX0O#4d1v_CAr=wNKDf6Oq^%KiAFMiN+2&NiPjWlBP50 zqu$|cH?k9slY{~T`9%3LP87~+BW7};u=qpO9$Ga5;>8I8p2jFMOGNtoW?x;DZYu#vItKz@xX z?pjc12HdIPS5u}oV7OjT0nQzk$cBbVFj*|bB4{RxQDo1>i3#u25`fojTPXOJa^@&IR>sgaHWy@ zAs=OSg~bXPN2`G=t!OGM#3uwZRUiRwWM-;BB^U7}@(?t1g>n#YF&UDL-m}gTBU`~w z;Z|^UPhNilJI^^9B_cOXMDE}m#d=w!&H>&K@rSss-Bu49M2H1*wi%lm9j;ZQjpm7M zyf*GRxV+u`95Di%AnI*L_rU|;*>^Q?XN|-b?^b|$Q>1@*WCZxONSg~lbkj-WkCP|W z19`B0%fW`G!A?knoiH*9wlBf*2q%n8Bao{eLnJA8HIkIO8hDv*X;y*UNmrcy*Tly5 z-M-U1N;_Tgk1(V0oqHdnnfE@mq};30=&JNil0Pl&g41Fb1ihpaPK%x3uGGzmpBCdb ztFgk#|APT4a{Iq9Kx|+>KJY#ZZdC4HiM0Iy6-`|J#Pz`%>?>{D>(>gH2GVdNicE#{ zq3g$z{oB+sfa=8J`Tr&iM#(G)NyIfsZNAQ$CatIWqBI8B8twpAw6=}xHBjm8XPI`; zOxl+`TKDFrZM$D8PncQ;ghb*ShL8T6Fc{_8hgnNp?EuBpOf*9Ka*bl~eIXy)TKj6i zcGkYpz5b;=hlVAmY;R}Us8ghJuBl}}=!SSM?=NSw=Nrw^en+sun|k_j|bwdB|>v{#g(A)L9d z&E$=XD;uSi}dHDG>f^}~R%CLeWtCrq%5`yZ+Yiss^NaZmea)hHe>N;-Tg-JR#p z1iRt`^islTtZMi08Gv$sxzrP~%2xJ-%=*mlfLm1gNbrJ+hXK09x^<+zE!#j30Yb^| z{6neP!t&|%dM#M<=B==%)WTY~-g?@Mfm}^%xV{yd)iu?gVCuPrm)*$AZue5|c~%W6 zbY`Be>&!eup07VAQU-66;hW-zDY}>a;kuVSL$?br7Tqe8+$NNoE#eBm=x?GZps(Cl;Q^ZY;F<4MBE9ngxWzX)kH>g2W(9w|YXzR^@?^{k z{>at}JRW0TutM^hu`Ax?Ta7=|w1Pj$w1Pjrw1Pjgw1PjVw1PjKw1Pj9w1RgfP3#nf z!Gs$x(l!Y26j6J3m)@&P?@NKs2%6p-`bFdPzVrvLyrV7!Iwdg6F-sM0mm6zzfN#tkOGewTm3>X{{Yhk7BaR9tZHn> zP{DyB%i?V@-+H0Cv_47_DGac`u~py_V{6w7#v7Xfi`rY7jx7XR8k+&<2I)nDw~VdN zxolfyut@C#h8mjz2OC=ho-(!$@TNyO>>;=#u)tl$R-Y5R8>GPWAO$MRW7e^^;1FXo z;1*-+Qv`1ZDe$?mwJ)?M&9fqA)rK~qu_6TqPBOOou3&|gk=B7-jjjGla7$qSAb2UT z?+Vsi#d6@K(X*q`>3GR)KGftbUDTRxm!W4+x$%HUnNXwhp`#q`(%tS{A@oqMnr_D~AY=HE{-Q$M0uO6M7i`zk@83P<^YzJ_BkOF4} zDR6y|0yi03y+bfPNUJ~5$DSfN11>hUy1*XcEweg=cg)L*q_C1;hrj|m8CyL@aH_E# z1NPL%3L@pXcaP4k#qA{0&I;^o6(gRibnYu|M5q87vEmov&JPv9g|VVj+%2I3xGh#Z zEbiG*0Zfb)Z;SglQ~;mGioSbk@rslcu&Ah4g{-RL_OOZ!*vHuF&jhCh7C1u`)H}u9 z5-Nb(V#TU^YX*tbVE`|oG?~sgL^l#5NuL%x8`zfxp9dEB%Gl~AhwAO5NV=yAZZNj` z7r{G$1^zCw$+7EU+Mq?!1}-tS1Gpkcfop;k_)U-kzc;q}jNrMz{!Q?)v3209AYJBg zT>?c4F;MWsz*a`+3pGhmppb>KQ=>lL$RGudGByML z7^EKy1~x3(*@ERp8VjsvYzAy-Y;~~UTw`m%`Nn3z-9ZYxYiu3(yRp?3kJQMCl;ov? z>y6ETn~bdj_Z!>ss$jaY8L;#y%sPG`s0a4oW5TzOa^}ZuvELr6jyleCIbcr~sZ)VB zjO_s44pM-(i0r-s-W!Td&)(dH@D!e-H+LEEez&1f@mmeC+-HPiYz=rt#9zz=zgP^v zwKEsj)Al8dU#WAT?9FuAslNPjN zQjKHM*uZiidR!#4j|H50#Bu`JMkJOKNchO7HcS_mo^~y$tt|-Gm|AfysIk94Ad=a8 zg0Q96*t~b%-K1>4F9&uW?V;goom%mMPK~=Vc0_sDUV8=mir9w*y={l6u|ss)22f*% z*!oaYXb29qRaj$5vp!|U+8ku7uy&|`l_)8*`eB>OHKy?=B1xH=yzmz5cYk7wIaw>_ zWPEJTCofDSZIV8pwAW0tukrHR`)T&60W-#Ge9l;bS@WpohZUG1`HlayhTqd#jo;E* zff>QrTfsllvH~N0m&Viz9U4Xk%?f;E#aLOvKc2FJe=%hR9|bG;-LVz8Ii^dkK&R4C zR`9N}f_Ih`{5IJNewS+$)(7HhDhSc4t(=kG+)<-V}L zdQ|KZg5^beNz8MI)#zyM_Eg3FTv(|ctW@sPB<22$n=`T8l-(FuhJ>3aN!N&r*1n?) zi?-ty-4NX&(%)oR4V)zMm<-exwu(E7rQ5+>PtDeA$G(E&0{f8Q9g*91Xc-?Q@^Z1X zJ6Oc5UggBf?fpYzxsBlTFDZw0&f{V^nXw|pa+H~9>#n0%cO8s4=MpKf*mktV)=@0B zj-|BbmKS*?$mRScgf@`0oEVHWv%WAvHR$K>{wTdoGQsA=oL}0m8ZD*IN zj)Mf31@?A9xcqeNtd+?XMrN$ejYVRMD@KP;I7xjT&8_{J`Ju@*y}>ZOtue6zn8R< zD|{q|UBn8>k|@6Xvl?$ou_WrnC92MnxYe#jbzqW6R{DvIn3sbb$ortH0rQSXS5@GX z&^KKTm~bJhvxs=eA{BszWG-QNpdvZIDl$0?&qgFq9+7l4SX&1NIdGfE^o_BFR-Z$_ zx-&V<6+sTL2u%(%(3W5wU`3i7hKD7J3$Q#*4zrf6(>kz=%VBm6a^R0HhvC_W`~W=n zFh4L~1vyZ93>#K_-9W3_^nGKNA6EOjw%Y3eE8bL!rC(?MvHVRA6E5L(fQ{Vb#r3?- z6wPO4SEJYg>P%3+_%eMqef9w>z}zEJJ^+_26u=3b~ib|EurbdY#HPLXAzUbutCa??~^8H!<-c402`;tiygGi z0ft@FO?j5=2iE*mC?+4ykt18@y7IZU{7ssr5nm>gzjk@5k!js!nq!o5!& z;Qq(tFn5cj54`4bn6>O6SO>TrGJTkE3917e5={>ChFy>90M{gw7e~iB=b^Pl3Iz-k znFb4Jc7kwg89?Z2C(KW66TZObXyl7|#Ru`4JDtX~R6Y~eztshRiPd`bh z6R^p2ju30$7XUv}NX~A}F-|NHH}2#((beG5b=iw2Sp*FnoY6t3~lJy%BgyUG>!JWmm zQU#9q;Ra6ycjxLl54*BhS4~dIztG9CrufFKgde6@O zu$4&V#VEsnU!*<+xV!NxzteG3u7})qc-iB62+c;khnu6iYfI{i&nTC7MM@vVtwmxF zi8k4YJc6XD&5LFe$M{(ln?$|T!f+EAgY6~}C*CAJqERMl2dFLe6)zZ{v-%hd(Ywuh za}M|qZy-70|o8R=4RF~46)97@#u{`+xt|m1zMRgAAa-z4h@uf9`}kg=r#n7{IGjui}uy^Ib3d170t?_y4BP zchz*8<(qPMj^ZVv()5}k0e6GR)`h6Ai86rNlF5M*oM`nOJo^YQnBwCBYDZXY2B2ux zu3B=%P3GewmJ8T#Im^Uv*pw7I@C{Xyu3FQ%LnP^~f+qs&KX#Oqr*QTFRo-}$#)CMC zJu*R-)}p;q1P`*JrQ$akV!gMTQ~P>ZYsj<)40*D0JyA7kT7y)1M{5O7%L>hj@!LzQ z_)n>sk|$?{nWguwdQVH4&l^@1iCtg7#|-2NP6%R888JzIXx-S}Dn&V&Rf6HgVLR#F zERyyMf;R#Sd@54X(;G0n$&*T&|DDSeBfqg_R|CR_78@jb`t(O9%q~R3tHQb}k05FmWB=mAW(lUY^^` z6;2Iepy#k42K$S2Spya_wg#*oq`>Au3JeNTU`u1Gz$wPocqPvZc!dU@5)m4l62t&+ z;1Pq{beJ}8;v0blc>RtB@8ACs#0K>s?jfv;6owb=$LC`37eRc!;GSFzK560(AiRsO z0eyE3{=khz@(1jbi@~E!TnAnT+WH5oWj1S?&9jFq#)AxsVIjst(HGrC zEEZNu^8M)|ik(k;)@S!Q?THqO!+aqpZnl$~?q4*yEwv#?Y?-gI)LZYCFkpo=2yO*NHe2fb1}uNL-BYmCPwL zpAac007Y}|s-;L=;>MeD1_ZAiu9{qyPz<%LVp2QXF(*j*Zjt?cSeW}n>T=*=laIT* z0Yf}f@_ek|Jwm)GB3S|!~|45w6l95K#A<{4bSd<2Lumsy$eFhw3 zY-~8Sm?RDn&5lF+Tgtfnf!Sw3yGYURZom-A{$`)|AzptfQX_#7H=cP$<)XB`E=%U1 zi!?gLziC+rldk7FdV*aU>&Yi$o{V2*<(gW)Buk=jDg7qca%s!IF>_nL(8|Cse2Fa= zPOg}xVMsn@b1#EZJ?go(mW=)>K@Yo5)`338#to0!f1{ya=L_ajZOIw|7vPeRZ{7IJ zO-th~LAVOX>EN|y;`JqauF?6&aNZ6VmGsczB3=@5`OZI|OTK4wKYnpnYJRCr7BHXF z{ad8ga;ffR7vH$1mXK&oyO3u9AKdxv4PV(EpOjaY<%Yo;Ae5_mCWEEUDIr;nE-JMr z`GC(&5s{zi`8lFwbb6}cW}E6(;BdPgh-2ZRk}*2mI%xJ6KRYdi$?WGlyt71V1HiGQ zDfCO@NI+D_(u-9|KnSS{1t!G zJG1|#Bi~UTJ=9NHX#`$Glx!S(spbN!tpbxp`EOz-#eXRQ9a^Hs(T+7mV(B}+LlEof ziSwR;Z%zr1+vsvIl(enE7mgZ&e6({xWy~6qf><{41arI{W1hI!67agI$V}aUZ zqJiNL<|ehHD=W;>x>y*8%Kkq!4xR3en{|t@Ia8z-0hbtC2d)(@+$!TvYHkws*FTR} zZcHa)n%dgXyO9ogN2G}Y(hNKPq zoZwScY|#rHjO${eWWWXj^|V>2a`$Qyf)3rL=Y68k=i5?kLhm3FIHP6g$)* zxiFbvzF4&>elM<7E4b4_L$l6Tb1CdlEoc_J30rDxtZng0krLw@ql(@MC!6_psu^yz z*-NUOCekYVcT|i=0TipI7_U}4bQj$w!{^OMyx@+OR`(yicnhh$#N0-MlXH=JqPU}U zVUjvueBLT5^~a*xHFy!5j5necOq2ofYZ6c418or%n}`{}Jo111hnI!(+3d*xCX-jW z^?bQWDGL|sUCl3f&Ev}a-ezSH{~Q^}H)%5b)ks(PsRZ%M6c_T%>4_o@4DgAuwXX#O zb~Gt4(AX+)k+C(P)7T7nDoBCJK?=MQq`=f5&y z)*>r-YUw48U^qnvz9Ujk0)#L-kA)5~31<}^mkJLHPp>TGQP&nj8ZjR_3N4V7W}4d& zxgmsRD;{x@Ok4*0f{^XOsyW7LYv4Hwy1?!%6fUK>4rpjpathCwi zkQuz^u%hZV6>02&LB_^s*Ua84O;iJB9qQs-L#{}rPZ$`c!McIq_;FCUK5mPZA8PXzsl$OjJ6jq}zbWLyxg@#m zq7r7OH^@GZ%jbPf!Cp}9m!iari%MS5iC+xj zhhIRJG!BuV`|lt+ssqQE~42dU}YgEGzJ2e16{`*c3O>OwLJQ}p{;i6K4 z2kI%xnD9^qxYQo1gn!bIClA+&6ce~f)O<8KGdC%@bYb(+=je2$i&`|mBiE2-tTmnD-467bVY zxdfgvHXc%`<=2==yIxX}*GuU{beXzk>2xBtORxJcGCdz^d7YZ9l6zHrUc_Do@{1m& zJ3e;G*Anm+D@h2^{3gl(YD+ETW0vsAZb#qU!xt)vH6lLJRqE3RB!^9xmt66q&b>vX z2OcYu!p$+gb0z5hqfT!ywS4Vc^7*m^eBGP&r^}SoK52iBk>2_CqAdMMsJo|@mvtrg z8|i6P_g{v(3AKFelnepS!g$1`KJo`#Np~SyOQg&WOfz$NDRzCYR=?Zy*wpSTO1xis zh#s@%a=SuHtkro4RgUJ7} zzT!8Y@iK9{s()|ValIfyvy?&4!*t6m(rMz`&TYi(>IF~y00~YI(QYvRtofGM?wcj- z{_D`>$Di&A#rW|v_53Qdlnp;l<16R1KU}8%csE@HM@Wy`Udw#xQQ`M6R`7W9kI>md zq#jFtUYh)-H2EQ^+x$TK`R`DhMWsy9!IJ{6)X9%{@MQ%zD>QVqDKwHx&xx|XLX;dW zTvUp6S&TI^PyDWkY!Xl2Ov{PnHf~O^(2!f#NDic5$su`b{S~$GLg%%XX;B}KvwVr3 z|1#Hm1kw255QyKYd;M_|=0Dp_McwqyZ)H45!dFEaY~T%JV>Z;{C)rEBQIXH$OM`~6 zmxS^Hg!*L2R?LM-N4uyrWEk=zE)$Lt6F2>y5R4`iFmZLv6f# zQN8IBCCx=~`CtR^_r^7$fwh7Z;E#_hml^hF&Tp0jE5P7wDgBEN>#sD|w?|b5@3_(m z@Zegj^{6bmP@J$N!yk~hCMAD8yy&GwV|pXem>wT8CmK^zjj2)N1x5Kx#6ur&C5t$6 zY$wdRB28H!WFoo8Nv5(#(LdfW-Tv{9J(v0c|M-XfX+zg{LQTi1GS{3{@6_O5(#!<_S0>~EIw z*9^VftQW>h3MiG*#?zf5B?jPB^%}ZDxfr^|RGVuQf5HzT|CEf(CN*F>L>dX;V3X@l z_`&dR%_Jj)YE6{<2|tPlnN~bg?XrU20E@yp^M5p?yy{%X8s;jcRwf$L8i_`+>Ud$Y zr>JChm;@)yT-diGE{vtu(1lB+#PqNEc=sdSPE>NbhXhA1OvudXVw~1H??$c$- z>VHTopEs!?d&XoVj&{>THiEjzqU7x1Zj$TuOVYq|GHit?-i0E1&$Ke&@5aVsKw%Ki zF-xzhw;!UkUC355S&?ue8$sPhq9kE=lO(*cH1M1xT!>=Ah_*AW4ETYuG2y}>CcK|C zE)%5*BO76|BH=_fg1RxHBw=@xBz(Ly@SG%Eh+@Ks&M~bFIM3LaaA6P=zFrz%i%K)k zh3QG(Wjg7fyj*g-`?!o>urPICYVdV;+@q1Y`9#|BfMrC|E?VZ=`g;Rf${P;w)l-&l zIsiWyC(S}-mEfBvxhnaPei8l*mHf_qG+=yYlHUAt*6A^cXv`3%ezu8ili#bmKTvlYTML|B2j z!WGeK8wr0RDvck)VIr)+T;cL)h2UgS$;yT4YR`@wbOaQY`T*hLB6<$Y6)uZChhTeA$;yRk zSeGg6M`_p&88@08AUsG!STI+(G=@cRiKrCTg=tuqDeT|Vuoyqk?7)So1DDCc`>6wr zr!_lpVfqP`%jDpl)B(nGuiMlF7p57wOb*^k9bmj(vjZ2V8MsUiUQZotCF9+i9U!cV z=z1_$xFmM{!4jS-Ds?@=F(RzMT;bwqb)ke4L?tVP<3(73xxz)!3c(*l^Vn9J|H*O$ z4~ddjcj&z*GVhD5r$1*PDusGfBZ9dMMfHJtSlC0$Wd&6!r)PVHP)+rGYF+rWB)#N0h70>NWe*u<`<<~mcX0lyXT zFFoM7zX%@pG%CphtJr9C(XmDsxl~E1TW1uOeK+mIGH9sash^Vj)|J;iCl_H)CjIh# zh}`^8r0xSkuJK56$1MGMt)A!XW%-1bsNngyhOW6qKJgkqA$pHp>RM@v1C$q@lS%)M zEdM1c&sL-iQ)vd#qETi&?3d^11&~O;HhD*|^ZCXCyNEPL;}?N$WS-p23K*i@G6sj0 zk8_3e;DWnDL^_QCA)OkUy)B1!U@psHR4$1u?*PO*myoItOrGphsMUn0dCzDzmn@aMQSq;2C1FCp8XCA9bCm# zu&-j@)3S`)+^w-Tqn5r*rd6AiXE7^I9;h1>QF+!OeM)3q|Dl*qz2F^t(QIklDJ|uK zhmQl>Y_HyN|H_$jvuwL86FwIOQLd%k>bBJ17DWl zEs>f4{LR?to!V|DUrTt{2DzV~i@DGX^$m3v7L_8P-bWgW04y%bKjod;_iPogP6m_u zYyq3XNRqeXLTl_&dvhUzxgYT|hm5G`}-<%RyZ;3n8&PpxG zi}lo#dmI$E2(>`)SS>up-8fV2cW4djhnU|QfTd1Ly$Z)QlKGJ+nX4Fu4C(+zdGkU8 zvZ4WT$7r(Y2sS`4Puh~0$64Pg#lMSeXdh8J&o|F2G;R_p6X5rvIIo`04U&0vYpzpX z6G%&8uq;jA2WCrSinJ7rL?06+aot|sNiF`9o~8D2v#kNaO|?*r{qaxL?jT#sjWxEv z7kp}=@wK_ifc~nF{ei*Wq9m^cRa`WPfF+HM;ix5?W+Zk5OD5+sd95Ym^`%}zV^cHA zsNXlRo~qlcBiuUa6KYp6gBlRrR13wJWRp*9|!yw+MnJszw8Gq<_Q0PIRlK3?^~Z_VwJMtLIX329NeST1-3LMAouq+iX_ zpV#VKFsRexS)sdq-RqMfydipzKhAZnG{twN_Jv3j2cQ+nkA62$)?16pYYOQxBI})B zi5c$&Pwo4&rLniP6c-OS1h&~;{p5oyn`)sL=MOapnqmeVVQjqiQ5&1# zkx!NoPo~TZz=y`hVW)P9O{k4~)QntI3W#t)(~CQZ z>&dbA0-|1~l>xyZ#yVW0pNss-F#O3Pbp>#NNHL2i(`EflRkx0*L zw!cDxNi!4ntZW#4x}sX%SU!1K^PAj3(sD#kiqvwTOO&>p>W57>`e=~)q~(Rf*z(t; zvFK(^Eq7s>q|2I<{4#ftB#CHl`Baj?e4;c-s(YDi^wA*oNs@)bm?Q}fHjCngDY7+0 z<$-W%nDm#v1QCMQ?EJW|aYZiKJbuSl9NY<@-WeK4<`bFixVQa!~MB zyh}oGlqj?X?pTq!4>&_qitgIY(aZ8d1Mq`!5*?NEg1;jAtr9#Ua)0noh!h`~C@RG- z>lYhESw46GelSkrqw;?6SHwrqWAh?D{G1}i2j&x%;+OS{_+|Ov0rREqA}-djHQW%-~1_`x`dj!Jv*S42NSg7ZY~5B@@twrSvcQ7L{| zzi2)3-vs5t`S?~sw4QC&JZq5NABxJ$3F(6(Wzf~=^*y~06j{NWebsDf+$$}0C?0x? z#5UV&`*8osPJ;Iv%(eyuH`PKhUUQe)Qs0t^bkaH+TwWA1Ob+f_R14X5z zzBgMMyGe`bEbA>qN$6jkAF z6)7d)4a5hRUPCU$GwkEWzJqE=<1sL2E{{rVD#kia(5s z(gNz$a@&zE-aJ|eR_msUls+wW)9MneEmFq->l+*Uo7!$BOpalqk{=iLtZWsJ8z>zt zN*`~#tYnPR*d|4nl@u?O(xoD03tVe#e6~hy5XGD1$0eG7YYb|@q9Wds?YoVBxgwJI z3c(YB^+CsIj2R7kR1j)QF5i+y&&m-az;{Gp+6*25e~nC(^l2lp#k&-1*miNkhrc+mLHeS^`=`=$u0 ze*(P-n*4j{XoR+9N!wa<)~q_HaPohlgP5J3YC2P=DARRp7Sw@_M7(QUOP#%k^?RLJ z#4sfLJVk~geJFF6%J-XE22hMjY_U9-o~^+W2JJssbxTj9?#G#%gOBdMl;Vd%oc)aC7cjH07x`KOLC23ny)Dz zBSc!sz-W;ccrON&kxDKy6fsX*vc1afrj`LzCl=eu$?W+?v$XCBR$9}EMrcW{QMBZT zxev_^vS%!kX+jZ`H2e8gUcyq&0ICycPo~4-q zbU^a7(M{5fUy({^SUi_qm|Lp13ePUo4(Y+}kRC2edWA5#q8`|$n;cR3LW%Tpk=ef| z=I>tc2*=Kr#s$(+T6p*%u+8?GLGC}9On5)h3~E4dQ!NzZHJ2oB5|z_OIzd!wK7t3k zsUpR%snW`iz2KQXGFuvNN=q%p!-s)wwpa7qf6`LCKVt?pAh@X(im|2S^{uGfQlx#p z-_+7!66_-?t0Fz!Ri}&j$P1q70kfrXqO{afJp3cD&Gu@Z`%hYm_ruMg1_U?NLNT_K zBrg_~(?{AVDvjyA5_EM_MLMZjb<-jGBR8V5SEMyj$?I?l#)^{U5nXGdxOKazWQtkP zi%%*MohfR*@hQs(#|Mn=qU0B!cZfpvaCeC`48S8IX%`1{*KR(bm*s;7;0NR6fR4&D z!C$e%Op@TArWad?VZiqs*% z7NSyzxOQ`gl;wj4;0NQRLr~c^_$xYOs04?bUThVjQ%n>)#6_jVJEb#0*>3_(s%#K$Wi+j zv#kNaO|?*r=`$pA$#XeaKBu`xWgv$Ec| zReh-+(KykZW<-A=u-;2@x;tw>D+wl_BBMD1+5`p?18*v}$lBy&e#Jr%cC=Xt70 zKT=yWgBlRrR13wJ^O>qWTcju6KLf{!ny;GZV47St&r|Ut6J@|<#zv>qHW@rE(aWOp zcp?2jR2nY?J@)UO2J)pOFDds#QKS(8<~BAaLTxt_1nY~Mn~D5jk@-Jc%s5f9><6m2 zv57KZb7NyDYG-A=Wvlv9Q_$GeoMuEnH?Th5Zm&Tua*NBJ+U?As1_U?NLNTUEn{E^} zHy-)DqEbc(o^7Fwe1$r9pfkE*$sw{6CfFF$0ZA-$i5VX7@H1&uSiEZ0rQAT zIk|p$b-L$L4{R^n5u!94vYN=l`J8om*{yphxjjzimy3cb+_fUjDc}(iPcYvXevhSa;)Eg`;>^gd+?sUpKV^#w(hi3?PA0qfV98 zY&4@OajcR=Lv75)YrlIo7e>D|Z$)y&pe=+-ALy;C@@67U8z5v7SJHj6^yjsD>Nup+ z<5|IHhihoeygnJe`=j^x*FmLu6g}YcY3w!BabE zwlq$XmbwNHcLuiEUj6I-ldi`55oS;Wf}3ig7`LFSRf{-XYc4BIwChLd$G;-o9RCcw zPo(!tz=I;`7W)sncUpZ0P@jHQlejt(SJWq45Y;)S}hf+yMfUnt_qWcQ*wUJqxHT`l#B>gJBu`lfr~|!4`!%a0cJ6? zYX@*qN_tx?IY570C~cdBw@=SBpe3-tN%IS9pr?jY8rV%lNsgRly>+4wRsim zf(!^r#m)ZkS^D!@ewggx(jO^%y@tiBlMy;1`i?uFYo!T(AhoZoNf|&Jw9ELkdO)Hs zQF*IJim%dO?kmd^MBRj=CFJ=cm@9OS^Z*EcX$r+T%Vi}`H%aNYqH-okr-)2-x|ol= z-~sNNEseiQOB){^{t?(_dyTXEPlg=tkC;IX2yUu{V(dtgM4axJE-STju4DAW7Ew!~ zQuMsg;g4{Y^akX@4_rKdrr*jB2AMI1Rn<0T^6c3hP$c`7ag6hYz0@}Th{xV zhYUE_*w|odXEW{*tyC@FB5v}c)78}(BstmQW~lx>u%2L{So79s=-g*AiYSgY+Zu3! zvDLzPwXlipyIe}Y5~V-lLxz=hrVj<52G-NLHLtand3|a4(D=0(Wx%7x)=>R8ueXU?&qnCsE0`5GKzVE|AtG<}m~AFgAW4M=hd~a|AD#Fxi$0Vd8wgvHB-2 zMCEZrnu#pACr;7hAW8h)VL@Fmm2opBm-U+Ky0 z8M#`(Ty+2oiMS_1l_5#)1Syhh+9{t%HpA31fa=6z+HCtqv(zaBE6vzMBTUm=qnM8G z=RUOh$(~_NHUf&6q}e~9@{^{P0aPazbE-&At^IkecFQnG1h9e+QlX)((=)P#0U=ntFL#qP<1?ie8W#7z^>WLSXBQ^>bo)qcG1msSN z;oei0-#t&PF0{}!Aa7lT)=jWrwW4ux_rd6Y&Ub$~xz{4sf%`=4K13#@b|1QwW+oev zCzH;BKS}LHv&euj5OE_q>%R$uQEAACt5G;%q~~M>pSOj2-=Uqwps7%(tB|TsQv^*H zpxbau?smzH@*r$h9s}N0(@pHW+^zN=ROwT(u9@se-rH$^UMlVD%pwEAV8k=|Ewk&| z6|JW{i<$Rfq8=tbsY$)7;b~jJ`*1=`qvpPot;$W(X8lY4df9BsfH1M*l|^dSAk;Uy zyt=ZYglmL)V0&ZZ0$C-BVrQHv(G{jO4EUqSwmEg%10wkMg$voiGw#n=U1(NSfEL+s z)6=M10cM6s51Ig6nB0@a$tmU}19B&)jl@Z=eA>uVIYewvB6c;Bh+T~$VtW#?*f&pC znD5?LtRApDYe3#bmES1Mx2<`#qK9I?V)Q@fd#;?kYLV-}G!gse@rpXZBG*ZR=*hn6 z$)wY(hx&e=aPI(w(TvmLp8qBcMy|O zJYX^G$+B{1Y>w_L-6-!U6vMK2~hrFUxDgMX6Bi>8(Vq0i$^Icc_i zqgm=Uf|Zse_pFCJWMMBSiz@N zp`j$*Ln-6s6roL|EgWFTlDXz4X~yd)NN8Bx!gtIqOP*broKIKRnj9FGC$O=x@y~Kl zyQPU@`*%@scN1m6UdBcPY7a6|oSJk3NIaF(&rfZ7X86b-IY@z*AbL9dIVcpdnM zM7>XK8tkufVbWjdtlzA6tOT7i7beeF?vvItqSA8CWu?AF>6Io$mz5Mhky4*uls&qv zq=?c|qUNU;$X67Vlo4#wLK*p1&B_RBqVgjYq`Nh%ek8#+qUI#Z@=XVz)8jOov_OB6 z@+)3nm-PpmK1#`>SyYw?cE$2Vu&T)8!>=LI6b3dImEx53i_h50^1%b}gK-icm2HB* zB7RkZT|~TJ0)HaXsRB4mREnMG{tVsSMEYrI{1bfCj};~R&k?z(G?rIO_=xGnYr2cl zY3Q<&?M=}(ZUu;LGj|yfJjZ8j&q?&D)y80mUJ&Wy!Xv?#tvW7Qwo6M^x(EvVQTajk0{`0Q_K_3@j=e2Yc0I|AN=S1&uJ9e!!#lK1IbCHG= zpcTo+{IH5xrBm8v$%$waHSYVORLy0H+Ayi?)1>CIMC~Z4+|s0m?B^yc{>_I(HiEiy zM9GYDH%XtID-Ap+!&Zpm3_;XsS{ZPiv2kS;2Jy=GfHXc8rOik7l*x*O6WIvrUJxY- zyPG887o~ycB;i676Grqm)5?GkjExBw1~K8@XX;BDQJOHa{w6CDPGlpfTSk;5>~4~T zmz4&dlY|RVOc>F+rj-F37#kBV3}V9DN#iO}X+63yeMjlC=693_$au7csRKU`zKTm9 z^<%6)1E^15SW-RGWTOrNsZTnB>Tc z@PM&#&!+ZYCW5)PF3$=-C1a%lCQK)We3dKHW`KbtQ9+5ULU@1{4rfd84%XiMQeA5B=!8nPH z%8J2XaXs2Xf~`z11GY6b_B^#mm?+NMwp^6fw)9VcPL}a!%?=QLAR;W7D_kAJB3R}e6pBx)koA?U zd~4y-uvj)7fX1StWb(PQQXB9-M3hEAHc(WK;8Kr(#$Ztr!JU;N;JqPABOn_tDo1ds zM?m9XQ4+zOl_HFh&OM@*!gO$4v3V|EoI6N1dqg*hv^fE{iPCjW^>rp2eI!VIl4jvB zZsYe!qsz21V4|qpdK6v|m0HpNT>UHWqOvN|wM8Y>10)zHO8XhvaiX%hOTC}bI9-%9 zz@3#M;Qc;P8Ufk$qH+Y6dIU7?5+xDbSt$bE-xj42kUb|VM{ub}K;u^}L7o07Pfzs0C!o!t;ZMN5JbpOf3#QTzFPy>RS zYM~e}Xw+RbT3QnR*>ers-* z%n(l`y;0m%F7^%{fsjef`}TlY`tw@dzP5LIJS%j!uX}yc3x`JU@m|)o(iB%!UK@oJ z0a}sV%RVC~Q$*?#V5+D*s3`ESZj?HTf2iaj(M*JWca85N&>ABuJ4Jd*vps@KyQw0* zrdbuiJ>681-ruZ>U}85_q?4Of5lrujY~0F5sCb;HXJwolRK8I8 zYg5aBH7+Le(PQI)E-Jy2B83K4H?{*=h=4UO!KMbRC7MS&(E2MK_0inD zR~R?|!8)S(OgOI6d&M9}wz)`l-xCZ8tOpn`ufG# zMVkw!ar5|CnqQft3|QNY>HvOqRkY+V+}5fxAS4#=Z+6IrikRrhC+mf^;i z>W|Qi!~zE!n*k?@dR9jD0^c)!+%90R%S?L}!Q{aHUC`%pllBw59a!K!W2^5AHn_qR zfNMoctqr_6i2oqyd!=ar14Yspx~uS_AO_wG;tZVkD$@q`6iGV+PYz<>r63*(KHX{B zz<{fRHdq&_<-n`P*4_|&U~C4waE&Ps2Y-02DFfGt$Pauhh=C=p3u17TNUo0+Ob9G+ zpRpOR@vlsI2>4@>l!2RqcqlmM^(F@T7@GkHi4=S|`0Nd)@fX1nmxFzNZEl8w%LP6IPY|gy zflGsUD0pY!Gw_*Q4qkMZx!DDLEAT_XZSFQVz$g(N1OCFq8F0rvp&j7kfgifXZ}b>S z#O(N1xczT~DY%13Z3SKo;-TPcK@6;OZ_ox06lvc9P6^_++k}src-T{dKL-}r`*$HE zct_xegKvrC1elSF7x}%~_6JiRzRmr*RTrtdfXN~f2R|`!4e0xTiFW~45=k4_(AXNV zeUR1!7YFug!8#9`F0hG6o_F!BGue&$7Q0c#rnHQ96REbb!5o$ zvwd6}b2gt~ZJTMvQ8w3HSZMN zp@jc7xKz)WM7oBs(S8k}e~Cphzrx=dT0H-uZQ4**llAy|cQuVAH_vAQ&51 zcGRhX{r=6GHX=E@PH<0PpAak)_Stm>+XVJt!RWxU<1VayRA$AF8&6413*;2di#aMs zjqUWSu@#sm8;PvoOTr31Rjj~dnJTgZKJY(F=_6RwAomlppc}<9vz8Y8dG` zHKtZztbgeRM*C|oFy1GMOpOs|Y^}iPo-DEgBl)!#7|TsGFjm80jr0P;wS(;!Guj-w zF87AH+zR7%=?#;g+|mnd##L|g3APVq;I<-Nmw?H+7~K3$#5G`d5xdq1;b;?Qz-PG_ z%rB!E8`~EmIRxks-FWQMJGlzP*W8}1E-0R>{>`wq-bYmiboz-P3dow>HVXXGBx`pb z>%9AL`QEou=|1cdWPjRkxd+WdMRCMO0x)!15HDX91+!3Kz%M#Po~t)sd`Hd!u?gG zyA^^lw8<+aYR?gA!j0`*PjwrMl<^P{U90f)5!Owp6!wT3Nj}@88ppKKSVPUor{ECx z>#`&<7p1+&G<`{A9rmUe8eHlSku@HSXabjSunpn z-<1>kRFNj>uHIGnK18Hx4dkkJ13EdVW*}zC9e&g8>0DfwMpXuA_y~5n zC=q!~w8x1;zvQN+e)(CdaaSvis?J8ciZqDrJ1r=>jiP1Rd!JS2^0M0zm;aFUBb{oXqYxGZo}9R;2irk{%}_}94~E4YtR zT2oT>mKu|k$LDs4)Gqn87!HypA5&9}#Z=o(W0-_{iqtfK(`QWFpFBi?-+o7dHx1KM zL>Bz)+>aI9M=7mCQuUS^+}vL)(kveeju&Z`EdTp>LqF7GFQa2I=j51_KLLmW9s>*% zML}x%eLG&O19!^(Sf=iyl=fQEi0UmhNSjo-=4`2mLq$p($e%;ROA)dMM7Fd>+G_K( zs5(Mq!AFU?#S5-6Jk>b2mBynIz9&kywL%oP9v7uoym{}_EwsoI)A3Z>fQO}OeUT-$ zk(lGW;2Hx`je08$y68et;{HDA{YB&(5j@?MsJMTsJ`-66GjhGsAibVyEF&*?DrsD) zVZ2M^*C=@It>W~k>X`adQ53M8-)Xg^F`XxTg-c^_m7g+}TiouT++(#+5ZB-l9TWZXy`^bguIYABJ*3zCg@w^BF zEAZTol&s*XpuU-@Yn^Q!ZB;02RdDs?QuUS^2T6k`7|G%7Gu_L6E7DYM1G%NOmnn=S z+ou)!=vgL@IZLluP+!^9mBiX&f~^XLZIWI;X+-sw8pXrrVg9f=4v#;=jRMlyP80>+ z4Vb=U_u&fuh8XU}ZOq(9X#gKe)mv)(L$~hz^{m>=77??f7d+&QRAb#%8rMtsnn*nl za6n*>b_Z17Wz{ucqOtL14Yj$&V7GWrvi|ZCk`l9{7hGdTsjlW4)*JE;Rc4O3& zw~53~5ZrHU2IP;hPg<^adF&$3^Xo=9jK&XwkkMumE z)X7LSn`h;|pS$z3B%9z}a*vq5dBHWVNHv~srBS?Ri7D{Dqm{E%ZPf56VZ1ETyBx-0THUX^&Lnf>s)r>Hh3# zkq)WAFaBs@d;MB?#lwMjXQ*Chsu_^0RuWa$tSs`79%_krc@3T`(jwYTUNIBvs*~l3 zS~R^HK2z|+EP>+F#zJ>orO+K$DRhhX|L@4};ubXnNJ7`m;>Xg3&7gR3+&_<*OnL0K z5Y1H?srUTjdiCzT!U1Z);i5$3jVYSi;rS)Qx`zA=7U|m;V62EwjL^g!AY4~B@Ub{>QyDOCUmh>K1r0^pGuO@|#P%$II#mDg*h=;(9>E4Yel5WyATy?&`Y zLNa@9k!ayZ$Zr_1h=};$5<%?7zm?{bA{heXq}u0$A~3Hh#=T-q6)z9A zz*Qmwg1-u454eenLrjzb`x!e7I7`HHpTa2a@H?rh-83`cB4cCl`&8WgQEM%*g@`E! zwgs^Ve?pp*%{T)#wc3tCF}C(q)xHrFfu&6`2Ha1@gG`hGuNph-HNmvNdc098o@$~D zxW?EH;29B(EsSF9GgWo2X=cC+#>UwHR`KVLS!00{MKl&XHHbZU9~BojQ3i}Pwxdvt z0hdU*Vq{FdKGU9wZON=4%_f?b)P6XFy5n@$AcoUzSVXViZR|Zs(mgf0t=gB zj5k=t%tRS*xUqF$gs4~L(;iuz`h{*4-9t^cg{O9E53|}1z&*7`Pe{g^LI#{=Y&-CZ zNH09@9t$(-Nebg`9qXMuMZ&*6!BJ<9DVy$4>Fh6sokU(v^)`^68N+NQ(xL;fH#x=& zi?jm)_$dY3Ggt0e**+#-$c9AOQPO)*B>zD0f5d5Xc`^uyWzLCmpeWh)ihAuyUSHai zT!Vec71BNF^*lndClzYNWqr>WJ6_SwB$cN~XBf~E()=4P zINxql&4i!`Ofxpll9lCkb@QA7KMO%_5!@YEkGGME+nFc>#v9vFD8_g@s%Gb)2%Kqb zjQ5O+L!Pz<0y~IkAh=5qd%zc^`K}pfz;;&KQ7FcMe^>3tK@nKf6l1_ScJlwU)1lT@+o;ecqTa(>_T^Lw4&ivm&Sl3?8Uv4}j0sN;ST9nXbm3+Mi-7*mM;F6rjabV~k$ zPU>&wZ6kXE=))P0qmI5LcC_T~+vM)mTdkWXZ?EddCwA?L-T1hl|3SU{XY1)~(FH1% zr9{adw%2@>3SznHii6Wf!iDEYZy2zMh{*?{n_M9=U(hr=05s%j;_-!Qocd#=dX|V0 zu^yy=UNRySw-iMk3YWOfX*LoR`znjXj3S9eGw(Cf^OzYUTZ$P*jhLATW7DA!V}5x& zW~G?HERAVqY0TN{Jns<=hv#J@?ioq$xk&!y@t%b#dHiH73xCzb-}tfKtD0HfpK@{9 z*u>xXv4y|*5!cJ=($_=^0UXmGwgwz0($8-V#~44N0&cXRsd!g>Bddiaj^jcBJsZ2w zj}$LWbttSNKZy=STt`2x0@xsw0)(A_0N3XMOou`Y5OmT2rNN{Nj+MUlCIDZo1TeHU zPH%6kI?Iz#CyyWN;U)LLCijrZ_!TayiHl3j1-+v2^Ukp;P`Idiha4=mR)gd9gVl=< ziqwb!;8UUn^emuJ8L;4bi!Qw8YCS58F4Xy&q+jG(Zh3{uABdC$@QJ9m%tlsL=!8dI zRj%Es;;&8A4iJV}BzP~d0Dg9ohoky&L3Lcqa*$saIC@1Z_4U>cnd35~((b8{`1K-X z2RtUy$29$VlML!s@Fq#gTVrx}LVNBKY4ZheGH1x!-Q>j<3H(sXQ_Qvlz<@afhE(Gm zT4A9|WhIfi3fOrO*jTG;dPQ3kwZJkW`8g0=QKTucKs-mRC&3OP=>q+9gwU=H%qt4F z9B_Sfj!3q1%(gMJDsX_Y9UW5KSEOk1sXLlSS#>*rimHdZs`?2F+#{BT{dcadWWKi%h6vT^Ez7d23t7fhL;oxZz=O^%WFQG9`@U0-yYlnxw|2l9Vk*1AonmtIoN*-N_A1QY6o(wU6LerNdm_Y%g4wV zT@5wxt;oLif|=8zb>Jd&N@*~>i<3!02fZhnqcYdGoiJaBlrIp1)IA>^1iep8+jEoL z`^4n3wEq}#a^<`VuBrUgff*Rux?U$p&d7E~!KcS(AUpwdEV%x6 zoro4Cc_*ogb;aL{dCC;qfjrM4kw@_mQ)~wauKe}?@ZW9XHl34%I#SUlCaM9Oi)7)ol|%mzb8iA}*Le1E z?@T9=9E1c3K_rM-B4$Mp-W1h+_Hp(`%qgXYMk1o>|93y@e%7=1IZnOr^?uj)oy+ZiKll6$>sf2Bz1EJ}OHCa;j#2Yt z6IFmuMe6O`c&&;4Bhxnn=+hboG!zPhMH)+BO_6?XpucC_NbSj{E(2>XXWnu1K)tD` zM`2=H6=tMJp|%ig9a!L0W1Br_vzq0g1*VBqa-jhx%McG>Y)=vCDhI$s+fZT|w?8ab z)@LW}oxlJQ9R&%RY^mqU^6?M|*h;&&EceE8Oz_$pEQ^$DRXK+M`IaZICq%a82^Sha zYs}h;G+d++0G5ToW0JsQJTR^#Ai9!|@hml4p8T6aI3No*7PkYewjz*480(|EvP@Ss zuO=Y#+BYd;-z0I|^6Eynza=Q=qZbz(qxY^TY-eIV5vj+(<(9VsJTKC$Ueo4@b=Z05 z&6Og~vMd$gT9Mg5BW7`s0|PWbCifAl*#Mbz76Y3VxUsToIE!HD`N%4`gCZdZ!yJ#S zdNs)N5gA$aM96(m=O{LvPC6mhEt4JP9vQKybhZVudd4ycTZ9_MHVMfm6Ayo=O1wa% zVFa={+nb?SV3tK7o9VdGvGfnrp4hk0!Y86K|D%1ds9%uHYD9?O5K*I!2iif3WU?rA zr`=t9YK=RB9->-zBn_g}opwJc&5mF|ogr;D{u)CBYt$Li9$IgRV0fJ&?G5S;5o}y% zNPA?xA%f9$hP1b>H}o01Pt3j=EKNP**iCj~853NR1%dV}Gi(O1(84kdmT_CWRH|Eb zn#j&Juy=@bGGfvi;lHmlMy7^6M&xSvt8%s1`I3TuVHGt2SSbC#R86A3b^;7bi1u7j zzihSGxGg&PP8X$y zw9lzGL~vf6A?=yW*G3JZ<=^fkdvm0iOW4l1`vZ$8{SAcz6 z)Hm2vFrnS3OAFqI$I*lcRyN_RF;R$MT~QVcb~kG_$z%oC6GXPE)rLPwl;)!Suf)d3 zbDU&%i?}6W`DtJn1#U?VtBbVVx~R7{>up3j)f`@hX$p-A@$;Ko4ARBnMcu}&J8u2P zofToNS%-zzu;`{met3{g)kpDj6zHcST}l8Ki1?H~Q7ZVEriyi3rsh0RystvzK2aa_ zYE~b{n${bs360%#+Q?049WIJdXxv+4LhGs2gvOt0OlZBEn)qOOk?N9{rzP6Q3zOJO zLhQvz>}4SK0wng-h&`#qp6(^}kBhW!h4HCqsl=MDA5>wwNw3B+RhSh*4V6_A2yJy{)MWpGSx&_fbx zkpa*@7#y1$AfY}P0BZ(=<8lKe)GPyFqhN4+Zh#~VQd~>>Np!C$8MkfJWIojGldI^b zgvO*Q%uhmNautRP5t*G>h2e@$jVV=_Ux&s?RTvUTGc^t(DRvgAQeYQRgWb*=R)rrM zQ~-tal4|P_u@sH`#L%bg;5s3+hFN`6<)DF`l=m75#VQ$aMlhJ18z4!ptY!s+6LSM3 z;j*;|Tp0|eL82aoNyRG6B+>FZr8f-kV_%ky98yK}Be#J$ucHm3TSUo+ zRI-H7Q~M_|)WG->k)8qWUxlH_{y4YBK^BCwt){o$q4)V|-; z(F4(aCMp9Dh_rF&1Qh<((`j`>krw6UZK?2L33c`aZZWn6I7nwsee>R}3Ug#Qn_evV zt+5s0UXgw3fO)_g`Xw2dheXK-OHv<${ktKt~; z(npXL!>18z?&3VbYxW^`iz@g*5PO6{YF=%kcpZ#rl&DW( zvaQtN@oIIxqzlZr2!yaxJyhX$eRVY|VwAvR^|fAdx#Vhf8SMqqTCwgwO~T{MrR8|R zjKI3KhrS=&NZ;AvA0oSO*pD8qDPx>-34T8k zQLB9qLxT?FCLS&?H6E*1sJ82@zPQZ3qdVmlQL^$})LSQmaqEuUFc$cf?A{P*p6+Xd zY3+|=rA_eHz;MK>BZxlQ<9kLHT{5+hkcCRYh84kn{b zsD42fK9hQET@H@HJ4ng$Nu4`wimq|@!keUgOVrD5ST({DLoW=?W%q9MvNOHAQTpp5 zZMy(gEONI_cH{S@q5__K0(+{GI&~1mdB7ux;tU@zr&-noo0wTgS&t=nOw_A@un~5? zNS~bfl-LNr#;Q^6l`oZeki^N_9=V#nXb>f$i)C@AC?4=M9unEs5x$_OxwqVs-GpXE z6y0c?>NdfR=0X>R?SSBICJdz2x zQIKGl5wkvR%7gyxrIt_eNxTCs^(=;k}8Rg z_HQDNCwGST*yv+l+@NL?a*NKhU!)G*CDI3pyl-(6Ld#HS6UwzMo*Qk)q00^9CX|P1 z&b7@R<|d8j^CBkM4t^R(4z5`UG*1^r8yXk7O;|rPm$@jcGMZnCq8p7KtJkb)n!{Wa z+-UA0if%OitJcP=KUc*buBaMbfI?YzARfs?-z&?365H&|7IU9SQw{vX*fK!Pl2X>n zBD02}sAOT(M5{6O%G^RFxIU?7fvR~&l%z_cqy1FGQgi2Y*`bepaf6y==N6r3zd@aR z(mGno`xciS+Atz5xi&64v>k^oH;l_J57V4$07@C-P(u>yA=TVVL0)8etU5W#^up-Sfmjjj)*N z+`WV+1RH4_r;cQL*poz2PlJwT`a<^SVYLeq;X5L+K*iV=;82m4_^ZOg& zQW#>RT@(0;u|#IJ3HZIJ#^s)D zB08Bex|vMbKV|umXa)LbR~q4oOJpn;%}|inEFj%l%B<~D(I>9fxRCv^D#)ruqx%x! z508gLoyn5w+^nW^o35iTX+*lZ1b!*f^E%zCFxQCm8m;bo4QWVzaG@yi1)^l5J4MZ_ zMfL_e46fmp8LnHbH)=@LtHn0B$8BP+L~9NU9XLbyV#d46tI`jUOc{ac#x?^N1Sx=1 zvY`+!F(hnKFj_?HM*f$}wur@UDw~6XD{zFlOxAT~_^YU$g*mWZru$wu#5fpE7A4W19gildfRcMV!G>?-M)#oONS!Oss6a1Pe{52T{Ba z2;Vnh(g(NHaprb~b+wy{Sb5+fBFzCXArrgl#%hl>b#V{D!GU${L^a+&ru(I)nO=+8!_i$lr5dT3ygk-lNJ^^%K0_RA}=v|&!!h0@Ev;1*& z<+6N{HY(0`7P1KJBGTZ*MLJsTP;&nJugC~pvq%wsSCmX}Rn5?sG8Nt`(s~7M6LHsR z)Vh-j!}5NXy?FOjhl;pj0uMea(h3H${>7_}#O=UjOk)3ERzZV;`w+o#fyI)7lEdN% zt)SaP65S!#X@eT=`Wxyth=^(2PWXaIlLYkK$O=7hd*L{d#HR@61lGIvnBqMbVgkg{ zi~{(mqx+RICwTXI>VM_+hP(z@f+9eYnnU<#3C3D^Ws)8iSYU!EPEy{BI7#m5^b|3D7KZ|XUF538 z4!onF8h|k#^$V%LZR)si4^p#Z@L7%SfK|euulSQn|lY}d)U@bvlmr(n- zslwBO_*DT>lMRNT1kgAFXm!TFugwejm4v~&%pg2ufy%%mqPSY}$Z@r}CnJF?Ch*`Q zkun1Hy-eJC=EI(Ea|>0_kl;R4@Poi&NkPeKDXJ^Xx4z!cwlj5L!!TMu2$HrS@m`)j zQs1YE7)G#Nq~!vvF^Une?BJh2eKZoBInbB-97mHLU zaEr^mki8UfKauo6!{)FpKo)Oq+rf%QOv#hbbKA&qkA;q(+M51PqaCGa_l4TL+yN>q z4nR^(zJ9QXr6(5ogR^d-wb9cJ;62A+Mc7cp+>91JBU0aiFGU*rd2QQjuy?hwZ}}`6 z?qrRVfe0E@AS>slHqWLI`8&W9WD!D@(Z6mZT?XD1#RZ?Ii3{F66>hG@#>N^jJ#A`= zK(-q4A#l&H8-mMK)1N{IUK4C=JuOlmH6?5Q9%)##Va-p`ny0lONVMjW__(r`4>I?- zUJ$Xo(&67w1+z?(@pMsYwy8{Z6fsNS_syjlm?p9#2RYfI zQ+Cgq_A*gpkZH#Gyo993mi7V4?jrZhFe63OH`OWIR9SRy&O&XV>i z9V~suZqz( zR<)B!djnDJWFi?Ys$UMsb`#Ys2el`NY9k;yUQ{0e*MUtr+rbja^>voCZ|Gp@3+m6Bu`Q(4 zf@0_=7~2FK7o-d)?#Y6}XQYYB0Di0-@R%S5a73I3hzshQTduveK0%4n$)vrXsCF`u zOc2#C2V|2)X$0D{MYR!-Tq&xLfNYK^jX?WaQEdby*VkFnzM+F9k~``wY2Ves63M(e zOWOBzutf4$oh9wZJ6IxlzRr^N3mq(xyj*8V`;`uszM%R^bGS$gilLuvY!h%rkTRUO zCkqOnLrqi$@MGnGmjy9^BjP+j*^_>A%kOTZEnAdMChc=XwUdctwy1tNAe$pfBhY?G zR2u=w)1vwa$etIa5oo_4s*Ql;ZQC?YBEvB6+9IlJ@C0pB4UD{2eEf#t?l$lQKXAV;P{hKU zh?)Uj5>XuYEesWRmWYc!qz`2L6T-h{yukkSv8^yer04+Vlmy-p#O{^k$7v_imVmJ$ zJ$pA4y?8Bhx%|r{&vXn?&lz(SlZEivS;V^;X@fRhXYzWAdri z8LHA{>#6p#?b~W-hyXffa-scgum4k#)&danlz?WF7J);JEdhrcTLdN=ThjmS5BEJp z$^`5s>M5I{RU%|=;_T0D`^aF6b$J&Z7dpBeEFDWXJn78a<%5sb}>BR|#UgejnJ>X)`(M_8_pO<(fDY#3`FP9Cyr{yqmgz z-lUKzdGlPcJgk}dUMu$Iyy=P8&$4OSw-dXINGoc8!4His0>2XJn~PJc-U(|^O;M!r z2S{&n5|hmuo@XP4pf{R!Amk|lyP32I6pbwbr62{q7o;8u_pO5#*g+Jgod}s*y=|D$ zlQiwP(9vw#5$%!rjfm@Jz1;=UKt~#ukAkA{`SaS7CaFexF=rG#CgC z!pT)e<3W)|3SjO{?s=|}XUNk6+%D2Wm?sD+OTdFBEdoy(TLPX6QsB=)>OqM_2$Bji z!&FP3==A7y8HR^4qg>*)AE{n`M@W%ebfB7lH&K~)g_}glM)Y%OE)NdCCq2lyv`Rogvsh zBK@FLp9bBP7}7ATN}mrEr84gw_S=Xk$j7F>IEuH2#~E3M(;9AVjn2XmmcH}2u6x3} zW142X?9xI0h1yy{3@;&)#qw2E>vkh zEYc5&8a`rtUd$J2^Aj8@2H^BXF<^g@!~+GZ2ljZu#K3yaP1M{=l;)(puZWyri}86* z+PtfyMB1#vpUafcMHk8B7otRTlbTP8(rmOBh{y)MV0@l!ZROy!pfJD&eQZa&stsma zk>tP@%Vly;U*|VXzS;?|YJ)i^G?q<+xlp7az#Ny)6Z3Cxa024BR~fCQEp|=Ya}^0@ zZQFCl13LxzvS~15f*dIIw#>_>!R#+m93XplZ`m}M=YkyI9n8LkE7hm)NBd2Ys$Vv( zkHlX$1QqGbs8!6l-ndxIb)j)p+oNIzhml$~4TfP$lX+4`kJ0E}*r^KcY5lJN42K@l z=~jj5W&Nx$E+?r*%t6Z3)g(Ywh(QXI*y}?~os=lCSBjX5DOO@&6_tq?q-2S`(ydh8 zcB16iqTmNjRN7KChPf-{!(7@l3zMG550JyZprg9%1CABxnzpS96FOhc zJFl->)p-)h9C%!0=1goDlyW{0<$NGUCIeBz-70tS+EuW^AyrPzTI$H87TJm9U@nNqYF2+KO@1izFW2BNWj$l|8 zqvEnKBhP4!&PKr$UV$|jiMK_>1;dgU6-UL4(&|pu81&>ToGKhgx|T?Oz&A5?V{MF@ zfulvbltF%v_T<0lzo-3EiqNZ<)N=w}+6H{b5UyTDP@T;dpghS7<;s z59ixFgcZ{awA=hl?p}onE2f#zI!e@|pmZ?dIBLo#tBIjvR1`g*tavHNWU;?7cGNgf zvEjiHA`MJByy+;$trEZRTSepjw~936%ci;U1jT2d6${f5qU4Z#RT?(bZiNF`5aF%i z1AS|gl&aZ~#CpUxJN4;mi>!^))&9nzFvm(P|5LzhBp>W@Z6(*n9Vgc|qg~E?n}HC9 zn>_ZH8;`Qn~pVWy#L8ZxN~3xq{p4)T!$nGb;hti}Zj}w<^re+aB= zw^x&4NUu&@rZcabF)mX?>7@v5-b3Y51Z2R{w|e_D>X&asy$a)J_nF-X_O9jmNIh$2 z8v>7Al;X!C#nyarF}GoLbs3Hnr82k2b~Wj=0s%~^en;W$K@5;8?bP8b=u0e7a+JNO z=A0GzjAhSi&$5Ss5j-Z+MA|P{1Syi|>rD~7)xi`=L;t#{2>6NF+Nelwt~d2=UZOY; zi_}ek3UoMJ)dqu8asbkihs?AYz=E#lmT_x)SC#{$j&F$2*ew&-W9u|dNd+{>$5Z#C zt2{H{75@1fr{$+&=ZJKl54cUF0{c)PgDA0&CE}jS#(+ue(nF;NCk?MJ9QGWIoHPVds2RHnQs$SVv&41f%ZT5r>~r-0}KIT@_$Rzd!;Zv z_Rz*!YK%?=`>0V)1wIrX%XLjDG!y`iO41X=K3OgO)a=C41EF4ClplI)RcR9`Io;f> z=5Iu-BrEl4HQq`EU#iita$?~b_#xY;M5+nEky1hIlTz=Ms1r*Mg!+C_Uh0r4Z6YP5 z9;Be(PYao*#_UvZiyC*Q0?*JQVXH_r0XR}Bh<#G(F=}>V>48umC(275R;5j(q}1I8 z6bj!FY3u#2pcL501n&jb;|*4m7h~h_(>Ot7FUO4IFr_s;HKB1!jR~zgQxh7!2BuLw zVJ~SWiqvI*;EV)#a}WarL=3(g!~n%3274;Jf&gSf>^TmUIt0$YIC&wu=f4HOTeiFs z5Iaxfd{N$cTGiBq#@#h0wC+nyyo?qJ&l9OifKXHkVxLSpk9>Dx>48xHSk!2@C}!=) zHOU%PB*aQiue?Wl<0_mg?fqETn?(M8Ec~IXMm6kVB3Hv7m#bmlNYwC+gQB+=x21ws zMak;xt7d;ucE%>{LwOVS4UtaZ?@UWi;5{U~L8O5JaAUkc>?QURlA$9{Cr)2uNvwv# zhp&y$4(le~_6`v-vwN=2&f2Nn%2rpryup=0Urs+tp56WOIk0=_nandMW*&5h)$}Et zNRzs&U~FK|7W`DSvMqq6GrDCLJxg{TQbm42F!LbEl;9b(@dBUl#8!&O1aBLAu=_r% z<^mHHT|~G}hB#G+1u!1SrY(B!(6u+}F1*jwqWhUhms`LBk*;3m$In0LUpIZl>v>lZ z4>3_0I82mo4ycjkSIf)dM}v>Lc12z5x+Js_y%dSP48&f-;R?iz^x?CRJ(F8AKl(I8T;?OUsF|JQ^HN1tU(+2XFxg|t zalB}SxUKQ&Dt|E$bEZ-UDeza34$}MDVCax~Pz0Gn+4xi<_KrO%6}~IS6ce)@bV$`> z4vad*&c0n3QY8r^I3U*+qY?#~_2t-@OgJmodh)WS>}XN?ycO+JMOp+b&Bn9D|GdtI z_MM3h{5^Fxw3pM{)BUo?rR|am!9Y=(koJc4hF;-bioz@Z*?YUN6r@vV_{|O)4RX%( zu;hq(8tdnJSaLOEPcXc4UIB=P7#tyzH9$nf9*kk7QmrH}Sj%E= zn-?p&7ix0CQJLgkpvgVn_Z5q2v88SMMa?8>X%m@A$t`N8C|Udm%8DMUbexzuv7U*z zCx}+ixAfth&4SN=er}$0RGWMo_IMOEd6Yj%^oeNY7-doxEsumgM2c>|R^WR@eGB%l z3Ry>KKP~dr__BE3$xm%)e<*4Ue%S-~NCvKvd%~|JNhla*Pd1rc9epMjqX`G(xVJRZ&X%(%^KklBoZ^79*$&tNL0J1*NWd+50X7|u1gM|deuL-&F4G06xm&7Czxpk zU_|;9PGHa))~eDvBPaoeCB2=uh1$e#ki$uZwW^*g3BQlj40(RwoRA$jYgK(Jw4*Cq zI5=~ykM)13;Q?FMe&m=f#;-xFVrAKv~X8yyila= z4Zx9AkylosnovUA05|H~>3)exq*$FeO_wGNL5!1&Vpnk7S)@A{@%wh#RM1^3!v7vq z`(;t`@%HCx&Jo2vqW@be_)?9P*Geor+L=*e!3As1wURvg*W= zK)R-%Hd@#8ZsP4UVo0bJlZ9awr22;xN1vckuWI!im}+k}?RX%od<>R-&2l`D{ffjG z_ew_ZNU4trmZ`RrKDxSLZQVT*X_|quNP{&7{4|Jx)rST#c$O$Rf4(dA<|c|~wXqU~ zm~kbn7)515zb(={*qCnj4ZJcsNTom&z>L-g1-8X`CGb{a9WySL8H+NmAAR*wm_ zG_a|5c@vEX2xylGn7$U|0KKWXbl78<-fR?UFWgg53hc##%S4^s6+(VRF!SWeWZ)UJ zahoALv6bQ_!NnLg(ghCxfeYRFuMoeNKIK)0&$tB>QGp}SfMwG;SFN+C=;cW2{X2^E5 zG)(~E_0Iwp8rH7Do*gs*-PCxW)0TSH6{y|3llpeqKp&<=8tOR$euyO*b+q3W^|E^& zjj*?i^vO%#*y~;j4Ssti)58)W>b;yDrTC>tH2`E{p7V_HI+Kh|BK78=D$ID1#uJ!r zY!hBLiDYtM6^1G_zQBsgZmuvZTW6Ypk;ayR(8YK;<6YDp0J=vW1(?|ebEHUe;3#8@ zQv_23OBtjzYaa+%GYF(KIm{r-T>@4&wz#n%lo2=K-^+`dlffUa<|`&D1Ai7VXyCUu z!ZKbS+%3_=A`TAQB4}Wj{Jd#{Tn3Ax4UH{DiOr5`5<1%W{9UbBos>dMLZ}pXO{$vT zxs%64{e&q00(6ZkZR$=gGbSni%(NyNH;Xu|XAR{RG_5;R6B>W5F`>02HKDPe-h|7e z&^lBUJ5S?;8WS&_nr;xOvjF)y{J~x2AThAJ2r<|a!~l5^gU1IkKqkbVV}^p!)$FS` zSbhV@Ze{CU0l6N_)v)x@)gI++$+DjgvSGqTS$ewO!`90#mEG6fUU*Ns-d1=MuyQDT z5J;broo+QXcQa81U?8+L^l3OjcME8ggANFzGSTZQ^u$)wp#2VW&y++TDs?u-u|LQd z`_67S_?!%&gs;2b@E^+hRI&dh(#-*2xlI_(iG>q|KQ=!9FnF`{^UQQSfTu?JP+ayl z(^-e&a$ClG&mWfEOTi8GY>}?yfXp&(8IQ~ADYJ~CuPM)CKcOf~MJ#bUiPGr5X?hgU z8X<}%H1?=5p|y8vLgVTh6I%DACSJj7O1Od)Iz#}nvFO38f*8OZF*q-X0U{#yU>|1P z$qo_gnM~}~stytFN~ZRXxZ0!qodF4vd*VX(lqD`H4_hz$g05(Fc6M8NPsO-Mq-6qR z{n6JK;ct8GqMe%l!z!Y85rqUI7&oI)Cno29c%YlJA8(AcBK zgx0v!gvQTmOuRcJ>?@5X6(Bg%1fCwmz?qpCyf}yfLSpT~-p{JfX3cB&S@X($Qsqsh zuJ$N@QxxRsaC)eE+2^vYoyhzPF=G5sq=^Jh4I%div;GVM&lSl8$odoK`mo$IE-7S$ z>o~DPs-9**Tw1gCj^Bcjm$6KggQC(0SvORDf18zSePpha`_m%3N`iS=qzf#d-{!DQ zs|wZ@$>hK)%z8l%%nb5_sxTJ@IWX7QGVt3V^@I;A@S~Qa1cY>D;4eW6yl!mqAA%18 zOA#S&8Q9B$mVl783|tzdz%Ps~-Y5tK#7%KqiKsTYwBk3e8b;cj0c&mz8?QkxlIZfF z1^#7hyx96u&2>hZFL3f`*r@%nnlnsP1cq4TsAWvn5NQb(ek+_WO1^qpDXK?SQU6|) z-rC7!+g7ErKlf4ZP(LP0Iyy$pJxpXTzmE%AV9y{0xOI^Dpe+V1z_6&^?+NU0qW*uO zh{FhcS0wKxf)%eWvX{SMb_#N0oo|WbZZSn(KN6{4AQ-mfhVgFAbZIX& z!xHd25kDEY#kwbHE5QCB%TYR1a9m)46GXY)>1v%9l)!~G%4^iRGbn+1HOi;ddOs+E z6{pa?{K?&R{ zvRYuC4szfFm&2@ZlGO-oE;4(VeS#eLq03=r1UYc4%VC}la^M4(!>lkh#20KX3h~A4 z6Xd`TT@EuN$bmat4)a`)1E0AZX7I@te+$80f&HG~`+)_fi1Lv?ORY?KpEb(vKia*}OQhKbmJ{VUS66FzPy!=rl-sJcLr?-c*C>l>H3ubd zP>u3lF4B<6{!QjC{f;lJ=FSPP@XTC9a!LU zQEvC4T77?PL4e&vmK0_}kOMPa4)fa}e^KyBV1ePMX09;1iBuOb(d95RgB-ZulL8 zgxMp=_Yv$b%2U$fv}Kll#+;)Q&^%Fga~_s+(%^VbY8bs<-S}Rm4Axtw6Bri*&ayJl06%-?qr6hb39mdz{gl<#D23_UKz9Y_n)( zT^ZLG%Yf`?A$hv45tb~SnR@g&3U#+dw<=&+bFm5rdR8%&ftn>R=lP{ zy}4xCRDdmwZ2|TPQeZz3uV#V=in!D&RpAIHS5Nk;qV>617 zj|nUgD$DPJ5-T`WfbB$s^>ZZ+eGA?6|1o>5JFHQur*E=Bx5BCes;G%QSkLNWqW{;M z=c2D~aJsU}vrxP_(cGrnC zkHGb!aK#JvKv4KJT$ULq?ptYG$-__tEQuSA+If>EPb z0#Jik(oPI4@FQd6=Rgu}B+?9i&J22y-u6P>PW|5(n<*Bi1Y~{6Cr`51OkD(eoaGD1 zV?8M8vu02N+@KWqo~I=Jw;5D`FGaoe6^r%){eYSpcqFU)j}pBv(x=m08|V5JY5rx} z=3E;;I`vnmbuC;GIMmo?;BZk`_;AMug?9nBjZIVn4l}k4V9fU|xl^oU6RD0i%lI*O zqM9!U5%4Eb$mxkNm~I9o;4EV+z$HQIhBMT>&qPfN1R-dg=EV0#Y5!=36%0w4jAdfz zk#kWI-!99=;BJf90{l+Yt1#uX>C>utuJ~yb<8M-ODNkGSQPR0;wYXkhSD=qXTJ6C4 z=fbuCBSf_Wn%kDJUGZ#NHvqQjMz}Onb8MntTY6o+h0h0XrL82Jm9j z@X<6U$&yWM-OPhTxGWbE-Pz_o-;waUBJ~ewHns%((AYA7mlExrIw4CE?VEX!2$zq} zu^!EfiCQIW6DbjJy0ImoYHS(6ONrtd#tB)H=#0#RM7X>b66OCq#LW`kDpDfg4r5Ee zGsczyyp$+zEI1)c65W}3kO-H@g3A~mgx4fnC{iBaEn`c-SH_ls%xS;W30ab7QRYD& zTy6__#=6V$YOiQ6MPPujC15pU%K%PVK>5EpffvFg(Lgmf7Lf?NOjL8pyn_Tgiqs=u z7h_AncZ{t7nb$ROV(~(lWZG3tY{>+kYwEaJ?H5JyyqJsPA$*vujuH_BoGjA$3piP1 z_pV@CgWQK}q}JsQwl<5v7yoTuK;gW2z=|6rN^bk_F5A6>8-P~pBVJ;n{Gr=}f)H?#VSB^@c!k;(i@P@u1DE;;HZ+S-oyK zq9dXQM5?**8R2WDE&_`(u}>+coz7!E!Z8zBRT2Y<7Jz<=0Dlvq)iqU|7L$fUV3T5SD%H?of%g4qBjWY%{RGD4ZMN zCYYiK^f=!Z8qgrBJ%8r$O2qRZr7GN+7Ni7RC{mw~1+NqlrBsExE7O2~j~cj7G7adN z^Q*#%lAb8)U6}kup<#=4t29W(wc)6BCGb(ia+*lv1Yo05zIT?8awMjXn*$5nCemKD z)aoI-OwwRM6xXl!DVZ7<)gO)X6zmlX7&jtBkC>?GQ2`xK(xDBan6AGj;X<2}A~3td zoU9|sdS+1GMzCvO4;FmS*a~oBkb1Z9=`v{7?&R3VB9@Mgk>ba5v{~wN#ZqyyZzhqw zn%tp?LzjhNJI*4u08OIo8Z*xoH}j;`q(6caR$NX4Bx`u^m1~xLbxVd1jzsacL*M^#|Ns#d|tr20jeofsca}SZ9VM1=bUVsf1g1mMMTOjV%IO ziGmH>)C+4WCSf;=R{}g<7x6>#qb1@LK9zzwnCF9D-PAr#!cK>-{X6>!G|1;E?|4_}r{ z-;1^~nt-rgTJrVM#Cq{bZL&#y$|ki1@JVf|!mVmE(E|9SHdWzv4GO>~wW$iXC@26Q z;-)Ixg(9tXz=yc03OB;Wr3LUIZn7Z`y=+N)*%XiaSJa7Dt(Qe$p|MQ>J=F({{Tk@w zB#|{>P84a)>?i3P4SX+h1K*IMf$vFf;2Tpk@V&_m{LqaCzAWC2%c6;8v5QS` z6ObLFMexT#46qEe$co_nAO_f@5QF~?Vt|E!7~D~$%LpJlnu}oAr<$0fGeoig{wBf^ zTv1~sF~G7$?B#Ex92BUZrP{Y)oAvsB_0{TC?|Uk9`c01s!rEaS_t|X2@XZXvH%TNnAZ+y~6xNQLpj`l1x9v>5rr2;Upm+bToGiUZWG0<1 zbjZapCf7V4Nc52?ez0*j6g|wg0&w!y(ZN}J)4&3wME2R`7%`lyWs(L6qWEFLuK<$k z@m$ows{ZO~Tg5-ja>T1-M7x`)X%7KaBo&|yq8NL+Cg&2Hry{WF#kN}FUA|mhLfv)| z@mhfCqA+1_Hv|Q6V^qKqFu737<24cQrP*l9z$YS&T)Q#9%wjZE;jS0S3h>}f)jW9Y z{Ld8e29bIUEU$=K`TG&#NfG=?DrZRO<9_Q4v;M}rjkn70Hz5RYs%37bht~xbAhmJ; z#L(gaHZZmbgigmXUaUx8g`fa+>9D~4HH*{)P+3}GGHv*uY?dulLVq-*dHVRF;6Z5~ z7WFPnIlmhp%4s}i0{+$al<{)`g(S(b45FCkeTlG4=G8^@OY}bV z^%d)H`87f4MLF+9naK!)7^e{*RsG5CT=Vo#rrFxlo= z+!An~NWT+3u?oXT>5~Vk86q9M6RSQ}X0%MwP)Re{PqLz#foUSMhoKxDL{ze!u_a&^ zkwt-Ftdt4}#m0lHssL|`r2VJh^T5uFhVe7{-z56GsCQxN8QmJT%s(`LCSf0qy4Kk8 zf;9pQFd#ZY;#0+h7-;GWfLd3K`Eu(f0U?s@+(q>VMp0&mnQ0L?<>%%FoGM~tEmq-< z_(e^)b7WgE+hQ+4|G;8+d0>I7MBQ~8?ndDQLA<-dgi!HxM5u3?_8QqfC1PcOUy3x~ zl+e!-lqli6z~*U7o;F=k#QL#Wwg5QlX^VaB@r`{uJidWC6dt#q&lG^n8q%8QCtRM4 z{t%h{NTkKhKv0fYKdR7nIs&to*( zz8A!w2zpp4MWDAx|G>x6!Zu=d4011#U_lfsAqWwYZn~&`k@ZzDf+m+Yh*mREX;9S0 zHIX~SbbBgQr-S4rHp$>1k&@RucH;7+&WXx+x+O0H&ly_=dR*p<9&S&O<_VY)6>t{? z1@Kl>z^!_@c>s@ybX4Bd2D8c)CI^O!Ob&CQC>&&Pcex7YkSkpUccds;GW4L$$}Ryj zD4lMdU*>Pf~iver~@x;9a#X-+mC#yBkfs)47RvJeqj-a}$Q3ueuveXwd)M z#785VFedacH}U>P6Ys|bSwA!o-h(iBUj6?+CyVNaiP(L>Z;7;P`FM)GLy{Lv+RP9R z(THITGG1D`z`L0kWYpvcu#RNm%Si{BuO&%+EYqEj8aA+OMPL(=zMz^|g$YZ(NNpFo ze6ASEQaCDFU&OVhU^9`OK4Gp1@>>O==w=H2#H2;wOOYjl2^}Z`YltjL-i1oug?NTt zM~h@PI}B<>8=I&IY$4KNuyh*C=+L;P4Q6kVHbS6Tq{j*4$&|2+QgU?tM4e>>IuX@x zZQoT_E*5Dn==g5~n^zxC`z+Y6L>jr>6`B-c?^4&7x8$);7#2eE+^~${3bj=p5W`f^ zJ}%M>eJ&`NVca?~JWQm2k!WdQQuHd~^#}7R0*{K!Bo7fcvMaJdda@7><21F@!)K@LkKCPkYpt6{kDzLzFA~WfxrP$lnaGXs-1X1h}L5Pra z(na;#*aFNfU|ax*-Z1adn^7Cnoa(PgG>0)8p#rza`1`}JE6K`>Xeyxq)?;`b%`qNDg1*XU!3NcTN}yF@k7 zd@+2ZzU-3q1*Gb*NqLAheyQ7VBAppr^q34k7wI4OE!scWS*5kRj8@{4N5k-*{MRsY zGyOBA)lC#}j3_tuFpK4Mr257=oe`t2@Wa)caUys;|4Wpf_widQ(m(y%GfP6VLHYaW zt^JUe)-Iw|lZrxJLGMMBWOJB^1mMnB)7A2xfB7qw zOZ8id!~%3g@jC0rbQOJpC>dGOZeStHdB}1eGR9Fz@4+DoaZCsUOg6TBk{|>x57hXr zDN6FV58cBlSQgzf9qo&xo?|haekFJyu*73#wE(>i46hX74Bl;)Ww%UYvVazty7ZFZ z^}rHuGmBXQ7&1Mu z(D<{jb}m#e&K85WeKNi6b-ABHxr^nfw~lDzhf5TA z$z%!#Z2hue6qAmeEW=YongReHZT5TnT7vf^@E#xAOM{z>exl~BCW^b~{c3)rDlmK@ z_yYehwh3rdLAt~(Glj-(I2v%rR~@yGE-x zuDw(xY1s%kA+BiqNB($_>ow1=PNsZCd8{VVNTPipunPrm8(RTB4pJ`_A2N0xv1?xv zJZZkge+Vd66XKE4W_kNc6SQ$WlE@t$nsbMENt1_b$+ht!HYp|7c2Y`Hu8s4+>5YpK z=9%*}*AMBOyIw=&>SWMe+r6-N;=OlVG2^r78X3Iz5ha6kLDa^M9x98|gB5VtuW)Dq zjxe?eOb=4vJW;sZfji(jGY7_tf&%WiUz-9b+`zFgYkn(CqbOLx{ZXWBz~7?+?%vx? z0c?MVxwp5%>?sQFa6^7$R=`kWi@+PdH7W3kD44^o^n@vZbwsMEy%px_AP4>yU}B9p_kJY{m=evxH^S>6qz+lpBK#9j|!Hxw*Vxl<+r9ALBH07y8(RbximZdn#LT$eOn})U z-2m#z+UaqpiGc=DmZ?qbz`INXtYvHw_`}^6b3rRiH(PC$-QsGiu)h9%k2wNg8CwMU zK9CI-%&gy;3Gj?aMLyfQ*@L<>@CTFMD!9YgBGB+qX7UFyr#@^Zz`Y_Hf0)0A#)8%_ z#O(2iX%@7?tn^rB2J_3%SkMY{lStbFFyG~Giy8fR<^jWTqAUyS7-$_s zPs#Y{!V5C~a^W=@|CI2>jAxhWt?h-pBZQl0JX_8s8GncH>5Lz&v(h>u?7>Y$x;@>a z%EmNUgo2&v{fq}c7MT&uGHYmaI`}5N*(<_>4Qyo*Jjf2#gB^_hYY!0$@Y^C&u$wIt zp#c9SG6j3v4I+K_TVNCG9d@q5K;c>$zn*ZjjNef>Hsis)L{{w4VkTvZ(}dX;XeZL~ zcZAIM3LnaN@ClJQ|4U5a&R_(xQCfLyljmfL=Y?-({0G9m+AQf0`{W-*@NATOiQxAW zPRRI)!l@Y#P7_(?%f-ye6yOc6xKqsinWA0zLdGu=t}!oU01p>gsW8`Oiox2XHxyAu zi?EXM;2|PQeS?_aWD0imFEf4%?d98xaQ?1v|BMF@5?QwE#N3`K*zZ>s;V??LWyXWM ziYyz<5!TQ;xlGI)5gy?6rqH^4NX%a{1*eOxMHt;6yglRpE$s38ApeE%s*LZi6Ukr^ z_PYox84sQzvbs6J{7r;WKb=Rm7r`GbJSpRSdo~9)+h2(=dRW*lG6lQs>LP0l6|;i~ zD>mGRGoDRzsz`fA(=#ebBo^3T#G(g}5a~ly&j#N~EhgLKw?)MKSlIKAfoG#UF5}rA zR~2EyKDc|v?xuSsY}-4GgbmNvji*n2KO15SC>bn4>XOu0^dd z*V+IVf!mF(0NFGyN(XaMI+%;n!CaIs$3^M*DTglava7&F>G&;5m*b*z{1&C-wTLX$w63ZS4i4Q0LboeG)~6+DpO&P3T9Wo@N!q6+X`hy)eOi+CX-V3rC260Q zqsdLs(wu96Yzj0Nb|S273M*kv?7poaBpar)%cpg`KjJd9X&%>K6R6anJ# zfSVuRvhbr@Y#NH1blV^g)j}xzCC%Mia`$+bX{IW>27$A zJcy!ObihB2tpJp@1|RP1sW(CWuNLK5?86uZcWLjX=o5)oBGyO3Z~f>#cg+)XE)Taj z-1;=l`cB%!wZ~toI{El2_Tc%tpcIK^lio!nmcrJx(QM|UVN+oD6C4m&PGYZ$Wc!xj z-M}spd>B~In(vq`6u`>T6!}?LEMpdGY4J0#q})N`gdx^1?rGV@~cKaN{5; z!$tMqNl;n{6l+5C50O^o`%xP+=MFL55)JHGHnT+r_9n|*WP~_>>d;|?4hgIe3qB8; zPdXXQ04qX;vl6ly$RpWUhe$E|07YS4afpCFvZy60x!x)%xjz?NVN)2Tfq50!4+gu-72xqBRu>*US}i46kmXQ4`Ys8U{4$^Fya zq$($Z==2QqF#ifbRb3v_d6G(=q~i5<>FSjvd%%&uil0aGk7X`QP7Obo-L)dQ0(LJi zKP-N5z2EGQBmCxd`d}^6WC7t@fjE_oa#%qmEx@h2&s!On%#e0Bic*N z?*tK$ecAMSE4QV&Bdtrx*ISb>ZC-CpzNvY=HThQM^;W;ZYCfKm1blD7#DQ6cmn}o~ zebLKlhL_U}FQ*w^jv3NbKmvklP`zleUb0v(Sge;T){7PErT$ovo)l?40R-h<3Q_MD z!Gl@R&&HxrcoKNBtZo-aO~5)L#NhBC1~$mV;HE(g@YNL7{zp;Sn9WbeY<^5{SNopd z8s1H7c%ZAY-Z6IGJ*^FTcfCj~W44n>tcMfp!O}4&Rv7bg?q4PhgQLTzJzN+I>MxA* zBxQ0PEZUHdD-FY^cWW5FiCs_Ut$J_FCy2UCLGkC>wo?YU*Y-b1;r&fc-9vBC6~9QM z0c>P!+;{mZZr7j%b~iRIsw33=e$WCZ8XFJc2{-8lFj121hiXnTQ4t8*=)jkKGlCYl z+}N0`s3y16Rj5xp_uh9gQH+s`q9ga)=ZKR1gD(;9G*PtLT+J;^R0LMJrKa$)5;co# z)ip{N^sy4+Un^2^z;BF=MR8;QhFfbYI8>qumZJ!8w?7%DDH8oeWa%dBCO-*dtrGpOBLLIU2jTCq5+SFg+HkT+( zz)Vq17WAu|ON_FrYzCW45eVA2#Q4f~=b#04H8xJm>1uY!fsiQavk_OS9lzZ51#-KD z_gOLVpDlh*O};isMiZ-hMEppq|G8&_{d?eRSBXM+{d%jL@P!Lsw4_z!viwmQmnFM# zE{azSn=2Au)g*Nl)jX_LG+9l)t4XZRRrCBH0)A#}6L6!k6~MmM=BvDxr*vS6G-uDY zCeH^v+se0ke4%F=@8itOS8LNf#k!wZ_evJ;?stTIx>lQ~Ox)a0F58A?TDIK%vtk%Q zkC|@8o?ZX!@zjMY>K`7=?7i(i-u7a=UEd30dklE@hj-ul{KgmgDN`wF-ti_+kPhf`iuziX0sKIeY|A8_Z|bRr z?WQi`^+jNTuZ)eK16Fw=JhP*F685{q-W!+O__^@NYy~BUF`^%ddfJ)Y4X=~r4pDNT z@m(lidnPmaWE90+0nziKbTi=#(g~uZt2|u7SEWg?L29mTq9PEqaht^d$e;y+Hg2)! zNi-v90ls)mlHH`{EkO(1Yix|nH?uwMo7s_7utB751KE=;?XAhvB<<kP*Xm3rP+o*Y%qCI_RqP=za z^IDdonpyu=))iaWy1Bw_EO_p2@iYuP{n$qY50*q41>hoMo4s>b_@gfH-Zgl7Hc6zx z_kJPvZb|H&LhOBl=h~PrGvPlK^7IG1FG%{Zj|drfxk#Oy-+F_XxgzbcKsIIb(2o^s(&fD@CyUdbEViD^2t8Tc3KOQP2xLz$EpAOZwK!dri)~Sk4(m{6Vz_|Uq|@1> z0}EtJb#dD7#c976r~O`>_Iq*q+|S~4sV>w@W2~%czQJa_$Sk&sw59>RxZ!@6?>iFvxZ=bCr?K+mUTkg{qmPu)AtF{S$fDBL ze3#AV}db>n z4fsOTr9B2;2791~E)u%5$Dog0Ni+jI1hbmnHqbu^a#EqbuRa@`fLO#jwC1O0%dp$- zV%duTH|@=+-cys;_42;Y=+(%#3WOC!3vy-4)~oSeI~XE;6!_Q03_$sU6qx{6VJfD4*rBWHDH zS4zHmk_GFciL#m_O7=sXE;La*DV!3m;%Av9+EzZYU8V@|l%bOI;4BY=iREcoo&`%v zT2DqJ%&-UqpUM_8+|qoCKyZ(1vpohc6C7jJng@@Drz_$`A-H$$0X2D0G1-P+RFmfw z6VV51uBWFIwazyXl#OlnC+<`}Ptt{lm|K{`@LX}TKf{(BokUu}+$#W&KWc9BNKO7s zo}@gQmpvJs2W`rO#(^g2N*1X&P!K9D5^0!7{lMog8|Wgyb9FjRw)-Fy2+&KO+ynpz zS+EijHnIpM&zjz7!HQfQn_%cnna+G}i=&*E9p`|jKeO@MKl-FYnft`G)%lozjbX>-i?z=YPkFh+oHi5L&CS)@&x2um$O$+M;-c9g7+ zG0Wodg6V?S&%dn>vUSti{-AlIiq~Yy@qeZ5H`IT+w zW#Da>!|>d#c0k@K;J7t=e}BLlduXnCi@+M(aO8PeYw-R6?;KgfOZ`NpE)!`90a>Z- zX{ma!GB35=N~H>gX>U#HXpiqPm?o(syvdN&(cYTWkw1UA{r_T|lH{+a$zN|xlD}@R zQFJ{Bo?M%`Pmx&fwOF4Xv7S_{kGoh;DAvbZtoKx`kN0@>bGC>>0_0sJjXi0bL}EQE z79J}-fSTn&6m1&7W5$*NCa=p&jJ$JY?_8Jm-t8`pd_cN1@=j^#`cQRg?;V%D4`P@0 zKD-<+zqUi92ynzGgll)w0F4o8lz}#55L4Bw8gy23*GEUo=WmEpfR6IFgxvsQWg2YTu6tp)I#S?|cNY@W< zC_E%W20kOwfB+vD+uW}DUJzM98bR(l!*gx%f^Fydd(uS175)F#FHc?mpM&H`Z!ruGCw zUz@3afmt;FS#X%;Xa+7cw&Lj&BCofZde0R}3h)kwo;K*|BeX=JKC`IBF9Zb(6>os- zBhj%z3-H#9#%6vT8*6wnYxwYJZF&k`oH^ctGy`-=+T1W6%Bv~-8lnbWhD6nBNww6mWbc6VU8XUJRu zRuu8OAro|1v5`vbulgk+@#k$F?JBupOKunwT_M9ih*%roGLia-)2SA{=uTL8$ME{l zESmu`X|w(M2b2kSgoSGcri!|>$6#8p2k2*)_S87j7FsiKv8YRX41N~u0ZtfQ+Iznb zQb!N9VJ!kPjI96z!*$uSt;tK<&$b?{z!NM_1>hSvJH9>M;hCon5cd;{7p7v}a7BeD zg+5idXi4VFyiC)l-1|i=G?3?w()sc{`W|-YkMzB*C-b&v^tR`4KjOL%yxXS>8{6q3 ztwJEYB;N%5#iT93>mq&FY^%c111(Sj(*dy_H~Dx&*bu7)_?j2)y*Q0-yN!Anzqrh& z$~6?%lo!`bz-;2?rxQ0n2@!V)Lg2u-T0u4)m2Lux>Q$I}n*Oa!FGQo@ok=I+Y6Z9@ z3j+R5lw2PW_vfabVt9qAi+DX1Sm0@6<3c!3V|THQU;NG!(QHxeSEz32k5J&mYDvC( z?XRo-Q6g;tz~L`idBBmP@Z>+-&M%n)7-wwUaq|czB2+C{`9{GLfqho6IIu*zOQeOK zM~eN*BQ+5T3;i6;_}nsH<+vpyohPl3bf|@|km-@Yx_>$?^#LYWeJ#LIB3rRAp*JlA zo+r|Zr8gf2mK;B@94){M5jnun$(GJiUo7VkwwbUmTdcU~&>+@_(wd*kb$POOR#Kh` zA`K?#$dzm$Xgi(F+%_gM{}hb;1dM3jB+pQX%(T?x$gOH?i&|)}4}Zzf&>q6=lEg z1v_8V;UDnBZl1_y`EfCCinKm}zq*|GZ;B-Mn(!NBBFi4Mv8V4!`+=zLXT1=ABGPH` zQ$g^LA<02F)7vzO|#~ev-OZGHR_V;cQVhYOpgz z9Yzhi3q)GI028UPA@+tMvB0Jx8&(p19^_se0fJX^T}8n#j^s%BZ7r%BNyIx^$kI*% zMk1LUv_TZ(kc<_Rbk;@nhbD`7Kaq_lVVHhvFvc7QHRJ5&itNT>-89KJQDLTvvcZKt zL)76X=de3bWMg-xm@7r<9dNbFiQgzndW|2YX4!)_4#2h2+$gFWNW{0BQ|S&t@Q+Ip zZ5GmJZm5!O7!m^?7~2edBnle|+?9W}N`R|HK>;`QRZ{>z76k>|+d%=m8x?RZubBt1 zzbJUXJrWea<52;(C@6q;q5^J}zgQ?>uqcFr>+yyu(q4|Uu9bkjM0#m|%_=?nEXe80 zZ$vtnS5}e3L}Ka4%)nB5!3rr+?8LxQ-on8C^>tlTiju43eHEJ={E*#y3-wQ1N)3_DPIv~SwmO<|v2+tR(0Gz%OiS4I6A@9hl2S~3z@VLw(Vo`w{K01@o z)zvI-CGTGx9y*kbNu%t8PdYrgPwZdk1ewt0?00 zp7|8`nbC;mlyy0J&KA&Y@Kpj0BJA5j z$e^zXLduSf@u2VS@|0o!L-UbRR(j2{%Y!=iXaI5w1Df~1hgOg6@l)H zfW9HHTPF~q&JM2=bt?U?KJGG@;-_r2Rzc)q89grWzc0$@Yi3_Q zK_~=}I*5wCCD6dVCe@jFPa~yJtQ3lsB8)VCZk3xm1nD-72ZG=}frc<>j)0TaL&8r6 z_6tIP4*5cER#z=OMDtVPsr*&2*(@t zn#{LVYxLdt8iI6h+k;v&v&52j1f zFqztJmo!YKwzow7L!fyD8esE1U6x=IJz~@3v2R-{c+NbRKN4EsJg00SjrFc6N${Lz zZsys;FAOS$LFzH2&st?2pg#)Y@A(wUX^+ezL%P(++6rkKN(8BkuGP}6`GC?h)@rTL zPiv^3)YUf#(Pbj(vF`{((qZ=na*oiWfqYWv=|FlzaT-R#q=Tt3jD$%CQ^OLL<6=-u zI=C1V#Ttr92&_tA(=D*H%OYJQ(8*$9X*tP)Y8lmgO|=ZVU!eO`3vGaRTD++ziwbI3 z{oJf-pfGMH9ZZP9D0MK^Y%IuEd*?MzjR&Kv?5qpxX@O?q+$2pAA?-0~8RTJjf>%_J zU1+^lCcj$=w0N8$G&PW*X#zfy0;UI~;n@|LyIRX!rHpQ&B4dJy3I48$+l!josp&iB zvc2%$?%wkWy`gOJrN*lO0O~P)9gDR^uPIo z9*7C54~K|v5GWE5$yuYcREKo(se(QnGC?K@`cU!Ys7_D)c`+dxEe&7K=KOqQ?Wq_i zSjbi4VVEkV)O)=k8&@cjPjxYf+~EhKZOy0*I!FK;Tr+kJgj?A74a;;f3r9(IlBrg_ zx!IDFKksJOxx9+MU)+SZ50~iOxyVczJvu@ZuxzK7Q{9J@j(*;e@-XF&4OSJ^*a|q z3|zrXKx+srEQm!b8y~d#u*iqFcDV6D!&iw_Lu?=jRX}yDYFeP%1=b9R@2+Ni(31k= zLu|Ra@j+#Q@geqI!}y?a0^>tmx2Ey)UfbDvtsQi^krmL*M%F+Zs@vpXZYRW60?h^x zoojsh^?2jgE)@DxAVKd6^i{(x{}S%6PG&I!A1lz@rQhEOBt89Qfw-5aPOs6kM+n6I zhtN$6j0D{*7!ZD1;kSR++k$VKr28FR`w65Ex=Rq1wppleBNRvi+QrB+=(_^T&n+TW z&>)ctXt*F6Gjs;LXOgnelY#8NNOuqZXs|I>rpdj_Z^A-(;R^uPG?7pS%3#4+J(60jt8ayz1f!HM! z=5`(^;`?5J`0}8r261XA% z>SU^HIy9<5>>mn?Iw8K~5{Q#s0&%`eAntYv#G@{Oc)=wQVM^ARg(Jh1oZAVpe<-L* z5t9U3YC%sLS^JyN@+-y=AubXqsn-krB#@wA3#>^Hy`eC-bB&euEgff5zQ!ycC6ISe zO(6ZpIw8gzzXrNmD}eYtoy_;G1@!&>!oLwnFt-!pLxExd4Gasx+)jv1LSa!S#8xhW z2unwe)nYwcEo%D;g@vOwTx&vDD{3qccL?PD9ijIF30m7%3W%_R)L1m838a0W(4&Ez zEA*zo+A&CL%1~QZ%AhR-)(nWx7(Z>&>=I$UX#>R-{B zPeWp#=!7^**<|@_>xQBgs{4sfZ%z==9zr$|#C$;zL9r;B$d|?MDz>S%0G2^4f_z~* zaUBv?w9?_ita74RgwBZc6T)vqdIxQyy9>|9Ez?2}Cd5eOYaH1CAvjkXNF8sqtgISzSiKTh2044BzLHN3Pt=Gc^2*9feOu!00 zLx2Fx5^e$(@IwTAFB>cM14f@}xJR@__^yceqX68Zh1&!WEa>Kn<@{vLWGV7ZTU0vF(DAL0EX4L(R7YKCHVp$s}5DEI4fGGezU7#CUEv?UKmv~oz z=>c&oFrRD&4+s!cwHq8QfIda|oJb$8HS<^j{4<3wiu4u2Ka4aB=;i`+wig~9>2rlI ziL`GIRB)~G zJ)PN6q$fXp^yCMQp3dxy(bJh7D|$M!<3mqpb~fngWaDSQ*Iv=nneEv6+L~gU?#XxN zo=!H$xFZ(d&rVhzvrR>x^$~tTphSTFU}WXsm=g}no)Tz3!$EsOpgkYZelmmhY(TH3 zfx9V#SF|6#pgk2jw|F98dmf-Y4ba|jXm2;PA4s6{?x#h{*qlz9{_Xm0Whc2+idlCqpjerwt~0Y3QKCZ3B2W2@TObA z+ir!t@hjVouU|KSSY4oQ2E{qiYjfhDm=ti#LvNmk-aHSz`9$c=^U#~;p*PQiezicy z@IMGtJ&0kTSbOt1(VNeS-h58<=5wMqpA)?{C*onaH=h&w0;FP2^yYJ-H_eHBq%18z zO@Y&&7I=0DFMfuBc{S4}P>sQMl0fHHhS#au9z}v~7s$o)mbx8v1tUJ_tZ*^&e4fSU z^8xgHo~`FoPGs)WL!^%pk)8mNK0ZYH=wRNbsli~JAW-*!;>FLL^p%&cta}tbZbiDQ zJ@Nt7%*^yi&s~ZaG z%Le+Iku?y_>9bFWW2D7V18pkkQ=eeVK_A3DratvOWqm5q?1u%4AH=g(PhnxFGJ|^y$UdV75cjpk8&>{KQIw<7Kg0O)D+lZziquFqbX#d4X2WCrYd8 zoVu~y2g$x!>m^Cw5NJ68rG4J3Mh-KJhI=C156O1ARdva_u|Olq4WH5di{A;v0{zLz z6zgc+XV^<1DQJHqQ{%WFd{mHvjy5uFtLLeBevpEu7@0hC!F9detxK#U#5zi#%0S`v zeX8txy8XZ{2}!>$={bUiGv1dZ`-*@swMGH+{Ds4fV_7I2Xa4p@_Sz914Aa4I;oAr1V&k9mEcu+-d2Fbu#E9w5vI)aQfPQ|YU z7AW3_d$E%{x{N-x&zap z%*$(-m)9^a)sU|*R6wK}bsnckk5Z(^DAFSo>G54D^EU*VqaZwSjg70%3!uRqvWEJ zDs??2Sl2!rAAfK_ACni=Y=s)B?$b3v53$X?3gQCp6S(&FWe2`dy6d!!fbmgt^5(LI*vSvpsk+5;juyjmf9O4XBRT_18+G+bqw8d)bqD-b7# z1S@1+(9@Y^y(fQ8Q{40EE1xu4K8xS2*-cFyBT%Y9=NVaSN-AC!q@XZLtDr5EQ#qR7 z39*$WxD49W$Qmei&CiGG{Cud+x6u>2xR#}C zex9=8r!c3gMOTJ)f;US-VFS!HC3+<)BOu-UM;i~ z6k9sS8h6TamX0}j6XxVm&&k6nZi(Ed$zPSNrif2vk<8tr1R_C9V=lFQtcmSw9ro0% zvuk1B;d5Wy!X_QHUzE*Y*{~{sKWFysg?+mlWOD7FneK6xe;G!BX4ARLh{v1;#Jz(zwDd zMqNl#o!r0T=2aGkv(!Ni-`qfG!BL6{)@}k_kL{kMspi5URd68oV*Q^5B$ zk-np469b#kW|MaYJ-{$f;14KKY@;FzPaTD)RQu&|FfkbzRR0txbRt<~k+i!#8tx#U zI+w@-FFK-u{%&LqM1*}#g`$=km2p<+Q{Nldr;<0lPbF`ZCZV?}n~$p~@Q~iBSE<&y zg>XcA15u32L!sDFD0UQQ$b8DX z`B`#&mpQLubEi2^a|-DsleS+bbgPkN&>aHHT49x%gH;IF;s`!d%cw0#Q#G*W2$Y?N zk~Fz143ZBr6C2%k^A6U+8PC$*Vp!4ES^t$-DI{3u3KWuS9hbCH@`r2PpKfb^xma(@ zEV93~RlW?eXX4sti&Zu?4SSwWYPBfr^F_L_Np0Uz`s_C>1>h^qzP+$-ccXl<*h*Sh zYM%v7HnIky{ywK{;kic3XilH{UVS#NPth4ZUW66rcxPtIJ#W+;p!Z|4@m;Xe9f?Dw zag1rDMDk+Ij(UG4Gvr0cF~&-UzZC1?U%W&T7*n3-VM4{&zN$GUxy! z(@=O`#gbms$s$-w#dVC;2D({bzI{L;-@)!%B`@2EwY@-F4k$=dguKXkSdfCgWMpbx zw~C9^0TVCzeK%em8m1S3vQT*;l$VIIKI;+dae+bs1!)Qe`&G@L3<}cJjL(aeULE!3 zep$@p%p`s1*bh{^(O4Oy+Qm~CvX47_vnf*99}8fYU^@Kk!~l_ zt+KssTC`#M9uljg``jv@*6v?l!nflO_;IzU?`5~~vRCJ2?;H1nZ}$Q1_RwzITz{6a z?<#cl0BEYfK7tED`owq7BHgh__bW0FXK633<13uY-JSZPr_&u;p>Ua&%?)I>gN4xs ziXA#9@6b89lR2qFwPbo+I3X@l0G=e!@&%%q(ge|g;(~a~UR)xjE5-FV#q}ujgtp1x zivoDylgvSySX4U3#1jl3XyP(fX9W_}Wn|j8KGLSnb3+}X8-85P`Ia(o;xTaqWpfMG zi2{8ypl)5d;t0Jc$4hkC$lXN6&5TtB1!;<%cfI!uQc#DHsmotc%NoZfr6*nucZHo*_1)SJjKQfk3q3gR9PvitWYH` zv``mSCi5|hcK`6`2y~&5NqT5vr77@Bu^uw5GKe?MvMu15#7YLssEb-ckAZl7GBcQ} z;tfISS-4BZ2OC*`R&h1GHmRY%rqI4dRyag(V_NQbKhK^6>buZ2$e1eP`pa`NbLV&} znRyMw`?ZDNAK+ zE)a+W@ot}vz{S_f;NU$0i#2$VIcvwmOXi{7Yt46Kw5W?24-W0B78$A*VW;87o2fCC zpG!7*RtuXnB9@%~r6~59-NGg%59hlIl$$+LKxG>7CxN)wl&x>eAi7zvXBNrB!IlD2 z1OBW)hi^Q*VjkMP);xJ*rFEETmcJx4K9IaddbUmAbgV$J%cO1olBvdq53S>)ZT>aq z_&P<9zUJJO?+|mgK#c;;F|rE!l_2~chJU0Wj}_@}1a$P0+P@~FlJ zFXU=@eNKp68J`Kq$1SXIqX^!rwE{1Z#t$mIn4T0bquN@m;xZ^!+>=+_lULl+=@rXo zPiIzjPiIzjPiIzjPiIzj@jPSSqQ1TwnpN>)Ud4-f6))yh6s_|rv_N_$MS31Zx^s~p zy-1H;q(?5&`|4Q5-7R1Ug85{XhB*~{&K|~=-4z-*;4>`H?%@bo;6;-QG}p)~i2Uoi z@%iu!RH*rBX3>nQH=|E|Z(yHF95Ga>!!29{Uj-P2!oGl=q;Ku~A0QDMK;RWmU1ZePb4Oo>GMeJ}{Vp4ilI=hnT1%Hs_jo`P)Jl1=6Lj zD3Sqz1>&P8T9oH>x_c{l1y(4kNK=eYuPkd$Dj=Gn=~O7Do$e}0?i94@4U^OLTMW=Y z3)-OPGLZ+!cDkvJyc&o>l+EPJv{+6J3npkyeHKMmx1f;%eu}|AgD19s<}SPb#h%Z$ zXo?hy9fe|Au=$kV(*k-Fyqp=8F&d`zK+Sa{G(33wkf3Q+`U_E$7CHS81#hPaHLuLL z`%s`3f`-a-pZX}QV%1kbYyUfaVth8}gP!|$`Y5~*^g(<~vCnwC-6yJ{CtJJApl%~; zAYQ4^FnX*r`w;nKo!KYHAM2!+*R0YShzl~aaObB+HyY#aM5MbAi36;%NwAKprE0B? zx9HHrCz7&-vJ|Cs-DTQP_)NPUkJSgfsFioA*RC5oZ*U{XL-4Z4;bjlT%gwEz9{15$ z=hoeBo9{N%KPluB6h6@3271%D9iRmQT`_faL(n>nZz`d2BHeGcn&bB0e>s2$s{ZK7 zJFUk$E#y2+nG57HMA}wFTA`9S2*xFk>29GC-0Dt`=dYbmHE|iM7Xk_Tqmk(j&{Y~((`|62#j#sC zzsd5R?vBFxk)ZKDk1P7kSBw~m*$tu@Iwk#9pydX1=30ER)u}wrmGLy2Lydx@jw& zBi$asvZd2MEVb&(z$iRpjHcgSK=Zc(Ix6b$y(iC#ej~6!ZwYiJSy1z+tj|D7&k_5$ap_qaw+*Au`s{BaVo^77X zpc{;=fNmCq@d9;+3Cf`3)~419=p;eVf%^8ROaQvT$TH{>LF2fi&Qr}_JLpOytJetK z6i6yO-fF29eyjM!S+?jG(YF=RcjVExb>r+d^VrYU_qN zEeJq_5G;yd(tQyRhV`k4rsmm$?N<2`MhZ|Lqz`Sh4&3Y013zBV%+C`Ky-S3@*CeM* zE0MeZ+};Pt7K)j+sk=Pq5az8qz5C6I(ZL7M4~P5v zFZV|-X$X8UZBR#2&EByZFjX!F%RV-POcxpxp%e;+ zspg9_)EH)cIQCBKLxsMi|N2m&U+KU;RDACAq2k@$hl*!X*8x5X`q1`VZ>=1VK`mJg z-*M;s?6T`NsXZ&mSnsI)E2)86kiQ}{K9D~V`g0&XZYg+;hs)-Cfrcmx1{#d>_*Y1) zg)|*fz9WP03DTL3!d1p-IBGiq|CLZsEEkF?TZNlyAx)LDJ}+_8@HT8K z=Zrq}8KdkgfpjSn*owVj-*j)Sge?r}7aN-Z^q?RJpcZY~ zkbno}M(^UlGeod$=kiSqh zJyun^jC)(vP>1%y1J~U|7f1r=u~M5UfX3u;GfSCwGxeHViF6~8g-tpWV6(hcHL4rD zxizbd{rUn8M$is|@b&hGr4UASyF1&%Vh>@zi}@>luf}=VX!7{NH`;rMjo)vN4izh1 zI|`8mg@f*?jqP@4jg9po^8-b5tw2{gE$O8OnEP8_Rko8eoXWaaXi*^D`fe%SD^Sg# zVAE09bQCt}V1~^v1g-JcZJ-|#$Oq^#fqHQ7yoyg0%abyEF8BehVe!`p;2jIP3<~k5 z)#)%PT^brXS?IoC!|?u_4Zj+Q1giNAEk>gjw_;GHk%FfS%)DCIR13v4#Zf%V6w6&g zq4qL1Z(EgRY<_9=ltB!mhDXFWI7z@^3Vg0WgP`!x?zQH3rqH4;MkAQ%sO5mBK5g|@ zi}s~hzb&PhliA6pmZhh#Nhw`&9+#pRqG-e8?<|V8LNQ%_;qeX&w|rNMqKwTPvngZq z^N=wR&DT3u#Y1%*{767P!1oB0F+4nG9@@RuJY(~u#Y&|t9iS2Lu#JN1OLESb%9heX zu~H~j3dJ-=P+TCO55Pmrdl{p4^IirWEeNa038JVLeRr3yCfKhUBJ|l(uu`oaQ{(ah zmztD^V}#B#GOd+vldVZCFt8ilIClw(+JqW5(9w#NQOIRSs&yq7WR5okdHJtqkHd_@%1qVMkVd}2S*e54sruu`oaQ)43FQj_xe zywJx+rhK|hmZs^dh%HYIzeh1`7jp2d5TRx1C=@G&Vx>?_fuT5CK$F1F3zP$lW?8b! zpvMIv9nXoPTJ+sro(}9^HXkV+1uNC+F*T+GE;T6~PYAtZWJ-tIWa(I5sbJez!|5V4 zM6!hwT9%GNu~H~j3dIx{iW>@O5_nJZUdCvz5DutA5Yq8wQB;e*yUWvo{Q>49rK4b_ zT0N%5bik!1rK2kJ4I@)J+$KxM#j0qDM=zh~-a0j)I396udlfbLSU$AV?E!(@X+*{C8chGGExwE!(qxeX1&o`TtRaoZ< zbP6zhfr)FN3nSY@`Krp}jW?U*A&?%(EGfB}9p1BH(4Q?YM1eM^^K$wsPkQ>(WO`fLb+Bi-0Q>c9Q{r(rL> z>i_Q^|I?iOr-Aid-~XZXKkc-p5LQ&jeo>Gu*%MWqW~{cGg>DO^{@dR<`aeyewb9D@ z_bb8U0)02=6V5AryI-kvk3fz=_X;$DT3n9!b`u{4isB<(yv;JD(q4kx#Ch2>y#D=5 zr9lGCGSDVQRzEGYe<0o8>MFv{{W&l5H)7dRX#;`$fz}*s@w*eGYZ$8nT1y~*E-mfc zw|GL|;+5s+PQiduZF0-xA&_?oblEkKGW7jQR1~XZf3wAU#nM;?9jYdVZDDbRb`%b< zwA4TcM&0&qC@i!4KyOO-z2FxVvk5|3=_zcgUeyQcuTP{nNG?VPH*UL(im-v!u2oO!u4_i}LN<onS^06% zy;&LhJu8R0{wcbj>Kay>bZJ-Xz+FG}-qZcwo8Ipqt<(Fh*WDZ#StGbSfaYMmfw_(c zJ64quu%5Q=+wGCJluny+ayN0`AqXX?2LxPQf}a&=pK{-3-|SS=4wrEfP4Du+l=kUq zfMg2>+5A84MsHB|rpm5LRt#uHmj~?3{9ts16i*N+J`gtfignQPrBb^`1!m`xE5*9sq-CVNfpj3%uV zFBt1E5E{0OLYy56(^B?P-dCV@gC-i8t|5`0WvmJa>%2Ktl}|8nTC89-If2!OlM^LA zEjR&%I>viKOD!vwN&^K75L7j?Hdg5JKwcqqb0B{z^qWAs{T3?jVyrRTsNyPx%6FWCU`{Wj#t57*f;AL;xOzFHO(2LNsy1JpLRP}>MLlC(7M&jT~nYc7X z4RZ-mxy@b@?=O&3Pzbu{tGC2^KZrqJTm#M2j(7W%_LuU`W{{@U2aEeSMHl9fH%Xv(9FfEx_DHce6DVvn{u)S^&XmuGL(QPy2$m^*z2#16{mwLNAPfiS zUQFxyny%q*XR*-Yn}Xk1E7S~~%Xg7n)q>6t*sz1ZPK8$|x}gVnAlh zVnAlhVnAlhViab~tI{BV8QL|e#ly>|eV63t3w!{gGgMjkvbSPC>6|LixcgaGHx%J3 z8=in5@G3&djejpyBzeXE5N}a%0YaP|4Uqu@Ea1JB~T+l=bC1k0fSX+Vy!Dy&9qXjYb>sHs91f}dYZ&% z1t*{oR52}Y7jI?|gN|6A_^O@?#a~)OpwkcNpLYMO3i?pM&BXR@sIO@UY%*Kf%-TSg z7+C=gma<0k&0P@gqs@G5D<39;I7)zf{mz>x+?&Yb8YfrBo7Xbvdq&nklZ;GRT}jn^ zO2FkAcrSs51?U8UoKES2IME6d^l@|%rwF73`i_wm&~F8%5AnDa^zn6wMS^TCBe+kR zsSl+)K<0zED4yI><{xF^9vpa+#=>k-3R(q2)DX(yKb)Nf@y72sk>n~`1|84YcvZFZ zM151z5!Q~5qC-2}7Adx|9>}Y#Xe%w`%>u2oqZQi_==TdTB)#Zj=wk$NorWZ67kiz= z`$^MC1a}D33pS|aPNe5dOY`V#X=aGrD#&wA83zqHe@l!{)H(DP^$yWVk-(? z>&kpX0j_Qmo)Kw$jFek+z*K>b2l`2TEXi&U`T30?<^l30f#(7GSA&uma!1`laujW(XLG`U!BHoLSTO~m$;fD~*k^X&z=`nmAzNaJIa+@b@fiabr9 z#K)5CM$6C90(BwiINjaRssK7k5Oy!95q66s?HTCaFBrg?dh!s+cLYjbi8Ay)y6Y8_ z4~Y}qlbz9poWiMsD2J@)ati+_ z2F3%pRXce|<|oMA&-pU^j$n{IS`0f7L0D1%m!R6!P(X83<5$U(t6?cS)vYA_k8wmnK4l}`FB{DfeGUef;b$Q6)lusC=|!@9J&R@dMn~{JX575aN!&z7^>emm%)6Suv}^K!03YFraHPeHUiFe#?8ZkbCh6Z?y|R99K!2c;P9^%s7jl}ExIT{ z1K!PnA43m(cyk4f^}>1HxUr!;tZ#wSD_B-x8^imV9{5nu=mgFnWuT!4V5}&}d*A?- zNnt#bK@L+ohJ>D*w7_x)suLi6>3@_q%+1_b2; z1kreR8&ojJ?Fum{623Zdzja{}2q;YycGmqou|6a8Y#==* zq(3n~c1ZzwpTI+ho>Pb+Hu~*#BHImF0#N)e72g+D9Tu^){2C?Rf9(&^zfwv&nq#4xSs0rupCZCjvafrVC z#b&)-LVCEK%WSgjysDns3F0t=yj7rtaXpjf;X&dZEs!PXT7h269N!J`lfd^%YAXKJ zSRKwxpor|PEBCph)b!w)<68 z&`1HP25%AAAWZWfSXu5i5oE`c6I47`z={a|ZxgrUXg#woE@r+e(X}QngKiXrMPUfq zTMOhDM72@k&E8wepE8Xa%AXFTOOKQk?*mFU8X@t~JTgue|2u-#(rKm1%S;{$Jy|eV z<&#V6jUE9L290nfs-q=d_By@cx~`$!v_|zUn5g3_G-m48-idB6J>0~&OwU~%BmH$G z)53@L5rG7u-L!Dl#Tuo%gK^A3ZY}UJ2R(3|B!=94WFht{|0pl73AD1!m&MBheJrzd z+K|@ux+#1tSWZKIVym&-4DWjg)KMTz)yM_B^J#zWk(u4<>lN!gflNRXbq`S{Pb8CN z#ekWaJfY&A3S8S9s3MTbqRy8^ycPIf;io_KiJH5I)V?E#*HDlHN7}S#yw)LIFIf#8 zRJNIP)F~j6sGi90;18C@7*j5z{81oF@ek?R0wxA{2NSoW`D$dl>OKnRuO_Y{em9UV zJw?*~jjZ!V>Xou}3CJ$pAm?tdcqdn+cB}YW2|;%Vn9X3+v*rDMX+A7aCxI@JLnR-C zqLP2}#8UjbOw6AI`Qog!4t+mr(fS?M*P~j2+)SJ3l_PL_SJsk;=UCf{fL*VX1VPAf3sFZLFu#g2bS( zr@$^Y=Gj^L0u^t}b-aQJ@^rr-&RNLE%=x6*7!INEp$wxOa@r;~JcFFVYl0|;9QNr< z?)B^{KRDN1@;c~n+%J@k*dR>vRh@QTZC17a+DQAiU|F3DY~oWmRiL#%OIE{LfY*=A ztPH|bJzQLJ{w*@I!|HL;xkjKwgUG1@8SUX;5P6wJSt^GM2HDEa8)cJQC|@G*8x6)J zMYjraMatx=LD4I_SspM_WuDKhUb-NkP8(D65x&&tkls^zUYIX5Q@CGsOGI_d?x;3(h8PTq?$(rP1H3Mn% zIHk*L9J`r@g+Ox9twz>ddZLP_1S#kqBhz6Vu{?ryBMD};U=NSE%R;$g-rgRT^4*dOU)%KtKP6;#^7#4Rq~O679} zaqoic7HEucp*+OZ?icUCEm31W41qjE;O7G9$)l1Oa=)z$G4wTpXbm|#6X%tzBTuY? zY&|VkZl$GJkQfw(%lSa=!Hh(O(k_Ce;&l}&?jF~h3bau5lb`DhWu(Kma+Yf?k6=t+|(hj6v&HR#JnteUGrj( zvLLq#UQA3S(QCsM__i{`GhGA5Mhh6~M+egDKS0v23)IK~k_5%FOOKS~Jd?H$Ptvq} zGkLSEhz#N0t{ z6x1vkCyV~EAc`Sx&BRm^y*A|TmvVz=atFpnxkLS>KzjYpNy?LX6zz@}MVA^3iQ_AIPGU#(AO^48$ibn{vacn24{pp5FiK|-89uTJuMiltqU=8Xpt72H6 zsqza!4EkdfgJ-J!at69nkPpv!Di01#1`QP;1|MKUKV@Q5v2F@t{SSZNmdbZctqgj; z(L&iQts~Hzj)q4XUA#Aqe3-%4OZtdX>vFvtEcez%`aZWcM{Sv=`+ib5Ty2QEDCCy} zK31Urt~NxmlaFWhx-xLO0!Ib=TVMZs1=$FHPsNV~`ZUgCLdD-G zk-Fdop(7K}B0+d*0%}d=KJ&GoiiZf|OorseF7Iv`*xwh#Uq;=ojvOh(mMn5zCG5Wi zBCis{Fze}CW%E~o5(2_bo!SCE-0Ul$-DLcShFc3E?T5C|~YV`ZY->HyXe?PtZ7e;angXSQ_6n zdfi3dYXsip)*a}B_u1%$+oX7fSW9ot3`u7SxRJ1}y-q;sm&Q44@<7h^EtEL4E>{xg zR68J1Bss>4@1>|nu8g&Vx$-_6po8J-;UEk8q0WeTmmVeF(Izf~PByX~G(})t3V~Te zmtHPrA8rx7Ef{2X_*?89%UL3 z9flqwq|2KWDU;|1MGx!u%F_!1O%l*y($i9p-|GVDic3rV|80`bQl*VahI6hU_D9GY z44PUD@&8d@(3YjQlmSJnwA{MaY{NzxZIL!*iNwLqXS%l_bHaG~hN*qsFecd!%UD^} zSZP6iRhM&zEXPJ-&$dn!c~(*MPTEph+X&Q~phKmhb?$JX^8=YH{>l`qAT*f1U|cIy zuK_kSeKW8@_{t|cvAKub%qv44LveAo`u<(gHO+ZC2s$gT1l|y-HLkgERuC+{<`zDR z6T>pnY^ur~G_JXDn-nSb)kx%r3e>VCG;&)>b`%r?meRh)@im#!SV6WXQ>4;tO+HOU z`eO-evWxPxIWPM@o<9u=U$c`hTU!p+I~RhSN14y_r={#F74B$KqI_qrf;i0~ahI!nqOPJr zodSO&5c*q!hE)^>0TzRjFiB~H+W)BAJpoE8foA!oCUL2vDb?P}m{Z1`NUv6;_er6c zJ4dm}Bh3$~FDAdIAoF*6RLhoLhV6TT>@56@v}P<%pV$pW$e9AaM1%fIA@*1|6Kiv0 z+l^|-F-7rQk#`hDNc=3Xlb_y{XIq7%>zQska)|Igxxa6>HyIQMm)G0*dUDZi7;Gc zS4ECvLeMJN~my*}PohSF4 zb)hFyqrg+BOI%NcNN{8HCtf^5k^laM%RC22a#^vO#1L(n=?(0ICm^G(6x_e0!kp16~x8A3~yyMxC2 zA#j@%$;o5ZhBD}Nfm)j`;A!3(vLXX(3wt&^S;)h8#FPPB8%7;>J6BKih68;8o z`8j#u7SZJr&NTN)^h9t6dPiVaj}Y{^A{y=W?56Uuf_N_t^2Y*Ss9kM?mGq=Zpa?;~ zUl}s(G55*h55`JayjaC1EgokK7sv$HI=E<;@xZtH!;-TI4Mq+wJy#LjBAyuT-OvfaY!I7R4!Kwcz$AgX~4zB#Z#R0$iry;YrB zOx3hX(SQg{nghW>Go@>^BA6z~jz;^d*k!CT=rRFs4R5!>gqGIz)?YE*f!$N}9xG69 z6Yv><1jT?42VWN0pcwGs-c>t@7aX+X0C5%u(*JdCysD+7E*FRBil14+q$#A&D}NVT zrmLV!1f&)GKw!JW@hb8FR$olGdF!^tgP=`yqhYQ+bcGTAP#t383Mg8&fOiUP5P>oHz?HxTMQ56e;cqEcxj1+#@{CFJ zo?^OPyqQ)@88kunUb0G{B$M zrXzPCb||?6v89U(`l0}3>Du3=`X3(7mq9-g*oc2rL~y)K_gv9zZhTgJZ1S;fTA_~= zkH^BQ4aDmQ@-dI-?GJf;@d>n&?HD!CFhO{{3B?Op8j>J<1VQd(qE*rcij_RyP)QcV zROwg{5I;4$vb#D-#o5NHfCywD@wQGVt=H{g>7__<^kpmSb$e`ul82Zn<<5D%K$Sl~ z;m0B#@dCsO*2J{l5D6*CkK&`Ga;mAdgD%m&s16$o4$oNILA(V8+p9e)THy(^-ii_w{elKWB!hvV#6Gpg|B7KYMrdo(;q zk0v@8W14NQnN53IbDT-5g*5FFv@bmBtWY;W%cI9`5AMCjZ%g&(0{KQYv@NaSNUs(! zu)%kmW*N;R%xM}jw0B2iEh*gol5B6%S`lu|V?er=fLg%Ynr0czs{`qpx2pJ-fZhV{ zZby~cK|-}af{qa617^N74={11(5xI9HI*56&kK5AFvX5SF)hkexZ`4O+_t|Y+ncmn z*rpyqx|YD2D9qOh>5Nrqre_g+>rAIW7tlYm4{CS?4~Y2(Gb@9((5XgK=S3i_3UvC{hKFyuC7Rr2owSV|Ie5M>um-db3&!EFQPmp_{%o7_uVhW#E zH@|SoT1}fhoFv{Eg2wvboGr-xQa)Y{Y}ACqvw&v5@V+6)Jy1S(3A*rpC}{Ky=WgTX z?SS)upt(MHd@*&S4>${!pbd`>Yt(MjP0(?IMlPH)1kE+R2v0j`qxPEOtSiXdO?i7k zvj=$Grfl@!qvJ}Ajy2V5va%7_GO5QtY6Oq(B9G4(?7N{TA0UVy6ku4y&TcTJv+0Cp zm)MgXI&W84&pgj<1DyJ);-N(o{6}8p-{L@UI(dAP{d>`c^J%^^^qfvYxg2wkYito)b zzE{bL@V^b47xsoK^d&Wgb??`b%@=SVe&tcC4&Q8(ex+51b$hE&@n%8O6ux8!8q6Tj z0m@qf+oNA{!e&i$*D+yCcab>m2_y*L@(X%FptQ`I2=Qlu4m7hSww|t24V>9ad_cPk=-da(FngCT$2twWJCQ|x^u^xt6k@LyIVqmV>?KFD z1=`pP2W=*u&w!8ob@;rzF`%%6^iNPbf+Y*nY2Akw-!FeW(^re#Or%?h#At6D+o>(j%4Q9->A>cT0(JF~ zLZn4xVcy|&W@CYCsk;Pn{<_eL=BaY25FHh3|BHF56y_;cH_PTXX5RjLp%8q#w_k@S zV)`#LZzqs916i~q9j&t3QCxbJD8?ieOa|5)u!1xgR3Yyk?Sj4fs?mTDPz`?5aG=Z6V-PD7wMw5pu(jyj0z{dzgg2oB> z(gap)XxbuCv%CLk3JBvN0TT%vT3hvyU>7k}iHX)|$)Q0ZpT!KkGqtJhIW>)L&>Sf2 z+q@IR^}z3y&8ntYD->()JzJEBZt!9r-OW5nmosUlaFZq)Ql8MWD1nzX%`%#+SaZ^% z)U6^HA$LNSdO!q{aoH(p79Np?1ArLaxeM7pMc zY=U<*&2picvU#W^A=q}%&ep<72NEf1(qKK%t2{^Y$-xmQs*dptOLYv{xK5xW4JdjT zvlI`%kQc1L51QjDh%aZ;r~-`?Xim=TT2}-WitqJ_{5REoOU{B(#oLoDNmG-wqj1^r zBUM7!*~DF1OodfCh|QJH<;^;EGOV`*bOm@>6Q}&|s;8Z!SERl)e#q920;Ogkcz1ys z3*zyh@-e^u#`=H@>QZcp~sYe=xEPI(8+?89xW|l#w;iOGcJK4~M7lpbuB2dQ}54a5Xao z@zq$yzeB|5N5%rgFV{7toz~L>F%2HIXtdBD1*XpcV+^U&HWu18kQWR6edDMCF>e!7 z0o}Bjc>&!luw+17w7IEVBJ`6$f_`RX4YcM~(ILbI0BI-LvC5Wp8s_ZX9-`Y9yA$IwU@j+vZtbzWxOH_e)Nubt(dW|fD78qFpy(dsK zkJTaW-8Gv2QpAS4#R9}m0)?=r&=@0YWueuy23k`ft`exKRrgRQ3ycr3?r1XwjW@D3 zWly~mAutt)*1b#xG|tEx=&Zm6-6JsV5uep9bAe*HPH5!bMjkEnyFh~8GO`9*7`UbQ zcaQJ`0`)p5F1(lK3-6_At^Iq{P@{$|qis+iyQ5qDrGs*REoGmwRjqu3&`$%&=N^s; zmvC)bu)bz%SNT>g5O>>JQ9fr?odX5BS^>owH@)7qnm%JDP$j3XRVsa3Aad9U4H<#R z$wIdWvSn>udI`im=~KEY7Kr@bI+{HKk^c}{Wu%eJ%AEw_9xZgIK)IY=XQ>~s0sI)dym2H?uS47< zkon0PuU{94r2noHh*XB{kA6A1ADiQ-Ztz0_op?c?R@$xWA>xKIwN5Wg6G$?(zNHd> zt-u0+pf^kc@sI#tLTp3gPqF>zboG%bL40H#Rsr#})RZ9Dm1GP$T^$+pMX)Q0529C% z4-vM5HqcY*TjN7KFVL1cwayRbQTUTUgZMom27r8lSZQT5qn<6fQ|mt#mt|LyDRl^b zTEtvKw5$;&5a(*pm;{0mWY2dXHq*c{3B*n|iYm)%1g&7Bs2y~ak(E<~!tXIuN*Y&3 z39M!a2Ag?-xKW_ML3aec!V~cqjXhIh5NfglY83d|8HvgpU`zJT#x6%ht`4Kz9o^67PmFvx45c{(zfer>o`J%JU@UPX6I1y+Dy(5hz8$zkkH zuR}0o#lK$Y-Y|@(*FRV@3@7n7)cECcMDS>1-F-XKcN@F69mFe|jtkgJ}{B6tF5Ka{wC#+Sz9Lkun!U4hf5MhAS zK*PhKK}%sgG?ZUr`X_5>>wn?vn7@#0|D_>F(BXuO_bi*@ysv<{c;+`CekBmIO|5$K8$ zG}_3v4xw-k?%>4RU*nbu1zt^{83@|L$hL!pz8tv6rBPa)v92F>J2>p_Bam4!psEj~ z0afL^`htKuzzYRhK0qVvz}mL8(C$W7i*B!SR_qo?m(Cq#{Z{29$N3CzeqMrJWABn3 zfuKD>el=#lKgjjiJN+%SGwTrSoAM31RAApMF+~J>src-dVUs+)s~aM2hBNCd4soZO zS+@m%Eb3N3oy&?}djTR`V|0M-R1!@IB3xxuva5`lw$Jf3x2DAM(4pCHg|Q;yZZoqE z5x1Cmw#BTjmBG{?SSECs0C55`KE#d2uYlNzv=#R2hM*%&$*)D6c5HT>wYjcH73#30_)!EM8s({Gfkt#M#5USfIzls{~a) z=7>wzhYQ*&=tu#X0DoN|4bW9aw%sNau5znf<$k=PDS()Y3iXM)U4`0ItM(IO)`>s6 z&M0|*71QS|w5dS8*)JZ}z!3SAP}|x@f({c{a~UQBMj9V9Okn(-MC=pz>?Mo=dGR@I zvG}aE02mHzE>dED`E4K>7tDBZ*+rP~BH2aSwS|aeCkYp@RS*}e5V^AH~t~5o-d*>|O#b7a&HZ z^)|#q8keR7(Ib!&$o31yBm}2)Q}W|FRWL&1Di#jtLp2CZi_y4`hMN_9+*yH<$AD8| zc0F5&rqmgE@%G7-dUmLpZHF30Aa#N}H15n91CZfn1&DhD3LkWphMrY&g9vVuSOFp~ za8v3K@nkc*o~?FM>YQy@<;o?U04#x-$@t%>oz#+14b zR&(s5)x7z5H37YWEd}u2d*+M#{&Wak3CbR24(5(_5 z>Q?=_qtkjjr9NJTc!HT-_gP>zJ`Yq2_b}q3Jf#l7WH4VoE6l>@g-Nc96T=EVGfYiW z!v2^WC-e@1Fd{0T-wI3#Vz`dC;)8Yy zC*7VpL}%cGu5~^H$6@J%exzYzejpe&;)CK?=&`ZDx+Ok{RwW z`RQNX5Pz}4q*--{Fk|)0&JfRq={u_q5iU+7fr$MxE9;+dJ#0vRfpJApj?1X5|}TDu)yeN53_+atIojskw6w8)*Icp0KFEtpv^So z%n!tNR*)ZvT?8@(earZoU=WvBK}rx)1X2RMV0!yA!b@Z zV+n$d)g)Xn#noh%o%dKoEYlE^L*e6Yh&VxJ)gd;v2~q|fF0dv-Fk>t*2$mhI1%jKX z<`^PQs#*0?{PVM;zks*BeO-+|`r%!;I`5E9nr4XSKrafK`S1?tzc?QrcP(_2#QY55 zNV<`Zq|FZ4{dpm#na@FBpk{P4A0G3+F>GH5^z%a@?9dw429|{s1%-Q-U)(FFiw%Y? z&WATkkQ{J>ucr-2H0c&DvaEaBY#?`dz7JMQ%`SqIJBP z508^xV|BjJH*5Q?j8vW9$7)veTUtqxOC4^fHY>7&u=+Ri;c>i74k(R9l9=^7V54=w5t?Lu7_C;zu5$4J|euoPr*EO;DMm({s8h@p@r{3CN z?T47*L4Hc3?|GVj-0Nw~CmgPQ{M%k8YIJgHY1C@faASPNKwi**AJyv97;CoSBPpH&H)tEok)n9d#a^+Q=QQ?&KC@ zBllo&I59MGOY!eB{dLn&J9hjE7xt&`3S!Z3^v5C#{kDQw}jGn@JFScNs;LNxXzFL2`O+7KfNC6mow z{Bcw>KU)hM{P;tv#@MqJvO${_GOi&Fe7cC^W^=9HU-ZmH0$uKb_R$ei_n1JOKJ_KB zUEMwE49;Xy;i16a1$rz2inknR)*)D8wB|fkZ`HSw_^llI;(WpjEjkL%tV3{}mlVA( zq{t2a=LGhq2n6@?gQA}B`VEz2$!5;Fkr*VNg(ER2aOXey@Vgxf-}i!~?8|y$_#Frf z$8S3%sXr$$sVCD9>}qOwL94$Wt5_ksuQtQ(tL-v4N+9+S=sE{1q-`V_6}4JU656 zryrAK&*Wy*{X}CDKebrFPbOCI=nKFK5aJF#ffDF9{^+fr{}}d z>QAXKSD=?tK&*9Ao>pgJi?=qX)mgr|XfO%O26vyW;Ongw{CS`ieCf4A@+8rI zJ1bnZFgAJEm$6RLc;fySU(08!s1J)wXMJ@vw+Q&gop9;+dsWB-yMp7bK0`HrEQq@h zB+u70O~a4C5yC|ZA<7|n;F09yhNljR!9;mn5Dg&XRZVc1oyG%$20SB(29O-YV=+5Y z2XzmeRDCGWvokG*AcD1S_CT#bkdFwY1R_A=dvI3ps;%JF9;z(fEfBNl z&uo?yOukw3HG#f+5%iVtP+(deg8KpT@Zv<4qImoM#fkpjfJyw?%L-gE#mDw9PV^`B zCLvX9qE_G;J5#_49x?YLW~$C*N;`Ce=NLVz8$3^-;SA#C3Z(;dh@#V81v)tdI(Gtr zUL(K@_)(*`?FRorAbnn{;D&%mU(%K-ZQJePip{FE>-IPq)eRS-~x> zklXT&n_^C>XBt!LxdyMZEL%FIG-iV_8(FZ&sp*N4YpyCyWev2UprthFx~^`h&4U26 zjldovL+l**pgo)qv2Wmm4s?5Xl&k$gzg{1?sF6KfiGia^nwE=1>v z%wwNuc9TYTL!2$p*aF4ej?OwzN`-S3aQ%rfYtZ5!cT#BG*y~@daZp z(8M?a&7*WKqQExcQ&*xRIS(Anl!M}9y#MnGrhCBxGg+z_mubjbRaw;oDD%k z6tB9xxNUr@BELkSAp@cjk~bZ^JUEm1tph8R;@`x=wl_bt^=7xkb&DXgEj~Sw+0M^x z{~vpA183KC{(bK-Mi3Rmd&D&2rD#P&Y0(T)a}b=F$;^ZVQ9%&zZ==Q0mNtksskf-; z8AJt9X{&7zl|PD>R{oljdQD4P@8Ufz>iK@x+UuM>BmV#U{yg{nJooeYJp1$c&F@;* zTI*WZy4Kojuf5McXI?1QeW6(Qh1znG>asE{I;)zZ98<~bm`Y8@RA0aO{zpTqt(@vA zr<%&C-amNu_BzOaYESWfz#bsnIt?(9vDVk__rgjd!+c{0yOQ z>EweCzWvffVc+BX8SAdwOJ(w4;C3lE;f;X*HN8;H@BRlC>5&s2=xzuLVtr^0ZjUZ;f~$J8zHYOc}o=Pq)+mxlfE{9n4*)Wv0I`vf0doM zn*dDA=}wc@3}@>%LC8pRFeGj!i1z|Z{dx#b3PH$76UvMhvPIzy~5dE-bSri@2_}Wstw+fCT1@y`>L@YY>EmTfX z)b4n9i$juJMVsDoK>V~I`XQH|$$Cl@7KI?{rWwgkWgX4u-lF2%ThyKWwp3vrF6vIb zFrzRh7lrq`{m8})IiH`4x{Ez5%+*ERcGol48nRsv?iMETqVWDpK8Y7~7bfwdZe!#` z4s{fq!@hZuBBtTOgkDsf(2KgA(9TqAq=~9*kUgWVoz86aX$C8QTJ+z_qc499xIAxL zRmg{8@qalKE(Nw)SP~W&hh_1n4a?$B84y^&zUCf7&e!(coEQNijb}-}9F_Hov=YBFqmF&llwRpP2mdk$^PlDj>rGne6tE?fR@DIRpE9GxI_jG%O$!ADU@%-#5&XAtsCA+7)Fco@g zUug)f6xOt!?vL{8uQS^RmOiTtrPg7ka<#(Y)ZzQ->{FniazS^eQBeJvWzOp}DoGow zhbQeTFX+Et#^dyOoLQebj}#}xBgNP89_cR3gGXw6@l=;Mxv2gnwAL=!8heauE49;? zGRa2aD%Qusz0rd7yC9a`dAPM87WEedb6dBD8>x25r>up(&&oSRL8tbX08#QmZJ}VF z=}=BHU}zqmaG_#KL_9*UONuI1Loa@HnU)&uZK zdOe73QvOA;7mE|^#aifxZ_3jMfH(7s(`w#|N<0!u9M4(B{l4T0M$P(2wqojJz>}%u z_hUoY{)0laZlszoSa?FEQ?Yn*)$?aG)bs22Q0D(EHa)Sb;Hw+>aadL1DM0(rL+=Fr zDV3_i`%$k!KPspE#AEpVBH-6CcMZm~O zzA8YkmwqD|+AmiY{PH8gwE$HlU*e(4^slEXLvv-po$K~uvH{A~!{n;{1AraLR|?2q zcy_YmvUnOO*zq&Pe+E@YD&-orUs$I)C0{hK12rou?v44*rc9Be4I+lR=Qi=W6*!QBC1+T*Tk+0|Fq; z2x8kJ=uc5AJrT95P<8cCy-o5T5D-_%cGu5N&IWw^@yC^oXYdbX7OdOYyx*|RHvVjN z8}fDtMO&ragV-kR8^p5I8nu#6VwNVuaRh&-0I$RHIe={GS`a?lR=6+frGF&7!h2EA z-*DWFb$>sW{!0GKZv!T;yK+#ck}p&84L}T~H-p&b&+6_3&`LW8vF%9c*eFU@T$ z2kX`%b80;-7m+a|lxvmz-B=bA>EdId6Wl8YqGSk5KLmf^ zm}-(=dkuPp&ZtkF{WijUKrHyYBOY~KeYaNEIaA_sC3GWLgMVc^V%W-qn)c^+rBvJ= zm6e*3bU3X03qTMh8~#idDuzFUM{HR|6%LEqfc=!USvXmpCSMDxvUE+%m97Q;^mDnY zv_S|@yR-?28A|czt!pQn_D%;3h4iB!c1qWR_*2qK8&VbTrDU(ITDR9pk#N-QwQA39 z@l07t_F98~8wGn^QnJ@tu-6rg@rU&*+Y1naBcLOrcrBOj& zTvRwiR;nueChG0h@*tL_j{!ycRTUay%Ti%NG)1k{8N|+8p*x~hdKWZ0HF+V1p69>j zT?;RU!@rKEBhMk~K%96=&JHppBN8)|qWw0hKQ?2AQv9v(UNIShAvT`U^T2=EBx|1q zV6uD$cGS!MP`Y|~d9IgH2EA-6mQP1L-t7kYD8L+%&H$^jB8HD1P1s5DjN&?=mS-Xk zewTD6pqNe=Pej|bhn!LMj@G92K+JwVnC^1Kr$$lwaS+RrOHWu674C|ObE^vXq#UEM zT4*r15r?#_3yx#2wri)Ub7u))iIAQGeAlvHRUvk_(^>ls5cCRmj463JbX5>Lr5+H9 zDBKYB(wwAMi1DaRpkJbj)1g(;&EnA1v&$*FHXHHJ!y+#L{E=P(VbUwaUc0b`qX|_r zps3_O6Awid;^>vF@j=on#6hc>FrHaU-NKDe6Ej@FNgFk!GD=$j=9bh`%P2M!t+y4ew^g+sO|}(HwpHsU z+lnUJYCW#|-m32!;*>ATF9B8yNi(YDA;3ih(nHln{|bS)Ee1k*GKghq<6yRHYv>C> zEK4T@vHcXt*O&;CGy{Zp^c1d)dg;0#c1gdBT1lsgowVXmuNqtr|1{j5u$0u}6GFaq zEFf(ULemPn2Yvg|&bAwxoddI`Wu#;4j>=^~> z9qhD&(czBduw(iW;F2VLhBlZ86XZC)ZTh<%poCNgwH4mPK_Ra^2|7NC^|5cWTl!69 zU0*Y}RB*IS?~Ee_l1q+JXHd0Ehk)?zh{B|(mmI^OFAQcf@prnierUG6KA&oXWbUW* zIaX?`SE_lHOnRE6?BXe7TyF{9m8DmM*d@INdaq8Fy%wyLoirf1Y^9$AP8jKdAa+WN zL0BslUWxitYZ=K^R|&PGy@J>&eHFx3l@5#%ik+!PR0Wm{L zM(XR&#%Q+)1fJ>~w$;={8`It%%>}fpQ5xI+v%wXXWzxM05*a znJ>|=7|*i*6WExlP5~`GQ1plWKLlZSkV5uauH;k=nM3FWd$9p_%-?obmhBz?N^yW} zm(-{6R(8N0W#u%+$~t81l~bE*VPhRY*Cj(q~Uz7>dz{)?+)`7#mw=QZh#j$0cjJt2aEcolq^fb#-mRha4mD8VCu6 ze*yL%(nmpTlME8t6r)f&oe3e4T%bo+SI(le;R`v*p%f>aETzaOr@$!pEgRyK3Wr20 z-79jM-X#rz!r6f9ZK{cwJV#88Sn!lku-sj%Q?|~vA*|(Fptv%Wt-f`LL2Wl?^t@c5^87K&&IJ%fiLgdu&x?@>gFqrT7hkzWzXqnXU2ySP>iKW-Pz4ILT6N;#;7_ZR8<_Qp z)>h)RV;l2d{H>Io8TjfTpD{q*hRQBy+Iud@rv%ms%ggrBKAsSFkZLUncYBC;jlEsjdOol{?;LaHFKW?nV^9=cvAlKV8-^N&xB#RXG zFXoO7sxE0f2sZ`_XGDE!XeP;D0B4tcU&t;?{@)4J@;{P7b;>+lsn0?Revpy8N4Mz7AXe$Zkve@ww2uva}uOwUk`KoVo?jIq9Jwwn-01 zt>kWt5tRN8=<@uE!t$UmOJ0yLT&XI=%TYO9fv9>Gk#f@&sw%`yR_*+shiWn4DpR|n zzeIW&z%}XZAa+TsPzJ5^wIFs$lcF|_#R3Yx73y?K?*gsMhli52E6oR}HVLYBX+J>8 zWGCBz^npQla^UtLpT?#?9_GjDt&&9x)7{*WLDeqp3c?MT!o;Xgh8juc|H(s&uS^$~ zeHI^oP28?aTLS!?B5wR%eFY(eK?g@8~zQYI+PeUIxr+= zOh9=Aph;;GSdB-+@88$&{X6NwK6nD>SL46T~hn}Ig}UjIA# zMnEnl?f{gLoJb*@6L85X6B5oF9S8|0j*})NXgVI$ zYlvnf|B+S5e~6mD1DJmrivQcGHWYrsx?YUG59VG0{O_<3tc|Ls-i(=&&wJ{brdEl= zl|1+nakv@q12yx)a5(D**G_voU5Xw`--;g2t8GWpL~jhUb)#B6_4@Ky`f;7+!Tmj{_`zQd|&*SJQ$}xZxPiT5vGX zf=iTxr7Xwgs{U?Ga*mCyRpO@@?Tc`8IY3*l6g_STeQr-{6(y3Bi2A5wi28L!6jPix zKo|v>UD6&woX`!OAGOlepx0b&LNN>!R`G2}e$o)iaO}w6ok5{OS}uy;r%F2BTyI)~ zH`iT93jcca8ItS+x~mE=fj;J3a{6V5#3tin^h78%-U{(SU2Qsa(oPdeJqY~TFl zfOe!0KxkhfuH&_`-i6Xt^F<_wpNI_wf0@%oNg>3<+M~NrUXGj zNoZ*N_n>Q{m`+{VN(KL`1#Vp$W<=*z6ml<`3tluAyl5_X(VUDwPP5O%rk{m;C_~e) zL;s3mD)?Wmpn1ckLc^s(!=*yQrDShI9FEWU#y25u4`_Hev|AKY!T&|eawk>~iIxwA zj*sFA(AT4w+S@8$BMKwnKPh$DC`{AmNxlw>--%V{vd*kqxEixg*)pUbGOheJz>M@B z2(wVZb*_(js~4Owxh$%z;6<{K>-|$)9cuIDjGC%8=j@~Zz=C<0tqaf2WjTIQI$rub ziy0S~?7jYX_1mawYS*yL%?P|-uiO+i7og?9Q!H$gr{cj~L(E@)=H_M5#988oS&Iryr>I##=P zhl1wW3+_GX&P!h!RkyS6i7$R>oss8{8eH8W?;ug0_yY3F0MDc?>Dk3K&nDda!w25z z**tpo)?+Vp9oaUv(8kYhdE}J|>mFUu95r<7^M5*~=-DOLKm5Y#!w)Q!+43Lr_GlQg zML{$1)H`2Tf8^f_zV0+>&56<16mES@asC{R+6R0tcEyjYoC~N|RO=?H-v-E*o&t;k zQ4V9U>J_W+a?j!SgowX#`IQHKahvN#4XusAt6P6%_nAj5D0uinQ|o!ZJ8W^G%$xVk z|DgG?Ckkcu|M?GY%`SPeP-d6Y-~aXegN|SfXgwUy@b?vfSNi_N=zq-PBXk5yu%j8t zy!kRXnoUpix#{rh_S|dMqF)D}2W~ug=x-1CENzh+G;1CA$NPsaI<26&^ABI_7<0qC zf@Za+pZxt2*; zPw~gmCmx=XKZ%n-a`4f{qTH-f&<-r9MQiT***cHEygWwhg~>;4KI6JG8LJen12=l& zsn%_-DQMQcWAHKO{C;skGx@1O-@5aJg)v&rniWT)X7m5%2y9Xtf)9#AP>9ZoMLk<_ zZ^OXUdKyx-UWQbyhXu=@-qAv#|7}CQN$pHYL&}+wrY28|!Zjewy0EPIyGbq;@)1#P z?mH(s{9VA; z!j(SRW*?yGcL1VvBDM+zP3E8bNVZhSHF*V~t~952u1Vb@H@P(tSB?r^jhC(iT&44C z*Z%=m>A5&$Y>4^9ZE)RfGIL3q1peE-PP(+z_c}>a-|HkzeXo-=^}SBg)b~0mf)1u$ z;#JYvWAVjV0|(j_z}*8BV_4fV{GIN+1;~AjI*ViVG%HesnJB66 zy{|sbs)fK)Kz=sL%?q%jE30Qea!o$(UyJYa@kKb2(f>_Xq~z%T3s)o`b`J~@9B&|( zf(>f76|wV6*;#SE4y|3_{p~g*LWrgJfor(zf{$9tmzltyk1a?p$7#hcJmEI-s^#AU zj7ToPs^uSq88Ke!dof5W1=phE58&EVJiMxELOvK^S#lXcJx)G4s=o_e9K{9DgHe$9jxB|s!dHkzecT@oix%Q)Pt;rqA4NYEWgeZ0v3lBWZvd{VX!yS`uc zd*_!v$naP?YDiW6L_ozU(04(-qC>W%mxe?*R^{(dKsCuixD)v4sOE1t2J+W=QwYIV zNbVU_wb&;Y3&XLH63&XgUVCGPIvlz&7*I``2y{c91W-%g0IJim0+-xo_}WIH{oy3_ zau~aeV$^8AuVV0!nnz#GYxOZSBHEU|2>j^emwce~%YNM9kTxQP8V=!>Q6>517zSnX zd;J~F?~t0+OG6?YdTa|UGmNtsQXg!?mYV-;z4@9SeTqhlJX1r^!-97@t4loo)tBi} z}B9nJ4;^eXk01I0C`QoWR!*k zu}fN&CDu72Zv%MGLW=MHmZf(=aTa;H%m*w5KA-qY5X+Je!1!Eb6KF^f%hD1+{nG2I zL&KfY8$k8Hb0=`E&{_#|;c!aC?}L;jhnf{c+AD}<=~q#E7vxhc3M5mAD8um)fA!Fp z`eav4-bM+mLyi1%?Hzb>r|g3U^W?n?dCI5fdGb(NOZ9B>;6nN^WMh}|b2qZ&2OUms z5K6uA+fl3LUQ|s?3NFqVE1wJquGAgGvNSttr5l6TDa{RHIrRkdIz9;?N=FB=EXD53 z7<)eQOu(3olOG4TC_Nv8AEKBwp6JzB{RJ#|cMp60&sP!@hWest+p7OX`P0sO}wj{u6^ugtek4NR)1Jn_EvLbFxn{@4yxPtbE7DI z7x2`3rK*m{7CQCz{@9r0fby2nxwUm~#iu~()(;To0osxdjDFc!zvYRG>q1RYl!gVd zERBfTWXbQz%md-;fJyn&+$J9NuO_P@k?e*<-{O2fAQeVTMG=byJ;nLyiHFXqD%}U@ zgk&dTMlupp$xcjBFdW~Z8y|$ObnHUxt^tLHQZBvfUp0Rs2#NFa!XZ&K_C1WDoCn22 z8yA7tuF_?|$pKvr_z>#$a}@L=mP)Sl_O-bozQ7UMyr0B_fHzID#?AXzmA7I4*vlbn z8~_@!Q|GT#Rq6n=EomWUBwPI87q%#wjK%EK6RnL7m1ZnCr>dkytR=(r>wlQ!^M#jUd{Dc4Ig- zthL_3)hw@8*&XSYAht@*;`my-(!XN{e{07iBtOVD``5WF{|+={YutBFRmshzrQ~R& zj1&%>;VqA_Fx7NBkd9w1Evt*y;<8P+`NB(WJ{iSlp*Nz)-*|8q_&rw&N^Xi{A5uO! zd4ceKSPQT&dhra$MAGrQk!9(?I8WzSiurEaS@NY{1hG^47%-6*RDA!*Wn?I*DNJaL zwdIqhS~cZWfy<&~VZCmx)~nU7m(No6uYev(F9H_FN^Qm^C8x7_aY5@!jg~Q;e_LI8 z8Zc3wfnJJYv7leXr=!vjgV-tk2(W%ts`Xm6K571&p=hi0WDwgW3&%dytF@-amXWzm zSc1yZ?jVkuk~g7rR`NO?Gn7t`8Pb`x45e?x49QDItWj)hgHWJNa%0k;muSxjFG8C7 z0%(kys`8fs?+N>TjG(k5Xk8XOr^tx|HnwNSR!QF~{rzIh;T4pzx_JR=)iRkZn4 zvJoZ~Z8^_PjlEB#Rzl5^Goh-mT1*^LRfzrSs`u;6Lcg@u$g92dG`Qv?-C#yxY)l+d zRWP{B3TblGPpB%K9219B70v_{k_>dPlp@Y>C5O)=?+2hU#vlZK2ElNoOep!0-R*h z%vwe=s4H69l)+zT`1*sk-MU}4{<@oQu+GW-8&isNJ2m!+VyE^hmYVx-ilxSXO~bxT z=QddOznkz)!%2+_`f7k(FvF2b6KD(DX*xVf9#5xPWu)H*u}g|iemd91&?bO^lbV9q zDQy|G(ifsuvJ;d|ePN}XVC*i5YRNBY#V=qY=qJUKmtHDM!G|_UmwJ7lCk6a}=?EHw zwfc-;HFe+<8OhZiJijM+UzU8&ka;2<#e{R`Tr7DL`bPg(5I?V~e0xZDUfRH%U6n!F z4mA32cu4Pzd|4sAHuiicG36hCY#S+^+Bu3k=Kz8uT?|&vPOem|2y=tJEd3O$%2_>Q zT;t%XiTIt2&d>2IBEEpqE{y_gJNTV%gna?MI{<1AVp%#0)GV1e4uoex3a0~yUp@y= zUpgNIy9(Dt{dLgIK`cK2{Wgf5(qmC8#kX2IrFTKNpsY$53{Uu{fGG}76I=UaH8yXFP z2oK}xD+ce`uX9STwZJkjg3o@UT-d}GR~L(|O*gmeRkXBc=x8Uriex zcCrH+>(2alHB*?Kw)+qSzVH!39J_j2%FfJ>-y<9=IXhW=(#%A3g06!B&VR}Im(Q^{ z7rLZh0alBZstQJw(w~R+ilVd+2n&jWCkI8O)*#ldD~8@!4eS*sLSIc0+@x1d?>JOb zz&87D0#@5r+3DS5r}u>N{;$BXlkjtD^i}E!U%HtwM*ahcn-Qfo*>5x5#>iKIn4@&T z8Zk${0^~VJ)jTH+i;ev_G}b09z$|OO*4wayC>;xEsHExs7(gv;62vx1vuKM}{h|s> zk92sj+AjH@E;!vQRRz1m5Zl_5L2Q-0jX*2q4Uaw#d0JFU-v?pMP|zugOLK$RDn&Qj z>u$E{<}ty|cFEA-o)n$0?T=5!hbx0SU8`cLI~eV{vu3obUZ-}UatH>7f@Nttz?Yx~ z?h5Y})zSeVY_+xEmrV-WoFU|W8Tj2Lc}yrfqtvKyV#qjcp!FP2F6AZWP&~A3AxB7# z1J{}cj@YD<%gBv^DQhM6yLLjPJ_HX_FWB!5^nN6n=%JopV8L_gXub|YyY*`ux`#t{ zn>2xJZX={afYY$8s${*w;{vVD4%J$v$D%0x3DCee`Om<8^~vmRm0t$*?ltI*JnK}l zl;d}D+N6U*Q|hP)?|(s#q!1oKP*)oKPET+rJ#p2`O)~xoFs?aU)ChmDACLC))z5OAiFGUHUDE zT~+#5%#c2+Wh5gzq8SB3mlO^JcrTp^jDf77Q06ZPn&}k-tym+(AXUXmq2`2Yp=Lb> z)@%WELdu(LF1lya_B+)t#=wUYYXGWC&jhhuS_)zelm@P4nRaPi5Hplcj~S`GjVQYX z2)$F-3D6Pg5MVfDtA;Ye5VlE)JrFe5D>j<6dWcQ3gUN!K3Dts`3Dts`dZ0A(c|cF4 z+?iUS%+@J`lZ+`RTg9NAN4c2*Q&Rtdie1vj06%*w3Jm}4TM${_6FFMIzTLyM$pdP41Ay^ z{|xw#epb)U+qi1t1;A9WhXXJ#Uav&Fz*y!UKzH2(Y9vf?RX zPd)-nr~|4Bv0JUuHURzXio$Tf7Dn1F>gQAxz8dw?O;JC)qA)k;+okuTeojTfnGlSo zScR62mS<4NDV$1kDxOMCmyo0IGr*jcew+0FiC_@X8$qWPqGT{bRb%N?3ke118-*m# z!=P6%#3T-=rXW+u2(Jc$ULl6NyguTlQGZ}nVROJzB5fPQHYq=2XIIh;HR|!y7*S1e z@b^Rv!$>-;EbjqmJ_ST|>XdSFS6LTrM>!3(a%$26Edgea)D?!|P5*XD8&0L9EY~uKJv)on90u zR^L0+DO>%RDDFVdM}^*(Q^E1%{LdQirp`B_Md?c5hW>i^mZ+9)1!23ar$6i6>V@Rp z4*a-Tek91J4NRRY({D!Gymn7KR{j%a7G%lzGAC%Mi4utv!hlzKWe3$qgI+1#CGY&gM%??9-!R; z^0)ATHl%4mY?t(`FkK6d4b-u#gV~N*(7jQV9t>hxT73iScSr+*SeA~AT4^%ixoAUG z;kBrjvJI`+E^QRV4r#lnmBvJ^)E%|b6;UhQ8N@c}pHV9f*eKYQMh3A%>I!0;^i0%B z`9H^zR@yl9Ls~D0?b6t&mCg)eS-LQ4rCC92msZ*&T7cFIV!O0?)Jl6qt<)a1(os<> zts4feLmC;xF6o4*l}-a8mI~)by>wC1D_kA*(zQvi5T`{)VOk7yTD%MxKxrAkeE+Hf zPu0~+jUY6uuy)i-8$^Bos>01tFWnaP4ONBPqh5MGh;0&2;ILknRsq4f!oZ;Kkk$)g zo3v%rO1nm_6lZZqeHPcwQO~0_;~cG@M_ryVmqo4fIi5Ua&zK9s^y!iw4`TUgD9)L# z`jwM&Wv zS(f71bva(Y0#ugn2RwP>|A->QaqN=f(3Pba{VwT|5dE?g2cpa9uN30hWx!*U%Tf$& z7pB7T8{)YLFk*Ug3vlrAV>KeUJ78hJr+T81@g!mS2!tAT zD)xlxC*s|AK=Hb*{Vk%I*#-L}iuPw$eo2Wt0QXYTOR2(p>cX{ZZ7VxBwPb zz4rQ2*Y5fj7qxchUtHAMUCH89YE3J~9>}}ZMY6};9EsX$Pp?8Ci z$YuEoz&)6>IiJo`q*>m@PwKPr--0fS>cD=v&LZ;NfFjbpQ62b^sD1)^HL9ECccL8L zN?60sjIknb66L`0t)}t5jL*3V;1d7ngF$pEOy84bKi+Ru#v@9N(Sr*M=#i z(>jUxb13@SnVdrF+Yz>ps0+4-n70<9HIf7$a5Y!2Mc6LbDoe&B=<98iA3>+_pjUVf zFjeZUlx@YHg(5b$UrO|Cl-1AfIt+*spRy3J9jda;qpmmJl?EexG^Qu7#v=8`yKLO{ zsQAg&I-Cd5Y=>rJusS5I^)cH~H``G++mXyVapFLQui!P4qE}nJYrlgJ`w1tY>e<$N~}GQ`!*1Y4dTvlGzf{?5Z+6P-PVaWZXstU?k@HOA#p6i zSt)S=HyYmuAxGf~U}xxg?O000(G8UId>p7Bd-L%*`GfX{uZqDKB>O89KCF`SdRUK# z<79Z*-=%;eZa~Q)c`f-%0JV`FL=+JX=2wUzVhSaqfi!lA{*cv~0P))d(YPU|s3E49 zA*P5Srg$NyXd$LpA*M(n=3U5oh(|sX=2jf?U2%>`&aEhvg2Qc+PV@Hr+)Cr=eAt+} z5K1np&xg4cyK!-x4|6M5AY2bvqwa?CsWG>r@SGp()C{IB2ZQ$gc~H+zVF=kN5FwF5 z5fUjFA(6rn5-A`dkwOv@zh@q;!I;(?8%k>1UYZoRP$7lRAJ<+GrWOC6vmVBIA&hPD zWSLhnIL3sk^D5s#FgSTU8u-j6=kvN|RmL8SXi!oC0IFo{U|aUilY7 z{1vuN$zOw`mFbngA$$nv*!pzX-Xlr}fKbFG;?HrJm|jtM3Giy+^hzT?$!EfjhoUYZ zc045P{f99E(<=)91{jwNNGLQB!GMH>Yl#5~2`7UA2?^(c0SSrJ!JAnmUJMJyh_EpD z9*i4cJ$Mu-%dTX_AKUpWvt$JI!nIDpRfnb4MMrxyGP9!aFJj3K+@H#J;R)pxVnf5L zPa?kzDDygWG3REetKhG6(pkwxCg`1ne@zL6?ZS*)?c=J#uE4c#6ud{szzxq=Kb;Qs zJzw*Yn^|$P{xS~Z%!^itA0{hj%tveV;1A{-J5hMR~;`7qC{c**eJw}wIrj;_uYMtNo>&41!n z81R|3$E*&xV-l=55Jo*DjGb`{3A^)j>f1*Mb}Hng4uyo%B)`bjn^@u8&`~FcE41<_ zCWO}yGtvMnf9m+^t4ooE9A1Y=`4dCsgf}D2ciFk*g;0)*TmPo&K_qk`bSquUEVW;) zsphIp#vg%1&lGX~gbE6ygAc>2^0xs$qTEzfa9U_dHk6@;f^)!(`dpxflj2QahMX@9 zGsDv82PtOAmj$`GDmxCf0XdJw!9wz_AULAX$fPkt9++m*rU*WuHA8ka2{jaaE^3CH zuPQTZ>#Z5iy-nky66aprSq!f|V_%hp!gruq8>EZDn&BDuR;OfxSKp~&a8*_O?g8&W zEA#-SuQVhqCA>4I;MCzu13i_-&8lAC<9b4-f-lskOl4o-!^m%-hXI$wd6mX9d9rTm zKVxRv3Z{AvyVI|agK0*lV$RAfnF-vORH_P2k(B8axj1Di`~cvH^rN8XhgcQdOf+!U zx>;4pN!+JdRc=R<<+LMBX|GLt1Mb4S9IXjxM`{jYr@K~9h*Y6|a^QDb$5N(?*B}#)vI||I3dZHfZzu=(=%d5pB$qZ?Pf z3*Q}>C;PvuQeOIArFkc#zr2v=p8M;}&Qw;H4NFR=RXC+xZk==~?HtqZly+Hj^-Afq z0Hk#NKKfL85D&K~8{>lkk@I`z=E4r8Iqgs^qksCvR-!pw4wUt66@0ObtZ(Y|FW-7J zr#3&pMl%;40zbE+;B6_(Sh_paU*CRBx2UGQLDiOPf2im7^(l}t-FU?N>rUx8kh0u* zcnP41!cKK=#aaI!@f4UFHWfoynS*f!mu_mLWjW~64OX(8_LwPM?4j3PD$T1XJO_A! zR_MXJaDGRRyL9Ulw};N|f{XE%FnZNh@Tz`4_Z6Ct&n~*0TJeUX%UR{G=Fq&C`Ry4f zM8|M1Vu|Qb{YMmy?$c3pGHr-k6iBBeqHD{VgbXn)^oV--{isc+CfYRp5K~C|rs}!DOEGVvr3yM!N z7Sx_(q@LvK;ey)w{VvmJ4T56<*$C0V^l;tEAAC%&IHxy{;h$cy-}8V~WY0s_2rm}) zFH}#bRY;_BDkM^Oe#d|<1y+?^wltagu0ECBg`2vs0)Gi&LBIDO==XkBJ&*KEz^e)6 zs^67;7%*?7#{o-KN&YJcWqkAAyYY}%jdkWwKn3Yofblhwanq*&jmYsm@UmTf7EtS8 zCgCw4SUU^h5`bQs4y-AAV-(7G-5wUssPZn5_sv1?a`l&}cO}?4tWo7O9k7^!a1TS} zmOn&MVZSh`+oc18Se6_?KJIaY^NVmMwL8f@lh8Voe-ieA?b7_XC6wa6x?LI#XjgIx zrrIe`T-VCd%~31;B#31xuE*_ZuR%387QX_B(p^C;OWydQbsv3r6s04BSe9ILD3In9 zq8rSo!#1*AS{lT%gq;o+Ss}z6Bq|1e}gYiU|WW%d+e!BHk6#fu~rb~)% zte2&h;8vI9rjpJ`j#6kz!Dn+?mpxUv#gXD!I=q@LmljEvBIWw9wK;4%hq3CC^4I)& z!fSrF27NgYLlolTf1r;8+9o-Rwdmk>0UVILN22)5ietKS7`+ZDUov_s3J$V$<#xb@ zMw$@BHmN&mrI{c&px`qAT9Ul$4|;_-Iof={y*?8uf2P|L)_7-3C|{g1#XFJW z^l_5JxzQ&57Em`n*eOm3&+A~+Sou&1K% z9-xBcK!rkHeH@&SNT>Tu9GnFxEUn1(RJ1sTZu*{&LnX}*Yi*abAc$otuE1R@8b0Q8 z8a%`m4IOINg|`8s$BH=rSrraV>)Gk#WW#-lGx`1*f-@&fxh;Dgi@KcAAV4NyrNf%Ul=@G8Eb-#ZKX z_5a|kYI)t!f8_VI%-cB@O;0rnpVE%4G%0GOqoP)d*SOAf8U!0IUC)Oi;r7tITF@&vp4gWD z9>g~3m8g{*V6F^loI^!7Z)HG5>ChmyN=HPk-u8CUd`lyxS>U%~dd<5o7 z5UeO12(ThejrzG2g?L%*EL>LSR$M;3o>G1^6tAS6g)8aY+Gm&)aas8}2pv>#X+fV> znBYQTjhS0pV`3Nc)tefH1!rz;GuG#{$!|C3gxk&h8aXH26M0)1EPi5YJ5xfA7rJ8@ zrI2v!)(Zo`ndB(t7xy`}rqj(izxH^*Rk-OLx;I!Uoz85_eFJby&|kg)aNUun0`3CN zt}6U6>iHWEtCc|bz(S!FP;Vv_i?&HON3C>g5Zk0XqE@;Ggda9gcmOnJr-rXx8ml1y zn`pz4+H^BfZ?Y|Ae+}VCKn*EAnP|7)?x)#pd+Bqlg6O@z`w_(Bptv5id#cBOS=R1J z>aLRl_4A?K`R&dTZCWi6(+&VJ-8CcDZ<5;6T_f7$>~RP&P92iYu92Nt*=frW!)Ekv z99m5eRC+0miH}x#DeaXHS$Zkcaq;7{qnm!?sCQwME zDHIYZDj`9?!m%NPzd0D-mz6hPdBm_Y`7ItUxbc_*oe2u((2eF045uQrGT`5cWsNgV z;Lq?cgda($TE^os@D!lF^jE-oQ2%geAhmtS%-Rw7+sGKc0PZR# z#xn@kONX|;2|T%FU+<&c+o1VT)RwPrqSe;pQPkE4zr#BT2ZzmR#i?RJc9fRz^W8I?p%l%!`3M+iUlM)z_f2@RCpoiJ8kQqLF|&E z?;X-8fMvh2CYo{qqe0z8mD z$kp;Xm_ls}{*IM1P2MxAkAiHN67_cLGp%nM_lGt*9)#8pwK^niub_!&w_`uPW*P{XHo1oY5K1}h&v5NE*=#{S> zHYAuIS(SOkT=TqGpEX61zqKQl>H%?V>Xs)h$5#@@)VI8fp$)hQb6NrDu&J2UnFX zR0!t1B%cqeHt8RLk8>LuHy^0@a>yx5cQNs4s4OoA+zd$m(41=d8-V^v@pmKJr0ant zun~@a)cQ&=&@P=7#7@cen_H!`s|q(p{l?VZ4Y1fruAzKW=XD*8o;AdwgoJReRU|T}r+mD@nQe5@I;4`~$$!IIm*${3j3# zpO}$*4xp)K3mBsM?RK)m*LEm#18B_nm8|wl8@@!jaUlH?Tq@Z{neT>j@fYGYr;H2n z>Wp6F`;Yq!qiXsXuo^QwSEcIm#(;Q8dj_#x8V%x?z?EFlDI?7ZV!Px{K9*7XP0ZkL zIL7lgo?PX6Zf)*)>YV^wDCKj4yhByKG|2TY^Snm-V^A3JcSyQ(vAXOG@Dmw%P>}1@ zPb7U6U_=)}{_nEFC2ADOqk^h^DinX7vMk*iwZ0kut0+p(0fL*27`F1#e~!t9ntmx} zORog6EX9UuYn12J*)jKb&|jk{S#LGAX(NVhzR8YTxHN>L9krg>$1CBRayjKUFr-@n zPIPBS{DI7N$@7p2mI`K03QKCqqA|aI{h5f)7fG!n?*gzY?Ut*Pt@A1Bbwg9~ZGerq z^ivR)PX#|dL;rW^{U|02=aBSD!DvcT0pB1RC|ij&FJsM9{4-#|oZx%9%FhC7Y4dH6 zmsHHXtbIu%c}XXdll__eBZi&Ihx*A^G?l1Hu37B`5Pm+fulxL4g*>+|GptjT%#4hQGsFmz3-#cvx|JwH)68!L9=+p%M z<@}(kn%RA{18Yl+4&<%Yu3AkE7ZOe(3zA@F zFY*BVFd&?g{}cx!()&Oo{!E|0Ev8&_|C#81gZv)g^p%!_Rd~yaFZLf}sv6Z)bx1Rlq5#J-bvmTd$;~KGP#fvvhc@>^}@f zE#+~jEpR^cdOy~ZJ_g|yN@0Uo&9>r89c9V?8Xk%$XdTNbKq-ElVEQl*tj>pOBZi&g z)2XUyLyC?|aMT&8w*d29vR!IRb{B1m7uwW}0~-U~Ds2)9c1Xj)T5&7k3ZI3=&<@1l zx7Ll-E=rE1RvdGA&0wu_Ehu_WyQG|p>WYwCz8dleQVV_m2Fa^}s?}WoF*7@%9))l#$-CvL=!xWY zhobG0Mf3a3RAL^grvS4j@JGlj5Yp%R>-HH_s&64|%@bwIq@z%;!TJ_vQWuKW&c4^l z{#P(tmSV{^>1BY?3IB#Sqyc(lJKIDtHT5u+Y=T^A<q>YubQwAhk^o@<=0G;?K zlqzd=K3v$;Q3`@U3<(A5$yV^-IJ%!RmbRBW!j#`-)X3#j2%L z1v4dEuuk7A`51KH3Ho@iISu*#LOR*qpP;sfz;;OI2eDJS5QOInehcHrQ7_F6`qR6s z3NJ*x^it6C90LEd^*|wnE#&<$6m6HZ$l1WX!=S42hcQdCa>`O36b!XX8y2&2|MmHM zp>~^eHSqU}$y!RM%D3m`nC_`aVdggxsS&`y$nl##fz8b``{P&&?jk5grM+ITw$B(s?lz%dS^7L! zg@+St4i()fgsVDfW$h5sN%CEVyyRsnn;Nn##lq2q>jwjLfhUA`m!(53u?W zn=}S6QO>R^Shg@sUm)2URPB;aAU_cwl?TN#l1_Z0j7mS}B4CoO#D_HO2W!iOUDzGC zDU&tKrFR@;eMHF~St9ieb?TTEEW#-^KmNZSfd?7SOLz)1l*Mbx zD)rv{8NJVF|5C_boBX{&vD}F~yITmJ0-Iu|Nn2n`u&pw7zX`q#IA61sK(ccP@{udB zcR99h0CT|2;8x&Wt>x2UyM7I~uim;p1izuZ*T5U#Ezq|e^PgUU{$=WZ43eLzJ^QgM z@GDlfnT{{gNB@^i>PynUuwirdrHz`i=fL|Q9mj3loV^ETZPJ|G4$`sG;O1-w*mcw9 z>~N5do~Gt((9q`Wp3R%HCqX(6-=aA?bj#+fVXNkBFi6K0$ghACw`tD43(|4+w$0g< z;5IO9ySjef`pwx9U%;Q+O4)C~lp9LfdEhc+b<@BMaQp01b}v{us+7GBx(_R5mw@Tu zUhvSarR-TSmb%A+`#Vb6U%`?em$G$kEM*IhDP;qXEoH-RDP_BZDSv9oegG~5zXZE{ zx0LM<<|B`Myd|3iP6Nt^gE13J*+kI)z*6=(a6fn&%+2K`dzZ4;z=kcQ?DJsB0kQ0S zbmrYo`U!9u@-M(NY;O1j_FrhpP6czHZ^;J1Vh7XDwPZ^`30wfCf~1?elr(q<%zw5e zdjUMMQYl+~WJZVB!H<39?78hq*|=fEdkgxvW-0s1 zTBYp6!KLiRA^5goDZ6eX#(6|3`(Q`>UXOXPKK;Yy*TC%l#Ev$08HMj)S!0REB+TPg zh&A%owBb3j+gIopm_qsMz}A#`2lOXzAec$sX4IeDP|8M9cj@k>Y#2Iie-8|!ugkzl z^bdhohnBJ~d>+(P$||45Hh2ZyoFS!bU35$7(|%u|ANYLqPNi(o8l~(z^sT%J{h)8N z>C=J8W0)ILz(8VajK|H6b7TVN`q^L^b8#>{bH7q{2N+4&eZblH`W#sPLHD}MVK8imQucjfH*4!sw(2&eYyh$Q_Xfm-vR9+)kM7iM@dICfwLN15 zHmA-cVtW-nZ_S+B9ZcV&l-&U4URBCgCOs3r32c2#DZ3mjxsg5t*N|al;=r76PCdnfn35dI)7n55JD_0vU63Gmz1Sb6^Q_6S1GZ z8ZigAzt)mfUT?|Xd9fvX?Iq6lKeS|PJ=&5@e5572;`c4thi|dYvaU=g_C3J4=a`&? ze4h9UJ^^LRG?C{Vorr9iGEiRpkJ!efcItzf`;@X)hW)Y(W!ccLJxe##-k*d_L}tmTV?IHsW)`!!6mN_&kiVyMZ~SQg%0(`rDRlCGr;R z$9S?%%^b~mfsx1JAMo0;16acRdKWlHUCSm@-nlpk*}1rk*qruqOPF)VuN~*y4eL># z_qgtOZFUSV6LqNrZLy9 z1ap}We+Lc6aGryajJjn%%-T5~gV8k~1wDZ3dofi^G}oGV{i z%6`N=8jkIDFn~IDg58)it-!gu1sF`;=fMKj4;zPltfX=*^q8 zyd`@QxaR+uy4kE!wjO9+63dhuO4*U1;cLVb45H5)0oS||=;0iB5HyS-?!aqm1^_qJ*a4vQLugU9TXFBrF!6Scd$Sk@l>t_;OtIf0ha!{C3_c4xQKZGUOkpR9mkl$ z%Cmv;9Qx=r@pi`6IpDRq1x%m9J`Z>ez8=h_t-HaTo8w%ztsxh3U13dh?v|)?5E#o` zJuSy&@IcO)O~6B6j_2@T|cbGe?{hRY`GUprUX6?QNEXPL{ zjjWlu^c;BSKU=bIJQnM?7dVeObU9c~ot2Nlf9l)-tmB?wICJVza5i;TW0WNQKuDzbBTHrujV`f zFE9s=quvzCTn?Iu<&MC;%zj`Z`4@uu;4i>y?SFuWSabde9%2j~%jIBa(z`JxmjJIl zv%qB9IteUcT$X}va2}X<6zAvB$n@=}#B}cXQua$Q7_@@ZPA5K~`(WlY=`!a~6*Ljs zQD7N1mJ8(O9?CV+1{lED?4IE_Ysax*(FD#vcn-EUWxTf|Js()-`(Pk3-yUeoYut;- zUi;khcy7N#47V`;2bHpw@MSW54QR&R$>9ER_(po-tWtIx7|vK62wudVKK93FeRr?q zxj*^6mh38Qj;7uL;P$Rk_7Yfl8vVlFK;&8AB0Is<`z%{oU^w7u67>ix@ArJH?=7$1f?HCNh#+SepbpHVc zqT2>&!*g64p5xOQleHLwdD!q;-a~BP1IF0czr)(I8g?4+;UF-F7~Tt}V#8~J*95Nx z^JX!w*AUkda|T@q7SW2L1@f?ZUeKCC2eY`bPR8$~*&>gEg7=Q<&eEfa%~-ur+1h z2g@iskn}E;+aF8@=YZ3&b2*p^o&ZyK#!uQ1BHmXUa8!oj^DGtH3Pq6qx_T zQubZye0V&4GmQ_w2mP5Vn}TJ?tH34t_YE-lex3(_(?A7Gy^nbU>`SZtLp}*iXKq{# zW`P^QJj%WT?8E-xJmi_6nX>zVF`x@fyq9`F-#fr?%l_G zzYSjO=K4Re4$o2s+tHT}Fc54D#(`r&f9B+7U;<-!1}GyR4aPC{r+}r%?}IXP=2$Qj`8F_? zxpo5Bnz0=P#+*{hjsi=W$NvORW9wb8m@=<{CD?isEW*Z1z`3#$aBdv}oQt;t=k5i- zwe3$J9p4<;oGt!RbG8Hw{Br&I;AUT3vHs3oR;>TwSJ01Y&Q@*aStdxwB%U#Td#{-8 zpDS0%dCQ!K=Dc3cej4mEzzR4ITns!0hQIM6AjS0Y#AkE;hJ85MlfBpP0ux(G*|&ku z0N)1hfZdlw`@{44O*wC#bFx2;bkF|GUoaIYZ@o9q9YDF2H3SSOalHoPXlp7spSEU$ zf$z0s2LO+vU#7SB4@VR58SEc`M~au9b9tox^I>E-k{v%5^Jofxc}t^T6b_WW%bWln zP2q37{lR%U+1;*?p2;<$2b>3{f<^eWC)bIS*5>|j-PpIA=%0PN1K9Vg!7%#X0=%c0 z@z<7Y8v9}Q#AW(^BzWknF=q2`zpZ_NH=*C|K=$dtqks6z ztLi!HzejpkAoVNF<5WJy)lX+VQhrlN)#q&*AJ0>t>D&b7Or!lvV*BRL~63Gyavubp7RCtfakz+uKn(fGUO(360z(CJ`;D(?UC9uF2l*&1vC@m67aK_A%}B* z@5=RUw^)8us8yezo(HqZTL`=dU5hbS_8IGfZ}J=m%tq&22)41WZO5_++bc7c%NFun z4txk!<$5*{-Vf;WAz&%@R?ERSu8}8#lfVUF%&Dv=;3RMrc#&&of7m0fbKghqW)5Bm zUc{IF-=bf{^F}Zg8&%K)egR6{7ajwqfM0|8*jfU*iKBa|G5GWvc<4dy$H8Lo9LT_~ zz_y2jMeOxo1Rnjv-#V|Jr_;KW^7qR1O*vlyH?UV*3k(FC$Pcw-`vQIX9R4k(&E;V9 zncTO4%fK4l_>8YFg5Ah_0C?;O)Hx@{U}Gihd8G5CFQ<9oyd8+$y+BXC22X}vo0k&H zcfoRS*SBNbQ@;|Ar2f`>5L>W}IC2m5ufVJ$m;CAdk112BG zx(|9-BW?u`VdqWoA-Y|sL_2FzZ#e0FEC-$e)3I?E_z+a7_aSZW`W@ydtb7_at^|X@ zsbD71_S5uf6Lc+y9Uf6?-#&lcAp22Fwg%6UZBq(ffwl4KY?>$O~$qx z`4Zq9{0MmNtjWAh$Mt(PXE%Xcz^z~&_&K-(ECA_v9{DBk3V01H18;+Wf)7DD)*aoP zZ2&d_+kkZJh`ck{73^Eke+_vuI1Zdz(9c2MaPMaJ3C-E+rMjIVUv16~0_xjZnzM!A z1(1#l$Xl5_bszQ7PbKeSa1)pd?gW;5w@|K__XPRRfLDNJiuQ_mZ;<~cu-$b03ZEB( z`$5Y-&Dlx&HfN`UbbJQgHsJGMd$0r89rP`?6}lCbOLp$U=5wHXzvk>5kd7ZC{~m04 zKy$V&NXJX)299aYhVS2;O$3jD)mM<;mglE>!>Kb8>?fx7aOTjmDzpZcCbfoU#|rzu1ViF)+^Faqd)V2eM^U9a~xRMN8e34l{YUPuOr_*mT?0c zchvQ(kUkQ;+eg1K=}o~furo-UCe;v)0=CoUt=!CYgZcXdMupzt82OT=s>Te@gy2-oeZ0mo+A13Kl_Q z1wAF3@EpZfXh=S@o4oYR!7`Zrb+}v~P0JS{_oX_=Ltq)GUj3)>n(-3uBZK&!hURo^L9E$ zPPQZa6#)(1j^uo~o*J^%8+pxf0xt@}}{XUtE{wt}FyoA&Gds<)-P{3UMZ z*Y<6#b?M(`=VKc8{~>bHFFDya4SDQLLR)g3jC=)hl~Dstp%F|^Bzm{w@eGaST^$anxo;*^npz_>$ao-3FP4S&Y<(Fje9yqS}E z8rvCX>B4nGT{J}tw8BJaNZ(%UH~LFc|2O?f=u3v=#(ED}$6bCtJzsU@zQGn~gp&8- z@^nZ35c#7xgC9)`@K^IF4aVXf3i`3jA0>{SK}umUp`jU@7u~3y(`6zF36X1 zTVo^6K;s=_`4h8o6e;*6-*JslrFUlG7eq-D(C2J#HD&7xbIW(j;65n8g z(WCXi)O=)uztZp}nY8@c0KC#^l{wVnQ1gcTv&@5xp0q}v^u&YwYqVa_=uXeb^lTqv z5RCWGm`{Br*5VVkQ42%3qwf&4lQ@M)XbhmwTwn8jGw{b#Fc=f?Ev~{l6Zao97L!|! zl~|8Z9D~MrdWUA_PvPJkP>Y)!b3Q#MC5-5j?2!O^Z#xhstyhrR@{LK<*Nc}X<+I<5( z^u;AF>qz}Moa-zhw*ss1BR1kFj^iXWTCnYV@XpO27C?e5@+-aP} zd1#d9x*mXUJ|4rEke_2EVi&NihNxeV`x_cH=-mYE%jTi4F+Hn{KIb}%?fQ0md(Qd+ z4|&

uSz4QO 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