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/