work in progress - debugging reference evaluation issues
This commit is contained in:
parent
178c83724b
commit
f827a94d64
@ -3243,7 +3243,7 @@ static int fnc_openmux (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
#elif defined(FD_CLOEXEC)
|
#elif defined(FD_CLOEXEC)
|
||||||
{
|
{
|
||||||
int flag = fcntl(fd, F_GETFD);
|
int flag = fcntl(fd, F_GETFD);
|
||||||
if (flag >= 0) fcntl (mux->fd, F_SETFD, flag | FD_CLOEXEC);
|
if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,6 @@ static hawk_val_t* eval_getline (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
|||||||
static hawk_val_t* eval_print (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_print (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
static hawk_val_t* eval_printf (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
static hawk_val_t* eval_printf (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
|
|
||||||
|
|
||||||
static int read_record (hawk_rtx_t* rtx);
|
static int read_record (hawk_rtx_t* rtx);
|
||||||
|
|
||||||
static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t* buf, hawk_oow_t* len, hawk_nde_t** remidx);
|
static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t* buf, hawk_oow_t* len, hawk_nde_t** remidx);
|
||||||
@ -205,6 +204,10 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t
|
|||||||
typedef hawk_val_t* (*binop_func_t) (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t* right);
|
typedef hawk_val_t* (*binop_func_t) (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t* right);
|
||||||
typedef hawk_val_t* (*eval_expr_t) (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
typedef hawk_val_t* (*eval_expr_t) (hawk_rtx_t* rtx, hawk_nde_t* nde);
|
||||||
|
|
||||||
|
#define POS_VAL(rtx, idx) \
|
||||||
|
(((idx) == 0)? (rtx)->inrec.d0: \
|
||||||
|
((idx) > 0 && (idx) <= (hawk_int_t)(rtx)->inrec.nflds)? (rtx)->inrec.flds[(idx) - 1].val: \
|
||||||
|
hawk_val_zls)
|
||||||
|
|
||||||
HAWK_INLINE hawk_oow_t hawk_rtx_getnargs (hawk_rtx_t* rtx)
|
HAWK_INLINE hawk_oow_t hawk_rtx_getnargs (hawk_rtx_t* rtx)
|
||||||
{
|
{
|
||||||
@ -2263,7 +2266,7 @@ static int run_statement (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
default:
|
default:
|
||||||
__fallback__:
|
__fallback__:
|
||||||
tmp = eval_expression(rtx, nde);
|
tmp = eval_expression(rtx, nde);
|
||||||
if (tmp == HAWK_NULL) xret = -1;
|
if (HAWK_UNLIKELY(!tmp)) xret = -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* destroy the value if not referenced */
|
/* destroy the value if not referenced */
|
||||||
@ -2288,7 +2291,7 @@ static int run_if (hawk_rtx_t* rtx, hawk_nde_if_t* nde)
|
|||||||
HAWK_ASSERT (nde->test->next == HAWK_NULL);
|
HAWK_ASSERT (nde->test->next == HAWK_NULL);
|
||||||
|
|
||||||
test = eval_expression(rtx, nde->test);
|
test = eval_expression(rtx, nde->test);
|
||||||
if (test == HAWK_NULL) return -1;
|
if (HAWK_UNLIKELY(!test)) return -1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, test);
|
hawk_rtx_refupval (rtx, test);
|
||||||
if (hawk_rtx_valtobool(rtx, test))
|
if (hawk_rtx_valtobool(rtx, test))
|
||||||
@ -2319,7 +2322,7 @@ static int run_while (hawk_rtx_t* rtx, hawk_nde_while_t* nde)
|
|||||||
ON_STATEMENT (rtx, nde->test);
|
ON_STATEMENT (rtx, nde->test);
|
||||||
|
|
||||||
test = eval_expression(rtx, nde->test);
|
test = eval_expression(rtx, nde->test);
|
||||||
if (!test) return -1;
|
if (HAWK_UNLIKELY(!test)) return -1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, test);
|
hawk_rtx_refupval (rtx, test);
|
||||||
|
|
||||||
@ -3051,15 +3054,14 @@ static int run_reset (hawk_rtx_t* rtx, hawk_nde_reset_t* nde)
|
|||||||
|
|
||||||
static hawk_val_t* io_nde_to_str(hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_oocs_t* dst, int seterr)
|
static hawk_val_t* io_nde_to_str(hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_oocs_t* dst, int seterr)
|
||||||
{
|
{
|
||||||
|
|
||||||
hawk_val_t* v;
|
hawk_val_t* v;
|
||||||
|
|
||||||
v = eval_expression(rtx, nde);
|
v = eval_expression(rtx, nde);
|
||||||
if (!v) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
dst->ptr = hawk_rtx_getvaloocstr(rtx, v, &dst->len);
|
dst->ptr = hawk_rtx_getvaloocstr(rtx, v, &dst->len);
|
||||||
if (!dst)
|
if (HAWK_UNLIKELY(!dst))
|
||||||
{
|
{
|
||||||
hawk_rtx_refdownval (rtx, v);
|
hawk_rtx_refdownval (rtx, v);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
@ -3165,7 +3167,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde)
|
|||||||
}
|
}
|
||||||
|
|
||||||
v = eval_expression(rtx, np);
|
v = eval_expression(rtx, np);
|
||||||
if (v == HAWK_NULL) goto oops_1;
|
if (HAWK_UNLIKELY(!v)) goto oops_1;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_writeioval(rtx, nde->out_type, out.ptr, v);
|
n = hawk_rtx_writeioval(rtx, nde->out_type, out.ptr, v);
|
||||||
@ -3391,7 +3393,7 @@ static hawk_val_t* eval_expression (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
v = eval_expression0(rtx, nde);
|
v = eval_expression0(rtx, nde);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
|
|
||||||
if (HAWK_RTX_GETVALTYPE(rtx, v) == HAWK_VAL_REX)
|
if (HAWK_RTX_GETVALTYPE(rtx, v) == HAWK_VAL_REX)
|
||||||
{
|
{
|
||||||
@ -3505,6 +3507,44 @@ static hawk_val_t* eval_expression0 (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (v && HAWK_RTX_GETVALTYPE(rtx, v) == HAWK_VAL_REF)
|
||||||
|
{
|
||||||
|
/* as a rvalue, a reference can get resolved to a final value */
|
||||||
|
|
||||||
|
hawk_val_ref_t* ref = (hawk_val_ref_t*)v;
|
||||||
|
hawk_val_t* nv;
|
||||||
|
|
||||||
|
printf ("REF>>>>>>>>>>>>>>>>>>>>> %d\n", ref->id);
|
||||||
|
switch (ref->id)
|
||||||
|
{
|
||||||
|
case HAWK_VAL_REF_POS:
|
||||||
|
{
|
||||||
|
hawk_oow_t idx = (hawk_oow_t)ref->adr;
|
||||||
|
nv = POS_VAL(rtx, idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case HAWK_VAL_REF_NAMED:
|
||||||
|
case HAWK_VAL_REF_NAMEDIDX:
|
||||||
|
{
|
||||||
|
hawk_oow_t idx = (hawk_oow_t)ref->adr;
|
||||||
|
printf ("XXXXXXXXXXXXXXX[%lu]\n", (unsigned long)idx);
|
||||||
|
nv = HAWK_RTX_STACK_GBL(rtx, idx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
nv = *(hawk_val_t**)ref->adr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_rtx_refupval (rtx, v);
|
||||||
|
hawk_rtx_refdownval (rtx, v);
|
||||||
|
|
||||||
|
v = nv;
|
||||||
|
printf ("---- %d\n", HAWK_RTX_GETVALTYPE(rtx, v));
|
||||||
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3560,7 +3600,7 @@ static hawk_val_t* eval_assignment (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
|
|
||||||
HAWK_ASSERT (ass->right->next == HAWK_NULL);
|
HAWK_ASSERT (ass->right->next == HAWK_NULL);
|
||||||
val = eval_expression(rtx, ass->right);
|
val = eval_expression(rtx, ass->right);
|
||||||
if (val == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, val);
|
hawk_rtx_refupval (rtx, val);
|
||||||
|
|
||||||
@ -3588,7 +3628,7 @@ static hawk_val_t* eval_assignment (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
|
|
||||||
HAWK_ASSERT (ass->left->next == HAWK_NULL);
|
HAWK_ASSERT (ass->left->next == HAWK_NULL);
|
||||||
val2 = eval_expression(rtx, ass->left);
|
val2 = eval_expression(rtx, ass->left);
|
||||||
if (val2 == HAWK_NULL)
|
if (HAWK_UNLIKELY(!val2))
|
||||||
{
|
{
|
||||||
hawk_rtx_refdownval (rtx, val);
|
hawk_rtx_refdownval (rtx, val);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
@ -3601,7 +3641,7 @@ static hawk_val_t* eval_assignment (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
HAWK_ASSERT (binop_func[ass->opcode] != HAWK_NULL);
|
HAWK_ASSERT (binop_func[ass->opcode] != HAWK_NULL);
|
||||||
|
|
||||||
tmp = binop_func[ass->opcode](rtx, val2, val);
|
tmp = binop_func[ass->opcode](rtx, val2, val);
|
||||||
if (tmp == HAWK_NULL)
|
if (HAWK_UNLIKELY(!tmp))
|
||||||
{
|
{
|
||||||
hawk_rtx_refdownval (rtx, val2);
|
hawk_rtx_refdownval (rtx, val2);
|
||||||
hawk_rtx_refdownval (rtx, val);
|
hawk_rtx_refdownval (rtx, val);
|
||||||
@ -6794,7 +6834,7 @@ static hawk_val_t* eval_pos (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
int n;
|
int n;
|
||||||
|
|
||||||
v = eval_expression (rtx, pos->val);
|
v = eval_expression (rtx, pos->val);
|
||||||
if (v == HAWK_NULL) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_refupval (rtx, v);
|
hawk_rtx_refupval (rtx, v);
|
||||||
n = hawk_rtx_valtoint(rtx, v, &lv);
|
n = hawk_rtx_valtoint(rtx, v, &lv);
|
||||||
@ -6810,10 +6850,14 @@ static hawk_val_t* eval_pos (hawk_rtx_t* rtx, hawk_nde_t* nde)
|
|||||||
hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_EPOSIDX);
|
hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_EPOSIDX);
|
||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v = POS_VAL(rtx, lv);
|
||||||
|
#if 0
|
||||||
if (lv == 0) v = rtx->inrec.d0;
|
if (lv == 0) v = rtx->inrec.d0;
|
||||||
else if (lv > 0 && lv <= (hawk_int_t)rtx->inrec.nflds)
|
else if (lv > 0 && lv <= (hawk_int_t)rtx->inrec.nflds)
|
||||||
v = rtx->inrec.flds[lv-1].val;
|
v = rtx->inrec.flds[lv-1].val;
|
||||||
else v = hawk_val_zls; /*hawk_val_nil;*/
|
else v = hawk_val_zls; /*hawk_val_nil;*/
|
||||||
|
#endif
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
@ -1391,9 +1391,7 @@ static int val_ref_to_bool (hawk_rtx_t* rtx, const hawk_val_ref_t* ref)
|
|||||||
{
|
{
|
||||||
case HAWK_VAL_REF_POS:
|
case HAWK_VAL_REF_POS:
|
||||||
{
|
{
|
||||||
hawk_oow_t idx;
|
hawk_oow_t idx = (hawk_oow_t)ref->adr;
|
||||||
|
|
||||||
idx = (hawk_oow_t)ref->adr;
|
|
||||||
if (idx == 0)
|
if (idx == 0)
|
||||||
{
|
{
|
||||||
return HAWK_OOECS_LEN(&rtx->inrec.line) > 0;
|
return HAWK_OOECS_LEN(&rtx->inrec.line) > 0;
|
||||||
@ -1411,8 +1409,7 @@ static int val_ref_to_bool (hawk_rtx_t* rtx, const hawk_val_ref_t* ref)
|
|||||||
}
|
}
|
||||||
case HAWK_VAL_REF_GBL:
|
case HAWK_VAL_REF_GBL:
|
||||||
{
|
{
|
||||||
hawk_oow_t idx;
|
hawk_oow_t idx = (hawk_oow_t)ref->adr;
|
||||||
idx = (hawk_oow_t)ref->adr;
|
|
||||||
return hawk_rtx_valtobool(rtx, HAWK_RTX_STACK_GBL(rtx, idx));
|
return hawk_rtx_valtobool(rtx, HAWK_RTX_STACK_GBL(rtx, idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1491,7 +1491,9 @@ static int fnc_stmt_execute (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
case MYSQL_TYPE_LONG:
|
case MYSQL_TYPE_LONG:
|
||||||
case MYSQL_TYPE_SHORT:
|
case MYSQL_TYPE_SHORT:
|
||||||
case MYSQL_TYPE_TINY:
|
case MYSQL_TYPE_TINY:
|
||||||
|
#if (MYSQL_VERSION_ID >= 50000)
|
||||||
case MYSQL_TYPE_BIT:
|
case MYSQL_TYPE_BIT:
|
||||||
|
#endif
|
||||||
case MYSQL_TYPE_INT24:
|
case MYSQL_TYPE_INT24:
|
||||||
bind->buffer_type = MYSQL_TYPE_LONGLONG;
|
bind->buffer_type = MYSQL_TYPE_LONGLONG;
|
||||||
bind->buffer = &data->u.llv;
|
bind->buffer = &data->u.llv;
|
||||||
@ -1504,7 +1506,9 @@ static int fnc_stmt_execute (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MYSQL_TYPE_STRING:
|
case MYSQL_TYPE_STRING:
|
||||||
|
#if (MYSQL_VERSION_ID >= 50000)
|
||||||
case MYSQL_TYPE_VARCHAR:
|
case MYSQL_TYPE_VARCHAR:
|
||||||
|
#endif
|
||||||
case MYSQL_TYPE_VAR_STRING:
|
case MYSQL_TYPE_VAR_STRING:
|
||||||
bind->buffer_type = MYSQL_TYPE_STRING;
|
bind->buffer_type = MYSQL_TYPE_STRING;
|
||||||
|
|
||||||
@ -1620,10 +1624,12 @@ static int fnc_stmt_fetch (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
|
|
||||||
ret = 1; /* have data */
|
ret = 1; /* have data */
|
||||||
}
|
}
|
||||||
|
#if (MYSQL_VERSION_ID >= 50000)
|
||||||
else if (n == MYSQL_DATA_TRUNCATED)
|
else if (n == MYSQL_DATA_TRUNCATED)
|
||||||
{
|
{
|
||||||
set_error_on_sql_list (rtx, sql_list, HAWK_T("data truncated"));
|
set_error_on_sql_list (rtx, sql_list, HAWK_T("data truncated"));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
take_rtx_err = 1;
|
take_rtx_err = 1;
|
||||||
|
@ -177,6 +177,14 @@ function handle_bridge_event (&brtab, fd, mx, evmask)
|
|||||||
{
|
{
|
||||||
if (evmask & sys::MUX_EVT_OUT)
|
if (evmask & sys::MUX_EVT_OUT)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
@local i;
|
||||||
|
print typename(brtab);
|
||||||
|
for (i in brtab)
|
||||||
|
{
|
||||||
|
print i, brtab[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
if ((fd,"connecting") in brtab)
|
if ((fd,"connecting") in brtab)
|
||||||
{
|
{
|
||||||
## remote peer connection
|
## remote peer connection
|
||||||
|
Loading…
Reference in New Issue
Block a user