more compiler code to store source locations of byte codes emitted
This commit is contained in:
parent
162d4431ca
commit
c93ddd5042
80
lib/comp2.c
80
lib/comp2.c
@ -443,7 +443,7 @@ write_long2:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int emit_double_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1, hcl_oow_t param_2)
|
static int emit_double_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1, hcl_oow_t param_2, const hcl_ioloc_t* srcloc)
|
||||||
{
|
{
|
||||||
hcl_oob_t bc;
|
hcl_oob_t bc;
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ static int emit_double_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
write_short:
|
write_short:
|
||||||
if (emit_byte_instruction(hcl, bc, HCL_NULL) <= -1 ||
|
if (emit_byte_instruction(hcl, bc, srcloc) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_2, HCL_NULL) <= -1) return -1;
|
emit_byte_instruction(hcl, param_2, HCL_NULL) <= -1) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -496,13 +496,13 @@ write_long:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#if (HCL_HCL_CODE_LONG_PARAM_SIZE == 2)
|
#if (HCL_HCL_CODE_LONG_PARAM_SIZE == 2)
|
||||||
if (emit_byte_instruction(hcl, bc, HCL_NULL) <= -1 ||
|
if (emit_byte_instruction(hcl, bc, srcloc) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_1 >> 8, HCL_NULL) <= -1 ||
|
emit_byte_instruction(hcl, param_1 >> 8, HCL_NULL) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_1 & 0xFF, HCL_NULL) <= -1 ||
|
emit_byte_instruction(hcl, param_1 & 0xFF, HCL_NULL) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_2 >> 8, HCL_NULL) <= -1 ||
|
emit_byte_instruction(hcl, param_2 >> 8, HCL_NULL) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_2 & 0xFF, HCL_NULL) <= -1) return -1;
|
emit_byte_instruction(hcl, param_2 & 0xFF, HCL_NULL) <= -1) return -1;
|
||||||
#else
|
#else
|
||||||
if (emit_byte_instruction(hcl, bc, HCL_NULL) <= -1 ||
|
if (emit_byte_instruction(hcl, bc, srcloc) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_1, HCL_NULL) <= -1 ||
|
emit_byte_instruction(hcl, param_1, HCL_NULL) <= -1 ||
|
||||||
emit_byte_instruction(hcl, param_2, HCL_NULL) <= -1) return -1;
|
emit_byte_instruction(hcl, param_2, HCL_NULL) <= -1) return -1;
|
||||||
#endif
|
#endif
|
||||||
@ -613,7 +613,7 @@ static HCL_INLINE void patch_long_param (hcl_t* hcl, hcl_ooi_t ip, hcl_oow_t par
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int emit_indexed_variable_access (hcl_t* hcl, hcl_oow_t index, hcl_oob_t baseinst1, hcl_oob_t baseinst2)
|
static int emit_indexed_variable_access (hcl_t* hcl, hcl_oow_t index, hcl_oob_t baseinst1, hcl_oob_t baseinst2, const hcl_ioloc_t* srcloc)
|
||||||
{
|
{
|
||||||
if (hcl->c->blk.depth >= 0)
|
if (hcl->c->blk.depth >= 0)
|
||||||
{
|
{
|
||||||
@ -634,14 +634,14 @@ static int emit_indexed_variable_access (hcl_t* hcl, hcl_oow_t index, hcl_oob_t
|
|||||||
* 2 means current->home->home.
|
* 2 means current->home->home.
|
||||||
* index_in_ctx is a relative index within the context found.
|
* index_in_ctx is a relative index within the context found.
|
||||||
*/
|
*/
|
||||||
if (emit_double_param_instruction(hcl, baseinst1, ctx_offset, index_in_ctx) <= -1) return -1;
|
if (emit_double_param_instruction(hcl, baseinst1, ctx_offset, index_in_ctx, srcloc) <= -1) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: top-level... verify this. this will vary depending on how i implement the top-level and global variables... */
|
/* TODO: top-level... verify this. this will vary depending on how i implement the top-level and global variables... */
|
||||||
if (emit_single_param_instruction (hcl, baseinst2, index, HCL_NULL) <= -1) return -1;
|
if (emit_single_param_instruction (hcl, baseinst2, index, srcloc) <= -1) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1205,7 +1205,7 @@ static int compile_lambda (hcl_t* hcl, hcl_cnode_t* src, int defun)
|
|||||||
if (hcl->option.trait & HCL_TRAIT_INTERACTIVE)
|
if (hcl->option.trait & HCL_TRAIT_INTERACTIVE)
|
||||||
{
|
{
|
||||||
/* make_function nargs ntmprs lfbase lfsize */
|
/* make_function nargs ntmprs lfbase lfsize */
|
||||||
if (emit_double_param_instruction(hcl, HCL_CODE_MAKE_FUNCTION, nargs, ntmprs) <= -1) return -1;
|
if (emit_double_param_instruction(hcl, HCL_CODE_MAKE_FUNCTION, nargs, ntmprs, HCL_CNODE_GET_LOC(cmd)) <= -1) return -1;
|
||||||
lfbase_pos = hcl->code.bc.len;
|
lfbase_pos = hcl->code.bc.len;
|
||||||
if (emit_long_param(hcl, hcl->code.lit.len - hcl->c->blk.info[hcl->c->blk.depth - 1].lfbase) <= -1) return -1; /* literal frame base */
|
if (emit_long_param(hcl, hcl->code.lit.len - hcl->c->blk.info[hcl->c->blk.depth - 1].lfbase) <= -1) return -1; /* literal frame base */
|
||||||
lfsize_pos = hcl->code.bc.len; /* literal frame size */
|
lfsize_pos = hcl->code.bc.len; /* literal frame size */
|
||||||
@ -1213,14 +1213,14 @@ static int compile_lambda (hcl_t* hcl, hcl_cnode_t* src, int defun)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (emit_double_param_instruction(hcl, HCL_CODE_MAKE_BLOCK, nargs, ntmprs) <= -1) return -1;
|
if (emit_double_param_instruction(hcl, HCL_CODE_MAKE_BLOCK, nargs, ntmprs, HCL_CNODE_GET_LOC(cmd)) <= -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX); /* guaranteed in emit_byte_instruction() */
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX); /* guaranteed in emit_byte_instruction() */
|
||||||
jump_inst_pos = hcl->code.bc.len;
|
jump_inst_pos = hcl->code.bc.len;
|
||||||
/* specifying MAX_CODE_JUMP causes emit_single_param_instruction() to
|
/* specifying MAX_CODE_JUMP causes emit_single_param_instruction() to
|
||||||
* produce the long jump instruction (HCL_CODE_JUMP_FORWARD_X) */
|
* produce the long jump instruction (HCL_CODE_JUMP_FORWARD_X) */
|
||||||
if (emit_single_param_instruction(hcl, HCL_CODE_JUMP_FORWARD_0, MAX_CODE_JUMP, HCL_NULL) <= -1) return -1;
|
if (emit_single_param_instruction(hcl, HCL_CODE_JUMP_FORWARD_0, MAX_CODE_JUMP, HCL_CNODE_GET_LOC(cmd)) <= -1) return -1;
|
||||||
|
|
||||||
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT_LIST, obj);
|
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT_LIST, obj);
|
||||||
|
|
||||||
@ -1240,9 +1240,10 @@ static int compile_lambda (hcl_t* hcl, hcl_cnode_t* src, int defun)
|
|||||||
/* the check in compile_lambda() must ensure this condition */
|
/* the check in compile_lambda() must ensure this condition */
|
||||||
HCL_ASSERT (hcl, index <= HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, index <= HCL_SMOOI_MAX);
|
||||||
|
|
||||||
PUSH_SUBCFRAME (hcl, COP_EMIT_SET, HCL_SMOOI_TO_OOP(index));
|
PUSH_SUBCFRAME (hcl, COP_EMIT_SET, defun_name);
|
||||||
cf = GET_SUBCFRAME(hcl);
|
cf = GET_SUBCFRAME(hcl);
|
||||||
cf->u.set.var_type = VAR_INDEXED;
|
cf->u.set.var_type = VAR_INDEXED;
|
||||||
|
cf->u.set.index = index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1375,9 +1376,10 @@ static int compile_set (hcl_t* hcl, hcl_cnode_t* src)
|
|||||||
/* the check in compile_lambda() must ensure this condition */
|
/* the check in compile_lambda() must ensure this condition */
|
||||||
HCL_ASSERT (hcl, index <= HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, index <= HCL_SMOOI_MAX);
|
||||||
|
|
||||||
PUSH_SUBCFRAME (hcl, COP_EMIT_SET, HCL_SMOOI_TO_OOP(index));
|
PUSH_SUBCFRAME (hcl, COP_EMIT_SET, cmd);
|
||||||
cf = GET_SUBCFRAME(hcl);
|
cf = GET_SUBCFRAME(hcl);
|
||||||
cf->u.set.var_type = VAR_INDEXED;
|
cf->u.set.var_type = VAR_INDEXED;
|
||||||
|
cf->u.set.index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1642,7 +1644,6 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_cnode_t* obj)
|
|||||||
hcl_ooi_t oldtop;
|
hcl_ooi_t oldtop;
|
||||||
hcl_cframe2_t* cf;
|
hcl_cframe2_t* cf;
|
||||||
hcl_cnode_t* cdr;
|
hcl_cnode_t* cdr;
|
||||||
hcl_cnode_t* sdc;
|
|
||||||
|
|
||||||
/* NOTE: cframe management functions don't use the object memory.
|
/* NOTE: cframe management functions don't use the object memory.
|
||||||
* many operations can be performed without taking GC into account */
|
* many operations can be performed without taking GC into account */
|
||||||
@ -1653,7 +1654,7 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_cnode_t* obj)
|
|||||||
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_CALL, HCL_SMOOI_TO_OOP(0));
|
SWITCH_TOP_CFRAME (hcl, COP_EMIT_CALL, car);
|
||||||
|
|
||||||
/* compile <operator> */
|
/* compile <operator> */
|
||||||
PUSH_CFRAME (hcl, COP_COMPILE_OBJECT, car);
|
PUSH_CFRAME (hcl, COP_COMPILE_OBJECT, car);
|
||||||
@ -1684,6 +1685,8 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_cnode_t* obj)
|
|||||||
|
|
||||||
if (HCL_CNODE_IS_SYMBOL(car) || HCL_CNODE_IS_DSYMBOL(car))
|
if (HCL_CNODE_IS_SYMBOL(car) || HCL_CNODE_IS_DSYMBOL(car))
|
||||||
{
|
{
|
||||||
|
hcl_oop_cons_t sdc;
|
||||||
|
|
||||||
/* only symbols are added to the system dictionary.
|
/* only symbols are added to the system dictionary.
|
||||||
* perform this lookup only if car is a symbol */
|
* perform this lookup only if car is a symbol */
|
||||||
sdc = hcl_lookupsysdicforsymbol_noseterr(hcl, HCL_CNODE_GET_TOK(car));
|
sdc = hcl_lookupsysdicforsymbol_noseterr(hcl, HCL_CNODE_GET_TOK(car));
|
||||||
@ -1709,7 +1712,7 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_cnode_t* obj)
|
|||||||
/* patch the argument count in the operand field of the COP_EMIT_CALL frame */
|
/* patch the argument count in the operand field of the COP_EMIT_CALL frame */
|
||||||
cf = GET_CFRAME(hcl, oldtop);
|
cf = GET_CFRAME(hcl, oldtop);
|
||||||
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_CALL);
|
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_CALL);
|
||||||
cf->operand = HCL_SMOOI_TO_OOP(nargs);
|
cf->u.call.index = nargs;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1758,7 +1761,7 @@ static HCL_INLINE int compile_symbol (hcl_t* hcl, hcl_cnode_t* obj)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return emit_indexed_variable_access(hcl, index, HCL_CODE_PUSH_CTXTEMPVAR_0, HCL_CODE_PUSH_TEMPVAR_0);
|
return emit_indexed_variable_access(hcl, index, HCL_CODE_PUSH_CTXTEMPVAR_0, HCL_CODE_PUSH_TEMPVAR_0, HCL_NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2395,16 +2398,18 @@ static HCL_INLINE int patch_nearest_post_if_body (hcl_t* hcl, hcl_cnode_t* cmd)
|
|||||||
hcl_ooi_t jip, jump_offset;
|
hcl_ooi_t jip, jump_offset;
|
||||||
hcl_cframe2_t* cf;
|
hcl_cframe2_t* cf;
|
||||||
|
|
||||||
cf = find_cframe_from_top (hcl, COP_POST_IF_BODY);
|
cf = find_cframe_from_top(hcl, COP_POST_IF_BODY);
|
||||||
HCL_ASSERT (hcl, cf != HCL_NULL);
|
HCL_ASSERT (hcl, cf != HCL_NULL);
|
||||||
|
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_BODY);
|
||||||
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
|
|
||||||
/* jump instruction position of the JUMP_FORWARD_IF_FALSE after the conditional of the previous if or elif*/
|
/* jump instruction position of the JUMP_FORWARD_IF_FALSE after the conditional of the previous if or elif*/
|
||||||
jip = HCL_OOP_TO_SMOOI(cf->operand);
|
jip = cf->u.post_if.jump_inst_pos;
|
||||||
|
|
||||||
if (hcl->code.bc.len <= cf->u.post_if.body_pos)
|
if (hcl->code.bc.len <= cf->u.post_if.body_pos)
|
||||||
{
|
{
|
||||||
/* the if body is empty. */
|
/* the if body is empty. */
|
||||||
if (emit_byte_instruction (hcl, HCL_CODE_PUSH_NIL, HCL_NULL) <= -1) return -1;
|
if (emit_byte_instruction(hcl, HCL_CODE_PUSH_NIL, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
||||||
@ -2413,7 +2418,7 @@ static HCL_INLINE int patch_nearest_post_if_body (hcl_t* hcl, hcl_cnode_t* cmd)
|
|||||||
/* emit jump_forward before the beginning of the else block.
|
/* emit jump_forward before the beginning of the else block.
|
||||||
* this is to make the earlier if or elif block to skip
|
* this is to make the earlier if or elif block to skip
|
||||||
* the else part. it is to be patched in post_else_body(). */
|
* the else part. it is to be patched in post_else_body(). */
|
||||||
if (emit_single_param_instruction (hcl, HCL_CODE_JUMP_FORWARD_0, MAX_CODE_JUMP, HCL_NULL) <= -1) return -1;
|
if (emit_single_param_instruction (hcl, HCL_CODE_JUMP_FORWARD_0, MAX_CODE_JUMP, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
|
|
||||||
/* HCL_CODE_LONG_PARAM_SIZE + 1 => size of the long JUMP_FORWARD instruction */
|
/* HCL_CODE_LONG_PARAM_SIZE + 1 => size of the long JUMP_FORWARD instruction */
|
||||||
jump_offset = hcl->code.bc.len - jip - (HCL_HCL_CODE_LONG_PARAM_SIZE + 1);
|
jump_offset = hcl->code.bc.len - jip - (HCL_HCL_CODE_LONG_PARAM_SIZE + 1);
|
||||||
@ -2427,7 +2432,7 @@ static HCL_INLINE int patch_nearest_post_if_body (hcl_t* hcl, hcl_cnode_t* cmd)
|
|||||||
|
|
||||||
/* beginning of the elif/else block code */
|
/* beginning of the elif/else block code */
|
||||||
/* to drop the result of the conditional when the conditional is false */
|
/* to drop the result of the conditional when the conditional is false */
|
||||||
if (emit_byte_instruction (hcl, HCL_CODE_POP_STACKTOP, HCL_NULL) <= -1) return -1;
|
if (emit_byte_instruction (hcl, HCL_CODE_POP_STACKTOP, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
|
|
||||||
/* this is the actual beginning */
|
/* this is the actual beginning */
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
||||||
@ -2435,8 +2440,8 @@ static HCL_INLINE int patch_nearest_post_if_body (hcl_t* hcl, hcl_cnode_t* cmd)
|
|||||||
|
|
||||||
/* modify the POST_IF_BODY frame */
|
/* modify the POST_IF_BODY frame */
|
||||||
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_BODY);
|
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_BODY);
|
||||||
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand));
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
cf->operand = HCL_SMOOI_TO_OOP(jump_inst_pos);
|
cf->u.post_if.jump_inst_pos = jump_inst_pos;
|
||||||
cf->u.post_if.body_pos = body_pos;
|
cf->u.post_if.body_pos = body_pos;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -2470,7 +2475,7 @@ static HCL_INLINE int subcompile_elif (hcl_t* hcl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cond = HCL_CNODE_CONS_CAR(obj);
|
cond = HCL_CNODE_CONS_CAR(obj);
|
||||||
obj = HCL_CONS_CDR(obj);
|
obj = HCL_CNODE_CONS_CDR(obj);
|
||||||
|
|
||||||
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT, cond); /* 1 */
|
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT, cond); /* 1 */
|
||||||
PUSH_SUBCFRAME (hcl, COP_POST_IF_COND, obj); /* 2 */
|
PUSH_SUBCFRAME (hcl, COP_POST_IF_COND, obj); /* 2 */
|
||||||
@ -2654,22 +2659,24 @@ static HCL_INLINE int post_if_cond (hcl_t* hcl)
|
|||||||
|
|
||||||
cf = GET_TOP_CFRAME(hcl);
|
cf = GET_TOP_CFRAME(hcl);
|
||||||
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_COND);
|
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_COND);
|
||||||
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
||||||
jump_inst_pos = hcl->code.bc.len;
|
jump_inst_pos = hcl->code.bc.len;
|
||||||
|
|
||||||
if (emit_single_param_instruction (hcl, HCL_CODE_JUMP_FORWARD_IF_FALSE, MAX_CODE_JUMP, HCL_NULL) <= -1) return -1;
|
if (emit_single_param_instruction(hcl, HCL_CODE_JUMP_FORWARD_IF_FALSE, MAX_CODE_JUMP, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
|
|
||||||
/* to drop the result of the conditional when it is true */
|
/* to drop the result of the conditional when it is true */
|
||||||
if (emit_byte_instruction(hcl, HCL_CODE_POP_STACKTOP, HCL_NULL) <= -1) return -1;
|
if (emit_byte_instruction(hcl, HCL_CODE_POP_STACKTOP, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
|
|
||||||
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX);
|
||||||
body_pos = hcl->code.bc.len;
|
body_pos = hcl->code.bc.len;
|
||||||
|
|
||||||
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_IF_OBJECT_LIST, cf->operand); /* 1 */
|
SWITCH_TOP_CFRAME (hcl, COP_COMPILE_IF_OBJECT_LIST, cf->operand); /* 1 */
|
||||||
PUSH_SUBCFRAME (hcl, COP_POST_IF_BODY, HCL_SMOOI_TO_OOP(jump_inst_pos)); /* 2 */
|
PUSH_SUBCFRAME (hcl, COP_POST_IF_BODY, cf->operand); /* 2 */
|
||||||
cf = GET_SUBCFRAME(hcl);
|
cf = GET_SUBCFRAME(hcl);
|
||||||
cf->u.post_if.body_pos = body_pos;
|
cf->u.post_if.body_pos = body_pos;
|
||||||
|
cf->u.post_if.jump_inst_pos = jump_inst_pos;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2681,14 +2688,14 @@ static HCL_INLINE int post_if_body (hcl_t* hcl)
|
|||||||
|
|
||||||
cf = GET_TOP_CFRAME(hcl);
|
cf = GET_TOP_CFRAME(hcl);
|
||||||
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_BODY);
|
HCL_ASSERT (hcl, cf->opcode == COP_POST_IF_BODY);
|
||||||
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand));
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
|
|
||||||
jip = HCL_OOP_TO_SMOOI(cf->operand);
|
jip = cf->u.post_if.jump_inst_pos;
|
||||||
|
|
||||||
if (hcl->code.bc.len <= cf->u.post_if.body_pos)
|
if (hcl->code.bc.len <= cf->u.post_if.body_pos)
|
||||||
{
|
{
|
||||||
/* if body is empty */
|
/* if body is empty */
|
||||||
if (emit_byte_instruction (hcl, HCL_CODE_PUSH_NIL, HCL_NULL) <= -1) return -1;
|
if (emit_byte_instruction(hcl, HCL_CODE_PUSH_NIL, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HCL_CODE_LONG_PARAM_SIZE + 1 => size of the long JUMP_FORWARD_IF_FALSE instruction */
|
/* HCL_CODE_LONG_PARAM_SIZE + 1 => size of the long JUMP_FORWARD_IF_FALSE instruction */
|
||||||
@ -2827,9 +2834,9 @@ static HCL_INLINE int emit_call (hcl_t* hcl)
|
|||||||
|
|
||||||
cf = GET_TOP_CFRAME(hcl);
|
cf = GET_TOP_CFRAME(hcl);
|
||||||
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_CALL);
|
HCL_ASSERT (hcl, cf->opcode == COP_EMIT_CALL);
|
||||||
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand));
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
|
|
||||||
n = emit_single_param_instruction(hcl, HCL_CODE_CALL_0, HCL_OOP_TO_SMOOI(cf->operand), HCL_NULL);
|
n = emit_single_param_instruction(hcl, HCL_CODE_CALL_0, cf->u.call.index, HCL_CNODE_GET_LOC(cf->operand));
|
||||||
|
|
||||||
POP_CFRAME (hcl);
|
POP_CFRAME (hcl);
|
||||||
return n;
|
return n;
|
||||||
@ -3055,7 +3062,7 @@ static HCL_INLINE int emit_set (hcl_t* hcl)
|
|||||||
if (!cons)
|
if (!cons)
|
||||||
{
|
{
|
||||||
cons = (hcl_oop_t)hcl_putatsysdic(hcl, sym, hcl->_nil);
|
cons = (hcl_oop_t)hcl_putatsysdic(hcl, sym, hcl->_nil);
|
||||||
if (!cons) return -1;
|
if (HCL_UNLIKELY(!cons)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add_literal(hcl, cons, &index) <= -1 ||
|
if (add_literal(hcl, cons, &index) <= -1 ||
|
||||||
@ -3063,12 +3070,9 @@ static HCL_INLINE int emit_set (hcl_t* hcl)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hcl_oow_t index;
|
|
||||||
HCL_ASSERT (hcl, cf->u.set.var_type == VAR_INDEXED);
|
HCL_ASSERT (hcl, cf->u.set.var_type == VAR_INDEXED);
|
||||||
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand));
|
HCL_ASSERT (hcl, cf->operand != HCL_NULL);
|
||||||
|
if (emit_indexed_variable_access(hcl, cf->u.set.index, HCL_CODE_STORE_INTO_CTXTEMPVAR_0, HCL_CODE_STORE_INTO_TEMPVAR_0, HCL_CNODE_GET_LOC(cf->operand)) <= -1) return -1;
|
||||||
index = (hcl_oow_t)HCL_OOP_TO_SMOOI(cf->operand);
|
|
||||||
if (emit_indexed_variable_access(hcl, index, HCL_CODE_STORE_INTO_CTXTEMPVAR_0, HCL_CODE_STORE_INTO_TEMPVAR_0) <= -1) return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
POP_CFRAME (hcl);
|
POP_CFRAME (hcl);
|
||||||
|
@ -320,9 +320,17 @@ struct hcl_cframe2_t
|
|||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
/* COP_EMIT_CALL */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
hcl_ooi_t index;
|
||||||
|
} call;
|
||||||
|
|
||||||
|
/* COP_EMIT_SET */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
int var_type;
|
int var_type;
|
||||||
|
hcl_ooi_t index;
|
||||||
} set;
|
} set;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
@ -335,6 +343,7 @@ struct hcl_cframe2_t
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
hcl_ooi_t body_pos;
|
hcl_ooi_t body_pos;
|
||||||
|
hcl_ooi_t jump_inst_pos;
|
||||||
hcl_ioloc_t start_loc;
|
hcl_ioloc_t start_loc;
|
||||||
} post_if;
|
} post_if;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user