diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-08-14 13:16:34 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-08-14 13:16:34 +0900 |
| commit | 7d02df3016b0c6eb3f4ee945198772cf4ebca3fa (patch) | |
| tree | af4c35ee567e9be3e2ef6ca0c34dbd10440550bc /include | |
| parent | e74600c919cdadab1b4e605e50181f8cdafe7ab3 (diff) | |
| download | mruby-7d02df3016b0c6eb3f4ee945198772cf4ebca3fa.tar.gz mruby-7d02df3016b0c6eb3f4ee945198772cf4ebca3fa.zip | |
NaN boxing
Diffstat (limited to 'include')
| -rw-r--r-- | include/mrbconf.h | 11 | ||||
| -rw-r--r-- | include/mruby.h | 2 | ||||
| -rw-r--r-- | include/mruby/array.h | 2 | ||||
| -rw-r--r-- | include/mruby/cdump.h | 2 | ||||
| -rw-r--r-- | include/mruby/class.h | 2 | ||||
| -rw-r--r-- | include/mruby/compile.h | 2 | ||||
| -rw-r--r-- | include/mruby/data.h | 2 | ||||
| -rw-r--r-- | include/mruby/dump.h | 2 | ||||
| -rw-r--r-- | include/mruby/hash.h | 2 | ||||
| -rw-r--r-- | include/mruby/irep.h | 2 | ||||
| -rw-r--r-- | include/mruby/khash.h | 2 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 2 | ||||
| -rw-r--r-- | include/mruby/object.h | 2 | ||||
| -rw-r--r-- | include/mruby/proc.h | 2 | ||||
| -rw-r--r-- | include/mruby/range.h | 2 | ||||
| -rw-r--r-- | include/mruby/string.h | 2 | ||||
| -rw-r--r-- | include/mruby/struct.h | 2 | ||||
| -rw-r--r-- | include/mruby/value.h | 134 | ||||
| -rw-r--r-- | include/mruby/variable.h | 2 |
19 files changed, 133 insertions, 46 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index 693e7da88..e308e8f82 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -13,6 +13,12 @@ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT +/* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT */ +//#define MRB_NAN_BOXING + +/* define on big endian machines; used by MRB_NAN_BOXING */ +//#define MRB_ENDIAN_BIG + /* argv max size in mrb_funcall */ //#define MRB_FUNCALL_ARGC_MAX 16 @@ -54,8 +60,13 @@ typedef double mrb_float; #endif #define readfloat(p) (mrb_float)strtod((p),NULL) +#ifdef MRB_NAN_BOXING +typedef int32_t mrb_int; +typedef int32_t mrb_sym; +#else typedef int mrb_int; typedef intptr_t mrb_sym; +#endif /* define ENABLE_XXXX from DISABLE_XXX */ #ifndef DISABLE_REGEXP diff --git a/include/mruby.h b/include/mruby.h index 6257bee4d..d2a5b7449 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -229,7 +229,7 @@ int mrb_gc_arena_save(mrb_state*); void mrb_gc_arena_restore(mrb_state*,int); void mrb_gc_mark(mrb_state*,struct RBasic*); #define mrb_gc_mark_value(mrb,val) do {\ - if ((val).tt >= MRB_TT_OBJECT) mrb_gc_mark((mrb), mrb_object(val));\ + if (mrb_type(val) >= MRB_TT_OBJECT) mrb_gc_mark((mrb), mrb_object(val));\ } while (0); void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*); #define mrb_field_write_barrier_value(mrb, obj, val) do{\ diff --git a/include/mruby/array.h b/include/mruby/array.h index bc10d8919..d0d254936 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -1,5 +1,5 @@ /* -** array.h - Array class +** mruby/array.h - Array class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/cdump.h b/include/mruby/cdump.h index 15108d51f..14a365081 100644 --- a/include/mruby/cdump.h +++ b/include/mruby/cdump.h @@ -1,5 +1,5 @@ /* -** cdump.h - mruby binary dumper (C source format) +** mruby/cdump.h - mruby binary dumper (C source format) ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/class.h b/include/mruby/class.h index b4a2e9471..0d7f77088 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -1,5 +1,5 @@ /* -** class.h - Class class +** mruby/class.h - Class class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/compile.h b/include/mruby/compile.h index aae1b06b1..404582c94 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -1,5 +1,5 @@ /* -** compile.h - mruby parser +** mruby/compile.h - mruby parser ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/data.h b/include/mruby/data.h index ca2a04b55..18ca685b1 100644 --- a/include/mruby/data.h +++ b/include/mruby/data.h @@ -1,5 +1,5 @@ /* -** data.h - Data class +** mruby/data.h - Data class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/dump.h b/include/mruby/dump.h index f098ad737..0826606e9 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -1,5 +1,5 @@ /* -** dump.h - mruby binary dumper (Rite binary format) +** mruby/dump.h - mruby binary dumper (Rite binary format) ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 2b0aeeef2..85303935c 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -1,5 +1,5 @@ /* -** hash.h - Hash class +** mruby/hash.h - Hash class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/irep.h b/include/mruby/irep.h index d92aef9a0..af3346c0a 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -1,5 +1,5 @@ /* -** irep.h - mrb_irep structure +** mruby/irep.h - mrb_irep structure ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 16a35c3d5..ad03b1fad 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -1,5 +1,5 @@ /* -** ritehash.c - Rite Hash for mruby +** mruby/khash.c - Hash for mruby ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 867aa27d9..fed9ad39a 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -1,5 +1,5 @@ /* -** numeric.h - Numeric, Integer, Float, Fixnum class +** mruby/numeric.h - Numeric, Integer, Float, Fixnum class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/object.h b/include/mruby/object.h index 19da3ebef..3b4437c65 100644 --- a/include/mruby/object.h +++ b/include/mruby/object.h @@ -8,7 +8,7 @@ #define MRUBY_OBJECT_H #define MRUBY_OBJECT_HEADER \ - enum mrb_vtype tt:8; \ + enum mrb_vtype tt; \ unsigned int color:3;\ unsigned int flags:21;\ struct RClass *c;\ diff --git a/include/mruby/proc.h b/include/mruby/proc.h index f6bef23a5..4f9746d1d 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -1,5 +1,5 @@ /* -** proc.h - Proc class +** mruby/proc.h - Proc class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/range.h b/include/mruby/range.h index 036cdd574..f70aa5668 100644 --- a/include/mruby/range.h +++ b/include/mruby/range.h @@ -1,5 +1,5 @@ /* -** range.h - Range class +** mruby/range.h - Range class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/string.h b/include/mruby/string.h index c6f7c4ab5..dac8107e3 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -1,5 +1,5 @@ /* -** string.h - String class +** mruby/string.h - String class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/struct.h b/include/mruby/struct.h index 514f66dfe..cfe6df135 100644 --- a/include/mruby/struct.h +++ b/include/mruby/struct.h @@ -1,5 +1,5 @@ /* -** struct.h - Struct class +** mruby/struct.h - Struct class ** ** See Copyright Notice in mruby.h */ diff --git a/include/mruby/value.h b/include/mruby/value.h index 2c384fa4d..adc6b6d44 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -7,6 +7,8 @@ #ifndef MRUBY_VALUE_H #define MRUBY_VALUE_H +#ifndef MRB_NAN_BOXING + enum mrb_vtype { MRB_TT_FALSE = 0, /* 0 */ MRB_TT_FREE, /* 1 */ @@ -46,14 +48,104 @@ typedef struct mrb_value { } mrb_value; #define mrb_type(o) (o).tt -#define mrb_nil_p(o) ((o).tt == MRB_TT_FALSE && !(o).value.i) -#define mrb_test(o) ((o).tt != MRB_TT_FALSE) -#define mrb_fixnum(o) (o).value.i #define mrb_float(o) (o).value.f + +#define MRB_SET_VALUE(o, ttt, attr, v) do {\ + (o).tt = ttt;\ + (o).attr = v;\ +} while (0); + +static inline mrb_value +mrb_float_value(mrb_float f) +{ + mrb_value v; + + MRB_SET_VALUE(v, MRB_TT_FLOAT, value.f, f); + return v; +} +#else /* MRB_NAN_BOXING */ + +#ifdef MRB_USE_FLOAT +# error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<---- +#endif + +enum mrb_vtype { + MRB_TT_FALSE = 1, /* 1 */ + MRB_TT_FREE, /* 2 */ + MRB_TT_TRUE, /* 3 */ + MRB_TT_FIXNUM, /* 4 */ + MRB_TT_SYMBOL, /* 5 */ + MRB_TT_UNDEF, /* 6 */ + MRB_TT_FLOAT, /* 7 */ + MRB_TT_OBJECT, /* 8 */ + MRB_TT_CLASS, /* 9 */ + MRB_TT_MODULE, /* 10 */ + MRB_TT_ICLASS, /* 11 */ + MRB_TT_SCLASS, /* 12 */ + MRB_TT_PROC, /* 13 */ + MRB_TT_ARRAY, /* 14 */ + MRB_TT_HASH, /* 15 */ + MRB_TT_STRING, /* 16 */ + MRB_TT_RANGE, /* 17 */ + MRB_TT_REGEX, /* 18 */ + MRB_TT_STRUCT, /* 19 */ + MRB_TT_EXCEPTION, /* 20 */ + MRB_TT_MATCH, /* 21 */ + MRB_TT_FILE, /* 22 */ + MRB_TT_ENV, /* 23 */ + MRB_TT_DATA, /* 24 */ + MRB_TT_MAXDEFINE /* 25 */ +}; + +#ifdef MRB_ENDIAN_BIG +#define MRB_ENDIAN_LOHI(a,b) a b +#else +#define MRB_ENDIAN_LOHI(a,b) b a +#endif + +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; + ) + }; + }; +} 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 + +#define MRB_SET_VALUE(o, tt, attr, v) do {\ + (o).ttt = mrb_mktt(tt);\ + (o).attr = v;\ +} while (0); + +static inline mrb_value +mrb_float_value(mrb_float f) +{ + mrb_value v; + + v.f = f; + return v; +} +#endif /* MRB_NAN_BOXING */ + +#define mrb_fixnum(o) (o).value.i #define mrb_symbol(o) (o).value.sym #define mrb_object(o) ((struct RBasic *) (o).value.p) -#define FIXNUM_P(o) ((o).tt == MRB_TT_FIXNUM) -#define mrb_undef_p(o) ((o).tt == MRB_TT_UNDEF) +#define 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) +#define mrb_test(o) (mrb_type(o) != MRB_TT_FALSE) #include "mruby/object.h" @@ -75,23 +167,13 @@ mrb_special_const_p(mrb_value obj) if (SPECIAL_CONST_P(obj)) return 1; return 0; } -static inline mrb_value -mrb_fixnum_value(mrb_int i) -{ - mrb_value v; - - v.tt = MRB_TT_FIXNUM; - v.value.i = i; - return v; -} static inline mrb_value -mrb_float_value(mrb_float f) +mrb_fixnum_value(mrb_int i) { mrb_value v; - v.tt = MRB_TT_FLOAT; - v.value.f = f; + MRB_SET_VALUE(v, MRB_TT_FIXNUM, value.i, i); return v; } @@ -100,8 +182,7 @@ mrb_symbol_value(mrb_sym i) { mrb_value v; - v.tt = MRB_TT_SYMBOL; - v.value.sym = i; + MRB_SET_VALUE(v, MRB_TT_SYMBOL, value.sym, i); return v; } @@ -111,8 +192,7 @@ mrb_obj_value(void *p) mrb_value v; struct RBasic *b = (struct RBasic*) p; - v.tt = b->tt; - v.value.p = p; + MRB_SET_VALUE(v, b->tt, value.p, p); return v; } @@ -121,8 +201,7 @@ mrb_false_value(void) { mrb_value v; - v.tt = MRB_TT_FALSE; - v.value.i = 1; + MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 1); return v; } @@ -131,8 +210,7 @@ mrb_nil_value(void) { mrb_value v; - v.tt = MRB_TT_FALSE; - v.value.i = 0; + MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 0); return v; } @@ -141,8 +219,7 @@ mrb_true_value(void) { mrb_value v; - v.tt = MRB_TT_TRUE; - v.value.i = 1; + MRB_SET_VALUE(v, MRB_TT_TRUE, value.i, 1); return v; } @@ -151,8 +228,7 @@ mrb_undef_value(void) { mrb_value v; - v.tt = MRB_TT_UNDEF; - v.value.i = 0; + MRB_SET_VALUE(v, MRB_TT_UNDEF, value.i, 0); return v; } diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 0dac75c5b..e805b4b2b 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -1,5 +1,5 @@ /* -** variable.h - mruby variables +** mruby/variable.h - mruby variables ** ** See Copyright Notice in mruby.h */ |
