enhanced the compiler to emit the right instruction for super
This commit is contained in:
parent
e482ce620f
commit
f0b6ccdf42
@ -3521,10 +3521,9 @@ static int compile_cons_mlist_expression (hcl_t* hcl, hcl_cnode_t* obj, int nret
|
|||||||
oldtop = GET_TOP_CFRAME_INDEX(hcl);
|
oldtop = GET_TOP_CFRAME_INDEX(hcl);
|
||||||
HCL_ASSERT (hcl, oldtop >= 0);
|
HCL_ASSERT (hcl, oldtop >= 0);
|
||||||
|
|
||||||
SWITCH_TOP_CFRAME (hcl, COP_EMIT_SEND, car);
|
|
||||||
|
|
||||||
/* compile <receiver> */
|
/* compile <receiver> */
|
||||||
rcv = car; /* remember the receiver node to to push it later */
|
rcv = car; /* remember the receiver node to to push it later */
|
||||||
|
SWITCH_TOP_CFRAME (hcl, COP_EMIT_SEND, rcv);
|
||||||
|
|
||||||
/* compile <operator> */
|
/* compile <operator> */
|
||||||
cdr = HCL_CNODE_CONS_CDR(obj);
|
cdr = HCL_CNODE_CONS_CDR(obj);
|
||||||
@ -3606,6 +3605,7 @@ static int compile_cons_mlist_expression (hcl_t* hcl, hcl_cnode_t* obj, int nret
|
|||||||
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_SEND);
|
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_SEND);
|
||||||
cf->u.sendmsg.nargs = nargs;
|
cf->u.sendmsg.nargs = nargs;
|
||||||
cf->u.sendmsg.nrets = nrets;
|
cf->u.sendmsg.nrets = nrets;
|
||||||
|
cf->u.sendmsg.to_super = (HCL_CNODE_GET_TYPE(rcv) == HCL_CNODE_SUPER);
|
||||||
|
|
||||||
PUSH_CFRAME (hcl, COP_COMPILE_OBJECT, rcv);
|
PUSH_CFRAME (hcl, COP_COMPILE_OBJECT, rcv);
|
||||||
return 0;
|
return 0;
|
||||||
@ -4613,11 +4613,11 @@ static HCL_INLINE int emit_send (hcl_t* hcl)
|
|||||||
|
|
||||||
if (cf->u.sendmsg.nrets > 0)
|
if (cf->u.sendmsg.nrets > 0)
|
||||||
{
|
{
|
||||||
n = emit_double_param_instruction(hcl, HCL_CODE_SEND_R, cf->u.sendmsg.nargs, cf->u.sendmsg.nrets, HCL_CNODE_GET_LOC(cf->operand));
|
n = emit_double_param_instruction(hcl, (cf->u.sendmsg.to_super? HCL_CODE_SEND_TO_SUPER_R: HCL_CODE_SEND_R), cf->u.sendmsg.nargs, cf->u.sendmsg.nrets, HCL_CNODE_GET_LOC(cf->operand));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
n = emit_single_param_instruction(hcl, HCL_CODE_SEND_0, cf->u.sendmsg.nargs, HCL_CNODE_GET_LOC(cf->operand));
|
n = emit_single_param_instruction(hcl, (cf->u.sendmsg.to_super? HCL_CODE_SEND_TO_SUPER_0: HCL_CODE_SEND_0), cf->u.sendmsg.nargs, HCL_CNODE_GET_LOC(cf->operand));
|
||||||
}
|
}
|
||||||
|
|
||||||
POP_CFRAME (hcl);
|
POP_CFRAME (hcl);
|
||||||
|
@ -3941,6 +3941,7 @@ if (do_throw(hcl, hcl->_nil, fetched_instruction_pointer) <= -1)
|
|||||||
hcl_oop_t t;
|
hcl_oop_t t;
|
||||||
FETCH_PARAM_CODE_TO (hcl, b1);
|
FETCH_PARAM_CODE_TO (hcl, b1);
|
||||||
LOG_INST_1 (hcl, "push_cvar_m %zu", b1);
|
LOG_INST_1 (hcl, "push_cvar_m %zu", b1);
|
||||||
|
HCL_ASSERT (hcl, (hcl_oop_t)hcl->active_context->home != hcl->_nil);
|
||||||
t = hcl->active_context->home->owner;
|
t = hcl->active_context->home->owner;
|
||||||
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
||||||
{
|
{
|
||||||
@ -3957,6 +3958,7 @@ if (do_throw(hcl, hcl->_nil, fetched_instruction_pointer) <= -1)
|
|||||||
hcl_oop_t t;
|
hcl_oop_t t;
|
||||||
FETCH_PARAM_CODE_TO (hcl, b1);
|
FETCH_PARAM_CODE_TO (hcl, b1);
|
||||||
LOG_INST_1 (hcl, "store_into_cvar_m %zu", b1);
|
LOG_INST_1 (hcl, "store_into_cvar_m %zu", b1);
|
||||||
|
HCL_ASSERT (hcl, (hcl_oop_t)hcl->active_context->home != hcl->_nil);
|
||||||
t = hcl->active_context->home->owner;
|
t = hcl->active_context->home->owner;
|
||||||
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
||||||
{
|
{
|
||||||
@ -3973,6 +3975,7 @@ if (do_throw(hcl, hcl->_nil, fetched_instruction_pointer) <= -1)
|
|||||||
hcl_oop_t t;
|
hcl_oop_t t;
|
||||||
FETCH_PARAM_CODE_TO (hcl, b1);
|
FETCH_PARAM_CODE_TO (hcl, b1);
|
||||||
LOG_INST_1 (hcl, "pop_into_cvar_m %zu", b1);
|
LOG_INST_1 (hcl, "pop_into_cvar_m %zu", b1);
|
||||||
|
HCL_ASSERT (hcl, (hcl_oop_t)hcl->active_context->home != hcl->_nil);
|
||||||
t = hcl->active_context->home->owner;
|
t = hcl->active_context->home->owner;
|
||||||
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
if (HCL_UNLIKELY(!HCL_IS_CLASS(hcl, t)))
|
||||||
{
|
{
|
||||||
|
@ -321,6 +321,7 @@ struct hcl_cframe_t
|
|||||||
{
|
{
|
||||||
hcl_ooi_t nargs;
|
hcl_ooi_t nargs;
|
||||||
hcl_ooi_t nrets;
|
hcl_ooi_t nrets;
|
||||||
|
int to_super;
|
||||||
} sendmsg;
|
} sendmsg;
|
||||||
|
|
||||||
/* COP_EMIT_SET */
|
/* COP_EMIT_SET */
|
||||||
|
11
t/ret-01.hcl
Normal file
11
t/ret-01.hcl
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
(defun ff() (return 999))
|
||||||
|
|
||||||
|
; test a normal block return
|
||||||
|
(set a (ff))
|
||||||
|
(if (/= a 999) (printf "ERROR: a must be 999\n"))
|
||||||
|
(printf "OK %d\n" a)
|
||||||
|
|
||||||
|
; return from top-level
|
||||||
|
(return 10)
|
||||||
|
(printf "ERROR: this line must not be printed\n")
|
Loading…
Reference in New Issue
Block a user