corrected clean-up actions in read_object() in read2.c

This commit is contained in:
hyung-hwan 2021-01-16 08:23:52 +00:00
parent b327791484
commit 58ec16aa0a
2 changed files with 21 additions and 59 deletions

View File

@ -1658,7 +1658,6 @@ static hcl_cnode_t* read_vlist (hcl_t* hcl)
goto oops; goto oops;
} }
if (!l->u.list.head) if (!l->u.list.head)
{ {
l->u.list.head = cons; l->u.list.head = cons;
@ -1711,7 +1710,7 @@ static hcl_cnode_t* read_object (hcl_t* hcl)
case HCL_IOTOK_INCLUDE: case HCL_IOTOK_INCLUDE:
/* TODO: should i limit where #include can be specified? /* TODO: should i limit where #include can be specified?
* disallow it inside a list literal or an array literal? */ * disallow it inside a list literal or an array literal? */
GET_TOKEN (hcl); GET_TOKEN_WITH_GOTO (hcl, oops);
if (TOKEN_TYPE(hcl) != HCL_IOTOK_STRLIT) if (TOKEN_TYPE(hcl) != HCL_IOTOK_STRLIT)
{ {
hcl_setsynerr (hcl, HCL_SYNERR_STRING, TOKEN_LOC(hcl), TOKEN_NAME(hcl)); hcl_setsynerr (hcl, HCL_SYNERR_STRING, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
@ -1964,63 +1963,6 @@ static hcl_cnode_t* read_object (hcl_t* hcl)
case HCL_IOTOK_IDENT_DOTTED: case HCL_IOTOK_IDENT_DOTTED:
obj = hcl_makecnodesymbol(hcl, TOKEN_LOC(hcl), 1, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl)); obj = hcl_makecnodesymbol(hcl, TOKEN_LOC(hcl), 1, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl));
#if 0
// DO THIS IN THE COMPILER CODE
if (obj && !hcl_getatsysdic(hcl, obj))
{
/* query the module for information if it is the first time
* when the dotted symbol is seen */
hcl_pfbase_t* pfbase;
hcl_mod_t* mod;
hcl_oop_t val;
unsigned int kernel_bits;
pfbase = hcl_querymod(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl), &mod);
if (!pfbase)
{
/* TODO switch to syntax error */
goto oops;
}
hcl_pushvolat (hcl, &obj);
switch (pfbase->type)
{
case HCL_PFBASE_FUNC:
kernel_bits = 2;
val = hcl_makeprim(hcl, pfbase->handler, pfbase->minargs, pfbase->maxargs, mod);
break;
case HCL_PFBASE_VAR:
kernel_bits = 1;
val = hcl->_nil;
break;
case HCL_PFBASE_CONST:
/* TODO: create a value from the pfbase information. it needs to get extended first
* can i make use of pfbase->handler type-cast to a differnt type? */
kernel_bits = 2;
val = hcl->_nil;
break;
default:
hcl_popvolat (hcl);
hcl_seterrbfmt (hcl, HCL_EINVAL, "invalid pfbase type - %d\n", pfbase->type);
goto oops;
}
if (!val || !hcl_putatsysdic(hcl, obj, val))
{
hcl_popvolat (hcl);
goto oops;
}
hcl_popvolat (hcl);
/* make this dotted symbol special that it can't get changed
* to a different value */
HCL_OBJ_SET_FLAGS_KERNEL (obj, kernel_bits);
}
#endif
break; break;
} }
@ -2054,6 +1996,12 @@ static hcl_cnode_t* read_object (hcl_t* hcl)
/* if not, append the element read into the current list. /* if not, append the element read into the current list.
* if we are not at the top level, we must be in a list */ * if we are not at the top level, we must be in a list */
if (chain_to_list(hcl, obj) <= -1) goto oops; if (chain_to_list(hcl, obj) <= -1) goto oops;
/* because it has been chained to the list, it belongs to the current stack top.
* mark that obj is not stand-alone by nullifying it. without this, if a jump
* is made to oops, the momory block pointed to by obj may get freed twice. */
obj = HCL_NULL;
clear_comma_colon_flag (hcl); clear_comma_colon_flag (hcl);
/* read the next token */ /* read the next token */
@ -2064,10 +2012,23 @@ static hcl_cnode_t* read_object (hcl_t* hcl)
HCL_ASSERT (hcl, level == 0); HCL_ASSERT (hcl, level == 0);
HCL_ASSERT (hcl, array_level == 0); HCL_ASSERT (hcl, array_level == 0);
HCL_ASSERT (hcl, hcl->c->r.st == HCL_NULL);
HCL_ASSERT (hcl, obj != HCL_NULL);
return obj; return obj;
oops: oops:
if (obj) hcl_freecnode (hcl, obj); if (obj) hcl_freecnode (hcl, obj);
/* clean up the reader stack for a list */
while (hcl->c->r.st)
{
hcl_rstl_t* rstl;
rstl = hcl->c->r.st;
hcl->c->r.st = rstl->prev;
if (rstl->head) hcl_freecnode (hcl, rstl->head);
hcl_freemem (hcl, rstl);
}
return HCL_NULL; return HCL_NULL;
} }

View File

@ -364,6 +364,7 @@ pdfdir = @pdfdir@
prefix = @prefix@ prefix = @prefix@
program_transform_name = @program_transform_name@ program_transform_name = @program_transform_name@
psdir = @psdir@ psdir = @psdir@
runstatedir = @runstatedir@
sbindir = @sbindir@ sbindir = @sbindir@
sharedstatedir = @sharedstatedir@ sharedstatedir = @sharedstatedir@
srcdir = @srcdir@ srcdir = @srcdir@