ruby-changes:2509
From: ko1@a...
Date: 23 Nov 2007 13:36:26 +0900
Subject: [ruby-changes:2509] akr - Ruby:r14000 (trunk): * struct.c (rb_struct_define_without_accessor): new function.
akr 2007-11-23 13:35:53 +0900 (Fri, 23 Nov 2007) New Revision: 14000 Modified files: trunk/ChangeLog trunk/include/ruby/intern.h trunk/range.c trunk/struct.c Log: * struct.c (rb_struct_define_without_accessor): new function. * range.c (range_alloc): removed. (Init_Range): use rb_struct_define_without_accessor. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14000&r2=13999 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/struct.c?r1=14000&r2=13999 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/range.c?r1=14000&r2=13999 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=14000&r2=13999 Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 13999) +++ include/ruby/intern.h (revision 14000) @@ -542,6 +542,7 @@ VALUE rb_struct_iv_get(VALUE, const char*); VALUE rb_struct_s_members(VALUE); VALUE rb_struct_members(VALUE); +VALUE rb_struct_define_without_accessor(char *, VALUE, ...); /* thread.c */ typedef void rb_unblock_function_t(void *); typedef VALUE rb_blocking_function_t(void *); Index: ChangeLog =================================================================== --- ChangeLog (revision 13999) +++ ChangeLog (revision 14000) @@ -1,3 +1,10 @@ +Fri Nov 23 13:34:08 2007 Tanaka Akira <akr@f...> + + * struct.c (rb_struct_define_without_accessor): new function. + + * range.c (range_alloc): removed. + (Init_Range): use rb_struct_define_without_accessor. + Fri Nov 23 11:01:54 2007 Yukihiro Matsumoto <matz@r...> * re.c (match_begin): should return offset by character. Index: range.c =================================================================== --- range.c (revision 13999) +++ range.c (revision 14000) @@ -23,22 +23,6 @@ #define SET_EXCL(r,v) (RSTRUCT(r)->as.ary[2] = (v) ? Qtrue : Qfalse) static VALUE -range_alloc(VALUE klass) -{ - long n; - NEWOBJ(r, struct RStruct); - OBJSETUP(r, klass, T_STRUCT); - - n = 3; - - RBASIC(r)->flags &= ~RSTRUCT_EMBED_LEN_MASK; - RBASIC(r)->flags |= n << RSTRUCT_EMBED_LEN_SHIFT; - rb_mem_clear(r->as.ary, n); - - return (VALUE)r; -} - -static VALUE range_failed(void) { rb_raise(rb_eArgError, "bad value for range"); @@ -895,15 +879,9 @@ id_end = rb_intern("end"); id_excl = rb_intern("excl"); - rb_cRange = rb_define_class("Range", rb_cObject); + rb_cRange = rb_struct_define_without_accessor("Range", rb_cObject, + "begin", "end", "excl", NULL); - /* compatibility for rb_struct_members, etc. */ - members = rb_ary_new3(3, ID2SYM(id_beg), ID2SYM(id_end), ID2SYM(id_excl)); - OBJ_FREEZE(members); - rb_iv_set(rb_cRange, "__size__", INT2FIX(3)); - rb_iv_set(rb_cRange, "__members__", members); - - rb_define_alloc_func(rb_cRange, range_alloc); rb_include_module(rb_cRange, rb_mEnumerable); rb_marshal_define_compat(rb_cRange, rb_cObject, range_dumper, range_loader); rb_define_method(rb_cRange, "initialize", range_initialize, -1); Index: struct.c =================================================================== --- struct.c (revision 13999) +++ struct.c (revision 14000) @@ -218,6 +218,41 @@ } VALUE +rb_struct_define_without_accessor(char *class_name, VALUE super, ...) +{ + VALUE klass; + va_list ar; + VALUE members; + long i; + char *name; + + members = rb_ary_new2(0); + va_start(ar, super); + i = 0; + while ((name = va_arg(ar, char*)) != NULL) { + rb_ary_push(members, ID2SYM(rb_intern(name))); + } + va_end(ar); + OBJ_FREEZE(members); + + if (class_name) { + klass = rb_define_class(class_name, super); + } + else { + klass = rb_class_new(super); + rb_make_metaclass(klass, RBASIC(super)->klass); + rb_class_inherited(super, klass); + } + + rb_iv_set(klass, "__size__", LONG2NUM(RARRAY_LEN(members))); + rb_iv_set(klass, "__members__", members); + + rb_define_alloc_func(klass, struct_alloc); + + return klass; +} + +VALUE rb_struct_define(const char *name, ...) { va_list ar; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml