Compare commits

...
2 Commits
Author SHA1 Message Date
hyung-hwan 158865a866 fixed a wrong assertion 2026-08-02 17:22:17 +09:00
hyung-hwan d516cd2e4b added some error handling code for completeness 2026-08-02 12:42:04 +09:00
4 changed files with 93 additions and 69 deletions
+2 -2
View File
@@ -69,7 +69,7 @@ typedef struct hawk_tree_t hawk_tree_t;
#define HAWK_ENABLE_ATOMIC_SIG #define HAWK_ENABLE_ATOMIC_SIG
#endif #endif
/* /* this part is kept for preservation of experiment only.
#if defined(HAVE_UCONTEXT_H) #if defined(HAVE_UCONTEXT_H)
#include <ucontext.h> #include <ucontext.h>
#define HAWK_ENABLE_UCONTEXT #define HAWK_ENABLE_UCONTEXT
@@ -538,7 +538,7 @@ struct hawk_rtx_t
hawk_val_t* driver_eval_result; hawk_val_t* driver_eval_result;
#endif #endif
#if defined(HAVE_UCONTEXT_H) #if defined(HAWK_ENABLE_UCONTEXT)
/* pool of reusable C stacks for coroutine-based function calls */ /* pool of reusable C stacks for coroutine-based function calls */
struct struct
{ {
+2
View File
@@ -150,6 +150,7 @@ hawk_val_t* hawk_rtx_evalcall (
void* eharg void* eharg
); );
#if 0
hawk_val_t* hawk_rtx_evalcall_xstack ( hawk_val_t* hawk_rtx_evalcall_xstack (
hawk_rtx_t* rtx, hawk_rtx_t* rtx,
hawk_nde_fncall_t* call, hawk_nde_fncall_t* call,
@@ -159,6 +160,7 @@ hawk_val_t* hawk_rtx_evalcall_xstack (
void(*errhandler)(void*), void(*errhandler)(void*),
void* eharg void* eharg
); );
#endif
int hawk_rtx_setsighandler ( int hawk_rtx_setsighandler (
hawk_rtx_t* rtx, hawk_rtx_t* rtx,
+34 -14
View File
@@ -50,8 +50,7 @@ static int run_block (hawk_rtx_t* rtx, hawk_nde_blk_t* nde); /* forward */
static char* hawk_co_get_stack (hawk_rtx_t* rtx) static char* hawk_co_get_stack (hawk_rtx_t* rtx)
{ {
/* get a stack from the free list */ /* get a stack from the free list */
if (rtx->co.pool_size > 0) if (rtx->co.pool_size > 0) return rtx->co.pool[--rtx->co.pool_size];
return rtx->co.pool[--rtx->co.pool_size];
return (char*)hawk_rtx_allocmem(rtx, HAWK_CO_STACK_SIZE); return (char*)hawk_rtx_allocmem(rtx, HAWK_CO_STACK_SIZE);
} }
@@ -2693,7 +2692,7 @@ oops:
return -1; return -1;
} }
static HAWK_INLINE int run_block0 (hawk_rtx_t* rtx, hawk_nde_blk_t* nde) static HAWK_INLINE_ALWAYS int run_block0 (hawk_rtx_t* rtx, hawk_nde_blk_t* nde)
{ {
hawk_nde_t* p; hawk_nde_t* p;
/*hawk_oow_t saved_stack_top;*/ /*hawk_oow_t saved_stack_top;*/
@@ -3807,8 +3806,6 @@ static int run_while (hawk_rtx_t* rtx, int state, hawk_nde_while_t* nde)
if (push_exec_stack(rtx, EXEC_STATE_WHILE_TEST_AFTER_EVAL, (hawk_nde_t*)nde) <= -1) return -1; if (push_exec_stack(rtx, EXEC_STATE_WHILE_TEST_AFTER_EVAL, (hawk_nde_t*)nde) <= -1) return -1;
return push_eframe(rtx, HAWK_EF_EVAL, nde->test); return push_eframe(rtx, HAWK_EF_EVAL, nde->test);
#else #else
{
hawk_val_t* test;
test = eval_expression(rtx, nde->test); test = eval_expression(rtx, nde->test);
if (HAWK_UNLIKELY(!test)) return -1; if (HAWK_UNLIKELY(!test)) return -1;
@@ -3823,7 +3820,6 @@ static int run_while (hawk_rtx_t* rtx, int state, hawk_nde_while_t* nde)
} }
} }
hawk_rtx_refdownval_inline(rtx, test); hawk_rtx_refdownval_inline(rtx, test);
}
#endif #endif
} }
else if (nde->type == HAWK_NDE_DOWHILE) else if (nde->type == HAWK_NDE_DOWHILE)
@@ -3856,8 +3852,6 @@ static int run_while (hawk_rtx_t* rtx, int state, hawk_nde_while_t* nde)
if (push_exec_stack(rtx, EXEC_STATE_DOWHILE_TEST_AFTER_EVAL, (hawk_nde_t*)nde) <= -1) return -1; if (push_exec_stack(rtx, EXEC_STATE_DOWHILE_TEST_AFTER_EVAL, (hawk_nde_t*)nde) <= -1) return -1;
return push_eframe(rtx, HAWK_EF_EVAL, nde->test); return push_eframe(rtx, HAWK_EF_EVAL, nde->test);
#else #else
{
hawk_val_t* test;
test = eval_expression(rtx, nde->test); test = eval_expression(rtx, nde->test);
if (HAWK_UNLIKELY(!test)) return -1; if (HAWK_UNLIKELY(!test)) return -1;
@@ -3874,7 +3868,6 @@ static int run_while (hawk_rtx_t* rtx, int state, hawk_nde_while_t* nde)
} }
hawk_rtx_refdownval_inline(rtx, test); hawk_rtx_refdownval_inline(rtx, test);
}
#endif #endif
} }
} }
@@ -4480,7 +4473,6 @@ static hawk_val_t* assign_newmapval_to_var (hawk_rtx_t* rtx, hawk_nde_var_t* var
return assign_topval_to_var(rtx, var, tmp); return assign_topval_to_var(rtx, var, tmp);
} }
static HAWK_INLINE int delete_indexed (hawk_rtx_t* rtx, hawk_val_t* vv, hawk_nde_var_t* var) static HAWK_INLINE int delete_indexed (hawk_rtx_t* rtx, hawk_val_t* vv, hawk_nde_var_t* var)
{ {
hawk_map_t* map; hawk_map_t* map;
@@ -5400,7 +5392,7 @@ static hawk_val_t* eval_group (hawk_rtx_t* rtx, hawk_nde_t* nde)
* before the introduction of this option, the grouped * before the introduction of this option, the grouped
* expression was valid only coerced with the 'in' * expression was valid only coerced with the 'in'
* operator. * operator.
* */ */
/* when a group is evaluated in a normal context, /* when a group is evaluated in a normal context,
* we return the last expression as a value. */ * we return the last expression as a value. */
@@ -5499,6 +5491,7 @@ static hawk_val_t* eval_assignment (hawk_rtx_t* rtx, hawk_nde_t* nde)
default: default:
HAWK_ASSERT(!"should never happen - invalid assigment opcode detected"); HAWK_ASSERT(!"should never happen - invalid assigment opcode detected");
hawk_rtx_seterrbfmt(rtx, &nde->loc, HAWK_EINTERN, "internal error - invalid assignment(%d) opcode detected", (int)ass->opcode); hawk_rtx_seterrbfmt(rtx, &nde->loc, HAWK_EINTERN, "internal error - invalid assignment(%d) opcode detected", (int)ass->opcode);
tmp = HAWK_NULL;
break; break;
} }
#endif #endif
@@ -7788,6 +7781,12 @@ static hawk_val_t* eval_binop_div (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t
case 3: case 3:
res = hawk_rtx_makefltval(rtx, r1 / r2); res = hawk_rtx_makefltval(rtx, r1 / r2);
break; break;
default:
HAWK_ASSERT(!"should never happen - invalid intermediate state in handling div");
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINTERN, "internal error in handling div");
res = HAWK_NULL;
break;
} }
return res; return res;
@@ -7835,6 +7834,12 @@ static hawk_val_t* eval_binop_idiv (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_
quo = r1 / r2; quo = r1 / r2;
res = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)quo); res = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)quo);
break; break;
default:
HAWK_ASSERT(!"should never happen - invalid intermediate state in handling idiv");
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINTERN, "internal error in handling idiv");
res = HAWK_NULL;
break;
} }
return res; return res;
@@ -7882,6 +7887,12 @@ static hawk_val_t* eval_binop_mod (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t
case 3: case 3:
res = hawk_rtx_makefltval(rtx, rtx->hawk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)r2)); res = hawk_rtx_makefltval(rtx, rtx->hawk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)r2));
break; break;
default:
HAWK_ASSERT(!"should never happen - invalid intermediate state in handling mod");
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINTERN, "internal error in handling mod");
res = HAWK_NULL;
break;
} }
return res; return res;
@@ -7965,6 +7976,12 @@ static hawk_val_t* eval_binop_exp (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t
rtx->hawk->prm.math.pow(hawk_rtx_gethawk(rtx), r1, r2) rtx->hawk->prm.math.pow(hawk_rtx_gethawk(rtx), r1, r2)
); );
break; break;
default:
HAWK_ASSERT(!"should never happen - invalid intermediate state in handling exp");
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINTERN, "internal error in handling exp");
res = HAWK_NULL;
break;
} }
return res; return res;
@@ -8856,7 +8873,7 @@ hawk_val_t* hawk_rtx_evalcall (
HAWK_CO_COROUTINE_DEPTH_THRESHOLD : HAWK_CO_MAIN_DEPTH_THRESHOLD; HAWK_CO_COROUTINE_DEPTH_THRESHOLD : HAWK_CO_MAIN_DEPTH_THRESHOLD;
if (rtx->depth.block - rtx->co.stack_base >= co_threshold) if (rtx->depth.block - rtx->co.stack_base >= co_threshold)
{ {
/* approaching the C stack limit of the current segment /* approaching the C stack limit of the current segment -
* run this call on a fresh heap-allocated stack */ * run this call on a fresh heap-allocated stack */
char* costack; char* costack;
ucontext_t caller_ctx, coctx; ucontext_t caller_ctx, coctx;
@@ -8970,9 +8987,9 @@ hawk_val_t* hawk_rtx_evalcall (
* *
* function f1(&a, &b) { b = 20 } * function f1(&a, &b) { b = 20 }
* *
* since a is not set in f1, the value for a is still the pushed value which is a reference * since a is not set in f1, the value for a is still the pushed
* value which is a reference.
*/ */
/* ---- DO NOTHING ---- */ /* ---- DO NOTHING ---- */
} }
else else
@@ -13849,6 +13866,7 @@ static HAWK_INLINE_ALWAYS hawk_val_t* eval_expression0_xstack (hawk_rtx_t* rtx,
default: default:
HAWK_ASSERT(!"should never happen - invalid assigment opcode detected"); HAWK_ASSERT(!"should never happen - invalid assigment opcode detected");
hawk_rtx_seterrbfmt(rtx, &f->nde->loc, HAWK_EINTERN, "internal error - invalid assignment(%d) opcode detected", (int)ass->opcode); hawk_rtx_seterrbfmt(rtx, &f->nde->loc, HAWK_EINTERN, "internal error - invalid assignment(%d) opcode detected", (int)ass->opcode);
tmp = HAWK_NULL;
break; break;
} }
#endif #endif
@@ -14122,6 +14140,7 @@ static hawk_oow_t push_arg_from_nde_xstack (hawk_rtx_t* rtx, const hawk_loc_t* c
} }
#if 0
/* hawk_rtx_evalcall_xstack — identical to hawk_rtx_evalcall but uses /* hawk_rtx_evalcall_xstack — identical to hawk_rtx_evalcall but uses
* push_arg_from_nde_xstack when the caller supplies push_arg_from_nde as * push_arg_from_nde_xstack when the caller supplies push_arg_from_nde as
* the argpusher, so that argument expressions are evaluated iteratively. */ * the argpusher, so that argument expressions are evaluated iteratively. */
@@ -14138,3 +14157,4 @@ hawk_val_t* hawk_rtx_evalcall_xstack (
return hawk_rtx_evalcall(rtx, call, fun, argpusher, apdata, errhandler, eharg); return hawk_rtx_evalcall(rtx, call, fun, argpusher, apdata, errhandler, eharg);
} }
#endif
+3 -1
View File
@@ -699,7 +699,9 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde, int depth)
case HAWK_NDE_NAMEDIDX: case HAWK_NDE_NAMEDIDX:
{ {
hawk_nde_var_t* px = (hawk_nde_var_t*)nde; hawk_nde_var_t* px = (hawk_nde_var_t*)nde;
HAWK_ASSERT (px->id.idxa == (hawk_oow_t)-1); /*HAWK_ASSERT(px->id.idxa == (hawk_oow_t)-1);
* commented out the above assertion because
* id.idxa field holds an index to the rtx->named_slots. */
HAWK_ASSERT(px->idx != HAWK_NULL); HAWK_ASSERT(px->idx != HAWK_NULL);
PUT_SRCSTRN(hawk, px->id.name.ptr, px->id.name.len); PUT_SRCSTRN(hawk, px->id.name.ptr, px->id.name.len);