diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-09-02 14:42:08 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-09-02 14:42:08 +0000 |
commit | 05e2cba4dc2d2ddd48bbe849acaaa511e181a1a6 (patch) | |
tree | 3e6db7f9ecee480edff058e18bc7211a53296f64 /ruby.h | |
parent | cf4b4b4ed9283d87497b661fc1ac5172db6030c4 (diff) | |
download | ruby-05e2cba4dc2d2ddd48bbe849acaaa511e181a1a6.tar.gz ruby-05e2cba4dc2d2ddd48bbe849acaaa511e181a1a6.tar.xz ruby-05e2cba4dc2d2ddd48bbe849acaaa511e181a1a6.zip |
* ruby.h (struct RArray): embed small arrays.
(RARRAY_LEN): defined for accessing array members.
(RARRAY_PTR): ditto.
* array.c: use RARRAY_LEN and RARRAY_PTR.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@10833 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.h')
-rw-r--r-- | ruby.h | 28 |
1 files changed, 23 insertions, 5 deletions
@@ -390,15 +390,33 @@ struct RString { RSTRING(str)->as.ary : \ RSTRING(str)->as.heap.ptr) +#define RARRAY_EMBED_LEN_MAX 3 struct RArray { struct RBasic basic; - long len; union { - long capa; - VALUE shared; - } aux; - VALUE *ptr; + struct { + long len; + union { + long capa; + VALUE shared; + } aux; + VALUE *ptr; + } heap; + VALUE ary[RARRAY_EMBED_LEN_MAX]; + } as; }; +#define RARRAY_NOEMBED FL_USER3 +#define RARRAY_EMBED_LEN_MASK (FL_USER4|FL_USER5) +#define RARRAY_EMBED_LEN_SHIFT (FL_USHIFT+4) +#define RARRAY_LEN(a) \ + (!(RBASIC(a)->flags & RARRAY_NOEMBED) ? \ + (long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \ + (RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)) : \ + RARRAY(a)->as.heap.len) +#define RARRAY_PTR(a) \ + (!(RBASIC(a)->flags & RARRAY_NOEMBED) ? \ + RARRAY(a)->as.ary : \ + RARRAY(a)->as.heap.ptr) struct RRegexp { struct RBasic basic; |