added a new keyword @nil
This commit is contained in:
parent
93aa76e104
commit
7ab601303c
@ -399,7 +399,7 @@ enum hawk_nde_type_t
|
|||||||
|
|
||||||
/* expression */
|
/* expression */
|
||||||
/* if you change the following values including their order,
|
/* if you change the following values including their order,
|
||||||
* you should change __evaluator of __eval_expression
|
* you should change __evaluator of eval_expression0()
|
||||||
* in run.c accordingly */
|
* in run.c accordingly */
|
||||||
HAWK_NDE_GRP,
|
HAWK_NDE_GRP,
|
||||||
HAWK_NDE_ASS,
|
HAWK_NDE_ASS,
|
||||||
@ -416,6 +416,7 @@ enum hawk_nde_type_t
|
|||||||
HAWK_NDE_STR,
|
HAWK_NDE_STR,
|
||||||
HAWK_NDE_MBS,
|
HAWK_NDE_MBS,
|
||||||
HAWK_NDE_REX,
|
HAWK_NDE_REX,
|
||||||
|
HAWK_NDE_XNIL,
|
||||||
HAWK_NDE_FUN,
|
HAWK_NDE_FUN,
|
||||||
|
|
||||||
/* keep this order for the following items otherwise, you may have
|
/* keep this order for the following items otherwise, you may have
|
||||||
|
@ -35,6 +35,7 @@ enum hawk_kwid_t
|
|||||||
HAWK_KWID_XINCLUDE,
|
HAWK_KWID_XINCLUDE,
|
||||||
HAWK_KWID_XINCLUDE_ONCE,
|
HAWK_KWID_XINCLUDE_ONCE,
|
||||||
HAWK_KWID_XLOCAL,
|
HAWK_KWID_XLOCAL,
|
||||||
|
HAWK_KWID_XNIL,
|
||||||
HAWK_KWID_XPRAGMA,
|
HAWK_KWID_XPRAGMA,
|
||||||
HAWK_KWID_XRESET,
|
HAWK_KWID_XRESET,
|
||||||
HAWK_KWID_BEGIN,
|
HAWK_KWID_BEGIN,
|
||||||
|
@ -178,6 +178,7 @@ enum tok_t
|
|||||||
TOK_STR,
|
TOK_STR,
|
||||||
TOK_MBS,
|
TOK_MBS,
|
||||||
TOK_REX,
|
TOK_REX,
|
||||||
|
TOK_XNIL,
|
||||||
|
|
||||||
__TOKEN_COUNT__
|
__TOKEN_COUNT__
|
||||||
};
|
};
|
||||||
@ -281,13 +282,14 @@ struct kwent_t
|
|||||||
|
|
||||||
static kwent_t kwtab[] =
|
static kwent_t kwtab[] =
|
||||||
{
|
{
|
||||||
/* keep this table in sync with the kw_t enums in <parse.h>.
|
/* keep this table in sync with the kw_t enums in "parse-prv.h".
|
||||||
* also keep it sorted by the first field for binary search */
|
* also keep it sorted by the first field for binary search */
|
||||||
{ { HAWK_T("@abort"), 6 }, TOK_XABORT, 0 },
|
{ { HAWK_T("@abort"), 6 }, TOK_XABORT, 0 },
|
||||||
{ { HAWK_T("@global"), 7 }, TOK_XGLOBAL, 0 },
|
{ { HAWK_T("@global"), 7 }, TOK_XGLOBAL, 0 },
|
||||||
{ { HAWK_T("@include"), 8 }, TOK_XINCLUDE, 0 },
|
{ { HAWK_T("@include"), 8 }, TOK_XINCLUDE, 0 },
|
||||||
{ { HAWK_T("@include_once"), 13 }, TOK_XINCLUDE_ONCE, 0 },
|
{ { HAWK_T("@include_once"), 13 }, TOK_XINCLUDE_ONCE, 0 },
|
||||||
{ { HAWK_T("@local"), 6 }, TOK_XLOCAL, 0 },
|
{ { HAWK_T("@local"), 6 }, TOK_XLOCAL, 0 },
|
||||||
|
{ { HAWK_T("@nil"), 4 }, TOK_XNIL, 0 },
|
||||||
{ { HAWK_T("@pragma"), 7 }, TOK_XPRAGMA, 0 },
|
{ { HAWK_T("@pragma"), 7 }, TOK_XPRAGMA, 0 },
|
||||||
{ { HAWK_T("@reset"), 6 }, TOK_XRESET, 0 },
|
{ { HAWK_T("@reset"), 6 }, TOK_XRESET, 0 },
|
||||||
{ { HAWK_T("BEGIN"), 5 }, TOK_BEGIN, HAWK_PABLOCK },
|
{ { HAWK_T("BEGIN"), 5 }, TOK_BEGIN, HAWK_PABLOCK },
|
||||||
@ -1566,7 +1568,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk)
|
|||||||
hawk_arr_clear (hawk->parse.params);
|
hawk_arr_clear (hawk->parse.params);
|
||||||
|
|
||||||
fun = (hawk_fun_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*fun));
|
fun = (hawk_fun_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*fun));
|
||||||
if (fun == HAWK_NULL)
|
if (HAWK_UNLIKELY(!fun))
|
||||||
{
|
{
|
||||||
ADJERR_LOC (hawk, &hawk->tok.loc);
|
ADJERR_LOC (hawk, &hawk->tok.loc);
|
||||||
goto oops;
|
goto oops;
|
||||||
@ -1579,7 +1581,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk)
|
|||||||
fun->body = body;
|
fun->body = body;
|
||||||
|
|
||||||
pair = hawk_htb_insert(hawk->tree.funs, name.ptr, name.len, fun, 0);
|
pair = hawk_htb_insert(hawk->tree.funs, name.ptr, name.len, fun, 0);
|
||||||
if (pair == HAWK_NULL)
|
if (HAWK_UNLIKELY(!pair))
|
||||||
{
|
{
|
||||||
/* if hawk_htb_insert() fails for other reasons than memory
|
/* if hawk_htb_insert() fails for other reasons than memory
|
||||||
* shortage, there should be implementaion errors as duplicate
|
* shortage, there should be implementaion errors as duplicate
|
||||||
@ -1616,8 +1618,8 @@ static hawk_nde_t* parse_begin (hawk_t* hawk)
|
|||||||
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
||||||
|
|
||||||
if (get_token(hawk) <= -1) return HAWK_NULL;
|
if (get_token(hawk) <= -1) return HAWK_NULL;
|
||||||
nde = parse_block_dc (hawk, &xloc, 1);
|
nde = parse_block_dc(hawk, &xloc, 1);
|
||||||
if (nde == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
|
||||||
|
|
||||||
if (hawk->tree.begin == HAWK_NULL)
|
if (hawk->tree.begin == HAWK_NULL)
|
||||||
{
|
{
|
||||||
@ -1642,8 +1644,8 @@ static hawk_nde_t* parse_end (hawk_t* hawk)
|
|||||||
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
||||||
|
|
||||||
if (get_token(hawk) <= -1) return HAWK_NULL;
|
if (get_token(hawk) <= -1) return HAWK_NULL;
|
||||||
nde = parse_block_dc (hawk, &xloc, 1);
|
nde = parse_block_dc(hawk, &xloc, 1);
|
||||||
if (nde == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
|
||||||
|
|
||||||
if (hawk->tree.end == HAWK_NULL)
|
if (hawk->tree.end == HAWK_NULL)
|
||||||
{
|
{
|
||||||
@ -1658,8 +1660,7 @@ static hawk_nde_t* parse_end (hawk_t* hawk)
|
|||||||
return nde;
|
return nde;
|
||||||
}
|
}
|
||||||
|
|
||||||
static hawk_chain_t* parse_action_block (
|
static hawk_chain_t* parse_action_block (hawk_t* hawk, hawk_nde_t* ptn, int blockless)
|
||||||
hawk_t* hawk, hawk_nde_t* ptn, int blockless)
|
|
||||||
{
|
{
|
||||||
hawk_nde_t* nde;
|
hawk_nde_t* nde;
|
||||||
hawk_chain_t* chain;
|
hawk_chain_t* chain;
|
||||||
@ -1672,11 +1673,11 @@ static hawk_chain_t* parse_action_block (
|
|||||||
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
|
||||||
if (get_token(hawk) <= -1) return HAWK_NULL;
|
if (get_token(hawk) <= -1) return HAWK_NULL;
|
||||||
nde = parse_block_dc(hawk, &xloc, 1);
|
nde = parse_block_dc(hawk, &xloc, 1);
|
||||||
if (nde == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
chain = (hawk_chain_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*chain));
|
chain = (hawk_chain_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*chain));
|
||||||
if (chain == HAWK_NULL)
|
if (HAWK_UNLIKELY(!chain))
|
||||||
{
|
{
|
||||||
hawk_clrpt (hawk, nde);
|
hawk_clrpt (hawk, nde);
|
||||||
ADJERR_LOC (hawk, &xloc);
|
ADJERR_LOC (hawk, &xloc);
|
||||||
@ -1749,13 +1750,13 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
/* @local ... */
|
/* @local ... */
|
||||||
if (get_token(hawk) <= -1)
|
if (get_token(hawk) <= -1)
|
||||||
{
|
{
|
||||||
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collect_locals (hawk, nlcls, istop) == HAWK_NULL)
|
if (collect_locals(hawk, nlcls, istop) == HAWK_NULL)
|
||||||
{
|
{
|
||||||
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1776,10 +1777,8 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
/* if EOF is met before the right brace, this is an error */
|
/* if EOF is met before the right brace, this is an error */
|
||||||
if (MATCH(hawk,TOK_EOF))
|
if (MATCH(hawk,TOK_EOF))
|
||||||
{
|
{
|
||||||
hawk_arr_delete (
|
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
|
||||||
hawk->parse.lcls, nlcls,
|
if (head) hawk_clrpt (hawk, head);
|
||||||
HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
|
|
||||||
if (head != HAWK_NULL) hawk_clrpt (hawk, head);
|
|
||||||
hawk_seterrnum (hawk, &hawk->tok.loc, HAWK_EEOF);
|
hawk_seterrnum (hawk, &hawk->tok.loc, HAWK_EEOF);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
@ -1789,10 +1788,8 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
{
|
{
|
||||||
if (get_token(hawk) <= -1)
|
if (get_token(hawk) <= -1)
|
||||||
{
|
{
|
||||||
hawk_arr_delete (
|
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
||||||
hawk->parse.lcls, nlcls,
|
if (head) hawk_clrpt (hawk, head);
|
||||||
HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
|
||||||
if (head != HAWK_NULL) hawk_clrpt (hawk, head);
|
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1827,14 +1824,12 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
{
|
{
|
||||||
hawk_loc_t sloc;
|
hawk_loc_t sloc;
|
||||||
sloc = hawk->tok.loc;
|
sloc = hawk->tok.loc;
|
||||||
nde = parse_statement (hawk, &sloc);
|
nde = parse_statement(hawk, &sloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAWK_UNLIKELY(!nde))
|
if (HAWK_UNLIKELY(!nde))
|
||||||
{
|
{
|
||||||
hawk_arr_delete (
|
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
||||||
hawk->parse.lcls, nlcls,
|
|
||||||
HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
|
|
||||||
if (head) hawk_clrpt (hawk, head);
|
if (head) hawk_clrpt (hawk, head);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
@ -1846,8 +1841,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
hawk_clrpt (hawk, nde);
|
hawk_clrpt (hawk, nde);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (nde->type == HAWK_NDE_BLK &&
|
if (nde->type == HAWK_NDE_BLK && ((hawk_nde_blk_t*)nde)->body == HAWK_NULL)
|
||||||
((hawk_nde_blk_t*)nde)->body == HAWK_NULL)
|
|
||||||
{
|
{
|
||||||
hawk_clrpt (hawk, nde);
|
hawk_clrpt (hawk, nde);
|
||||||
continue;
|
continue;
|
||||||
@ -1871,7 +1865,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
|
|||||||
tmp = HAWK_ARR_SIZE(hawk->parse.lcls);
|
tmp = HAWK_ARR_SIZE(hawk->parse.lcls);
|
||||||
if (tmp > hawk->parse.nlcls_max) hawk->parse.nlcls_max = tmp;
|
if (tmp > hawk->parse.nlcls_max) hawk->parse.nlcls_max = tmp;
|
||||||
|
|
||||||
/* remove all lcls to move it up to the top level */
|
/* remove all lcls to move them up to the top level */
|
||||||
hawk_arr_delete (hawk->parse.lcls, nlcls, tmp - nlcls);
|
hawk_arr_delete (hawk->parse.lcls, nlcls, tmp - nlcls);
|
||||||
|
|
||||||
/* adjust the number of lcls for a block without any statements */
|
/* adjust the number of lcls for a block without any statements */
|
||||||
@ -1904,6 +1898,7 @@ static hawk_nde_t* parse_block_dc (hawk_t* hawk, const hawk_loc_t* xloc, int ist
|
|||||||
{
|
{
|
||||||
hawk_nde_t* nde;
|
hawk_nde_t* nde;
|
||||||
|
|
||||||
|
/* perform the depth check before calling parse_block() */
|
||||||
if (hawk->opt.depth.s.block_parse > 0 &&
|
if (hawk->opt.depth.s.block_parse > 0 &&
|
||||||
hawk->parse.depth.block >= hawk->opt.depth.s.block_parse)
|
hawk->parse.depth.block >= hawk->opt.depth.s.block_parse)
|
||||||
{
|
{
|
||||||
@ -3015,11 +3010,9 @@ static hawk_nde_t* parse_delete (hawk_t* hawk, const hawk_loc_t* xloc)
|
|||||||
hawk_nde_type_t type;
|
hawk_nde_type_t type;
|
||||||
int inparen = 0;
|
int inparen = 0;
|
||||||
|
|
||||||
HAWK_ASSERT (hawk->ptok.type == TOK_DELETE ||
|
HAWK_ASSERT (hawk->ptok.type == TOK_DELETE || hawk->ptok.type == TOK_XRESET);
|
||||||
hawk->ptok.type == TOK_XRESET);
|
|
||||||
|
|
||||||
type = (hawk->ptok.type == TOK_DELETE)?
|
type = (hawk->ptok.type == TOK_DELETE)? HAWK_NDE_DELETE: HAWK_NDE_RESET;
|
||||||
HAWK_NDE_DELETE: HAWK_NDE_RESET;
|
|
||||||
|
|
||||||
if (MATCH(hawk,TOK_LPAREN))
|
if (MATCH(hawk,TOK_LPAREN))
|
||||||
{
|
{
|
||||||
@ -3455,7 +3448,7 @@ static hawk_nde_t* parse_statement (hawk_t* hawk, const hawk_loc_t* xloc)
|
|||||||
|
|
||||||
tloc = hawk->ptok.loc;
|
tloc = hawk->ptok.loc;
|
||||||
if (get_token(hawk) <= -1) return HAWK_NULL;
|
if (get_token(hawk) <= -1) return HAWK_NULL;
|
||||||
nde = parse_block_dc (hawk, &tloc, 0);
|
nde = parse_block_dc(hawk, &tloc, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4532,8 +4525,8 @@ static hawk_nde_t* parse_increment (hawk_t* hawk, const hawk_loc_t* xloc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ploc = hawk->tok.loc;
|
ploc = hawk->tok.loc;
|
||||||
left = parse_primary (hawk, &ploc);
|
left = parse_primary(hawk, &ploc);
|
||||||
if (left == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!left)) return HAWK_NULL;
|
||||||
|
|
||||||
/* check for postfix increment operator */
|
/* check for postfix increment operator */
|
||||||
opcode2 = MATCH(hawk,TOK_PLUSPLUS)? HAWK_INCOP_PLUS:
|
opcode2 = MATCH(hawk,TOK_PLUSPLUS)? HAWK_INCOP_PLUS:
|
||||||
@ -5076,6 +5069,31 @@ oops:
|
|||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hawk_nde_t* parse_primary_xnil (hawk_t* hawk, const hawk_loc_t* xloc)
|
||||||
|
{
|
||||||
|
hawk_nde_xnil_t* nde;
|
||||||
|
|
||||||
|
nde = (hawk_nde_xnil_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*nde));
|
||||||
|
if (HAWK_UNLIKELY(!nde))
|
||||||
|
{
|
||||||
|
ADJERR_LOC (hawk, xloc);
|
||||||
|
return HAWK_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nde->type = HAWK_NDE_XNIL;
|
||||||
|
nde->loc = *xloc;
|
||||||
|
|
||||||
|
if (get_token(hawk) <= -1) goto oops;
|
||||||
|
|
||||||
|
return (hawk_nde_t*)nde;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
HAWK_ASSERT (nde != HAWK_NULL);
|
||||||
|
hawk_freemem (hawk, nde);
|
||||||
|
return HAWK_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc)
|
static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc)
|
||||||
{
|
{
|
||||||
switch (hawk->tok.type)
|
switch (hawk->tok.type)
|
||||||
@ -5111,6 +5129,10 @@ static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc)
|
|||||||
case TOK_GETLINE:
|
case TOK_GETLINE:
|
||||||
return parse_primary_getline(hawk, xloc, 0);
|
return parse_primary_getline(hawk, xloc, 0);
|
||||||
|
|
||||||
|
case TOK_XNIL:
|
||||||
|
return parse_primary_xnil(hawk, xloc);
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
hawk_tok_t* xtok;
|
hawk_tok_t* xtok;
|
||||||
|
@ -162,6 +162,7 @@ static hawk_val_t* eval_flt (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
|||||||
static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
|
static hawk_val_t* eval_xnil (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_named (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_named (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_gbl (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_gbl (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
@ -3621,6 +3622,7 @@ static hawk_val_t* eval_expression0 (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
eval_str,
|
eval_str,
|
||||||
eval_mbs,
|
eval_mbs,
|
||||||
eval_rex,
|
eval_rex,
|
||||||
|
eval_xnil,
|
||||||
eval_fun,
|
eval_fun,
|
||||||
eval_named,
|
eval_named,
|
||||||
eval_gbl,
|
eval_gbl,
|
||||||
@ -6892,7 +6894,7 @@ static hawk_val_t* eval_int (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
hawk_val_t* val;
|
hawk_val_t* val;
|
||||||
val = hawk_rtx_makeintval(rtx, ((hawk_nde_int_t*)nde)->val);
|
val = hawk_rtx_makeintval(rtx, ((hawk_nde_int_t*)nde)->val);
|
||||||
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
else if (HAWK_VTR_IS_POINTER(val)) ((hawk_val_int_t*)val)->nde = nde;
|
else if (HAWK_VTR_IS_POINTER(val)) ((hawk_val_int_t*)val)->nde = nde;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@ -6901,7 +6903,7 @@ static hawk_val_t* eval_flt (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
hawk_val_t* val;
|
hawk_val_t* val;
|
||||||
val = hawk_rtx_makefltval(rtx, ((hawk_nde_flt_t*)nde)->val);
|
val = hawk_rtx_makefltval(rtx, ((hawk_nde_flt_t*)nde)->val);
|
||||||
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
else ((hawk_val_flt_t*)val)->nde = nde;
|
else ((hawk_val_flt_t*)val)->nde = nde;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@ -6910,7 +6912,7 @@ static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
hawk_val_t* val;
|
hawk_val_t* val;
|
||||||
val = hawk_rtx_makestrvalwithoochars(rtx, ((hawk_nde_str_t*)nde)->ptr, ((hawk_nde_str_t*)nde)->len);
|
val = hawk_rtx_makestrvalwithoochars(rtx, ((hawk_nde_str_t*)nde)->ptr, ((hawk_nde_str_t*)nde)->len);
|
||||||
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6918,7 +6920,7 @@ static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
hawk_val_t* val;
|
hawk_val_t* val;
|
||||||
val = hawk_rtx_makembsvalwithbchars(rtx, ((hawk_nde_mbs_t*)nde)->ptr, ((hawk_nde_mbs_t*)nde)->len);
|
val = hawk_rtx_makembsvalwithbchars(rtx, ((hawk_nde_mbs_t*)nde)->ptr, ((hawk_nde_mbs_t*)nde)->len);
|
||||||
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6926,7 +6928,15 @@ static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
hawk_val_t* val;
|
hawk_val_t* val;
|
||||||
val = hawk_rtx_makerexval(rtx, &((hawk_nde_rex_t*)nde)->str, ((hawk_nde_rex_t*)nde)->code);
|
val = hawk_rtx_makerexval(rtx, &((hawk_nde_rex_t*)nde)->str, ((hawk_nde_rex_t*)nde)->code);
|
||||||
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static hawk_val_t* eval_xnil (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
||||||
|
{
|
||||||
|
hawk_val_t* val;
|
||||||
|
val = hawk_rtx_makenilval(rtx);
|
||||||
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6958,7 +6968,7 @@ static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
}
|
}
|
||||||
|
|
||||||
val = hawk_rtx_makefunval(rtx, fun);
|
val = hawk_rtx_makefunval(rtx, fun);
|
||||||
if (!val) ADJERR_LOC (rtx, &nde->loc);
|
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ typedef struct hawk_nde_str_t hawk_nde_str_t;
|
|||||||
typedef struct hawk_nde_mbs_t hawk_nde_mbs_t;
|
typedef struct hawk_nde_mbs_t hawk_nde_mbs_t;
|
||||||
typedef struct hawk_nde_rex_t hawk_nde_rex_t;
|
typedef struct hawk_nde_rex_t hawk_nde_rex_t;
|
||||||
typedef struct hawk_nde_fun_t hawk_nde_fun_t;
|
typedef struct hawk_nde_fun_t hawk_nde_fun_t;
|
||||||
|
typedef struct hawk_nde_xnil_t hawk_nde_xnil_t;
|
||||||
|
|
||||||
typedef struct hawk_nde_var_t hawk_nde_var_t;
|
typedef struct hawk_nde_var_t hawk_nde_var_t;
|
||||||
typedef struct hawk_nde_fncall_t hawk_nde_fncall_t;
|
typedef struct hawk_nde_fncall_t hawk_nde_fncall_t;
|
||||||
@ -174,6 +175,11 @@ struct hawk_nde_rex_t
|
|||||||
hawk_tre_t* code[2]; /* [0]: case sensitive, [1]: case insensitive */
|
hawk_tre_t* code[2]; /* [0]: case sensitive, [1]: case insensitive */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hawk_nde_xnil_t
|
||||||
|
{
|
||||||
|
HAWK_NDE_HDR;
|
||||||
|
};
|
||||||
|
|
||||||
/* HAWK_NDE_FUN - function as a value */
|
/* HAWK_NDE_FUN - function as a value */
|
||||||
struct hawk_nde_fun_t
|
struct hawk_nde_fun_t
|
||||||
{
|
{
|
||||||
|
@ -498,6 +498,12 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case HAWK_NDE_XNIL:
|
||||||
|
{
|
||||||
|
PUT_SRCSTR (hawk, HAWK_T("@nil"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case HAWK_NDE_FUN:
|
case HAWK_NDE_FUN:
|
||||||
{
|
{
|
||||||
PUT_SRCSTRN (hawk,
|
PUT_SRCSTRN (hawk,
|
||||||
@ -715,9 +721,7 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
|
|||||||
|
|
||||||
PUT_SRCSTR (hawk, HAWK_T("("));
|
PUT_SRCSTR (hawk, HAWK_T("("));
|
||||||
|
|
||||||
if (px->in != HAWK_NULL &&
|
if (px->in && (px->in_type == HAWK_IN_PIPE || px->in_type == HAWK_IN_RWPIPE))
|
||||||
(px->in_type == HAWK_IN_PIPE ||
|
|
||||||
px->in_type == HAWK_IN_RWPIPE))
|
|
||||||
{
|
{
|
||||||
PRINT_EXPR (hawk, px->in);
|
PRINT_EXPR (hawk, px->in);
|
||||||
PUT_SRCSTR (hawk, HAWK_T(" "));
|
PUT_SRCSTR (hawk, HAWK_T(" "));
|
||||||
@ -727,14 +731,13 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
|
|||||||
|
|
||||||
hawk_getkwname (hawk, (px->mbs? HAWK_KWID_GETBLINE: HAWK_KWID_GETLINE), &kw);
|
hawk_getkwname (hawk, (px->mbs? HAWK_KWID_GETBLINE: HAWK_KWID_GETLINE), &kw);
|
||||||
PUT_SRCSTRN (hawk, kw.ptr, kw.len);
|
PUT_SRCSTRN (hawk, kw.ptr, kw.len);
|
||||||
if (px->var != HAWK_NULL)
|
if (px->var)
|
||||||
{
|
{
|
||||||
PUT_SRCSTR (hawk, HAWK_T(" "));
|
PUT_SRCSTR (hawk, HAWK_T(" "));
|
||||||
PRINT_EXPR (hawk, px->var);
|
PRINT_EXPR (hawk, px->var);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (px->in != HAWK_NULL &&
|
if (px->in && px->in_type == HAWK_IN_FILE)
|
||||||
px->in_type == HAWK_IN_FILE)
|
|
||||||
{
|
{
|
||||||
PUT_SRCSTR (hawk, HAWK_T(" "));
|
PUT_SRCSTR (hawk, HAWK_T(" "));
|
||||||
PUT_SRCSTR (hawk, getline_inop_str[px->in_type]);
|
PUT_SRCSTR (hawk, getline_inop_str[px->in_type]);
|
||||||
@ -750,7 +753,7 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
|
|||||||
case HAWK_NDE_PRINTF:
|
case HAWK_NDE_PRINTF:
|
||||||
{
|
{
|
||||||
PUT_SRCSTR (hawk, HAWK_T("("));
|
PUT_SRCSTR (hawk, HAWK_T("("));
|
||||||
if (print_printx (hawk, (hawk_nde_print_t*)nde) <= -1) return -1;
|
if (print_printx(hawk, (hawk_nde_print_t*)nde) <= -1) return -1;
|
||||||
PUT_SRCSTR (hawk, HAWK_T(")"));
|
PUT_SRCSTR (hawk, HAWK_T(")"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1385,6 +1388,12 @@ void hawk_clrpt (hawk_t* hawk, hawk_nde_t* tree)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case HAWK_NDE_XNIL:
|
||||||
|
{
|
||||||
|
hawk_freemem (hawk, p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case HAWK_NDE_FUN:
|
case HAWK_NDE_FUN:
|
||||||
{
|
{
|
||||||
hawk_freemem (hawk, ((hawk_nde_fun_t*)p)->name.ptr);
|
hawk_freemem (hawk, ((hawk_nde_fun_t*)p)->name.ptr);
|
||||||
|
@ -244,7 +244,7 @@ function main()
|
|||||||
{
|
{
|
||||||
@local bool, b, c;
|
@local bool, b, c;
|
||||||
|
|
||||||
@reset(c);
|
c = @nil;
|
||||||
bool = ((b = 1) in c);
|
bool = ((b = 1) in c);
|
||||||
ensure (bool, 0, @SCRIPTNAME, @SCRIPTLINE);
|
ensure (bool, 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
ensure (b, 1, @SCRIPTNAME, @SCRIPTLINE);
|
ensure (b, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user