split the method cache into 2 buckets. one for instance methods, another for class methods. the method type doesn't have to stored after this split.
This commit is contained in:
parent
3419097054
commit
ec262c4f68
@ -775,7 +775,7 @@ static int async_signal_semaphore (moo_t* moo, moo_oop_semaphore_t sem)
|
|||||||
moo_oop_semaphore_t* tmp;
|
moo_oop_semaphore_t* tmp;
|
||||||
|
|
||||||
new_capa = moo->sem_list_capa + SEM_LIST_INC; /* TODO: overflow check.. */
|
new_capa = moo->sem_list_capa + SEM_LIST_INC; /* TODO: overflow check.. */
|
||||||
tmp = moo_reallocmem(moo, moo->sem_list, MOO_SIZEOF(moo_oop_semaphore_t) * new_capa);
|
tmp = (moo_oop_semaphore_t*)moo_reallocmem(moo, moo->sem_list, MOO_SIZEOF(moo_oop_semaphore_t) * new_capa);
|
||||||
if (!tmp) return -1;
|
if (!tmp) return -1;
|
||||||
|
|
||||||
moo->sem_list = tmp;
|
moo->sem_list = tmp;
|
||||||
@ -1729,9 +1729,9 @@ moo_oop_method_t moo_findmethod (moo_t* moo, moo_oop_t receiver, moo_oop_char_t
|
|||||||
mcidx &= (MOO_METHOD_CACHE_SIZE - 1);*/
|
mcidx &= (MOO_METHOD_CACHE_SIZE - 1);*/
|
||||||
/*mcidx = ((moo_oow_t)c + (moo_oow_t)selector) % MOO_METHOD_CACHE_SIZE; */
|
/*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);
|
mcidx = ((moo_oow_t)_class ^ (moo_oow_t)selector) & (MOO_METHOD_CACHE_SIZE - 1);
|
||||||
mcitm = &moo->method_cache[mcidx];
|
mcitm = &moo->method_cache[mth_type][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++; */
|
/* TODO: moo->method_cache_hits++; */
|
||||||
@ -1745,7 +1745,7 @@ moo_oop_method_t moo_findmethod (moo_t* moo, moo_oop_t receiver, moo_oop_char_t
|
|||||||
/* TODO: moo->method_cache_misses++; */
|
/* 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;*/
|
||||||
mcitm->method = mth;
|
mcitm->method = mth;
|
||||||
return mth;
|
return mth;
|
||||||
}
|
}
|
||||||
@ -1762,9 +1762,9 @@ not_found:
|
|||||||
mcidx &= (MOO_METHOD_CACHE_SIZE - 1); */
|
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; */
|
||||||
mcidx = ((moo_oow_t)_class ^ (moo_oow_t)selector) & (MOO_METHOD_CACHE_SIZE - 1);
|
mcidx = ((moo_oow_t)_class ^ (moo_oow_t)selector) & (MOO_METHOD_CACHE_SIZE - 1);
|
||||||
mcitm = &moo->method_cache[mcidx];
|
mcitm = &moo->method_cache[MOO_METHOD_INSTANCE][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++; */
|
/* TODO: moo->method_cache_hits++; */
|
||||||
@ -1777,7 +1777,7 @@ not_found:
|
|||||||
/* TODO: moo->method_cache_misses++; */
|
/* 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;*/
|
||||||
mcitm->method = mth;
|
mcitm->method = mth;
|
||||||
return mth;
|
return mth;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user