fixed yet another bug compiling a catch block

This commit is contained in:
hyung-hwan 2021-12-26 16:37:54 +00:00
parent 73148041a2
commit 7b653c0df8

View File

@ -2752,9 +2752,7 @@ 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; 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);
@ -2795,15 +2793,6 @@ static HCL_INLINE int compile_catch (hcl_t* hcl)
/* add the exception variable to the local variable list. increase the number of local variables */ /* add the exception variable to the local variable list. increase the number of local variables */
exarg_offset = hcl->c->tv.s.len + 1; /* when the variable name is added, its offset will be the current length + 1 for a space character added */ exarg_offset = hcl->c->tv.s.len + 1; /* when the variable name is added, its offset will be the current length + 1 for a space character added */
/* fill the variable information structure as if it's found by find_variable_backward().
* we know it's the last variable as add_temporary_variable() is called below.
* there is no need to call find_variable_backward() */
vi.type = VAR_INDEXED;
vi.ctx_offset = 0;
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 !defined(HCL_BUILD_RELEASE)
if (hcl->c->fnblk.depth > 0) if (hcl->c->fnblk.depth > 0)
{ {
fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth - 1]; /* parent block */ fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth - 1]; /* parent block */
@ -2813,11 +2802,19 @@ static HCL_INLINE int compile_catch (hcl_t* hcl)
{ {
par_tmprcnt = 0; par_tmprcnt = 0;
} }
#endif
/* fill the variable information structure as if it's found by find_variable_backward().
* we know it's the last variable as add_temporary_variable() is called below.
* there is no need to call find_variable_backward() */
vi.type = VAR_INDEXED;
vi.ctx_offset = 0;
vi.index_in_ctx = hcl->c->tv.wcount - par_tmprcnt;
if (add_temporary_variable(hcl, HCL_CNODE_GET_TOK(exarg), hcl->c->tv.s.len) <= -1) return -1;
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 + par_tmprcnt);
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;