summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-08-07 17:32:09 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-08-07 17:32:09 +0900
commit81f1476a0445b27b58416a2ccd40cb43e2341e48 (patch)
tree98d3450aff45bca8203c4fdc175c46f8bbab28e3
parent7d82b935db709f5c8be83e2ca64ad9d02ec5c0e9 (diff)
parent7389ae4b7d6299da5c4a2d2442946a97e8c06e75 (diff)
downloadmruby-81f1476a0445b27b58416a2ccd40cb43e2341e48.tar.gz
mruby-81f1476a0445b27b58416a2ccd40cb43e2341e48.zip
Merge branch 'full-nan-boxing' of https://github.com/wasabiz/mruby into wasabiz-full-nan-boxing
-rw-r--r--include/mruby/array.h4
-rw-r--r--include/mruby/class.h8
-rw-r--r--include/mruby/data.h2
-rw-r--r--include/mruby/hash.h4
-rw-r--r--include/mruby/proc.h2
-rw-r--r--include/mruby/range.h2
-rw-r--r--include/mruby/string.h4
-rw-r--r--include/mruby/value.h69
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c4
-rw-r--r--src/etc.c2
-rw-r--r--src/object.c2
11 files changed, 60 insertions, 43 deletions
diff --git a/include/mruby/array.h b/include/mruby/array.h
index d52ca1596..f7fabf3b1 100644
--- a/include/mruby/array.h
+++ b/include/mruby/array.h
@@ -27,9 +27,9 @@ struct RArray {
mrb_value *ptr;
};
-#define mrb_ary_ptr(v) ((struct RArray*)((v).value.p))
+#define mrb_ary_ptr(v) ((struct RArray*)(mrb_value_p(v)))
#define mrb_ary_value(p) mrb_obj_value((void*)(p))
-#define RARRAY(v) ((struct RArray*)((v).value.p))
+#define RARRAY(v) ((struct RArray*)(mrb_value_p(v)))
#define RARRAY_LEN(a) (RARRAY(a)->len)
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
diff --git a/include/mruby/class.h b/include/mruby/class.h
index 4ab954d9e..45b48fc1a 100644
--- a/include/mruby/class.h
+++ b/include/mruby/class.h
@@ -18,10 +18,10 @@ struct RClass {
struct RClass *super;
};
-#define mrb_class_ptr(v) ((struct RClass*)((v).value.p))
-#define RCLASS_SUPER(v) (((struct RClass*)((v).value.p))->super)
-#define RCLASS_IV_TBL(v) (((struct RClass*)((v).value.p))->iv)
-#define RCLASS_M_TBL(v) (((struct RClass*)((v).value.p))->mt)
+#define mrb_class_ptr(v) ((struct RClass*)(mrb_value_p(v)))
+#define RCLASS_SUPER(v) (((struct RClass*)(mrb_value_p(v)))->super)
+#define RCLASS_IV_TBL(v) (((struct RClass*)(mrb_value_p(v)))->iv)
+#define RCLASS_M_TBL(v) (((struct RClass*)(mrb_value_p(v)))->mt)
static inline struct RClass*
mrb_class(mrb_state *mrb, mrb_value v)
diff --git a/include/mruby/data.h b/include/mruby/data.h
index c6b380f28..ad3f279c9 100644
--- a/include/mruby/data.h
+++ b/include/mruby/data.h
@@ -34,7 +34,7 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *
data = Data_Wrap_Struct(mrb,klass,type,sval);\
} while (0)
-#define RDATA(obj) ((struct RData *)((obj).value.p))
+#define RDATA(obj) ((struct RData *)(mrb_value_p(obj)))
#define DATA_PTR(d) (RDATA(d)->data)
#define DATA_TYPE(d) (RDATA(d)->type)
void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
diff --git a/include/mruby/hash.h b/include/mruby/hash.h
index c331db157..92e77bdb9 100644
--- a/include/mruby/hash.h
+++ b/include/mruby/hash.h
@@ -17,7 +17,7 @@ struct RHash {
struct kh_ht *ht;
};
-#define mrb_hash_ptr(v) ((struct RHash*)((v).value.p))
+#define mrb_hash_ptr(v) ((struct RHash*)(mrb_value_p(v)))
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
mrb_value mrb_hash_new_capa(mrb_state*, int);
@@ -33,7 +33,7 @@ mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self);
mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
/* RHASH_TBL allocates st_table if not available. */
-#define RHASH(obj) ((struct RHash*)((obj).value.p))
+#define RHASH(obj) ((struct RHash*)(mrb_value_p(obj)))
#define RHASH_TBL(h) (RHASH(h)->ht)
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern2(mrb, "ifnone", 6))
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
diff --git a/include/mruby/proc.h b/include/mruby/proc.h
index 8c6146860..2073494e1 100644
--- a/include/mruby/proc.h
+++ b/include/mruby/proc.h
@@ -44,7 +44,7 @@ struct RProc {
#define MRB_PROC_STRICT 256
#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
-#define mrb_proc_ptr(v) ((struct RProc*)((v).value.p))
+#define mrb_proc_ptr(v) ((struct RProc*)(mrb_value_p(v)))
struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
diff --git a/include/mruby/range.h b/include/mruby/range.h
index a87f1cc6a..9ec492ada 100644
--- a/include/mruby/range.h
+++ b/include/mruby/range.h
@@ -22,7 +22,7 @@ struct RRange {
int excl;
};
-#define mrb_range_ptr(v) ((struct RRange*)((v).value.p))
+#define mrb_range_ptr(v) ((struct RRange*)(mrb_value_p(v)))
#define mrb_range_value(p) mrb_obj_value((void*)(p))
mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, int);
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 000c80b09..f789771db 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -25,8 +25,8 @@ struct RString {
char *ptr;
};
-#define mrb_str_ptr(s) ((struct RString*)((s).value.p))
-#define RSTRING(s) ((struct RString*)((s).value.p))
+#define mrb_str_ptr(s) ((struct RString*)(mrb_value_p(s)))
+#define RSTRING(s) ((struct RString*)(mrb_value_p(s)))
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
#define RSTRING_LEN(s) (RSTRING(s)->len)
#define RSTRING_CAPA(s) (RSTRING(s)->aux.capa)
diff --git a/include/mruby/value.h b/include/mruby/value.h
index e78035b5f..1ec7c0dae 100644
--- a/include/mruby/value.h
+++ b/include/mruby/value.h
@@ -129,27 +129,45 @@ enum mrb_vtype {
typedef struct mrb_value {
union {
mrb_float f;
- struct {
- MRB_ENDIAN_LOHI(
- uint32_t ttt;
- ,union {
- void *p;
- mrb_int i;
- mrb_sym sym;
- } value;
- )
- };
+ union {
+ void *p;
+ struct {
+ MRB_ENDIAN_LOHI(
+ uint32_t ttt;
+ ,union {
+ mrb_int i;
+ mrb_sym sym;
+ };
+ )
+ };
+ } value;
};
} mrb_value;
-#define mrb_tt(o) ((o).ttt & 0xff)
-#define mrb_mktt(tt) (0xfff00000|(tt))
-#define mrb_type(o) ((uint32_t)0xfff00000 < (o).ttt ? mrb_tt(o) : MRB_TT_FLOAT)
-#define mrb_float(o) (o).f
+/* value representation by nan-boxing:
+ * float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
+ * object: 111111111111TTTT TTPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP
+ * int : 1111111111110001 0000000000000000 IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII
+ * sym : 1111111111110001 0100000000000000 SSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSS
+ * In order to get enough bit size to save TT, all pointers are shifted 2 bits
+ * in the right direction.
+ */
+#define mrb_tt(o) (((o).value.ttt & 0xfc000)>>14)
+#define mrb_mktt(tt) (0xfff00000|((tt)<<14))
+#define mrb_type(o) ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
+#define mrb_value_p(o) ((void*)((((uint64_t)0x3fffffffffff)&((uint64_t)((o).value.p)))<<2))
+#define mrb_float(o) (o).f
#define MRB_SET_VALUE(o, tt, attr, v) do {\
- (o).ttt = mrb_mktt(tt);\
- (o).attr = v;\
+ (o).value.ttt = mrb_mktt(tt);\
+ switch (tt) {\
+ case MRB_TT_FALSE:\
+ case MRB_TT_TRUE:\
+ case MRB_TT_UNDEF:\
+ case MRB_TT_FIXNUM:\
+ case MRB_TT_SYMBOL: (o).attr = (v); break;\
+ default: (o).value.i = 0; (o).value.p = (void*)((uint64_t)(o).value.p | (((uint64_t)(v))>>2)); break;\
+ }\
} while (0)
static inline mrb_value
@@ -158,7 +176,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
mrb_value v;
if (f != f) {
- v.ttt = 0x7ff80000;
+ v.value.ttt = 0x7ff80000;
v.value.i = 0;
} else {
v.f = f;
@@ -229,7 +247,8 @@ typedef union mrb_value {
unsigned long w;
} mrb_value;
-#define mrb_float(o) (o).value.fp->f
+#define mrb_value_p(o) (o).value.p
+#define mrb_float(o) (o).value.fp->f
#define MRB_SET_VALUE(o, ttt, attr, v) do {\
(o).w = 0;\
@@ -261,8 +280,9 @@ typedef struct mrb_value {
enum mrb_vtype tt;
} mrb_value;
-#define mrb_type(o) (o).tt
-#define mrb_float(o) (o).value.f
+#define mrb_type(o) (o).tt
+#define mrb_value_p(o) (o).value.p
+#define mrb_float(o) (o).value.f
#define MRB_SET_VALUE(o, ttt, attr, v) do {\
(o).tt = ttt;\
@@ -291,8 +311,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
#define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
#else
-
-#define mrb_voidp(o) (o).value.p
+#define mrb_voidp(o) mrb_value_p(o)
#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !(o).value.i)
@@ -339,8 +358,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f)
struct RBasic {
MRB_OBJECT_HEADER;
};
-
-#define mrb_basic_ptr(v) ((struct RBasic*)((v).value.p))
+#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_value_p(v)))
/* obsolete macro mrb_basic; will be removed soon */
#define mrb_basic(v) mrb_basic_ptr(v)
@@ -348,8 +366,7 @@ struct RObject {
MRB_OBJECT_HEADER;
struct iv_tbl *iv;
};
-
-#define mrb_obj_ptr(v) ((struct RObject*)((v).value.p))
+#define mrb_obj_ptr(v) ((struct RObject*)(mrb_value_p(v)))
/* obsolete macro mrb_object; will be removed soon */
#define mrb_object(o) mrb_obj_ptr(o)
#define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_VOIDP)
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index bd9abe125..4c844ec9c 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -62,7 +62,7 @@ static mrb_value
fiber_init(mrb_state *mrb, mrb_value self)
{
static const struct mrb_context mrb_context_zero = { 0 };
- struct RFiber *f = (struct RFiber*)self.value.p;
+ struct RFiber *f = (struct RFiber*)mrb_value_p(self);
struct mrb_context *c;
struct RProc *p;
mrb_callinfo *ci;
@@ -113,7 +113,7 @@ fiber_init(mrb_state *mrb, mrb_value self)
static struct mrb_context*
fiber_check(mrb_state *mrb, mrb_value fib)
{
- struct RFiber *f = (struct RFiber*)fib.value.p;
+ struct RFiber *f = (struct RFiber*)mrb_value_p(fib);
if (!f->cxt) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized Fiber");
diff --git a/src/etc.c b/src/etc.c
index 2aee0f0f7..368685cf1 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -176,7 +176,7 @@ mrb_obj_id(mrb_value obj)
case MRB_TT_FILE:
case MRB_TT_DATA:
default:
- return MakeID(obj.value.p);
+ return MakeID(mrb_value_p(obj));
}
}
diff --git a/src/object.c b/src/object.c
index 5b2278767..5da5f651a 100644
--- a/src/object.c
+++ b/src/object.c
@@ -29,7 +29,7 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
return (mrb_float(v1) == mrb_float(v2));
default:
- return (v1.value.p == v2.value.p);
+ return (mrb_value_p(v1) == mrb_value_p(v2));
}
}