summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build_config.rb3
-rw-r--r--include/mrbconf.h4
-rw-r--r--include/mruby/struct.h27
-rw-r--r--include/mruby/value.h22
-rw-r--r--mrbgems/mruby-struct/mrbgem.rake4
-rw-r--r--mrbgems/mruby-struct/mrblib/struct.rb (renamed from mrblib/struct.rb)0
-rw-r--r--mrbgems/mruby-struct/src/struct.c (renamed from src/struct.c)456
-rw-r--r--mrbgems/mruby-struct/test/struct.rb (renamed from test/t/struct.rb)0
-rw-r--r--src/etc.c1
-rw-r--r--src/gc.c31
-rw-r--r--src/init.c4
-rw-r--r--src/object.c1
12 files changed, 247 insertions, 306 deletions
diff --git a/build_config.rb b/build_config.rb
index c0a6eacc6..d3feccd71 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -17,6 +17,9 @@ MRuby::Build.new do |conf|
# Use standard Time class
conf.gem 'mrbgems/mruby-time'
+ # Use standard Struct class
+ conf.gem 'mrbgems/mruby-struct'
+
# Generate binaries
# conf.bins = %w(mrbc mruby mirb)
diff --git a/include/mrbconf.h b/include/mrbconf.h
index 45e3d6034..c84480af7 100644
--- a/include/mrbconf.h
+++ b/include/mrbconf.h
@@ -45,7 +45,6 @@
/* -DDISABLE_XXXX to drop following features */
//#define DISABLE_SPRINTF /* Kernel.sprintf method */
-//#define DISABLE_STRUCT /* Struct class */
//#define DISABLE_STDIO /* use of stdio */
/* -DENABLE_XXXX to enable following features */
@@ -84,9 +83,6 @@ typedef short mrb_sym;
#ifndef DISABLE_SPRINTF
#define ENABLE_SPRINTF
#endif
-#ifndef DISABLE_STRUCT
-#define ENABLE_STRUCT
-#endif
#ifndef DISABLE_STDIO
#define ENABLE_STDIO
#endif
diff --git a/include/mruby/struct.h b/include/mruby/struct.h
deleted file mode 100644
index cfe6df135..000000000
--- a/include/mruby/struct.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-** mruby/struct.h - Struct class
-**
-** See Copyright Notice in mruby.h
-*/
-
-#ifndef MRUBY_STRUCT_H
-#define MRUBY_STRUCT_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct RStruct {
- struct RBasic basic;
- long len;
- mrb_value *ptr;
-};
-#define RSTRUCT(st) ((struct RStruct*)((st).value.p))
-#define RSTRUCT_LEN(st) ((int)(RSTRUCT(st)->len))
-#define RSTRUCT_PTR(st) (RSTRUCT(st)->ptr)
-
-#if defined(__cplusplus)
-} /* extern "C" { */
-#endif
-
-#endif /* MRUBY_STRUCT_H */
diff --git a/include/mruby/value.h b/include/mruby/value.h
index 17f51db94..1dfa7b975 100644
--- a/include/mruby/value.h
+++ b/include/mruby/value.h
@@ -29,12 +29,11 @@ enum mrb_vtype {
MRB_TT_HASH, /* 16 */
MRB_TT_STRING, /* 17 */
MRB_TT_RANGE, /* 18 */
- MRB_TT_STRUCT, /* 19 */
- MRB_TT_EXCEPTION, /* 20 */
- MRB_TT_FILE, /* 21 */
- MRB_TT_ENV, /* 22 */
- MRB_TT_DATA, /* 23 */
- MRB_TT_MAXDEFINE /* 24 */
+ MRB_TT_EXCEPTION, /* 19 */
+ MRB_TT_FILE, /* 20 */
+ MRB_TT_ENV, /* 21 */
+ MRB_TT_DATA, /* 22 */
+ MRB_TT_MAXDEFINE /* 23 */
};
typedef struct mrb_value {
@@ -89,12 +88,11 @@ enum mrb_vtype {
MRB_TT_HASH, /* 17 */
MRB_TT_STRING, /* 18 */
MRB_TT_RANGE, /* 19 */
- MRB_TT_STRUCT, /* 20 */
- MRB_TT_EXCEPTION, /* 21 */
- MRB_TT_FILE, /* 22 */
- MRB_TT_ENV, /* 23 */
- MRB_TT_DATA, /* 24 */
- MRB_TT_MAXDEFINE /* 25 */
+ MRB_TT_EXCEPTION, /* 20 */
+ MRB_TT_FILE, /* 21 */
+ MRB_TT_ENV, /* 22 */
+ MRB_TT_DATA, /* 23 */
+ MRB_TT_MAXDEFINE /* 24 */
};
#ifdef MRB_ENDIAN_BIG
diff --git a/mrbgems/mruby-struct/mrbgem.rake b/mrbgems/mruby-struct/mrbgem.rake
new file mode 100644
index 000000000..476e990da
--- /dev/null
+++ b/mrbgems/mruby-struct/mrbgem.rake
@@ -0,0 +1,4 @@
+MRuby::Gem::Specification.new('mruby-struct') do |spec|
+ spec.license = 'MIT'
+ spec.authors = 'mruby developers'
+end
diff --git a/mrblib/struct.rb b/mrbgems/mruby-struct/mrblib/struct.rb
index 5d0ede90f..5d0ede90f 100644
--- a/mrblib/struct.rb
+++ b/mrbgems/mruby-struct/mrblib/struct.rb
diff --git a/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index d7b63259e..221ab0bb9 100644
--- a/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -4,18 +4,20 @@
** See Copyright Notice in mruby.h
*/
-#include "mruby.h"
-#ifdef ENABLE_STRUCT
#include <string.h>
-#include "error.h"
-#include "mruby/struct.h"
-#include "mruby/array.h"
#include <stdarg.h>
-
+#include "mruby.h"
+#include "mruby/array.h"
#include "mruby/string.h"
#include "mruby/class.h"
+#include "mruby/data.h"
#include "mruby/variable.h"
+static mrb_data_type mrb_struct_type = { "mrb_struct", NULL };
+
+#define RSTRUCT_ARY(st) ((struct RArray*)DATA_PTR(st))
+#define RSTRUCT_LEN(st) RSTRUCT_ARY(st)->len
+#define RSTRUCT_PTR(st) RSTRUCT_ARY(st)->ptr
static struct RClass *
struct_class(mrb_state *mrb)
@@ -28,46 +30,46 @@ struct_ivar_get(mrb_state *mrb, mrb_value c, mrb_sym id)
{
struct RClass* kclass;
struct RClass* sclass = struct_class(mrb);
-
mrb_value ans;
- for (;;) {
- ans = mrb_iv_get(mrb, c, id);
- if (!mrb_nil_p(ans)) return ans;
- kclass = RCLASS_SUPER(c);
- if (kclass == 0 || kclass == sclass)
- return mrb_nil_value();
- c = mrb_obj_value(kclass);
- }
+
+ for (;;) {
+ ans = mrb_iv_get(mrb, c, id);
+ if (!mrb_nil_p(ans)) return ans;
+ kclass = RCLASS_SUPER(c);
+ if (kclass == 0 || kclass == sclass)
+ return mrb_nil_value();
+ c = mrb_obj_value(kclass);
+ }
}
mrb_value
mrb_struct_iv_get(mrb_state *mrb, mrb_value c, const char *name)
{
- return struct_ivar_get(mrb, c, mrb_intern(mrb, name));
+ return struct_ivar_get(mrb, c, mrb_intern(mrb, name));
}
mrb_value
mrb_struct_s_members(mrb_state *mrb, mrb_value klass)
{
- mrb_value members = struct_ivar_get(mrb, klass, mrb_intern(mrb, "__members__"));
+ mrb_value members = struct_ivar_get(mrb, klass, mrb_intern(mrb, "__members__"));
- if (mrb_nil_p(members)) {
- mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
- }
- if (!mrb_array_p(members)) {
- mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
- }
- return members;
+ if (mrb_nil_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
+ }
+ if (!mrb_array_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
+ }
+ return members;
}
mrb_value
mrb_struct_members(mrb_state *mrb, mrb_value s)
{
mrb_value members = mrb_struct_s_members(mrb, mrb_obj_value(mrb_obj_class(mrb, s)));
- if (mrb_type(s) == MRB_TT_STRUCT) {
+ if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct")) {
if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
mrb_raisef(mrb, E_TYPE_ERROR, "struct size differs (%ld required %ld given)",
- RARRAY_LEN(members), RSTRUCT_LEN(s));
+ RARRAY_LEN(members), RSTRUCT_LEN(s));
}
}
return members;
@@ -76,28 +78,17 @@ mrb_struct_members(mrb_state *mrb, mrb_value s)
static mrb_value
mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass)
{
- mrb_value members, ary;
- mrb_value *p, *pend;
-
- members = mrb_struct_s_members(mrb, klass);
- ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));
- p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members);
- while (p < pend) {
- mrb_ary_push(mrb, ary, *p);
- p++;
- }
-
- return ary;
-}
-
-static inline void
-struct_copy(mrb_value *dst, const mrb_value *src, size_t size)
-{
- size_t i;
+ mrb_value members, ary;
+ mrb_value *p, *pend;
- for (i = 0; i < size; i++) {
- dst[i] = src[i];
+ members = mrb_struct_s_members(mrb, klass);
+ ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));
+ p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members);
+ while (p < pend) {
+ mrb_ary_push(mrb, ary, *p);
+ p++;
}
+ return ary;
}
/* 15.2.18.4.6 */
@@ -116,33 +107,33 @@ struct_copy(mrb_value *dst, const mrb_value *src, size_t size)
static mrb_value
mrb_struct_members_m(mrb_state *mrb, mrb_value obj)
{
- return mrb_struct_s_members_m(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
+ return mrb_struct_s_members_m(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
}
mrb_value
mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
{
- mrb_value members, slot, *ptr, *ptr_members;
- long i, len;
-
- ptr = RSTRUCT_PTR(obj);
- members = mrb_struct_members(mrb, obj);
- ptr_members = RARRAY_PTR(members);
- slot = mrb_symbol_value(id);
- len = RARRAY_LEN(members);
- for (i=0; i<len; i++) {
- if (mrb_obj_equal(mrb, ptr_members[i], slot)) {
- return ptr[i];
- }
+ mrb_value members, slot, *ptr, *ptr_members;
+ long i, len;
+
+ ptr = RSTRUCT_PTR(obj);
+ members = mrb_struct_members(mrb, obj);
+ ptr_members = RARRAY_PTR(members);
+ slot = mrb_symbol_value(id);
+ len = RARRAY_LEN(members);
+ for (i=0; i<len; i++) {
+ if (mrb_obj_equal(mrb, ptr_members[i], slot)) {
+ return ptr[i];
}
- mrb_name_error(mrb, id, "%s is not struct member", mrb_sym2name(mrb, id));
- return mrb_nil_value(); /* not reached */
+ }
+ mrb_raisef(mrb, E_NAME_ERROR, "%s is not struct member", mrb_sym2name(mrb, id));
+ return mrb_nil_value(); /* not reached */
}
static mrb_value
mrb_struct_ref(mrb_state *mrb, mrb_value obj)
{
- return mrb_struct_getmember(mrb, obj, mrb->ci->mid);
+ return mrb_struct_getmember(mrb, obj, mrb->ci->mid);
}
static mrb_value mrb_struct_ref0(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[0];}
@@ -160,16 +151,16 @@ static mrb_value mrb_struct_ref9(mrb_state* mrb, mrb_value obj) {return RSTRUCT_
#define N_REF_FUNC numberof(ref_func)
static mrb_value (*const ref_func[])(mrb_state*, mrb_value) = {
- mrb_struct_ref0,
- mrb_struct_ref1,
- mrb_struct_ref2,
- mrb_struct_ref3,
- mrb_struct_ref4,
- mrb_struct_ref5,
- mrb_struct_ref6,
- mrb_struct_ref7,
- mrb_struct_ref8,
- mrb_struct_ref9,
+ mrb_struct_ref0,
+ mrb_struct_ref1,
+ mrb_struct_ref2,
+ mrb_struct_ref3,
+ mrb_struct_ref4,
+ mrb_struct_ref5,
+ mrb_struct_ref6,
+ mrb_struct_ref7,
+ mrb_struct_ref8,
+ mrb_struct_ref9,
};
mrb_sym
@@ -213,9 +204,8 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
return ptr[i] = val;
}
}
-
- mrb_name_error(mrb, mid, "`%s' is not a struct member",
- mrb_sym2name(mrb, mid));
+ mrb_raisef(mrb, E_NAME_ERROR, "`%s' is not a struct member",
+ mrb_sym2name(mrb, mid));
return mrb_nil_value(); /* not reached */
}
@@ -233,85 +223,84 @@ mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
int
mrb_is_local_id(mrb_sym id)
{
- return is_local_id(id);
+ return is_local_id(id);
}
#define is_const_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_CONST)
int
mrb_is_const_id(mrb_sym id)
{
- return is_const_id(id);
+ return is_const_id(id);
}
static mrb_value
make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * klass)
{
- mrb_value nstr, *ptr_members;
- mrb_sym id;
- long i, len;
- struct RClass *c;
+ mrb_value nstr, *ptr_members;
+ mrb_sym id;
+ long i, len;
+ struct RClass *c;
- if (mrb_nil_p(name)) {
- c = mrb_class_new(mrb, klass);
+ if (mrb_nil_p(name)) {
+ c = mrb_class_new(mrb, klass);
+ }
+ else {
+ /* old style: should we warn? */
+ name = mrb_str_to_str(mrb, name);
+ id = mrb_to_id(mrb, name);
+ if (!mrb_is_const_id(id)) {
+ mrb_raisef(mrb, E_NAME_ERROR, "identifier %s needs to be constant", mrb_string_value_ptr(mrb, name));
}
- else {
- /* old style: should we warn? */
- name = mrb_str_to_str(mrb, name);
- id = mrb_to_id(mrb, name);
- if (!mrb_is_const_id(id)) {
- mrb_name_error(mrb, id, "identifier %s needs to be constant", mrb_string_value_ptr(mrb, name));
- }
- if (mrb_const_defined_at(mrb, klass, id)) {
- mrb_warn("redefining constant Struct::%s", mrb_string_value_ptr(mrb, name));
- //?rb_mod_remove_const(klass, mrb_sym2name(mrb, id));
- }
- c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
+ if (mrb_const_defined_at(mrb, klass, id)) {
+ mrb_warn("redefining constant Struct::%s", mrb_string_value_ptr(mrb, name));
+ //?rb_mod_remove_const(klass, mrb_sym2name(mrb, id));
}
- MRB_SET_INSTANCE_TT(c, MRB_TT_STRUCT);
- nstr = mrb_obj_value(c);
- mrb_iv_set(mrb, nstr, mrb_intern(mrb, "__members__"), members);
-
- mrb_define_class_method(mrb, c, "new", mrb_instance_new, ARGS_ANY());
- mrb_define_class_method(mrb, c, "[]", mrb_instance_new, ARGS_ANY());
- mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, ARGS_NONE());
- //RSTRUCT(nstr)->basic.c->super = c->c;
- ptr_members = RARRAY_PTR(members);
- len = RARRAY_LEN(members);
- for (i=0; i< len; i++) {
- mrb_sym id = mrb_symbol(ptr_members[i]);
- if (mrb_is_local_id(id) || mrb_is_const_id(id)) {
- if (i < N_REF_FUNC) {
- mrb_define_method_id(mrb, c, id, ref_func[i], ARGS_NONE());
- }
- else {
- mrb_define_method_id(mrb, c, id, mrb_struct_ref, ARGS_NONE());
- }
- mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, ARGS_REQ(1));
+ 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);
+
+ mrb_define_class_method(mrb, c, "new", mrb_instance_new, ARGS_ANY());
+ mrb_define_class_method(mrb, c, "[]", mrb_instance_new, ARGS_ANY());
+ mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, ARGS_NONE());
+ //RSTRUCT(nstr)->basic.c->super = c->c;
+ ptr_members = RARRAY_PTR(members);
+ len = RARRAY_LEN(members);
+ for (i=0; i< len; i++) {
+ mrb_sym id = mrb_symbol(ptr_members[i]);
+ if (mrb_is_local_id(id) || mrb_is_const_id(id)) {
+ if (i < N_REF_FUNC) {
+ mrb_define_method_id(mrb, c, id, ref_func[i], ARGS_NONE());
+ }
+ else {
+ mrb_define_method_id(mrb, c, id, mrb_struct_ref, ARGS_NONE());
}
+ mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, ARGS_REQ(1));
}
-
- return nstr;
+ }
+ return nstr;
}
mrb_value
mrb_struct_define(mrb_state *mrb, const char *name, ...)
{
- va_list ar;
- mrb_value nm, ary;
- char *mem;
+ va_list ar;
+ mrb_value nm, ary;
+ char *mem;
- if (!name) nm = mrb_nil_value();
- else nm = mrb_str_new2(mrb, name);
- ary = mrb_ary_new(mrb);
+ if (!name) nm = mrb_nil_value();
+ else nm = mrb_str_new2(mrb, name);
+ ary = mrb_ary_new(mrb);
- va_start(ar, name);
- while ((mem = va_arg(ar, char*)) != 0) {
- mrb_sym slot = mrb_intern(mrb, mem);
- mrb_ary_push(mrb, ary, mrb_symbol_value(slot));
- }
- va_end(ar);
+ va_start(ar, name);
+ while ((mem = va_arg(ar, char*)) != 0) {
+ mrb_sym slot = mrb_intern(mrb, mem);
+ mrb_ary_push(mrb, ary, mrb_symbol_value(slot));
+ }
+ va_end(ar);
- return make_struct(mrb, nm, ary, struct_class(mrb));
+ return make_struct(mrb, nm, ary, struct_class(mrb));
}
/* 15.2.18.3.1 */
@@ -403,12 +392,13 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
static int
num_members(mrb_state *mrb, struct RClass *klass)
{
- mrb_value members;
- members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern(mrb, "__members__"));
- if (!mrb_array_p(members)) {
- mrb_raise(mrb, E_TYPE_ERROR, "broken members");
- }
- return RARRAY_LEN(members);
+ mrb_value members;
+
+ members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern(mrb, "__members__"));
+ if (!mrb_array_p(members)) {
+ mrb_raise(mrb, E_TYPE_ERROR, "broken members");
+ }
+ return RARRAY_LEN(members);
}
/* 15.2.18.4.8 */
@@ -418,17 +408,24 @@ static mrb_value
mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_value self)
{
struct RClass *klass = mrb_obj_class(mrb, self);
- int n;
- struct RStruct *st;
+ int i, n;
+ mrb_value values;
n = num_members(mrb, klass);
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);
+
+ values = mrb_ary_new_capa(mrb, n);
+ DATA_PTR(self) = mrb_ary_ptr(values);
+ DATA_TYPE(self) = &mrb_struct_type;
+ for (i = 0; i < argc; i++) {
+ mrb_ary_set(mrb, values, i, argv[i]);
+ }
+ for (i = argc; i < n; i++) {
+ mrb_ary_set(mrb, values, i, mrb_nil_value());
+ }
+ mrb_iv_set(mrb, self, mrb_intern(mrb, "__values__"), values);
return self;
}
@@ -452,50 +449,50 @@ mrb_struct_initialize(mrb_state *mrb, mrb_value self, mrb_value values)
static mrb_value
inspect_struct(mrb_state *mrb, mrb_value s, int recur)
{
- const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s));
- mrb_value members, str = mrb_str_new(mrb, "#<struct ", 9);
- mrb_value *ptr, *ptr_members;
- long i, len;
+ const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s));
+ mrb_value members, str = mrb_str_new(mrb, "#<struct ", 9);
+ mrb_value *ptr, *ptr_members;
+ long i, len;
- if (cn) {
- mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn));
+ if (cn) {
+ mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn));
+ }
+ if (recur) {
+ return mrb_str_cat2(mrb, str, ":...>");
+ }
+
+ members = mrb_struct_members(mrb, s);
+ ptr_members = RARRAY_PTR(members);
+ ptr = RSTRUCT_PTR(s);
+ len = RSTRUCT_LEN(s);
+ for (i=0; i<len; i++) {
+ mrb_value slot;
+ mrb_sym id;
+
+ if (i > 0) {
+ mrb_str_cat2(mrb, str, ", ");
}
- if (recur) {
- return mrb_str_cat2(mrb, str, ":...>");
+ else if (cn) {
+ mrb_str_cat2(mrb, str, " ");
}
+ slot = ptr_members[i];
+ id = mrb_symbol(slot);
+ if (mrb_is_local_id(id) || mrb_is_const_id(id)) {
+ const char *name;
+ int len;
- members = mrb_struct_members(mrb, s);
- ptr_members = RARRAY_PTR(members);
- ptr = RSTRUCT_PTR(s);
- len = RSTRUCT_LEN(s);
- for (i=0; i<len; i++) {
- mrb_value slot;
- mrb_sym id;
-
- if (i > 0) {
- mrb_str_cat2(mrb, str, ", ");
- }
- else if (cn) {
- mrb_str_cat2(mrb, str, " ");
- }
- slot = ptr_members[i];
- id = mrb_symbol(slot);
- if (mrb_is_local_id(id) || mrb_is_const_id(id)) {
- const char *name;
- int len;
-
- name = mrb_sym2name_len(mrb, id, &len);
- mrb_str_append(mrb, str, mrb_str_new(mrb, name, len));
- }
- else {
- mrb_str_append(mrb, str, mrb_inspect(mrb, slot));
- }
- mrb_str_cat2(mrb, str, "=");
- mrb_str_append(mrb, str, mrb_inspect(mrb, ptr[i]));
+ name = mrb_sym2name_len(mrb, id, &len);
+ mrb_str_append(mrb, str, mrb_str_new(mrb, name, len));
+ }
+ else {
+ mrb_str_append(mrb, str, mrb_inspect(mrb, slot));
}
- mrb_str_cat2(mrb, str, ">");
+ mrb_str_cat2(mrb, str, "=");
+ mrb_str_append(mrb, str, mrb_inspect(mrb, ptr[i]));
+ }
+ mrb_str_cat2(mrb, str, ">");
- return str;
+ return str;
}
/*
@@ -508,7 +505,7 @@ inspect_struct(mrb_state *mrb, mrb_value s, int recur)
static mrb_value
mrb_struct_inspect(mrb_state *mrb, mrb_value s)
{
- return inspect_struct(mrb, s, 0);
+ return inspect_struct(mrb, s, 0);
}
/* 15.2.18.4.9 */
@@ -516,39 +513,42 @@ mrb_struct_inspect(mrb_state *mrb, mrb_value s)
mrb_value
mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
{
- mrb_value s;
+ mrb_value s, a;
+ struct RArray *sv;
+ int i, len;
mrb_get_args(mrb, "o", &s);
if (mrb_obj_equal(mrb, copy, s)) return copy;
- if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
- mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
- }
- if (RSTRUCT_LEN(copy) != RSTRUCT_LEN(s)) {
+ Data_Get_Struct(mrb,s,&mrb_struct_type,sv);
+ if (RSTRUCT_LEN(copy) != sv->len) {
mrb_raise(mrb, E_TYPE_ERROR, "struct size mismatch");
}
- struct_copy(RSTRUCT_PTR(copy), RSTRUCT_PTR(s), RSTRUCT_LEN(copy));
-
+ len = sv->len;
+ a = mrb_obj_value(RSTRUCT_ARY(copy));
+ for (i = 0; i < len; i++) {
+ mrb_ary_set(mrb, a, i, sv->ptr[i]);
+ }
return copy;
}
static mrb_value
mrb_struct_aref_id(mrb_state *mrb, mrb_value s, mrb_sym id)
{
- mrb_value *ptr, members, *ptr_members;
- long i, len;
+ mrb_value *ptr, members, *ptr_members;
+ long i, len;
- ptr = RSTRUCT_PTR(s);
- members = mrb_struct_members(mrb, s);
- ptr_members = RARRAY_PTR(members);
- len = RARRAY_LEN(members);
- for (i=0; i<len; i++) {
- if (mrb_symbol(ptr_members[i]) == id) {
- return ptr[i];
- }
+ ptr = RSTRUCT_PTR(s);
+ members = mrb_struct_members(mrb, s);
+ ptr_members = RARRAY_PTR(members);
+ len = RARRAY_LEN(members);
+ for (i=0; i<len; i++) {
+ if (mrb_symbol(ptr_members[i]) == id) {
+ return ptr[i];
}
- mrb_name_error(mrb, id, "no member '%s' in struct", mrb_sym2name(mrb, id));
- return mrb_nil_value(); /* not reached */
+ }
+ mrb_raisef(mrb, E_NAME_ERROR, "no member '%s' in struct", mrb_sym2name(mrb, id));
+ return mrb_nil_value(); /* not reached */
}
/* 15.2.18.4.2 */
@@ -583,10 +583,10 @@ mrb_struct_aref_n(mrb_state *mrb, mrb_value s, mrb_value idx)
if (i < 0) i = RSTRUCT_LEN(s) + i;
if (i < 0)
mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too small for struct(size:%ld)",
- i, RSTRUCT_LEN(s));
+ i, RSTRUCT_LEN(s));
if (RSTRUCT_LEN(s) <= i)
- mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too large for struct(size:%ld)",
- i, RSTRUCT_LEN(s));
+ mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too large for struct(size:%ld)",
+ i, RSTRUCT_LEN(s));
return RSTRUCT_PTR(s)[i];
}
@@ -602,25 +602,25 @@ mrb_struct_aref(mrb_state *mrb, mrb_value s)
static mrb_value
mrb_struct_aset_id(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
{
- mrb_value members, *ptr, *ptr_members;
- long i, len;
+ mrb_value members, *ptr, *ptr_members;
+ long i, len;
- members = mrb_struct_members(mrb, s);
- len = RARRAY_LEN(members);
- if (RSTRUCT_LEN(s) != len) {
- mrb_raisef(mrb, E_TYPE_ERROR, "struct size differs (%ld required %ld given)",
- len, RSTRUCT_LEN(s));
- }
- ptr = RSTRUCT_PTR(s);
- ptr_members = RARRAY_PTR(members);
- for (i=0; i<len; i++) {
- if (mrb_symbol(ptr_members[i]) == id) {
- ptr[i] = val;
- return val;
- }
+ members = mrb_struct_members(mrb, s);
+ len = RARRAY_LEN(members);
+ if (RSTRUCT_LEN(s) != len) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "struct size differs (%ld required %ld given)",
+ len, RSTRUCT_LEN(s));
+ }
+ ptr = RSTRUCT_PTR(s);
+ ptr_members = RARRAY_PTR(members);
+ for (i=0; i<len; i++) {
+ if (mrb_symbol(ptr_members[i]) == id) {
+ ptr[i] = val;
+ return val;
}
- mrb_name_error(mrb, id, "no member '%s' in struct", mrb_sym2name(mrb, id));
- return val; /* not reach */
+ }
+ mrb_raisef(mrb, E_NAME_ERROR, "no member '%s' in struct", mrb_sym2name(mrb, id));
+ return val; /* not reach */
}
/* 15.2.18.4.3 */
@@ -662,11 +662,11 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
if (i < 0) i = RSTRUCT_LEN(s) + i;
if (i < 0) {
mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too small for struct(size:%ld)",
- i, RSTRUCT_LEN(s));
+ i, RSTRUCT_LEN(s));
}
if (RSTRUCT_LEN(s) <= i) {
mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too large for struct(size:%ld)",
- i, RSTRUCT_LEN(s));
+ i, RSTRUCT_LEN(s));
}
return RSTRUCT_PTR(s)[i] = val;
}
@@ -698,7 +698,7 @@ mrb_struct_equal(mrb_state *mrb, mrb_value s)
mrb_get_args(mrb, "o", &s2);
if (mrb_obj_equal(mrb, s, s2)) return mrb_true_value();
- if (mrb_type(s2) != MRB_TT_STRUCT) return mrb_false_value();
+ if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct")) return mrb_false_value();
if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) return mrb_false_value();
if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
@@ -729,7 +729,7 @@ mrb_struct_eql(mrb_state *mrb, mrb_value s)
mrb_get_args(mrb, "o", &s2);
if (mrb_obj_equal(mrb, s, s2)) return mrb_true_value();
- if (mrb_type(s2) != MRB_TT_STRUCT) return mrb_false_value();
+ if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct")) return mrb_false_value();
if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) return mrb_false_value();
if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
@@ -760,7 +760,7 @@ mrb_struct_eql(mrb_state *mrb, mrb_value s)
* <code>Symbol</code> (such as <code>:name</code>).
*/
void
-mrb_init_struct(mrb_state *mrb)
+mrb_mruby_struct_gem_init(mrb_state* mrb)
{
struct RClass *st;
st = mrb_define_class(mrb, "Struct", mrb->object_class);
@@ -778,4 +778,8 @@ mrb_init_struct(mrb_state *mrb)
mrb_define_method(mrb, st, "eql?", mrb_struct_eql, ARGS_REQ(1)); /* 15.2.18.4.12(x) */
}
-#endif /* ENABLE_STRUCT */
+
+void
+mrb_mruby_struct_gem_final(mrb_state* mrb)
+{
+}
diff --git a/test/t/struct.rb b/mrbgems/mruby-struct/test/struct.rb
index d79b30c0e..d79b30c0e 100644
--- a/test/t/struct.rb
+++ b/mrbgems/mruby-struct/test/struct.rb
diff --git a/src/etc.c b/src/etc.c
index 626627f6f..5d2c836e7 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -170,7 +170,6 @@ mrb_obj_id(mrb_value obj)
case MRB_TT_ARRAY:
case MRB_TT_HASH:
case MRB_TT_RANGE:
- case MRB_TT_STRUCT:
case MRB_TT_EXCEPTION:
case MRB_TT_FILE:
case MRB_TT_DATA:
diff --git a/src/gc.c b/src/gc.c
index 5cc794fd9..ae47de025 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -11,7 +11,6 @@
#include "mruby/hash.h"
#include "mruby/range.h"
#include <string.h>
-#include "mruby/struct.h"
#include "mruby/proc.h"
#include "mruby/data.h"
#include "mruby/variable.h"
@@ -86,9 +85,6 @@ typedef struct {
struct RArray array;
struct RHash hash;
struct RRange range;
-#ifdef ENABLE_STRUCT
- struct RStruct strct;
-#endif
struct RData data;
struct RProc proc;
} as;
@@ -455,18 +451,6 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
}
break;
-#ifdef ENABLE_STRUCT
- case MRB_TT_STRUCT:
- {
- struct RStruct *s = (struct RStruct*)obj;
- long i;
- for (i=0; i<s->len; i++){
- mrb_gc_mark_value(mrb, s->ptr[i]);
- }
- }
- break;
-#endif
-
default:
break;
}
@@ -539,12 +523,6 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
mrb_free(mrb, ((struct RRange*)obj)->edges);
break;
-#ifdef ENABLE_STRUCT
- case MRB_TT_STRUCT:
- mrb_free(mrb, ((struct RStruct*)obj)->ptr);
- break;
-#endif
-
case MRB_TT_DATA:
{
struct RData *d = (struct RData*)obj;
@@ -664,15 +642,6 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
children+=2;
break;
-#ifdef ENABLE_STRUCT
- case MRB_TT_STRUCT:
- {
- struct RStruct *s = (struct RStruct*)obj;
- children += s->len;
- }
- break;
-#endif
-
default:
break;
}
diff --git a/src/init.c b/src/init.c
index fa2d5d305..0d1a24881 100644
--- a/src/init.c
+++ b/src/init.c
@@ -20,7 +20,6 @@ void mrb_init_array(mrb_state*);
void mrb_init_hash(mrb_state*);
void mrb_init_numeric(mrb_state*);
void mrb_init_range(mrb_state*);
-void mrb_init_struct(mrb_state*);
void mrb_init_gc(mrb_state*);
void mrb_init_print(mrb_state*);
void mrb_init_math(mrb_state*);
@@ -48,9 +47,6 @@ mrb_init_core(mrb_state *mrb)
mrb_init_hash(mrb); DONE;
mrb_init_numeric(mrb); DONE;
mrb_init_range(mrb); DONE;
-#ifdef ENABLE_STRUCT
- mrb_init_struct(mrb); DONE;
-#endif
mrb_init_gc(mrb); DONE;
#ifdef ENABLE_STDIO
mrb_init_print(mrb); DONE;
diff --git a/src/object.c b/src/object.c
index e087c35c0..6707fc6e4 100644
--- a/src/object.c
+++ b/src/object.c
@@ -379,7 +379,6 @@ static const struct types {
{MRB_TT_HASH, "Hash"},
{MRB_TT_STRING, "String"},
{MRB_TT_RANGE, "Range"},
- {MRB_TT_STRUCT, "Struct"},
// {MRB_TT_BIGNUM, "Bignum"},
{MRB_TT_FILE, "File"},
{MRB_TT_DATA, "Data"}, /* internal use: wrapped C pointers */