summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-struct/src/struct.c28
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;
}