diff --git a/doc/guides/mrbconf.md b/doc/guides/mrbconf.md index 823a0ba17..a17b84f13 100644 --- a/doc/guides/mrbconf.md +++ b/doc/guides/mrbconf.md @@ -236,12 +236,6 @@ end - Ignored if `MRB_NO_METHOD_CACHE` is defined. - Need to be the power of 2. -`MRB_USE_METHOD_T_STRUCT` - -- Use C struct to represent `mrb_method_t` -- No `MRB_USE_METHOD_T_STRUCT` requires highest 2 bits of function pointers to be zero -- Define this macro on machines that use higher bits of pointers - `MRB_USE_ALL_SYMBOLS` - Make it available `Symbol.all_symbols` in `mrbgems/mruby-symbol-ext` diff --git a/include/mrbconf.h b/include/mrbconf.h index 122eb2b0e..68ec904f4 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -48,16 +48,6 @@ //#define MRB_METHOD_CACHE_SIZE (1<<8) //#define MRB_USE_INLINE_METHOD_CACHE -/* add -DMRB_USE_METHOD_T_STRUCT on machines that use higher bits of function pointers */ -/* no MRB_USE_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */ -#ifndef MRB_USE_METHOD_T_STRUCT - // can't use highest 2 bits of function pointers at least on 32bit - // Windows and 32bit Linux. -# ifdef MRB_32BIT -# define MRB_USE_METHOD_T_STRUCT -# endif -#endif - /* define on big endian machines; used by MRB_NAN_BOXING, etc. */ #ifndef MRB_ENDIAN_BIG # if (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN) || \ @@ -170,9 +160,6 @@ //#define MRB_USE_ALL_SYMBOLS /* Symbol.all_symbols */ /* obsolete configurations */ -#ifdef MRB_METHOD_T_STRUCT -# define MRB_USE_METHOD_T_STRUCT -#endif #if defined(DISABLE_STDIO) || defined(MRB_DISABLE_STDIO) # define MRB_NO_STDIO #endif diff --git a/include/mruby.h b/include/mruby.h index a42e0942c..c5cbeca7e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -230,22 +230,19 @@ mrb_static_assert_powerof2(MRB_METHOD_CACHE_SIZE); */ typedef mrb_value (*mrb_func_t)(struct mrb_state *mrb, mrb_value self); -#ifndef MRB_USE_METHOD_T_STRUCT -typedef uintptr_t mrb_method_t; -#else typedef struct { - uint8_t flags; + uint32_t flags; /* compatible with mt keys in class.c */ + union { struct RProc *proc; mrb_func_t func; }; } mrb_method_t; -#endif #ifndef MRB_NO_METHOD_CACHE struct mrb_cache_entry { struct RClass *c, *c0; - mrb_sym mid; + /* mrb_sym mid; // mid is stored in mrb_method_t::flags */ mrb_method_t m; }; #endif diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 22154df8b..f6ee64d93 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -106,20 +106,6 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define MRB_METHOD_FUNC_FL 1 #define MRB_METHOD_NOARG_FL 2 -#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)?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)) -#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr)) -#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m)) -#define MRB_METHOD_PROC(m) ((struct RProc*)(m)) -#define MRB_METHOD_UNDEF_P(m) ((m)==0) - -#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)?1:0) #define MRB_METHOD_FUNC(m) ((m).func) @@ -130,8 +116,6 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define MRB_METHOD_PROC(m) ((m).proc) #define MRB_METHOD_UNDEF_P(m) ((m).proc==NULL) -#endif /* MRB_USE_METHOD_T_STRUCT */ - #define MRB_METHOD_CFUNC_P(m) (MRB_METHOD_FUNC_P(m)?TRUE:(MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE)) #define MRB_METHOD_CFUNC(m) (MRB_METHOD_FUNC_P(m)?MRB_METHOD_FUNC(m):((MRB_METHOD_PROC(m)&&MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m)))?MRB_PROC_CFUNC(MRB_METHOD_PROC(m)):NULL)) diff --git a/src/class.c b/src/class.c index 1990bd765..4033ccbce 100644 --- a/src/class.c +++ b/src/class.c @@ -19,6 +19,8 @@ #include #include +#define METHOD_MID(m) MT_KEY_SYM((m).flags) + union mt_ptr { struct RProc *proc; mrb_func_t func; @@ -243,17 +245,7 @@ mt_free(mrb_state *mrb, mt_tbl *t) static inline mrb_method_t create_method_value(mrb_state *mrb, mrb_sym key, union mt_ptr val) { - mrb_method_t m; - - if (key & MT_FUNC_P) { - MRB_METHOD_FROM_FUNC(m, val.func); - } - else { - MRB_METHOD_FROM_PROC(m, val.proc); - } - if (key & MT_NOARG_P) { - MRB_METHOD_NOARG_SET(m); - } + mrb_method_t m = { key, { val.proc } }; return m; } @@ -795,9 +787,6 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f int ai = mrb_gc_arena_save(mrb); MRB_METHOD_FROM_FUNC(m, func); -#ifndef MRB_USE_METHOD_T_STRUCT - mrb_assert(MRB_METHOD_FUNC(m) == func); -#endif if (aspec == MRB_ARGS_NONE()) { MRB_METHOD_NOARG_SET(m); } @@ -1754,10 +1743,10 @@ mc_clear_by_id(mrb_state *mrb, mrb_sym id) struct mrb_cache_entry *mc = mrb->cache; for (int i=0; imid == id) mc->c = NULL; + if (METHOD_MID(mc->m) == id) mc->c = NULL; } } -#endif +#endif // MRB_NO_METHOD_CACHE mrb_method_t mrb_vm_find_method(mrb_state *mrb, struct RClass *c, struct RClass **cp, mrb_sym mid) @@ -1768,7 +1757,7 @@ mrb_vm_find_method(mrb_state *mrb, struct RClass *c, struct RClass **cp, mrb_sym int h = mrb_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1); struct mrb_cache_entry *mc = &mrb->cache[h]; - if (mc->c == c && mc->mid == mid) { + if (mc->c == c && METHOD_MID(mc->m) == mid) { *cp = mc->c0; return mc->m; } @@ -1787,7 +1776,6 @@ mrb_vm_find_method(mrb_state *mrb, struct RClass *c, struct RClass **cp, mrb_sym #ifndef MRB_NO_METHOD_CACHE mc->c = oc; mc->c0 = c; - mc->mid = mid; mc->m = m; #endif return m;