more code for message sending

This commit is contained in:
hyung-hwan 2022-01-31 04:38:05 +00:00
parent 72ed203f80
commit 5ded15d06a

View File

@ -1970,27 +1970,39 @@ static int prepare_new_context (hcl_t* hcl, hcl_oop_block_t rcv_blk, hcl_ooi_t n
return 0; return 0;
} }
static HCL_INLINE int activate_block (hcl_t* hcl, hcl_ooi_t nargs, hcl_ooi_t nrvars) static HCL_INLINE int __activate_block (hcl_t* hcl, hcl_oop_block_t op, hcl_ooi_t nargs, hcl_ooi_t nrvars, hcl_oop_context_t* pnewctx)
{ {
int x; int x;
hcl_oop_block_t rcv;
hcl_oop_context_t newctx;
rcv = (hcl_oop_block_t)HCL_STACK_GETOP(hcl, nargs); HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, op));
HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, rcv));
x = prepare_new_context( x = prepare_new_context(
hcl, hcl,
rcv, op,
nargs, /* nargs */ nargs, /* nargs */
0, /* nargs_offset */ 0, /* nargs_offset */
nrvars, nrvars,
1, /* copy_args */ 1, /* copy_args */
&newctx); pnewctx);
if (HCL_UNLIKELY(x <= -1)) return -1; if (HCL_UNLIKELY(x <= -1)) return -1;
HCL_STACK_POPS (hcl, nargs + 2); /* pop arguments, called block/function/method, and receiver */ HCL_STACK_POPS (hcl, nargs + 2); /* pop arguments, called block/function/method, and receiver */
newctx->sender = hcl->active_context; (*pnewctx)->sender = hcl->active_context;
return 0;
}
static HCL_INLINE int activate_block (hcl_t* hcl, hcl_ooi_t nargs, hcl_ooi_t nrvars)
{
hcl_oop_block_t op;
hcl_oop_context_t newctx;
int x;
op = (hcl_oop_block_t)HCL_STACK_GETOP(hcl, nargs);
HCL_ASSERT (hcl, HCL_IS_BLOCK(hcl, op));
x = __activate_block(hcl, op, nargs, nrvars, &newctx);
if (HCL_UNLIKELY(x <= -1)) return -1;
SWITCH_ACTIVE_CONTEXT (hcl, newctx); SWITCH_ACTIVE_CONTEXT (hcl, newctx);
return 0; return 0;
@ -2110,7 +2122,7 @@ static HCL_INLINE int call_primitive (hcl_t* hcl, hcl_ooi_t nargs)
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t class_, hcl_oop_t op) static hcl_oop_block_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t class_, hcl_oop_t op)
{ {
hcl_oocs_t name; hcl_oocs_t name;
@ -2122,21 +2134,23 @@ static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t clas
do do
{ {
hcl_oop_cons_t ass; hcl_oop_t dic;
HCL_ASSERT (hcl, HCL_IS_NIL(hcl, class_->memdic) || HCL_IS_DIC(hcl, class_->memdic)); dic = class_->memdic;
HCL_ASSERT (hcl, HCL_IS_NIL(hcl, dic) || HCL_IS_DIC(hcl, dic));
if (HCL_LIKELY(!HCL_IS_NIL(hcl, class_->memdic))) if (HCL_LIKELY(!HCL_IS_NIL(hcl, dic)))
{ {
ass = (hcl_oop_cons_t)hcl_lookupdicforsymbol_noseterr(hcl, class_->memdic, &name ); hcl_oop_cons_t ass;
if (HCL_LIKELY(!ass)) ass = (hcl_oop_cons_t)hcl_lookupdicforsymbol_noseterr(hcl, dic, &name);
if (HCL_LIKELY(ass))
{ {
hcl_oop_t val; hcl_oop_t val;
val = HCL_CONS_CDR(ass); val = HCL_CONS_CDR(ass);
if (HCL_IS_FUNCTION(hcl, val)) if (HCL_IS_BLOCK(hcl, val))
{ {
/* TODO: futher check if it's a method */ /* TODO: futher check if it's a method */
return (hcl_oop_function_t)val; return (hcl_oop_block_t)val;
} }
} }
} }
@ -2149,7 +2163,7 @@ static hcl_oop_function_t find_method_noseterr (hcl_t* hcl, hcl_oop_class_t clas
static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int to_super, hcl_ooi_t nargs) static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int to_super, hcl_ooi_t nargs)
{ {
hcl_oop_function_t mth; hcl_oop_block_t mth;
hcl_oop_context_t newctx; hcl_oop_context_t newctx;
int x; int x;
@ -2164,7 +2178,7 @@ static HCL_INLINE int send_message (hcl_t* hcl, hcl_oop_t rcv, hcl_oop_t op, int
return -1; return -1;
} }
x = __activate_function(hcl, mth, nargs, &newctx); x = __activate_block(hcl, mth, nargs, 0 /* TODO: not 0 */ , &newctx);
if (HCL_UNLIKELY(x <= -1)) return -1; if (HCL_UNLIKELY(x <= -1)) return -1;
SWITCH_ACTIVE_CONTEXT (hcl, newctx); SWITCH_ACTIVE_CONTEXT (hcl, newctx);