From 05e2cba4dc2d2ddd48bbe849acaaa511e181a1a6 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 2 Sep 2006 14:42:08 +0000 Subject: * ruby.h (struct RArray): embed small arrays. (RARRAY_LEN): defined for accessing array members. (RARRAY_PTR): ditto. * array.c: use RARRAY_LEN and RARRAY_PTR. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@10833 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- struct.c | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'struct.c') diff --git a/struct.c b/struct.c index c7ca180de..b93f3383e 100644 --- a/struct.c +++ b/struct.c @@ -47,9 +47,9 @@ rb_struct_members(VALUE s) { VALUE members = rb_struct_s_members(rb_obj_class(s)); - if (RSTRUCT_LEN(s) != RARRAY(members)->len) { + if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) { rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", - RARRAY(members)->len, RSTRUCT_LEN(s)); + RARRAY_LEN(members), RSTRUCT_LEN(s)); } return members; } @@ -61,8 +61,8 @@ rb_struct_s_members_m(VALUE klass) VALUE *p, *pend; members = rb_struct_s_members(klass); - ary = rb_ary_new2(RARRAY(members)->len); - p = RARRAY(members)->ptr; pend = p + RARRAY(members)->len; + ary = rb_ary_new2(RARRAY_LEN(members)); + p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members); while (p < pend) { rb_ary_push(ary, rb_str_new2(rb_id2name(SYM2ID(*p)))); p++; @@ -97,8 +97,8 @@ rb_struct_getmember(VALUE obj, ID id) members = rb_struct_members(obj); slot = ID2SYM(id); - for (i=0; ilen; i++) { - if (RARRAY(members)->ptr[i] == slot) { + for (i=0; ilen; i++) { - slot = RARRAY(members)->ptr[i]; + for (i=0; ilen)); + rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY_LEN(members))); rb_iv_set(nstr, "__members__", members); rb_define_alloc_func(nstr, struct_alloc); rb_define_singleton_method(nstr, "new", rb_class_new_instance, -1); rb_define_singleton_method(nstr, "[]", rb_class_new_instance, -1); rb_define_singleton_method(nstr, "members", rb_struct_s_members_m, 0); - for (i=0; i< RARRAY(members)->len; i++) { - ID id = SYM2ID(RARRAY(members)->ptr[i]); + for (i=0; i< RARRAY_LEN(members); i++) { + ID id = SYM2ID(RARRAY_PTR(members)[i]); if (rb_is_local_id(id) || rb_is_const_id(id)) { if (i < N_REF_FUNC) { rb_define_method_id(nstr, id, ref_func[i], 0); @@ -278,9 +278,9 @@ rb_struct_s_def(int argc, VALUE *argv, VALUE klass) ID id; rb_scan_args(argc, argv, "1*", &name, &rest); - for (i=0; ilen; i++) { - id = rb_to_id(RARRAY(rest)->ptr[i]); - RARRAY(rest)->ptr[i] = ID2SYM(id); + for (i=0; ilen) { + if (n < RARRAY_LEN(values)) { rb_raise(rb_eArgError, "struct size differs"); } - MEMCPY(RSTRUCT_PTR(self), RARRAY(values)->ptr, VALUE, RARRAY(values)->len); - if (n > RARRAY(values)->len) { - rb_mem_clear(RSTRUCT_PTR(self)+RARRAY(values)->len, - n-RARRAY(values)->len); + MEMCPY(RSTRUCT_PTR(self), RARRAY_PTR(values), VALUE, RARRAY_LEN(values)); + if (n > RARRAY_LEN(values)) { + rb_mem_clear(RSTRUCT_PTR(self)+RARRAY_LEN(values), + n-RARRAY_LEN(values)); } return Qnil; } @@ -351,7 +351,7 @@ struct_alloc(VALUE klass) VALUE rb_struct_alloc(VALUE klass, VALUE values) { - return rb_class_new_instance(RARRAY(values)->len, RARRAY(values)->ptr, klass); + return rb_class_new_instance(RARRAY_LEN(values), RARRAY_PTR(values), klass); } VALUE @@ -456,7 +456,7 @@ inspect_struct(VALUE s, VALUE dummy, int recur) if (i > 0) { rb_str_cat2(str, ", "); } - slot = RARRAY(members)->ptr[i]; + slot = RARRAY_PTR(members)[i]; id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { p = rb_id2name(id); @@ -535,9 +535,9 @@ rb_struct_aref_id(VALUE s, ID id) long i, len; members = rb_struct_members(s); - len = RARRAY(members)->len; + len = RARRAY_LEN(members); for (i=0; iptr[i]) == id) { + if (SYM2ID(RARRAY_PTR(members)[i]) == id) { return RSTRUCT_PTR(s)[i]; } } @@ -592,13 +592,13 @@ rb_struct_aset_id(VALUE s, ID id, VALUE val) members = rb_struct_members(s); rb_struct_modify(s); - len = RARRAY(members)->len; - if (RSTRUCT_LEN(s) != RARRAY(members)->len) { + len = RARRAY_LEN(members); + if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) { rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", - RARRAY(members)->len, RSTRUCT_LEN(s)); + RARRAY_LEN(members), RSTRUCT_LEN(s)); } for (i=0; iptr[i]) == id) { + if (SYM2ID(RARRAY_PTR(members)[i]) == id) { RSTRUCT_PTR(s)[i] = val; return val; } -- cgit