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

ruby-changes:25223

From: nari <ko1@a...>
Date: Sat, 20 Oct 2012 15:58:11 +0900 (JST)
Subject: [ruby-changes:25223] nari:r37275 (trunk): * include/ruby/ruby.h: add C APIs.

nari	2012-10-20 15:57:51 +0900 (Sat, 20 Oct 2012)

  New Revision: 37275

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37275

  Log:
    * include/ruby/ruby.h: add C APIs.
      VALUE rb_newobj_of(VALUE klass, VALUE flags)
      #define NEWOBJ_OF(obj,type,klass,flags)
      These allow to change a allocation strategy depending on klass
      or flags.
    
    * gc.c: ditto
    
    * array.c: use new C API.
    * bignum.c: ditto
    * class.c: ditto
    * complex.c: ditto
    * ext/socket/ancdata.c: ditto
    * ext/socket/option.c: ditto
    * hash.c: ditto
    * io.c: ditto
    * marshal.c: ditto
    * numeric.c: ditto
    * object.c: ditto
    * random.c: ditto
    * range.c: ditto
    * rational.c: ditto
    * re.c: ditto
    * string.c: ditto
    * struct.c: ditto
      [Feature #7177][Feature #7047]

  Modified files:
    trunk/ChangeLog
    trunk/array.c
    trunk/bignum.c
    trunk/class.c
    trunk/complex.c
    trunk/ext/socket/ancdata.c
    trunk/ext/socket/option.c
    trunk/gc.c
    trunk/hash.c
    trunk/include/ruby/ruby.h
    trunk/io.c
    trunk/marshal.c
    trunk/numeric.c
    trunk/object.c
    trunk/random.c
    trunk/range.c
    trunk/rational.c
    trunk/re.c
    trunk/string.c
    trunk/struct.c

Index: complex.c
===================================================================
--- complex.c	(revision 37274)
+++ complex.c	(revision 37275)
@@ -313,8 +313,7 @@
 inline static VALUE
 nucomp_s_new_internal(VALUE klass, VALUE real, VALUE imag)
 {
-    NEWOBJ(obj, struct RComplex);
-    OBJSETUP(obj, klass, T_COMPLEX);
+    NEWOBJ_OF(obj, struct RComplex, klass, T_COMPLEX);
 
     obj->real = real;
     obj->imag = imag;
Index: array.c
===================================================================
--- array.c	(revision 37274)
+++ array.c	(revision 37275)
@@ -308,8 +308,7 @@
 static VALUE
 ary_alloc(VALUE klass)
 {
-    NEWOBJ(ary, struct RArray);
-    OBJSETUP(ary, klass, T_ARRAY);
+    NEWOBJ_OF(ary, struct RArray, klass, T_ARRAY);
     FL_SET_EMBED((VALUE)ary);
     ARY_SET_EMBED_LEN((VALUE)ary, 0);
 
@@ -436,8 +435,7 @@
 	return ary;
     }
     else {
-	NEWOBJ(shared, struct RArray);
-	OBJSETUP(shared, 0, T_ARRAY);
+	NEWOBJ_OF(shared, struct RArray, 0, T_ARRAY);
         FL_UNSET_EMBED(shared);
 
         ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 37274)
+++ include/ruby/ruby.h	(revision 37275)
@@ -657,7 +657,9 @@
 VALUE rb_int2big(SIGNED_VALUE);
 
 VALUE rb_newobj(void);
+VALUE rb_newobj_of(VALUE, VALUE);
 #define NEWOBJ(obj,type) type *(obj) = (type*)rb_newobj()
+#define NEWOBJ_OF(obj,type,klass,flags) type *(obj) = (type*)rb_newobj_of(klass, flags)
 #define OBJSETUP(obj,c,t) do {\
     RBASIC(obj)->flags = (t);\
     RBASIC(obj)->klass = (c);\
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37274)
+++ ChangeLog	(revision 37275)
@@ -1,3 +1,32 @@
+Sat Oct 20 15:35:06 2012  Narihiro Nakamura  <authornari@g...>
+
+	* include/ruby/ruby.h: add C APIs.
+	  VALUE rb_newobj_of(VALUE klass, VALUE flags)
+	  #define NEWOBJ_OF(obj,type,klass,flags)
+	  These allow to change a allocation strategy depending on klass
+	  or flags.
+
+	* gc.c: ditto
+
+	* array.c: use new C API.
+	* bignum.c: ditto
+	* class.c: ditto
+	* complex.c: ditto
+	* ext/socket/ancdata.c: ditto
+	* ext/socket/option.c: ditto
+	* hash.c: ditto
+	* io.c: ditto
+	* marshal.c: ditto
+	* numeric.c: ditto
+	* object.c: ditto
+	* random.c: ditto
+	* range.c: ditto
+	* rational.c: ditto
+	* re.c: ditto
+	* string.c: ditto
+	* struct.c: ditto
+	  [Feature #7177][Feature #7047]
+
 Sat Oct 20 12:50:00 2012  Zachary Scott	<zachary@z...>
 
 	* ext/socket/socket.c: Documentation for Socket
Index: re.c
===================================================================
--- re.c	(revision 37274)
+++ re.c	(revision 37275)
@@ -826,8 +826,7 @@
 static VALUE
 match_alloc(VALUE klass)
 {
-    NEWOBJ(match, struct RMatch);
-    OBJSETUP(match, klass, T_MATCH);
+    NEWOBJ_OF(match, struct RMatch, klass, T_MATCH);
 
     match->str = 0;
     match->rmatch = 0;
@@ -2453,8 +2452,7 @@
 static VALUE
 rb_reg_s_alloc(VALUE klass)
 {
-    NEWOBJ(re, struct RRegexp);
-    OBJSETUP(re, klass, T_REGEXP);
+    NEWOBJ_OF(re, struct RRegexp, klass, T_REGEXP);
 
     re->ptr = 0;
     re->src = 0;
Index: string.c
===================================================================
--- string.c	(revision 37274)
+++ string.c	(revision 37275)
@@ -370,8 +370,7 @@
 static inline VALUE
 str_alloc(VALUE klass)
 {
-    NEWOBJ(str, struct RString);
-    OBJSETUP(str, klass, T_STRING);
+    NEWOBJ_OF(str, struct RString, klass, T_STRING);
 
     str->as.heap.ptr = 0;
     str->as.heap.len = 0;
Index: object.c
===================================================================
--- object.c	(revision 37274)
+++ object.c	(revision 37275)
@@ -1679,8 +1679,7 @@
 static VALUE
 rb_class_allocate_instance(VALUE klass)
 {
-    NEWOBJ(obj, struct RObject);
-    OBJSETUP(obj, klass, T_OBJECT);
+    NEWOBJ_OF(obj, struct RObject, klass, T_OBJECT);
     return (VALUE)obj;
 }
 
Index: io.c
===================================================================
--- io.c	(revision 37274)
+++ io.c	(revision 37275)
@@ -837,8 +837,7 @@
 static VALUE
 io_alloc(VALUE klass)
 {
-    NEWOBJ(io, struct RFile);
-    OBJSETUP(io, klass, T_FILE);
+    NEWOBJ_OF(io, struct RFile, klass, T_FILE);
 
     io->fptr = 0;
 
Index: range.c
===================================================================
--- range.c	(revision 37274)
+++ range.c	(revision 37275)
@@ -956,8 +956,7 @@
 range_dumper(VALUE range)
 {
     VALUE v;
-    NEWOBJ(m, struct RObject);
-    OBJSETUP(m, rb_cObject, T_OBJECT);
+    NEWOBJ_OF(m, struct RObject, rb_cObject, T_OBJECT);
 
     v = (VALUE)m;
 
Index: struct.c
===================================================================
--- struct.c	(revision 37274)
+++ struct.c	(revision 37275)
@@ -384,8 +384,7 @@
 struct_alloc(VALUE klass)
 {
     long n;
-    NEWOBJ(st, struct RStruct);
-    OBJSETUP(st, klass, T_STRUCT);
+    NEWOBJ_OF(st, struct RStruct, klass, T_STRUCT);
 
     n = num_members(klass);
 
Index: gc.c
===================================================================
--- gc.c	(revision 37274)
+++ gc.c	(revision 37275)
@@ -646,8 +646,8 @@
     return FALSE;
 }
 
-VALUE
-rb_newobj(void)
+static VALUE
+newobj(VALUE klass, VALUE flags)
 {
     rb_objspace_t *objspace = &rb_objspace;
     VALUE obj;
@@ -688,6 +688,23 @@
     return obj;
 }
 
+VALUE
+rb_newobj(void)
+{
+    return newobj(0, T_NONE);
+}
+
+VALUE
+rb_newobj_of(VALUE klass, VALUE flags)
+{
+    VALUE obj;
+
+    obj = newobj(klass, flags);
+    OBJSETUP(obj, klass, flags);
+
+    return obj;
+}
+
 NODE*
 rb_node_newnode(enum node_type type, VALUE a0, VALUE a1, VALUE a2)
 {
Index: class.c
===================================================================
--- class.c	(revision 37274)
+++ class.c	(revision 37275)
@@ -49,8 +49,7 @@
 static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
-    NEWOBJ(obj, struct RClass);
-    OBJSETUP(obj, klass, flags);
+    NEWOBJ_OF(obj, struct RClass, klass, flags);
     obj->ptr = ALLOC(rb_classext_t);
     RCLASS_IV_TBL(obj) = 0;
     RCLASS_CONST_TBL(obj) = 0;
Index: ext/socket/option.c
===================================================================
--- ext/socket/option.c	(revision 37274)
+++ ext/socket/option.c	(revision 37275)
@@ -61,8 +61,7 @@
 VALUE
 rsock_sockopt_new(int family, int level, int optname, VALUE data)
 {
-    NEWOBJ(obj, struct RObject);
-    OBJSETUP(obj, rb_cSockOpt, T_OBJECT);
+    NEWOBJ_OF(obj, struct RObject, rb_cSockOpt, T_OBJECT);
     StringValue(data);
     sockopt_initialize((VALUE)obj, INT2NUM(family), INT2NUM(level), INT2NUM(optname), data);
     return (VALUE)obj;
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 37274)
+++ ext/socket/ancdata.c	(revision 37275)
@@ -86,8 +86,7 @@
 static VALUE
 ancdata_new(int family, int level, int type, VALUE data)
 {
-    NEWOBJ(obj, struct RObject);
-    OBJSETUP(obj, rb_cAncillaryData, T_OBJECT);
+    NEWOBJ_OF(obj, struct RObject, rb_cAncillaryData, T_OBJECT);
     StringValue(data);
     ancillary_initialize((VALUE)obj, INT2NUM(family), INT2NUM(level), INT2NUM(type), data);
     return (VALUE)obj;
Index: hash.c
===================================================================
--- hash.c	(revision 37274)
+++ hash.c	(revision 37275)
@@ -207,8 +207,7 @@
 static VALUE
 hash_alloc(VALUE klass)
 {
-    NEWOBJ(hash, struct RHash);
-    OBJSETUP(hash, klass, T_HASH);
+    NEWOBJ_OF(hash, struct RHash, klass, T_HASH);
 
     RHASH_IFNONE(hash) = Qnil;
 
@@ -224,8 +223,11 @@
 VALUE
 rb_hash_dup(VALUE hash)
 {
-    NEWOBJ(ret, struct RHash);
-    DUPSETUP(ret, hash);
+    NEWOBJ_OF(ret, struct RHash,
+                rb_obj_class(hash),
+                (RBASIC(hash)->flags)&(T_MASK|FL_EXIVAR|FL_TAINT|FL_UNTRUSTED));
+    if (FL_TEST((hash), FL_EXIVAR))
+        rb_copy_generic_ivar((VALUE)(ret),(VALUE)(hash));
 
     if (!RHASH_EMPTY_P(hash))
         ret->ntbl = st_copy(RHASH(hash)->ntbl);
Index: numeric.c
===================================================================
--- numeric.c	(revision 37274)
+++ numeric.c	(revision 37275)
@@ -617,8 +617,7 @@
 VALUE
 rb_float_new_in_heap(double d)
 {
-    NEWOBJ(flt, struct RFloat);
-    OBJSETUP(flt, rb_cFloat, T_FLOAT);
+    NEWOBJ_OF(flt, struct RFloat, rb_cFloat, T_FLOAT);
 
     flt->float_value = d;
     return (VALUE)flt;
Index: bignum.c
===================================================================
--- bignum.c	(revision 37274)
+++ bignum.c	(revision 37275)
@@ -166,8 +166,7 @@
 static VALUE
 bignew_1(VALUE klass, long len, int sign)
 {
-    NEWOBJ(big, struct RBignum);
-    OBJSETUP(big, klass, T_BIGNUM);
+    NEWOBJ_OF(big, struct RBignum, klass, T_BIGNUM);
     RBIGNUM_SET_SIGN(big, sign?1:0);
     if (len <= RBIGNUM_EMBED_LEN_MAX) {
 	RBASIC(big)->flags |= RBIGNUM_EMBED_FLAG;
Index: marshal.c
===================================================================
--- marshal.c	(revision 37274)
+++ marshal.c	(revision 37275)
@@ -1459,8 +1459,7 @@
 	    BDIGIT *digits;
 	    volatile VALUE data;
 
-	    NEWOBJ(big, struct RBignum);
-	    OBJSETUP(big, rb_cBignum, T_BIGNUM);
+	    NEWOBJ_OF(big, struct RBignum, rb_cBignum, T_BIGNUM);
 	    RBIGNUM_SET_SIGN(big, (r_byte(arg) == '+'));
 	    len = r_long(arg);
 	    data = r_bytes0(len * 2, arg);
Index: rational.c
===================================================================
--- rational.c	(revision 37274)
+++ rational.c	(revision 37275)
@@ -348,8 +348,7 @@
 inline static VALUE
 nurat_s_new_internal(VALUE klass, VALUE num, VALUE den)
 {
-    NEWOBJ(obj, struct RRational);
-    OBJSETUP(obj, klass, T_RATIONAL);
+    NEWOBJ_OF(obj, struct RRational, klass, T_RATIONAL);
 
     obj->num = num;
     obj->den = den;
Index: random.c
===================================================================
--- random.c	(revision 37274)
+++ random.c	(revision 37275)
@@ -537,8 +537,7 @@
 {
     const long len = DEFAULT_SEED_LEN/SIZEOF_BDIGITS;
     BDIGIT *digits;
-    NEWOBJ(big, struct RBignum);
-    OBJSETUP(big, rb_cBignum, T_BIGNUM);
+    NEWOBJ_OF(big, struct RBignum, rb_cBignum, T_BIGNUM);
 
     RBIGNUM_SET_SIGN(big, 1);
     rb_big_resize((VALUE)big, len + 1);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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