fixed a bug in handling a reference value in hawk::call()
This commit is contained in:
parent
c7961f84d2
commit
ef9db73f19
@ -56,14 +56,26 @@ static hawk_oow_t push_args_from_stack (hawk_rtx_t* rtx, hawk_nde_fncall_t* call
|
|||||||
org_stack_base = rtx->stack_base;
|
org_stack_base = rtx->stack_base;
|
||||||
for (i = pasf->start_index, j = 0; i <= pasf->end_index; i++, j++)
|
for (i = pasf->start_index, j = 0; i <= pasf->end_index; i++, j++)
|
||||||
{
|
{
|
||||||
|
hawk_ooch_t spec;
|
||||||
|
|
||||||
rtx->stack_base = pasf->stack_base;
|
rtx->stack_base = pasf->stack_base;
|
||||||
v = HAWK_RTX_STACK_ARG(rtx, i);
|
v = HAWK_RTX_STACK_ARG(rtx, i);
|
||||||
rtx->stack_base = org_stack_base;
|
rtx->stack_base = org_stack_base;
|
||||||
|
|
||||||
if (j < spec_len && pasf->fun->argspec[j] == 'r' && HAWK_RTX_GETVALTYPE(rtx, v) != HAWK_VAL_REF)
|
/* if not sufficient number of spec characters given, take the last value and use it */
|
||||||
|
spec = (spec_len <= 0)? '\0': pasf->fun->argspec[((j < spec_len)? j: spec_len - 1)];
|
||||||
|
|
||||||
|
if (HAWK_RTX_GETVALTYPE(rtx, v) == HAWK_VAL_REF)
|
||||||
{
|
{
|
||||||
hawk_rtx_seterrnum (rtx, &call->loc, HAWK_ENOTREF);
|
v = hawk_rtx_getrefval(rtx, (hawk_val_ref_t*)v);
|
||||||
return (hawk_oow_t)-1;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (spec == 'r')
|
||||||
|
{
|
||||||
|
hawk_rtx_seterrnum (rtx, &call->loc, HAWK_ENOTREF);
|
||||||
|
return (hawk_oow_t)-1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HAWK_RTX_STACK_PUSH (rtx, v);
|
HAWK_RTX_STACK_PUSH (rtx, v);
|
||||||
|
@ -6377,20 +6377,8 @@ static hawk_oow_t push_arg_from_nde (hawk_rtx_t* rtx, hawk_nde_fncall_t* call, v
|
|||||||
{
|
{
|
||||||
hawk_ooch_t spec;
|
hawk_ooch_t spec;
|
||||||
|
|
||||||
if (spec_len > 0)
|
/* if not sufficient number of spec characters given, take the last value and use it */
|
||||||
{
|
spec = (spec_len <= 0)? '\0': arg_spec[((nargs < spec_len)? nargs: spec_len - 1)];
|
||||||
if (nargs >= spec_len)
|
|
||||||
{
|
|
||||||
/* not sufficient number of spec characters given.
|
|
||||||
* take the last value and use it */
|
|
||||||
spec = arg_spec[spec_len - 1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
spec = arg_spec[nargs];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else spec = '\0';
|
|
||||||
|
|
||||||
switch (spec)
|
switch (spec)
|
||||||
{
|
{
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
@pragma entry main
|
@pragma entry main
|
||||||
|
|
||||||
|
|
||||||
function ensure (a, b, desc)
|
function ensure (a, b, desc)
|
||||||
{
|
{
|
||||||
if (a != b)
|
if (a != b)
|
||||||
{
|
{
|
||||||
print "FAILURE", desc;
|
print "FAILURE in", desc;
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18,6 +19,7 @@ function call_by_ref_1(&a, b, &c)
|
|||||||
function call_by_ref_2(a, &b)
|
function call_by_ref_2(a, &b)
|
||||||
{
|
{
|
||||||
b[1] = b[1] * a;
|
b[1] = b[1] * a;
|
||||||
|
b[2] = "perfect";
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,12 +29,13 @@ function main()
|
|||||||
x = 20;
|
x = 20;
|
||||||
y = 90;
|
y = 90;
|
||||||
r = call_by_ref_1(x, y, z);
|
r = call_by_ref_1(x, y, z);
|
||||||
ensure (r, 1800);
|
ensure (r, 1800, SCRIPTNAME);
|
||||||
ensure (x, 20);
|
ensure (x, 20);
|
||||||
ensure (y, 90);
|
ensure (y, 90);
|
||||||
ensure (z, "hello, world");
|
ensure (z, "hello, world");
|
||||||
|
|
||||||
## TODO: add a new special word, @FILENAME, @FILELINE, @LINE <--- which are understood by the parser and swapped to the actual value
|
## TODO: add a new special word, @FILENAME, @FILELINE, @LINE <--- which are understood by the parser and swapped to the actual value
|
||||||
|
## SCRIPTNAME doesn't tell the main file.
|
||||||
|
|
||||||
{
|
{
|
||||||
@local b;
|
@local b;
|
||||||
@ -53,7 +56,9 @@ function main()
|
|||||||
b[1] = 1;
|
b[1] = 1;
|
||||||
r = hawk::call("call_by_ref_2", 99, b);
|
r = hawk::call("call_by_ref_2", 99, b);
|
||||||
ensure (r, 99);
|
ensure (r, 99);
|
||||||
ensure (b[1], 99);
|
ensure (length(b), 2, SCRIPTNAME);
|
||||||
|
ensure (b[1], 99, SCRIPTNAME);
|
||||||
|
ensure (b[2], "perfect", SCRIPTNAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
print "SUCCESS"
|
print "SUCCESS"
|
||||||
|
Loading…
Reference in New Issue
Block a user