diff options
| author | Paolo Bosetti <[email protected]> | 2012-08-16 10:12:40 +0200 |
|---|---|---|
| committer | Paolo Bosetti <[email protected]> | 2012-08-16 10:18:41 +0200 |
| commit | efa46146a58be501daf3a38a15ffa9e3ddc87508 (patch) | |
| tree | ce57dbd7dba008363513f881599783c1342cdd51 | |
| parent | 441079557d8e78f33314aea14b31cc22932d0ff4 (diff) | |
| parent | 23e88dba6e9cfaded527f477341e7a7fe50e6795 (diff) | |
| download | mruby-efa46146a58be501daf3a38a15ffa9e3ddc87508.tar.gz mruby-efa46146a58be501daf3a38a15ffa9e3ddc87508.zip | |
Merge branch 'master' into XCode
Also, fixed issue in Xcode project build settings
| -rw-r--r-- | include/mrbconf.h | 11 | ||||
| -rw-r--r-- | include/mruby.h | 151 | ||||
| -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 | 13 | ||||
| -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 | 240 | ||||
| -rw-r--r-- | include/mruby/variable.h | 2 | ||||
| -rw-r--r-- | src/cdump.c | 6 | ||||
| -rw-r--r-- | src/class.c | 13 | ||||
| -rw-r--r-- | src/dump.c | 14 | ||||
| -rw-r--r-- | src/etc.c | 2 | ||||
| -rw-r--r-- | src/kernel.c | 2 | ||||
| -rw-r--r-- | src/object.c | 6 | ||||
| -rw-r--r-- | src/range.c | 2 | ||||
| -rw-r--r-- | src/variable.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 111 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 10 | ||||
| -rw-r--r-- | xcode/mruby.xcodeproj/project.pbxproj | 6 |
30 files changed, 356 insertions, 263 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 */ diff --git a/src/cdump.c b/src/cdump.c index 32982e6fe..f21a735ab 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -135,11 +135,11 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) if(irep->plen > 0) { SOURCE_CODE (" irep->pool = mrb_malloc(mrb, sizeof(mrb_value)*%d);", irep->plen); for (n=0; n<irep->plen; n++) { - switch (irep->pool[n].tt) { + switch (mrb_type(irep->pool[n])) { case MRB_TT_FLOAT: - SOURCE_CODE(" irep->pool[%d] = mrb_float_value(%.16e);", n, irep->pool[n].value.f); break; + SOURCE_CODE(" irep->pool[%d] = mrb_float_value(%.16e);", n, mrb_float(irep->pool[n])); break; case MRB_TT_FIXNUM: - SOURCE_CODE(" irep->pool[%d] = mrb_fixnum_value(%d);", n, irep->pool[n].value.i); break; + SOURCE_CODE(" irep->pool[%d] = mrb_fixnum_value(%d);", n, mrb_fixnum(irep->pool[n])); break; case MRB_TT_STRING: str_len = str_format_len(irep->pool[n]) + 1; if ( str_len > buf_len ) { diff --git a/src/class.c b/src/class.c index 795527263..0c0c6a3e8 100644 --- a/src/class.c +++ b/src/class.c @@ -204,7 +204,7 @@ class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) { mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id); - if (c.tt != MRB_TT_MODULE && c.tt != MRB_TT_CLASS) { + if (mrb_type(c) != MRB_TT_MODULE && mrb_type(c) != MRB_TT_CLASS) { mrb_raise(mrb, E_TYPE_ERROR, "%s is not a class/module", mrb_sym2name(mrb, id)); } return mrb_class_ptr(c); @@ -496,7 +496,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) p = va_arg(ap, mrb_float*); if (i < argc) { - switch (sp->tt) { + switch (mrb_type(*sp)) { case MRB_TT_FLOAT: *p = mrb_float(*sp); break; @@ -526,7 +526,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) p = va_arg(ap, mrb_int*); if (i < argc) { - switch (sp->tt) { + switch (mrb_type(*sp)) { case MRB_TT_FIXNUM: *p = mrb_fixnum(*sp); break; @@ -1264,8 +1264,7 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { mrb_value m; - m.tt = MRB_TT_PROC; - m.value.p = 0; + MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); mrb_define_method_vm(mrb, c, a, m); } @@ -1317,10 +1316,10 @@ mod_define_method(mrb_state *mrb, mrb_value self) static mrb_sym mrb_sym_value(mrb_state *mrb, mrb_value val) { - if(val.tt == MRB_TT_STRING) { + if(mrb_type(val) == MRB_TT_STRING) { return mrb_intern_str(mrb, val); } - else if(val.tt != MRB_TT_SYMBOL) { + else if(mrb_type(val) != MRB_TT_SYMBOL) { mrb_value obj = mrb_funcall(mrb, val, "inspect", 0); mrb_raise(mrb, E_TYPE_ERROR, "%s is not a symbol", mrb_string_value_ptr(mrb, obj)); diff --git a/src/dump.c b/src/dump.c index 230ba9bba..190f16027 100644 --- a/src/dump.c +++ b/src/dump.c @@ -224,13 +224,13 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep, int type) uint16_t nlen =0; int len; - switch (irep->pool[pool_no].tt) { + switch (mrb_type(irep->pool[pool_no])) { case MRB_TT_FIXNUM: - len = sprintf( buf, "%d", irep->pool[pool_no].value.i); + len = sprintf( buf, "%d", mrb_fixnum(irep->pool[pool_no])); size += (uint32_t)len; break; case MRB_TT_FLOAT: - len = sprintf( buf, "%.16e", irep->pool[pool_no].value.f); + len = sprintf( buf, "%.16e", mrb_float(irep->pool[pool_no])); size += (uint32_t)len; break; case MRB_TT_STRING: @@ -343,16 +343,16 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) for (pool_no = 0; pool_no < irep->plen; pool_no++) { uint16_t nlen =0; - buf += uint8_dump(irep->pool[pool_no].tt, buf, type); /* data type */ + buf += uint8_dump(mrb_type(irep->pool[pool_no]), buf, type); /* data type */ memset(char_buf, 0, buf_size); - switch (irep->pool[pool_no].tt) { + switch (mrb_type(irep->pool[pool_no])) { case MRB_TT_FIXNUM: - sprintf(char_buf, "%d", irep->pool[pool_no].value.i); + sprintf(char_buf, "%d", mrb_fixnum(irep->pool[pool_no])); break; case MRB_TT_FLOAT: - sprintf(char_buf, "%.16e", irep->pool[pool_no].value.f); + sprintf(char_buf, "%.16e", mrb_float(irep->pool[pool_no])); break; case MRB_TT_STRING: @@ -140,7 +140,7 @@ float_id(mrb_float f) mrb_int mrb_obj_id(mrb_value obj) { - mrb_int tt = obj.tt; + mrb_int tt = mrb_type(obj); #define MakeID2(p,t) (((intptr_t)(p))^(t)) #define MakeID(p) MakeID2(p,tt) diff --git a/src/kernel.c b/src/kernel.c index 1334d8f9f..5760ee61b 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -344,7 +344,7 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self) if (mrb_special_const_p(self)) { mrb_raise(mrb, E_TYPE_ERROR, "can't clone %s", mrb_obj_classname(mrb, self)); } - clone = (struct RObject*)mrb_obj_alloc(mrb, self.tt, mrb_obj_class(mrb, self)); + clone = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self)); clone->c = mrb_singleton_class_clone(mrb, self); init_copy(mrb, mrb_obj_value(clone), self); diff --git a/src/object.c b/src/object.c index 20310d288..4c494101a 100644 --- a/src/object.c +++ b/src/object.c @@ -14,8 +14,8 @@ int mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) { - if (v1.tt != v2.tt) return FALSE; - switch (v1.tt) { + if (mrb_type(v1) != mrb_type(v2)) return FALSE; + switch (mrb_type(v1)) { case MRB_TT_TRUE: return 1; @@ -26,7 +26,7 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) return (v1.value.sym == v2.value.sym); case MRB_TT_FLOAT: - return (v1.value.f == v2.value.f); + return (mrb_float(v1) == mrb_float(v2)); default: return (v1.value.p == v2.value.p); diff --git a/src/range.c b/src/range.c index db17c7d40..98b9093ef 100644 --- a/src/range.c +++ b/src/range.c @@ -392,7 +392,7 @@ range_eql(mrb_state *mrb, mrb_value range) return mrb_false_value(); r = mrb_range_ptr(range); - if (obj.tt != MRB_TT_RANGE) return mrb_false_value(); + if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value(); o = mrb_range_ptr(obj); if (!mrb_eql(mrb, r->edges->beg, o->edges->beg)) return mrb_false_value(); diff --git a/src/variable.c b/src/variable.c index 618e8cb89..9b233cde8 100644 --- a/src/variable.c +++ b/src/variable.c @@ -677,7 +677,7 @@ mrb_const_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym) static void mod_const_check(mrb_state *mrb, mrb_value mod) { - switch (mod.tt) { + switch (mrb_type(mod)) { case MRB_TT_CLASS: case MRB_TT_MODULE: break; @@ -78,7 +78,15 @@ stack_extend(mrb_state *mrb, int room, int keep) envadjust(mrb, oldbase, mrb->stbase); } if (room > keep) { +#ifndef MRB_NAN_BOXING memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep)); +#else + int i; + + for (i=keep; i<room; i++) { + mrb->stack[i] = mrb_nil_value(); + } +#endif } } @@ -380,40 +388,12 @@ argnum_error(mrb_state *mrb, int num) mrb->exc = (struct RObject*)mrb_object(exc); } -#define SET_TRUE_VALUE(r) {\ - (r).tt = MRB_TT_TRUE;\ - (r).value.i = 1;\ -} - -#define SET_FALSE_VALUE(r) {\ - (r).tt = MRB_TT_FALSE;\ - (r).value.i = 1;\ -} - -#define SET_NIL_VALUE(r) { \ - (r).tt = MRB_TT_FALSE;\ - (r).value.p = 0;\ -} - -#define SET_INT_VALUE(r,n) {\ - (r).tt = MRB_TT_FIXNUM;\ - (r).value.i = (n);\ -} - -#define SET_FLOAT_VALUE(r,v) {\ - (r).tt = MRB_TT_FLOAT;\ - (r).value.f = (v);\ -} - -#define SET_SYM_VALUE(r,v) {\ - (r).tt = MRB_TT_SYMBOL;\ - (r).value.sym = (v);\ -} - -#define SET_OBJ_VALUE(r,v) {\ - (r).tt = (((struct RObject*)(v))->tt);\ - (r).value.p = (void*)(v);\ -} +#define SET_TRUE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_TRUE, value.i, 1) +#define SET_FALSE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 1) +#define SET_NIL_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 0) +#define SET_INT_VALUE(r,n) MRB_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) +#define SET_SYM_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) +#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) #ifdef __GNUC__ #define DIRECT_THREADED @@ -496,6 +476,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->ci->proc = proc; mrb->ci->nregs = irep->nregs + 2; regs = mrb->stack; + regs[0] = self; INIT_DISPATCH { CASE(OP_NOP) { @@ -978,7 +959,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) struct RArray *rest; int len = 0; - if (stack[m1].tt == MRB_TT_ARRAY) { + if (mrb_type(stack[m1]) == MRB_TT_ARRAY) { struct RArray *ary = mrb_ary_ptr(stack[m1]); pp = ary->ptr; @@ -1015,6 +996,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) */ int argc = mrb->ci->argc; mrb_value *argv = regs+1; + mrb_value *argv0 = argv; int len = m1 + o + r + m2; mrb_value *blk = &argv[argc < 0 ? 1 : argc]; @@ -1032,15 +1014,19 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } } } - else if (len > 1 && argc == 1 && argv[0].tt == MRB_TT_ARRAY) { + else if (len > 1 && argc == 1 && mrb_type(argv[0]) == MRB_TT_ARRAY) { argc = mrb_ary_ptr(argv[0])->len; argv = mrb_ary_ptr(argv[0])->ptr; } mrb->ci->argc = len; if (argc < len) { regs[len+1] = *blk; /* move block */ - memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ - memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ + if (argv0 != argv) { + memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ + } + if (m2) { + memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ + } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_capa(mrb, 0); } @@ -1049,11 +1035,15 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) pc += argc - m1 - m2 + 1; } else { - memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ + if (argv0 != argv) { + memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ + } if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_elts(mrb, argc-m1-o-m2, argv+m1+o); } - memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); + if (m2) { + memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); + } regs[len+1] = *blk; /* move block */ pc += o + 1; } @@ -1248,9 +1238,16 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) NEXT; } +#define attr_i value.i +#ifdef MRB_NAN_BOXING +#define attr_f f +#else +#define attr_f value.f +#endif + #define TYPES2(a,b) (((((int)(a))<<8)|((int)(b)))&0xffff) #define OP_MATH_BODY(op,v1,v2) do {\ - regs[a].value.v1 = regs[a].value.v1 op regs[a+1].value.v2;\ + regs[a].v1 = regs[a].v1 op regs[a+1].v2;\ } while(0) #define OP_MATH(op,iop,s) do {\ @@ -1262,16 +1259,16 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) break;\ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\ {\ - mrb_int x = regs[a].value.i;\ - mrb_float y = regs[a+1].value.f;\ - SET_FLOAT_VALUE(regs[a], (mrb_float)x op y);\ + mrb_int x = mrb_fixnum(regs[a]);\ + mrb_float y = mrb_float(regs[a+1]);\ + regs[a] = mrb_float_value((mrb_float)x op y);\ }\ break;\ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\ - OP_MATH_BODY(op,f,i);\ + OP_MATH_BODY(op,attr_f,attr_i);\ break;\ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\ - OP_MATH_BODY(op,f,f);\ + OP_MATH_BODY(op,attr_f,attr_f);\ break;\ s\ default:\ @@ -1316,10 +1313,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* need to check if + is overridden */ switch (mrb_type(regs[a])) { case MRB_TT_FIXNUM: - regs[a].value.i += GETARG_C(i); + regs[a].attr_i += GETARG_C(i); break; case MRB_TT_FLOAT: - regs[a].value.f += GETARG_C(i); + regs[a].attr_f += GETARG_C(i); break; default: SET_NIL_VALUE(regs[a+2]); @@ -1337,10 +1334,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* need to check if + is overridden */ switch (mrb_type(regs[a])) { case MRB_TT_FIXNUM: - regs[a].value.i -= GETARG_C(i); + regs[a].attr_i -= GETARG_C(i); break; case MRB_TT_FLOAT: - regs[a].value.f -= GETARG_C(i); + regs[a].attr_f -= GETARG_C(i); break; default: SET_NIL_VALUE(regs[a+2]); @@ -1352,7 +1349,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } #define OP_CMP_BODY(op,v1,v2) do {\ - if (regs[a].value.v1 op regs[a+1].value.v2) {\ + if (regs[a].v1 op regs[a+1].v2) {\ SET_TRUE_VALUE(regs[a]);\ }\ else {\ @@ -1365,16 +1362,16 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* need to check if - is overridden */\ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\ - OP_CMP_BODY(op,i,i); \ + OP_CMP_BODY(op,attr_i,attr_i);\ break;\ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\ - OP_CMP_BODY(op,i,f);\ + OP_CMP_BODY(op,attr_i,attr_f);\ break;\ case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\ - OP_CMP_BODY(op,f,i);\ + OP_CMP_BODY(op,attr_f,attr_i);\ break;\ case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\ - OP_CMP_BODY(op,f,f);\ + OP_CMP_BODY(op,attr_f,attr_f);\ break;\ default:\ SET_NIL_VALUE(regs[a+2]);\ @@ -1447,7 +1444,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int c = GETARG_C(i); mrb_value v = regs[GETARG_B(i)]; - if (v.tt != MRB_TT_ARRAY) { + if (mrb_type(v) != MRB_TT_ARRAY) { if (c == 0) { regs[GETARG_A(i)] = v; } @@ -1474,7 +1471,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int pre = GETARG_B(i); int post = GETARG_C(i); - if (v.tt != MRB_TT_ARRAY) { + if (mrb_type(v) != MRB_TT_ARRAY) { regs[a++] = mrb_ary_new_capa(mrb, 0); while (post--) { SET_NIL_VALUE(regs[a]); diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index e6a088672..af6680e8c 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -64,8 +64,11 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) char *item; if (argv[0][0] != '-') break; - if (strlen(*argv) <= 1) - return -1; + if (strlen(*argv) <= 1) { + argc--; argv++; + args->rfp = stdin; + break; + } item = argv[0] + 1; switch (*item++) { @@ -121,11 +124,10 @@ append_cmdline: else return -3; return 0; default: - break; + return -4; } } - if (args->rfp == NULL && args->cmdline == NULL) { if (*argv == NULL) args->rfp = stdin; else if ((args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) { diff --git a/xcode/mruby.xcodeproj/project.pbxproj b/xcode/mruby.xcodeproj/project.pbxproj index 2a98c54f8..2ea99b6ca 100644 --- a/xcode/mruby.xcodeproj/project.pbxproj +++ b/xcode/mruby.xcodeproj/project.pbxproj @@ -833,7 +833,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ../test\ncat ./assert.rb ./t/*.rb > mrbtest.rbtmp\n../Xcode/build/mrbc -Bmrbtest_irep -omrbtest.ctmp mrbtest.rbtmp\ncat init_mrbtest.c mrbtest.ctmp > mrbtest.c"; + shellScript = "cd ../test\ncat ./assert.rb ./t/*.rb > mrbtest.rbtmp\n../xcode/bin/mrbc -Bmrbtest_irep -omrbtest.ctmp mrbtest.rbtmp\ncat init_mrbtest.c mrbtest.ctmp > mrbtest.c"; }; 88760AE015759C3600113BFB /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -846,7 +846,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ../mrblib\ncat ./*.rb > mrblib.rbtmp\n../Xcode/build/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp\ncat init_mrblib.c mrblib.ctmp > mrblib.c"; + shellScript = "cd ../mrblib\ncat ./*.rb > mrblib.rbtmp\n../xcode/bin/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp\ncat init_mrblib.c mrblib.ctmp > mrblib.c"; }; 88760AE915759F5E00113BFB /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -872,7 +872,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd ../mrblib\ncat ./*.rb > mrblib.rbtmp\n../Xcode/build/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp\ncat init_mrblib.c mrblib.ctmp > mrblib.c"; + shellScript = "cd ../mrblib\ncat ./*.rb > mrblib.rbtmp\n../xcode/bin/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp\ncat init_mrblib.c mrblib.ctmp > mrblib.c"; }; /* End PBXShellScriptBuildPhase section */ |
