summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/mrbconf.h11
-rw-r--r--include/mruby.h151
-rw-r--r--include/mruby/array.h2
-rw-r--r--include/mruby/cdump.h2
-rw-r--r--include/mruby/class.h2
-rw-r--r--include/mruby/compile.h2
-rw-r--r--include/mruby/data.h2
-rw-r--r--include/mruby/dump.h2
-rw-r--r--include/mruby/hash.h2
-rw-r--r--include/mruby/irep.h2
-rw-r--r--include/mruby/khash.h2
-rw-r--r--include/mruby/numeric.h2
-rw-r--r--include/mruby/object.h13
-rw-r--r--include/mruby/proc.h2
-rw-r--r--include/mruby/range.h2
-rw-r--r--include/mruby/string.h2
-rw-r--r--include/mruby/struct.h2
-rw-r--r--include/mruby/value.h240
-rw-r--r--include/mruby/variable.h2
19 files changed, 270 insertions, 175 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 380c5f24c..d2a5b7449 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -35,154 +35,7 @@ extern "C" {
#include <stdlib.h>
#include "mrbconf.h"
-enum mrb_vtype {
- MRB_TT_FALSE = 0, /* 0 */
- MRB_TT_FREE, /* 1 */
- MRB_TT_TRUE, /* 2 */
- MRB_TT_FIXNUM, /* 3 */
- MRB_TT_SYMBOL, /* 4 */
- MRB_TT_UNDEF, /* 5 */
- MRB_TT_FLOAT, /* 6 */
- MRB_TT_OBJECT, /* 7 */
- MRB_TT_CLASS, /* 8 */
- MRB_TT_MODULE, /* 9 */
- MRB_TT_ICLASS, /* 10 */
- MRB_TT_SCLASS, /* 11 */
- MRB_TT_PROC, /* 12 */
- MRB_TT_ARRAY, /* 13 */
- MRB_TT_HASH, /* 14 */
- MRB_TT_STRING, /* 15 */
- MRB_TT_RANGE, /* 16 */
- MRB_TT_REGEX, /* 17 */
- MRB_TT_STRUCT, /* 18 */
- MRB_TT_EXCEPTION, /* 19 */
- MRB_TT_MATCH, /* 20 */
- MRB_TT_FILE, /* 21 */
- MRB_TT_ENV, /* 22 */
- MRB_TT_DATA, /* 23 */
- MRB_TT_MAXDEFINE /* 24 */
-};
-
-typedef struct mrb_value {
- union {
- mrb_float f;
- void *p;
- mrb_int i;
- mrb_sym sym;
- } value;
- enum mrb_vtype tt:8;
-} 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_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)
-
-#include "mruby/object.h"
-
-#define IMMEDIATE_P(x) (mrb_type(x) <= MRB_TT_FLOAT)
-#define SPECIAL_CONST_P(x) IMMEDIATE_P(x)
-#define SYMBOL_P(o) (mrb_type(o) == MRB_TT_SYMBOL)
-#define RTEST(o) mrb_test(o)
-
-#define FL_ABLE(x) (!SPECIAL_CONST_P(x))
-#define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0)
-#define FL_ANY(x,f) FL_TEST(x,f)
-#define FL_ALL(x,f) (FL_TEST(x,f) == (f))
-#define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0)
-#define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
-
-static inline mrb_int
-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_value v;
-
- v.tt = MRB_TT_FLOAT;
- v.value.f = f;
- return v;
-}
-
-static inline mrb_value
-mrb_symbol_value(mrb_sym i)
-{
- mrb_value v;
-
- v.tt = MRB_TT_SYMBOL;
- v.value.sym = i;
- return v;
-}
-
-static inline mrb_value
-mrb_obj_value(void *p)
-{
- mrb_value v;
- struct RBasic *b = (struct RBasic*) p;
-
- v.tt = b->tt;
- v.value.p = p;
- return v;
-}
-
-static inline mrb_value
-mrb_false_value(void)
-{
- mrb_value v;
-
- v.tt = MRB_TT_FALSE;
- v.value.i = 1;
- return v;
-}
-
-static inline mrb_value
-mrb_nil_value(void)
-{
- mrb_value v;
-
- v.tt = MRB_TT_FALSE;
- v.value.i = 0;
- return v;
-}
-
-static inline mrb_value
-mrb_true_value(void)
-{
- mrb_value v;
-
- v.tt = MRB_TT_TRUE;
- v.value.i = 1;
- return v;
-}
-
-static inline mrb_value
-mrb_undef_value(void)
-{
- mrb_value v;
-
- v.tt = MRB_TT_UNDEF;
- v.value.i = 0;
- return v;
-}
+#include "mruby/value.h"
typedef int32_t mrb_code;
@@ -376,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 e42a5f428..3b4437c65 100644
--- a/include/mruby/object.h
+++ b/include/mruby/object.h
@@ -1,5 +1,5 @@
/*
-** object.h - Object, NilClass, TrueClass, FalseClass class
+** mruby/object.h - Object, NilClass, TrueClass, FalseClass class
**
** See Copyright Notice in mruby.h
*/
@@ -7,18 +7,13 @@
#ifndef MRUBY_OBJECT_H
#define MRUBY_OBJECT_H
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
#define MRUBY_OBJECT_HEADER \
- enum mrb_vtype tt:8; \
+ enum mrb_vtype tt; \
unsigned int color:3;\
unsigned int flags:21;\
struct RClass *c;\
struct RBasic *gcnext
-
/* white: 011, black: 100, gray: 000 */
#define MRB_GC_GRAY 0
#define MRB_GC_WHITE_A 1
@@ -54,8 +49,4 @@ struct RObject {
#define ROBJECT_IVPTR(v) (((struct RObject*)((v).value.p))->iv)
#define ROBJECT_NUMIV(v) (ROBJECT_IVPTR(v) ? ROBJECT_IVPTR(v)->size : 0)
-#if defined(__cplusplus)
-} /* extern "C" { */
-#endif
-
#endif /* MRUBY_OBJECT_H */
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
new file mode 100644
index 000000000..6cbe95509
--- /dev/null
+++ b/include/mruby/value.h
@@ -0,0 +1,240 @@
+/*
+** mruby/value.h - mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VALUE_H
+#define MRUBY_VALUE_H
+
+#ifndef MRB_NAN_BOXING
+
+enum mrb_vtype {
+ MRB_TT_FALSE = 0, /* 0 */
+ MRB_TT_FREE, /* 1 */
+ MRB_TT_TRUE, /* 2 */
+ MRB_TT_FIXNUM, /* 3 */
+ MRB_TT_SYMBOL, /* 4 */
+ MRB_TT_UNDEF, /* 5 */
+ MRB_TT_FLOAT, /* 6 */
+ MRB_TT_OBJECT, /* 7 */
+ MRB_TT_CLASS, /* 8 */
+ MRB_TT_MODULE, /* 9 */
+ MRB_TT_ICLASS, /* 10 */
+ MRB_TT_SCLASS, /* 11 */
+ MRB_TT_PROC, /* 12 */
+ MRB_TT_ARRAY, /* 13 */
+ MRB_TT_HASH, /* 14 */
+ MRB_TT_STRING, /* 15 */
+ MRB_TT_RANGE, /* 16 */
+ MRB_TT_REGEX, /* 17 */
+ MRB_TT_STRUCT, /* 18 */
+ MRB_TT_EXCEPTION, /* 19 */
+ MRB_TT_MATCH, /* 20 */
+ MRB_TT_FILE, /* 21 */
+ MRB_TT_ENV, /* 22 */
+ MRB_TT_DATA, /* 23 */
+ MRB_TT_MAXDEFINE /* 24 */
+};
+
+typedef struct mrb_value {
+ union {
+ mrb_float f;
+ void *p;
+ mrb_int i;
+ mrb_sym sym;
+ } value;
+ enum mrb_vtype tt:8;
+} mrb_value;
+
+#define mrb_type(o) (o).tt
+#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;
+
+ if (f != f) {
+ v.ttt = 0x7ff80000;
+ v.value.i = 0;
+ } else {
+ 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) (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"
+
+#define IMMEDIATE_P(x) (mrb_type(x) <= MRB_TT_FLOAT)
+#define SPECIAL_CONST_P(x) IMMEDIATE_P(x)
+#define SYMBOL_P(o) (mrb_type(o) == MRB_TT_SYMBOL)
+#define RTEST(o) mrb_test(o)
+
+#define FL_ABLE(x) (!SPECIAL_CONST_P(x))
+#define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0)
+#define FL_ANY(x,f) FL_TEST(x,f)
+#define FL_ALL(x,f) (FL_TEST(x,f) == (f))
+#define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0)
+#define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
+
+static inline mrb_int
+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;
+
+ MRB_SET_VALUE(v, MRB_TT_FIXNUM, value.i, i);
+ return v;
+}
+
+static inline mrb_value
+mrb_symbol_value(mrb_sym i)
+{
+ mrb_value v;
+
+ MRB_SET_VALUE(v, MRB_TT_SYMBOL, value.sym, i);
+ return v;
+}
+
+static inline mrb_value
+mrb_obj_value(void *p)
+{
+ mrb_value v;
+ struct RBasic *b = (struct RBasic*) p;
+
+ MRB_SET_VALUE(v, b->tt, value.p, p);
+ return v;
+}
+
+static inline mrb_value
+mrb_false_value(void)
+{
+ mrb_value v;
+
+ MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 1);
+ return v;
+}
+
+static inline mrb_value
+mrb_nil_value(void)
+{
+ mrb_value v;
+
+ MRB_SET_VALUE(v, MRB_TT_FALSE, value.i, 0);
+ return v;
+}
+
+static inline mrb_value
+mrb_true_value(void)
+{
+ mrb_value v;
+
+ MRB_SET_VALUE(v, MRB_TT_TRUE, value.i, 1);
+ return v;
+}
+
+static inline mrb_value
+mrb_undef_value(void)
+{
+ mrb_value v;
+
+ MRB_SET_VALUE(v, MRB_TT_UNDEF, value.i, 0);
+ return v;
+}
+
+#endif /* MRUBY_OBJECT_H */
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
*/