summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/mruby.h18
-rw-r--r--include/mruby/boxing_word.h6
-rw-r--r--include/mruby/dump.h12
-rw-r--r--include/mruby/numeric.h7
-rw-r--r--include/mruby/presym/enable.h6
-rw-r--r--include/mruby/proc.h72
-rw-r--r--include/mruby/value.h2
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