[前][次][番号順一覧][スレッド一覧]

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

[前][次][番号順一覧][スレッド一覧]