fixed a wrong compiler check in the post_catch() phase

This commit is contained in:
hyung-hwan 2021-12-26 14:59:34 +00:00
parent afeebc08c9
commit 447fafd7b2
2 changed files with 22 additions and 4 deletions

View File

@ -2045,7 +2045,7 @@ static HCL_INLINE int compile_class_p1 (hcl_t* hcl)
if (push_clsblk(hcl, &cf->u._class.start_loc, nivars, ncvars, &hcl->c->tv.s.ptr[tv_dup_check_start + 1], HCL_NULL) <= -1) goto oops; if (push_clsblk(hcl, &cf->u._class.start_loc, nivars, ncvars, &hcl->c->tv.s.ptr[tv_dup_check_start + 1], HCL_NULL) <= -1) goto oops;
/* discard the instance variables and class variables in the temporary variable collection buffe /* discard the instance variables and class variables in the temporary variable collection buffer
* because they have been pushed to the class block structure */ * because they have been pushed to the class block structure */
hcl->c->tv.s.len = tv_dup_check_start; hcl->c->tv.s.len = tv_dup_check_start;
hcl->c->tv.wcount = saved_tv_wcount; hcl->c->tv.wcount = saved_tv_wcount;
@ -2752,6 +2752,9 @@ static HCL_INLINE int compile_catch (hcl_t* hcl)
hcl_oow_t exarg_offset; hcl_oow_t exarg_offset;
hcl_var_info_t vi; hcl_var_info_t vi;
hcl_fnblk_info_t* fbi; hcl_fnblk_info_t* fbi;
#if !defined(HCL_BUILD_RELEASE)
hcl_oow_t par_tmprcnt;
#endif
cf = GET_TOP_CFRAME(hcl); cf = GET_TOP_CFRAME(hcl);
HCL_ASSERT (hcl, cf->opcode == COP_COMPILE_CATCH); HCL_ASSERT (hcl, cf->opcode == COP_COMPILE_CATCH);
@ -2800,13 +2803,26 @@ static HCL_INLINE int compile_catch (hcl_t* hcl)
vi.index_in_ctx = hcl->c->tv.wcount; vi.index_in_ctx = hcl->c->tv.wcount;
if (add_temporary_variable(hcl, HCL_CNODE_GET_TOK(exarg), hcl->c->tv.s.len) <= -1) return -1; if (add_temporary_variable(hcl, HCL_CNODE_GET_TOK(exarg), hcl->c->tv.s.len) <= -1) return -1;
#if !defined(HCL_BUILD_RELEASE)
if (hcl->c->fnblk.depth >= 0)
{
fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth - 1]; /* parent block */
par_tmprcnt = fbi->tmprcnt;
}
else
{
par_tmprcnt = 0;
}
#endif
fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth]; fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth];
HCL_ASSERT (hcl, fbi->tmprlen == hcl->c->tv.s.len - HCL_CNODE_GET_TOKLEN(exarg) - 1); HCL_ASSERT (hcl, fbi->tmprlen == hcl->c->tv.s.len - HCL_CNODE_GET_TOKLEN(exarg) - 1);
HCL_ASSERT (hcl, fbi->tmprcnt == vi.index_in_ctx); HCL_ASSERT (hcl, fbi->tmprcnt == vi.index_in_ctx);
fbi->tmprlen = hcl->c->tv.s.len; fbi->tmprlen = hcl->c->tv.s.len;
fbi->tmprcnt = hcl->c->tv.wcount; fbi->tmprcnt = hcl->c->tv.wcount;
fbi->tmpr_nlvars = fbi->tmpr_nlvars + 1; fbi->tmpr_nlvars = fbi->tmpr_nlvars + 1;
HCL_ASSERT (hcl, fbi->tmpr_nargs + fbi->tmpr_nrvars + fbi->tmpr_nlvars == fbi->tmprcnt);
HCL_ASSERT (hcl, fbi->tmpr_nargs + fbi->tmpr_nrvars + fbi->tmpr_nlvars == fbi->tmprcnt - par_tmprcnt);
obj = HCL_CNODE_CONS_CDR(obj); obj = HCL_CNODE_CONS_CDR(obj);
@ -2821,7 +2837,7 @@ static HCL_INLINE int compile_catch (hcl_t* hcl)
PUSH_SUBCFRAME (hcl, COP_POST_CATCH, cmd); PUSH_SUBCFRAME (hcl, COP_POST_CATCH, cmd);
cf = GET_SUBCFRAME(hcl); cf = GET_SUBCFRAME(hcl);
cf->u.post_catch.jump_inst_pos = jump_inst_pos; cf->u.post_catch.jump_inst_pos = jump_inst_pos;
cf->u.post_catch.exarg_offset = exarg_offset; /* there is only 1 exception varilable. using the offset is easier than to use the variable position */ cf->u.post_catch.exarg_offset = exarg_offset; /* there is only 1 exception variable. using the offset is easier than to use the variable position */
return 0; return 0;
} }
@ -2865,6 +2881,8 @@ static HCL_INLINE int post_catch (hcl_t* hcl)
patch_long_jump (hcl, jip, block_code_size); /* patch the jump between the try block and the catch block */ patch_long_jump (hcl, jip, block_code_size); /* patch the jump between the try block and the catch block */
/* make the exception variable unsearchable outside the catch block.
* the variable entity is still be accounted into the local variable list. */
kill_temporary_variable_at_offset (hcl, cf->u.post_catch.exarg_offset); kill_temporary_variable_at_offset (hcl, cf->u.post_catch.exarg_offset);
POP_CFRAME (hcl); POP_CFRAME (hcl);

View File

@ -2135,7 +2135,7 @@ static HCL_INLINE int do_throw (hcl_t* hcl, hcl_oop_t val, hcl_ooi_t ip)
/* pop the exception stack to get information to rewind context */ /* pop the exception stack to get information to rewind context */
HCL_EXSTACK_POP_TO (hcl, catch_ctx, catch_ip, clsp); HCL_EXSTACK_POP_TO (hcl, catch_ctx, catch_ip, clsp);
/* discard the unfinished class definitions for the exception thrown. /* discard unfinished class definitions for the exception thrown.
* *
* (try * (try
* (defclass X * (defclass X