mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #6220 from dearblue/methodcache
Reorganize `mrb_cache_entry` and `mrb_method_t` types
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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
|
||||
|
||||
+3
-6
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
+6
-18
@@ -19,6 +19,8 @@
|
||||
#include <mruby/internal.h>
|
||||
#include <mruby/presym.h>
|
||||
|
||||
#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; i<MRB_METHOD_CACHE_SIZE; mc++,i++) {
|
||||
if (mc->mid == 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;
|
||||
|
||||
Reference in New Issue
Block a user