Project

General

Profile

Bug #7111 ยป opt_global_method_cache.diff

shugo (Shugo Maeda), 10/06/2012 03:31 PM

View differences:

vm_method.c
static ID removed, singleton_removed, undefined, singleton_undefined;
static ID added, singleton_added, attached;
#if OPT_GLOBAL_METHOD_CACHE
struct cache_entry { /* method hash table. */
VALUE filled_version; /* filled state version */
ID mid; /* method's id */
......
};
static struct cache_entry cache[CACHE_SIZE];
#endif
#define ruby_running (GET_VM()->running)
/* int ruby_running = 0; */
static void
vm_clear_global_method_cache(void)
{
#if OPT_GLOBAL_METHOD_CACHE
struct cache_entry *ent, *end;
ent = cache;
......
ent->filled_version = 0;
ent++;
}
#endif
}
void
......
VALUE defined_class;
rb_method_entry_t *me = search_method(klass, id, omod, &defined_class);
#if OPT_GLOBAL_METHOD_CACHE
if (ruby_running) {
struct cache_entry *ent;
ent = cache + EXPR1(klass, omod, id);
......
ent->me = me;
}
}
#endif
if (defined_class_ptr)
*defined_class_ptr = defined_class;
......
rb_method_entry_get_with_omod(VALUE omod, VALUE klass, ID id,
VALUE *defined_class_ptr)
{
#if OPT_GLOBAL_METHOD_CACHE
struct cache_entry *ent;
ent = cache + EXPR1(klass, omod, id);
......
*defined_class_ptr = ent->defined_class;
return ent->me;
}
#endif
return rb_method_entry_get_without_cache(klass, omod, id,
defined_class_ptr);
vm_opts.h
/* VM running option */
#define OPT_CHECKED_RUN 1
#define OPT_INLINE_METHOD_CACHE 1
#define OPT_GLOBAL_METHOD_CACHE 1
#define OPT_BLOCKINLINING 0
/* architecture independent, affects generated code */
    (1-1/1)