summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct/src/struct.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-struct/src/struct.c')
-rw-r--r--mrbgems/mruby-struct/src/struct.c102
1 files changed, 64 insertions, 38 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index e21ac77d0..da3200fb9 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -49,7 +49,7 @@ mrb_struct_iv_get(mrb_state *mrb, mrb_value c, const char *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_intern2(mrb, "__members__", 11));
if (mrb_nil_p(members)) {
mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
@@ -113,7 +113,7 @@ mrb_value
mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
{
mrb_value members, slot, *ptr, *ptr_members;
- long i, len;
+ mrb_int i, len;
ptr = RSTRUCT_PTR(obj);
members = mrb_struct_members(mrb, obj);
@@ -167,7 +167,7 @@ mrb_id_attrset(mrb_state *mrb, mrb_sym id)
{
const char *name;
char *buf;
- int len;
+ size_t len;
mrb_sym mid;
name = mrb_sym2name_len(mrb, id, &len);
@@ -185,7 +185,8 @@ static mrb_value
mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
{
const char *name;
- int i, len;
+ int i;
+ size_t len;
mrb_sym mid;
mrb_value members, slot, *ptr, *ptr_members;
@@ -237,7 +238,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k
{
mrb_value nstr, *ptr_members;
mrb_sym id;
- long i, len;
+ mrb_int i, len;
struct RClass *c;
if (mrb_nil_p(name)) {
@@ -258,7 +259,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k
}
MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
nstr = mrb_obj_value(c);
- mrb_iv_set(mrb, nstr, mrb_intern(mrb, "__members__"), members);
+ mrb_iv_set(mrb, nstr, mrb_intern2(mrb, "__members__", 11), members);
mrb_define_class_method(mrb, c, "new", mrb_instance_new, ARGS_ANY());
mrb_define_class_method(mrb, c, "[]", mrb_instance_new, ARGS_ANY());
@@ -289,7 +290,7 @@ mrb_struct_define(mrb_state *mrb, const char *name, ...)
char *mem;
if (!name) nm = mrb_nil_value();
- else nm = mrb_str_new2(mrb, name);
+ else nm = mrb_str_new_cstr(mrb, name);
ary = mrb_ary_new(mrb);
va_start(ar, name);
@@ -342,7 +343,7 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
mrb_value name, rest;
mrb_value *pargv;
int argcnt;
- long i;
+ mrb_int i;
mrb_value b, st;
mrb_sym id;
mrb_value *argv;
@@ -393,7 +394,7 @@ num_members(mrb_state *mrb, struct RClass *klass)
{
mrb_value members;
- members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern(mrb, "__members__"));
+ members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern2(mrb, "__members__", 11));
if (!mrb_array_p(members)) {
mrb_raise(mrb, E_TYPE_ERROR, "broken members");
}
@@ -445,7 +446,7 @@ 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;
+ mrb_int i, len;
if (cn) {
mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn));
@@ -472,7 +473,7 @@ inspect_struct(mrb_state *mrb, mrb_value s, int recur)
id = mrb_symbol(slot);
if (mrb_is_local_id(id) || mrb_is_const_id(id)) {
const char *name;
- int len;
+ size_t len;
name = mrb_sym2name_len(mrb, id, &len);
mrb_str_append(mrb, str, mrb_str_new(mrb, name, len));
@@ -532,7 +533,7 @@ 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_int i, len;
ptr = RSTRUCT_PTR(s);
members = mrb_struct_members(mrb, s);
@@ -569,7 +570,7 @@ mrb_struct_aref_id(mrb_state *mrb, mrb_value s, mrb_sym id)
mrb_value
mrb_struct_aref_n(mrb_state *mrb, mrb_value s, mrb_value idx)
{
- long i;
+ mrb_int i;
if (mrb_string_p(idx) || mrb_symbol_p(idx)) {
return mrb_struct_aref_id(mrb, s, mrb_to_id(mrb, idx));
@@ -601,7 +602,7 @@ 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_int i, len;
members = mrb_struct_members(mrb, s);
len = RARRAY_LEN(members);
@@ -647,7 +648,7 @@ mrb_struct_aset_id(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
mrb_value
mrb_struct_aset(mrb_state *mrb, mrb_value s)
{
- long i;
+ mrb_int i;
mrb_value idx;
mrb_value val;
@@ -695,22 +696,35 @@ mrb_struct_equal(mrb_state *mrb, mrb_value s)
{
mrb_value s2;
mrb_value *ptr, *ptr2;
- long i, len;
+ mrb_int i, len;
+ mrb_bool equal_p;
mrb_get_args(mrb, "o", &s2);
- if (mrb_obj_equal(mrb, s, s2)) return mrb_true_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)) {
+ if (mrb_obj_equal(mrb, s, s2)) {
+ equal_p = 1;
+ }
+ else if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ equal_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
+ equal_p = 0; /* This substuture is just to suppress warnings. never called. */
}
- ptr = RSTRUCT_PTR(s);
- ptr2 = RSTRUCT_PTR(s2);
- len = RSTRUCT_LEN(s);
- for (i=0; i<len; i++) {
- if (!mrb_equal(mrb, ptr[i], ptr2[i])) return mrb_false_value();
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ equal_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
+ equal_p = 0;
+ break;
+ }
+ }
}
- return mrb_true_value();
+
+ return mrb_bool_value(equal_p);
}
/* 15.2.18.4.12(x) */
@@ -726,23 +740,35 @@ mrb_struct_eql(mrb_state *mrb, mrb_value s)
{
mrb_value s2;
mrb_value *ptr, *ptr2;
- long i, len;
+ mrb_int i, len;
+ mrb_bool eql_p;
mrb_get_args(mrb, "o", &s2);
- if (mrb_obj_equal(mrb, s, s2)) return mrb_true_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)) {
+ if (mrb_obj_equal(mrb, s, s2)) {
+ eql_p = 1;
+ }
+ else if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ eql_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
+ eql_p = 0; /* This substuture is just to suppress warnings. never called. */
}
-
- ptr = RSTRUCT_PTR(s);
- ptr2 = RSTRUCT_PTR(s2);
- len = RSTRUCT_LEN(s);
- for (i=0; i<len; i++) {
- if (!mrb_eql(mrb, ptr[i], ptr2[i])) return mrb_false_value();
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ eql_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
+ eql_p = 0;
+ break;
+ }
+ }
}
- return mrb_true_value();
+
+ return mrb_bool_value(eql_p);
}
/*