fixed a bug in copying value back to pass-by-reference arguments
This commit is contained in:
parent
f22b4894fd
commit
ee7fcef062
@ -6004,9 +6004,7 @@ static qse_awk_val_t* __eval_call (
|
|||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
/* intrinsic function */
|
/* intrinsic function */
|
||||||
QSE_ASSERT (
|
QSE_ASSERT (call->nargs >= call->u.fnc.spec.arg.min && call->nargs <= call->u.fnc.spec.arg.max);
|
||||||
call->nargs >= call->u.fnc.spec.arg.min &&
|
|
||||||
call->nargs <= call->u.fnc.spec.arg.max);
|
|
||||||
|
|
||||||
if (call->u.fnc.spec.impl)
|
if (call->u.fnc.spec.impl)
|
||||||
{
|
{
|
||||||
@ -6042,23 +6040,23 @@ static qse_awk_val_t* __eval_call (
|
|||||||
qse_errputstrf (QSE_T("block rtx complete nargs = %d\n"), (int)nargs);
|
qse_errputstrf (QSE_T("block rtx complete nargs = %d\n"), (int)nargs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (fun && fun->argspec && nargs > 0)
|
if (fun && fun->argspec && call->nargs > 0)
|
||||||
{
|
{
|
||||||
/* set back the values for pass-by-reference parameters of normal functions.
|
/* set back the values for pass-by-reference parameters of normal functions.
|
||||||
* the intrinsic functions are not handled here but their implementation would
|
* the intrinsic functions are not handled here but their implementation would
|
||||||
* call qse_awk_rtx_setrefval() */
|
* call qse_awk_rtx_setrefval() */
|
||||||
|
|
||||||
/* even if fun->argspec exists, nargs may still be 0. so i test if nargs > 0.
|
/* even if fun->argspec exists, call->nargs may still be 0. so i test if call->nargs > 0.
|
||||||
* function x(a1, &a2) {}
|
* function x(a1, &a2) {}
|
||||||
* BEGIN { x(); }
|
* BEGIN { x(); }
|
||||||
* all parameters are nils in this case. fun->nargs is 2 but call->nargs or nargs is 0.
|
* all parameters are nils in this case. nargs and fun->nargs are 2 but call->nargs is 0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
qse_size_t cur_stack_base = rtx->stack_base;
|
qse_size_t cur_stack_base = rtx->stack_base;
|
||||||
qse_size_t prev_stack_base = (qse_size_t)rtx->stack[rtx->stack_base + 0];
|
qse_size_t prev_stack_base = (qse_size_t)rtx->stack[rtx->stack_base + 0];
|
||||||
|
|
||||||
qse_awk_nde_t* p = call->args;
|
qse_awk_nde_t* p = call->args;
|
||||||
for (i = 0; i < nargs; i++)
|
for (i = 0; i < call->nargs; i++)
|
||||||
{
|
{
|
||||||
if (fun->argspec[i] == QSE_T('r'))
|
if (fun->argspec[i] == QSE_T('r'))
|
||||||
{
|
{
|
||||||
@ -6082,6 +6080,11 @@ static qse_awk_val_t* __eval_call (
|
|||||||
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = call->nargs; i < nargs; i++)
|
||||||
|
{
|
||||||
|
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -6089,9 +6092,6 @@ static qse_awk_val_t* __eval_call (
|
|||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
qse_awk_rtx_refdownval (rtx, RTX_STACK_ARG(rtx,i));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no refdown on arguments at position between nargs and fun->nargs
|
|
||||||
* even if they were reference, there is no effect(no copy back). */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_RUN
|
#ifdef DEBUG_RUN
|
||||||
|
Loading…
Reference in New Issue
Block a user