diff options
| author | mattn <[email protected]> | 2013-03-01 17:05:40 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2013-03-01 17:05:40 +0900 |
| commit | d6876aec0973be15ff8c81c2932eb6513964bc44 (patch) | |
| tree | 68765ed9992df6d0af31a827c3f9cd6dd1874878 /mrbgems/mruby-struct/src/struct.c | |
| parent | 3f1814ce3aba08802e0ff73a41cd542ebe9d3def (diff) | |
| download | mruby-d6876aec0973be15ff8c81c2932eb6513964bc44.tar.gz mruby-d6876aec0973be15ff8c81c2932eb6513964bc44.zip | |
Should be MRB_DATA class. RStruct isn't managed by mruby core. So it should be self-managed class instances.
Diffstat (limited to 'mrbgems/mruby-struct/src/struct.c')
| -rw-r--r-- | mrbgems/mruby-struct/src/struct.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index 6dd208ebf..847d637ac 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -10,17 +10,25 @@ #include "mruby/array.h" #include "mruby/string.h" #include "mruby/class.h" +#include "mruby/data.h" #include "mruby/variable.h" struct RStruct { struct RBasic basic; - long len; - mrb_value *ptr; + mrb_value values; }; -#define RSTRUCT(st) ((struct RStruct*)((st).value.p)) -#define RSTRUCT_LEN(st) ((int)(RSTRUCT(st)->len)) -#define RSTRUCT_PTR(st) (RSTRUCT(st)->ptr) +static void +rstruct_free(mrb_state *mrb, void *ptr) +{ + mrb_free(mrb, ptr); +} + +static struct mrb_data_type mrb_struct_type = { "mrb_struct", rstruct_free }; + +#define RSTRUCT(st) ((struct RStruct*)(DATA_PTR(st))) +#define RSTRUCT_LEN(st) ((int)(RARRAY_LEN(RSTRUCT(st)->values))) +#define RSTRUCT_PTR(st) (RARRAY_PTR(RSTRUCT(st)->values)) static struct RClass * struct_class(mrb_state *mrb) @@ -272,6 +280,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k } c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass); } + //MRB_SET_INSTANCE_TT(c, MRB_TT_DATA); nstr = mrb_obj_value(c); mrb_iv_set(mrb, nstr, mrb_intern(mrb, "__members__"), members); @@ -429,10 +438,11 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val if (n < argc) { mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs"); } - st = RSTRUCT(self); - st->ptr = (mrb_value *)mrb_calloc(mrb, sizeof(mrb_value), n); - st->len = n; - struct_copy(st->ptr, argv, argc); + st = (struct RStruct *) mrb_malloc(mrb, sizeof(struct RStruct)); + DATA_PTR(self) = st; + DATA_TYPE(self) = &mrb_struct_type; + st->values = mrb_ary_new_from_values(mrb, argc, argv); + mrb_iv_set(mrb, self, mrb_intern(mrb, "__values__"), mrb_nil_value()); return self; } |
