Feature #9916 ยป opaque-RStruct.patch
ChangeLog | ||
---|---|---|
Sat Jun 7 20:43:42 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
|
||
* include/ruby/ruby.h (struct RStruct): no longer.
|
||
* internal.h (struct RStruct): moved here.
|
||
* struct.c (rb_struct_ptr): a compensation function for the lack
|
||
of RSTRUCT_PTR. But now that we have RSTRUCT_GET/SET, that must
|
||
not be used anyway. I mark this deprecated. Dont use it.
|
||
Sat Jun 7 18:15:33 2014 Benoit Daloze <eregontp@gmail.com>
|
||
* numeric.c (bit_coerce): remove constant parameter `err'
|
include/ruby/intern.h | ||
---|---|---|
VALUE rb_struct_getmember(VALUE, ID);
|
||
VALUE rb_struct_s_members(VALUE);
|
||
VALUE rb_struct_members(VALUE);
|
||
VALUE rb_struct_size(VALUE s);
|
||
DEPRECATED(VALUE const* rb_struct_ptr(VALUE s));
|
||
VALUE rb_struct_alloc_noinit(VALUE);
|
||
VALUE rb_struct_define_without_accessor(const char *, VALUE, rb_alloc_func_t, ...);
|
||
VALUE rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, ...);
|
include/ruby/ruby.h | ||
---|---|---|
(sval) = (type*)rb_check_typeddata((obj), (data_type)); \
|
||
} while (0)
|
||
#define RSTRUCT_EMBED_LEN_MAX 3
|
||
struct RStruct {
|
||
struct RBasic basic;
|
||
union {
|
||
struct {
|
||
long len;
|
||
const VALUE *ptr;
|
||
} heap;
|
||
const VALUE ary[RSTRUCT_EMBED_LEN_MAX];
|
||
} as;
|
||
};
|
||
#define RSTRUCT_EMBED_LEN_MASK (FL_USER2|FL_USER1)
|
||
#define RSTRUCT_EMBED_LEN_SHIFT (FL_USHIFT+1)
|
||
#define RSTRUCT_LEN(st) \
|
||
((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
|
||
(long)((RBASIC(st)->flags >> RSTRUCT_EMBED_LEN_SHIFT) & \
|
||
(RSTRUCT_EMBED_LEN_MASK >> RSTRUCT_EMBED_LEN_SHIFT)) : \
|
||
RSTRUCT(st)->as.heap.len)
|
||
#define RSTRUCT_LENINT(st) rb_long2int(RSTRUCT_LEN(st))
|
||
#define RSTRUCT_CONST_PTR(st) \
|
||
((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
|
||
RSTRUCT(st)->as.ary : \
|
||
RSTRUCT(st)->as.heap.ptr)
|
||
#define RSTRUCT_PTR(st) ((VALUE *)RSTRUCT_CONST_PTR(RGENGC_WB_PROTECTED_STRUCT ? OBJ_WB_UNPROTECT((VALUE)st) : (VALUE)st))
|
||
#define RSTRUCT_SET(st, idx, v) RB_OBJ_WRITE(st, &RSTRUCT_CONST_PTR(st)[idx], (v))
|
||
#define RSTRUCT_GET(st, idx) (RSTRUCT_CONST_PTR(st)[idx])
|
||
#define RSTRUCT_LEN(st) rb_struct_size(st)
|
||
#define RSTRUCT_PTR(st) rb_struct_ptr(st)
|
||
#define RSTRUCT_SET(st, idx, v) rb_struct_aset(st, INT2NUM(idx), (v))
|
||
#define RSTRUCT_GET(st, idx) rb_struct_aref(st, INT2NUM(idx))
|
||
#define RBIGNUM_SIGN(b) (FIX2LONG(rb_big_cmp((b), INT2FIX(0))) >= 0)
|
||
#define RBIGNUM_POSITIVE_P(b) (FIX2LONG(rb_big_cmp((b), INT2FIX(0))) >= 0)
|
||
... | ... | |
#define RHASH(obj) (R_CAST(RHash)(obj))
|
||
#define RDATA(obj) (R_CAST(RData)(obj))
|
||
#define RTYPEDDATA(obj) (R_CAST(RTypedData)(obj))
|
||
#define RSTRUCT(obj) (R_CAST(RStruct)(obj))
|
||
#define RFILE(obj) (R_CAST(RFile)(obj))
|
||
#define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
|
||
internal.h | ||
---|---|---|
#define RSYMBOL(obj) (R_CAST(RSymbol)(obj))
|
||
#define RSTRUCT_EMBED_LEN_MAX 3
|
||
struct RStruct {
|
||
struct RBasic basic;
|
||
union {
|
||
struct {
|
||
long len;
|
||
const VALUE *ptr;
|
||
} heap;
|
||
const VALUE ary[RSTRUCT_EMBED_LEN_MAX];
|
||
} as;
|
||
};
|
||
#ifdef RSTRUCT_SET
|
||
#undef RSTRUCT_LEN
|
||
#undef RSTRUCT_PTR
|
||
#undef RSTRUCT_SET
|
||
#undef RSTRUCT_GET
|
||
#endif
|
||
#define RSTRUCT_EMBED_LEN_MASK (FL_USER2|FL_USER1)
|
||
#define RSTRUCT_EMBED_LEN_SHIFT (FL_USHIFT+1)
|
||
#define RSTRUCT_LEN(st) \
|
||
((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
|
||
(long)((RBASIC(st)->flags >> RSTRUCT_EMBED_LEN_SHIFT) & \
|
||
(RSTRUCT_EMBED_LEN_MASK >> RSTRUCT_EMBED_LEN_SHIFT)) : \
|
||
RSTRUCT(st)->as.heap.len)
|
||
#define RSTRUCT_LENINT(st) rb_long2int(RSTRUCT_LEN(st))
|
||
#define RSTRUCT_CONST_PTR(st) \
|
||
((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
|
||
RSTRUCT(st)->as.ary : \
|
||
RSTRUCT(st)->as.heap.ptr)
|
||
#define RSTRUCT_PTR(st) ((VALUE *)RSTRUCT_CONST_PTR(RGENGC_WB_PROTECTED_STRUCT ? OBJ_WB_UNPROTECT((VALUE)st) : (VALUE)st))
|
||
#define RSTRUCT_SET(st, idx, v) RB_OBJ_WRITE(st, &RSTRUCT_CONST_PTR(st)[idx], (v))
|
||
#define RSTRUCT_GET(st, idx) (RSTRUCT_CONST_PTR(st)[idx])
|
||
#define RSTRUCT(obj) (R_CAST(RStruct)(obj))
|
||
/* class.c */
|
||
void rb_class_subclass_add(VALUE super, VALUE klass);
|
||
void rb_class_remove_from_super_subclasses(VALUE);
|
struct.c | ||
---|---|---|
}
|
||
static VALUE
|
||
rb_struct_size(VALUE s);
|
||
static VALUE
|
||
struct_enum_size(VALUE s, VALUE args, VALUE eobj)
|
||
{
|
||
return rb_struct_size(s);
|
||
... | ... | |
* joe.length #=> 3
|
||
*/
|
||
static VALUE
|
||
VALUE
|
||
rb_struct_size(VALUE s)
|
||
{
|
||
return LONG2FIX(RSTRUCT_LEN(s));
|
||
}
|
||
VALUE const*
|
||
rb_struct_ptr(VALUE s)
|
||
{
|
||
return RSTRUCT_CONST_PTR(s);
|
||
}
|
||
/*
|
||
* A Struct is a convenient way to bundle a number of attributes together,
|
||
* using accessor methods, without having to write an explicit class.
|