diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/mruby.h | 18 | ||||
| -rw-r--r-- | include/mruby/boxing_word.h | 6 | ||||
| -rw-r--r-- | include/mruby/dump.h | 12 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 7 | ||||
| -rw-r--r-- | include/mruby/presym/enable.h | 6 | ||||
| -rw-r--r-- | include/mruby/proc.h | 72 | ||||
| -rw-r--r-- | include/mruby/value.h | 2 |
7 files changed, 85 insertions, 38 deletions
diff --git a/include/mruby.h b/include/mruby.h index 9fe72d7d5..6ac5a1a24 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -151,13 +151,14 @@ typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud); typedef struct { mrb_sym mid; const struct RProc *proc; - mrb_value *stackent; - struct REnv *env; - const mrb_code *pc; /* return address */ - const mrb_code *err; /* error position */ - mrb_int argc; - mrb_int acc; - struct RClass *target_class; + mrb_value *stack; + const mrb_code *pc; /* current address on iseq of this proc */ + int16_t argc; + int16_t acc; + union { + struct REnv *env; + struct RClass *target_class; + } u; } mrb_callinfo; enum mrb_fiber_state { @@ -172,8 +173,7 @@ enum mrb_fiber_state { struct mrb_context { struct mrb_context *prev; - mrb_value *stack; /* stack of virtual machine */ - mrb_value *stbase, *stend; + mrb_value *stbase, *stend; /* stack of virtual machine */ mrb_callinfo *ci; mrb_callinfo *cibase, *ciend; diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index 9e01de4ed..86a04368f 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -55,8 +55,6 @@ enum mrb_special_consts { #define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1) #define BOXWORD_IMMEDIATE_MASK 0x07 -#define BOXWORD_SHIFT_VALUE(o,n,t) \ - (t)(((intptr_t)(o).w) >> BOXWORD_##n##_SHIFT) #define BOXWORD_SET_SHIFT_VALUE(o,n,v) \ ((o).w = (((uintptr_t)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG) #define BOXWORD_SHIFT_VALUE_P(o,n) \ @@ -123,7 +121,7 @@ MRB_API mrb_value mrb_word_boxing_int_value(struct mrb_state*, mrb_int); #ifndef MRB_NO_FLOAT #define mrb_float(o) mrb_val_union(o).fp->f #endif -#define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int) +#define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> BOXWORD_FIXNUM_SHIFT) MRB_INLINE mrb_int mrb_integer_func(mrb_value o) { if (mrb_immediate_p(o)) return mrb_fixnum(o); @@ -133,7 +131,7 @@ mrb_integer_func(mrb_value o) { #ifdef MRB_64BIT #define mrb_symbol(o) mrb_val_union(o).sym #else -#define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym) +#define mrb_symbol(o) (mrb_sym)(((o).w) >> BOXWORD_SYMBOL_SHIFT) #endif #define mrb_bool(o) (((o).w & ~(uintptr_t)MRB_Qfalse) != 0) diff --git a/include/mruby/dump.h b/include/mruby/dump.h index d3d37c6c1..0eefa00ce 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -39,10 +39,9 @@ MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t); #define MRB_DUMP_GENERAL_FAILURE (-1) #define MRB_DUMP_WRITE_FAULT (-2) #define MRB_DUMP_READ_FAULT (-3) -#define MRB_DUMP_CRC_ERROR (-4) -#define MRB_DUMP_INVALID_FILE_HEADER (-5) -#define MRB_DUMP_INVALID_IREP (-6) -#define MRB_DUMP_INVALID_ARGUMENT (-7) +#define MRB_DUMP_INVALID_FILE_HEADER (-4) +#define MRB_DUMP_INVALID_IREP (-5) +#define MRB_DUMP_INVALID_ARGUMENT (-6) /* null symbol length */ #define MRB_DUMP_NULL_SYM_LEN 0xFFFF @@ -73,7 +72,6 @@ struct rite_binary_header { uint8_t binary_ident[4]; /* Binary Identifier */ uint8_t major_version[2]; /* Binary Format Major Version */ uint8_t minor_version[2]; /* Binary Format Minor Version */ - uint8_t binary_crc[2]; /* Binary CRC */ uint8_t binary_size[4]; /* Binary Size */ uint8_t compiler_name[4]; /* Compiler name */ uint8_t compiler_version[4]; @@ -157,8 +155,4 @@ bin_to_uint8(const uint8_t *bin) MRB_END_DECL -/** @internal crc.c */ -uint16_t -calc_crc_16_ccitt(const uint8_t *src, size_t nbytes, uint16_t crc); - #endif /* MRUBY_DUMP_H */ diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 683a5b41c..fc6cacfda 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -90,10 +90,6 @@ mrb_int_mul_overflow(mrb_int multiplier, mrb_int multiplicand, mrb_int *product) #else -#define MRB_UINT_MAKE2(n) uint ## n ## _t -#define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n) -#define mrb_uint MRB_UINT_MAKE(MRB_INT_BIT) - #define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1)) static inline mrb_bool @@ -135,9 +131,6 @@ mrb_int_mul_overflow(mrb_int a, mrb_int b, mrb_int *c) } #undef MRB_INT_OVERFLOW_MASK -#undef mrb_uint -#undef MRB_UINT_MAKE -#undef MRB_UINT_MAKE2 #endif diff --git a/include/mruby/presym/enable.h b/include/mruby/presym/enable.h index 0aec7274d..ddeb17e32 100644 --- a/include/mruby/presym/enable.h +++ b/include/mruby/presym/enable.h @@ -8,11 +8,7 @@ #define MRUBY_PRESYM_ENABLE_H #undef MRB_PRESYM_MAX -#ifdef MRB_USE_ALL_SYMBOLS -# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), -#else -# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num<<1), -#endif +#define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), #define MRB_PRESYM_UNNAMED(lit, num) enum mruby_presym { diff --git a/include/mruby/proc.h b/include/mruby/proc.h index f8681b40b..0edd3e1f1 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -105,7 +105,7 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #ifndef MRB_USE_METHOD_T_STRUCT #define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL) -#define MRB_METHOD_NOARG_P(m) (((uintptr_t)(m))&MRB_METHOD_NOARG_FL) +#define MRB_METHOD_NOARG_P(m) ((((uintptr_t)(m))&MRB_METHOD_NOARG_FL)?1:0) #define MRB_METHOD_NOARG_SET(m) ((m)=(mrb_method_t)(((uintptr_t)(m))|MRB_METHOD_NOARG_FL)) #define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2)) #define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL)) @@ -117,7 +117,7 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #else #define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL) -#define MRB_METHOD_NOARG_P(m) ((m).flags&MRB_METHOD_NOARG_FL) +#define MRB_METHOD_NOARG_P(m) (((m).flags&MRB_METHOD_NOARG_FL)?1:0) #define MRB_METHOD_FUNC(m) ((m).func) #define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0) #define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0) @@ -136,6 +136,74 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); MRB_API mrb_value mrb_load_proc(mrb_state *mrb, const struct RProc *proc); +static inline void +mrb_vm_ci_proc_set(mrb_callinfo *ci, const struct RProc *p) +{ + ci->proc = p; + ci->pc = (p && !MRB_PROC_CFUNC_P(p)) ? p->body.irep->iseq : NULL; +} + +static inline struct RClass * +mrb_vm_ci_target_class(const mrb_callinfo *ci) +{ + if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { + return ci->u.env->c; + } + else { + return ci->u.target_class; + } +} + +static inline void +mrb_vm_ci_target_class_set(mrb_callinfo *ci, struct RClass *tc) +{ + struct REnv *e = ci->u.env; + if (e) { + if (e->tt == MRB_TT_ENV) { + e->c = tc; + } + else { + ci->u.target_class = tc; + } + } +} + +static inline struct REnv * +mrb_vm_ci_env(const mrb_callinfo *ci) +{ + if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { + return ci->u.env; + } + else { + return NULL; + } +} + +static inline void +mrb_vm_ci_env_set(mrb_callinfo *ci, struct REnv *e) +{ + if (ci->u.env) { + if (ci->u.env->tt == MRB_TT_ENV) { + if (e) { + e->c = ci->u.env->c; + ci->u.env = e; + } + else { + ci->u.target_class = ci->u.env->c; + } + } + else { + if (e) { + e->c = ci->u.target_class; + ci->u.env = e; + } + } + } + else { + ci->u.env = e; + } +} + MRB_END_DECL #endif /* MRUBY_PROC_H */ diff --git a/include/mruby/value.h b/include/mruby/value.h index 2b1fbd7a6..293ef90a7 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -168,8 +168,6 @@ struct RCptr { #include "boxing_no.h" #endif -#define MRB_SYMBOL_BIT (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT) - #if INTPTR_MAX < MRB_INT_MAX typedef intptr_t mrb_ssize; # define MRB_SSIZE_MAX INTPTR_MAX |
