aboutsummaryrefslogtreecommitdiffstats
path: root/ruby.h
diff options
context:
space:
mode:
Diffstat (limited to 'ruby.h')
-rw-r--r--ruby.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/ruby.h b/ruby.h
index 36b146dd46..4244cd4ee4 100644
--- a/ruby.h
+++ b/ruby.h
@@ -417,11 +417,27 @@ VALUE rb_data_object_alloc(VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC);
sval = (type*)DATA_PTR(obj);\
} while (0)
+#define RSTRUCT_EMBED_LEN_MAX 3
struct RStruct {
struct RBasic basic;
- long len;
- VALUE *ptr;
+ union {
+ struct {
+ long len;
+ VALUE *ptr;
+ } heap;
+ VALUE ary[RSTRUCT_EMBED_LEN_MAX];
+ } as;
};
+#define RSTRUCT_EMBED_LEN_MASK (FL_USER1|FL_USER0)
+#define RSTRUCT_EMBED_LEN_SHIFT FL_USHIFT
+#define RSTRUCT_LEN(st) \
+ ((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
+ (RBASIC(st)->flags >> RSTRUCT_EMBED_LEN_SHIFT) & 3 : \
+ RSTRUCT(st)->as.heap.len)
+#define RSTRUCT_PTR(st) \
+ ((RBASIC(st)->flags & RSTRUCT_EMBED_LEN_MASK) ? \
+ RSTRUCT(st)->as.ary : \
+ RSTRUCT(st)->as.heap.ptr)
struct RBignum {
struct RBasic basic;