the simple method cache seems working now. pending refinement
This commit is contained in:
parent
b33e0744d2
commit
ae20171772
@ -1776,21 +1776,26 @@ moo_oop_method_t moo_findmethod (moo_t* moo, moo_oop_t receiver, moo_oop_char_t
|
|||||||
* otherwise c points to a class object */
|
* otherwise c points to a class object */
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
/*mcidx = MOO_HASH_INIT;
|
||||||
mcidx = ((moo_oow_t)c + (moo_oow_t)selector) % MOO_METHOD_CACHE_SIZE; /* TODO: change hash function */
|
mcidx = MOO_HASH_VALUE(mcidx, (moo_oow_t)c);
|
||||||
|
mcidx = MOO_HASH_VALUE(mcidx, (moo_oow_t)selector);
|
||||||
|
mcidx &= (MOO_METHOD_CACHE_SIZE - 1);*/
|
||||||
|
/*mcidx = ((moo_oow_t)c + (moo_oow_t)selector) % MOO_METHOD_CACHE_SIZE; */
|
||||||
|
mcidx = ((moo_oow_t)_class ^ (moo_oow_t)selector) & (MOO_METHOD_CACHE_SIZE - 1);
|
||||||
mcitm = &moo->method_cache[mcidx];
|
mcitm = &moo->method_cache[mcidx];
|
||||||
|
|
||||||
if (mcitm->receiver_class == c && mcitm->selector == selector && mcitm->method_type == mth_type)
|
if (mcitm->receiver_class == c && mcitm->selector == selector && mcitm->method_type == mth_type)
|
||||||
{
|
{
|
||||||
/* cache hit */
|
/* cache hit */
|
||||||
|
/* TODO: moo->method_cache_hits++; */
|
||||||
return mcitm->method;
|
return mcitm->method;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* [IMPORT] the method lookup logic should be the same as ciim_on_each_method() in comp.c */
|
/* [IMPORT] the method lookup logic should be the same as ciim_on_each_method() in comp.c */
|
||||||
mth = find_method_in_class_chain(moo, c, mth_type, &message);
|
mth = find_method_in_class_chain(moo, c, mth_type, &message);
|
||||||
if (mth)
|
if (mth)
|
||||||
{
|
{
|
||||||
|
/* TODO: moo->method_cache_misses++; */
|
||||||
mcitm->receiver_class = c;
|
mcitm->receiver_class = c;
|
||||||
mcitm->selector = selector;
|
mcitm->selector = selector;
|
||||||
mcitm->method_type = mth_type;
|
mcitm->method_type = mth_type;
|
||||||
@ -1803,19 +1808,26 @@ not_found:
|
|||||||
{
|
{
|
||||||
/* the object is an instance of Class. find the method
|
/* the object is an instance of Class. find the method
|
||||||
* in an instance method dictionary of Class also */
|
* in an instance method dictionary of Class also */
|
||||||
#if 0
|
|
||||||
mcidx = ((moo_oow_t)_class + (moo_oow_t)selector) % MOO_METHOD_CACHE_SIZE; /* TODO: change hash function */
|
/*mcidx = MOO_HASH_INIT;
|
||||||
|
mcidx = MOO_HASH_VALUE(mcidx, (moo_oow_t)_class);
|
||||||
|
mcidx = MOO_HASH_VALUE(mcidx, (moo_oow_t)selector);
|
||||||
|
mcidx &= (MOO_METHOD_CACHE_SIZE - 1); */
|
||||||
|
/* mcidx = ((moo_oow_t)_class + (moo_oow_t)selector) % MOO_METHOD_CACHE_SIZE; */
|
||||||
|
mcidx = ((moo_oow_t)_class ^ (moo_oow_t)selector) & (MOO_METHOD_CACHE_SIZE - 1);
|
||||||
mcitm = &moo->method_cache[mcidx];
|
mcitm = &moo->method_cache[mcidx];
|
||||||
|
|
||||||
if (mcitm->receiver_class == _class && mcitm->selector == selector && mcitm->method_type == MOO_METHOD_INSTANCE)
|
if (mcitm->receiver_class == _class && mcitm->selector == selector && mcitm->method_type == MOO_METHOD_INSTANCE)
|
||||||
{
|
{
|
||||||
/* cache hit */
|
/* cache hit */
|
||||||
|
/* TODO: moo->method_cache_hits++; */
|
||||||
return mcitm->method;
|
return mcitm->method;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
mth = find_method_in_class(moo, _class, MOO_METHOD_INSTANCE, &message);
|
mth = find_method_in_class(moo, _class, MOO_METHOD_INSTANCE, &message);
|
||||||
if (mth)
|
if (mth)
|
||||||
{
|
{
|
||||||
|
/* TODO: moo->method_cache_misses++; */
|
||||||
mcitm->receiver_class = c;
|
mcitm->receiver_class = c;
|
||||||
mcitm->selector = selector;
|
mcitm->selector = selector;
|
||||||
mcitm->method_type = MOO_METHOD_INSTANCE;
|
mcitm->method_type = MOO_METHOD_INSTANCE;
|
||||||
@ -1829,6 +1841,11 @@ not_found:
|
|||||||
return MOO_NULL;
|
return MOO_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void moo_clearmethodcache (moo_t* moo)
|
||||||
|
{
|
||||||
|
MOO_MEMSET (moo->method_cache, 0, MOO_SIZEOF(moo->method_cache));
|
||||||
|
}
|
||||||
|
|
||||||
static int start_initial_process_and_context (moo_t* moo, const moo_oocs_t* objname, const moo_oocs_t* mthname)
|
static int start_initial_process_and_context (moo_t* moo, const moo_oocs_t* objname, const moo_oocs_t* mthname)
|
||||||
{
|
{
|
||||||
/* the initial context is a fake context. if objname is 'Stix' and
|
/* the initial context is a fake context. if objname is 'Stix' and
|
||||||
@ -6028,6 +6045,8 @@ int moo_invoke (moo_t* moo, const moo_oocs_t* objname, const moo_oocs_t* mthname
|
|||||||
MOO_ASSERT (moo, moo->active_context == MOO_NULL);
|
MOO_ASSERT (moo, moo->active_context == MOO_NULL);
|
||||||
MOO_ASSERT (moo, moo->active_method == MOO_NULL);
|
MOO_ASSERT (moo, moo->active_method == MOO_NULL);
|
||||||
|
|
||||||
|
moo_clearmethodcache (moo);
|
||||||
|
|
||||||
if (start_initial_process_and_context(moo, objname, mthname) <= -1) return -1;
|
if (start_initial_process_and_context(moo, objname, mthname) <= -1) return -1;
|
||||||
moo->initial_context = moo->processor->active->initial_context;
|
moo->initial_context = moo->processor->active->initial_context;
|
||||||
|
|
||||||
|
@ -1039,6 +1039,9 @@ void moo_gc (moo_t* moo)
|
|||||||
if (moo->active_method) moo->active_code = MOO_METHOD_GET_CODE_BYTE(moo->active_method); /* update moo->active_code */
|
if (moo->active_method) moo->active_code = MOO_METHOD_GET_CODE_BYTE(moo->active_method); /* update moo->active_code */
|
||||||
if (gcfin_count > 0) moo->sem_gcfin_sigreq = 1;
|
if (gcfin_count > 0) moo->sem_gcfin_sigreq = 1;
|
||||||
|
|
||||||
|
/* invalidate method cache. TODO: GCing entries on the method cache is also one way instead of full invalidation */
|
||||||
|
moo_clearmethodcache (moo);
|
||||||
|
|
||||||
/* TODO: include some gc statstics like number of live objects, gc performance, etc */
|
/* TODO: include some gc statstics like number of live objects, gc performance, etc */
|
||||||
MOO_LOG4 (moo, MOO_LOG_GC | MOO_LOG_INFO,
|
MOO_LOG4 (moo, MOO_LOG_GC | MOO_LOG_INFO,
|
||||||
"Finished GC curheap base %p ptr %p newheap base %p ptr %p\n",
|
"Finished GC curheap base %p ptr %p newheap base %p ptr %p\n",
|
||||||
|
@ -1508,6 +1508,9 @@ moo_pfbase_t* moo_getpfnum (
|
|||||||
moo_ooi_t* pfnum
|
moo_ooi_t* pfnum
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void moo_clearmethodcache (
|
||||||
|
moo_t* moo
|
||||||
|
);
|
||||||
moo_oop_method_t moo_findmethod (
|
moo_oop_method_t moo_findmethod (
|
||||||
moo_t* moo,
|
moo_t* moo,
|
||||||
moo_oop_t receiver,
|
moo_oop_t receiver,
|
||||||
|
@ -1336,6 +1336,7 @@ struct moo_method_cache_item_t
|
|||||||
};
|
};
|
||||||
typedef struct moo_method_cache_item_t moo_method_cache_item_t;
|
typedef struct moo_method_cache_item_t moo_method_cache_item_t;
|
||||||
|
|
||||||
|
/* it must be a power of 2. otherwise cache hash will fail miserably */
|
||||||
#define MOO_METHOD_CACHE_SIZE 4096
|
#define MOO_METHOD_CACHE_SIZE 4096
|
||||||
|
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
|
Loading…
Reference in New Issue
Block a user