updated hak_sqrtint() to return an error if a negative number is given.

added more primitives in the core module
This commit is contained in:
2025-09-25 01:33:54 +09:00
parent d5eade91db
commit 4c000c2c9c
5 changed files with 97 additions and 68 deletions

View File

@ -4828,11 +4828,16 @@ hak_oop_t hak_sqrtint (hak_t* hak, hak_oop_t x)
if (HAK_UNLIKELY(!a)) goto oops; if (HAK_UNLIKELY(!a)) goto oops;
if (a == hak->_true) if (a == hak->_true)
{ {
#if 0
/* the given number is a negative number. /* the given number is a negative number.
* i will arrange the return value to be negative. */ * i will arrange the return value to be negative. */
x = hak_negateint(hak, x); x = hak_negateint(hak, x);
if (HAK_UNLIKELY(!x)) goto oops; if (HAK_UNLIKELY(!x)) goto oops;
neg = 1; neg = 1;
#else
hak_seterrbfmt(hak, HAK_EINVAL, "negative number - %O", x);
goto oops;
#endif
} }
else neg = 0; else neg = 0;

View File

@ -2055,6 +2055,15 @@ hak_pfrc_t hak_pf_number_add (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_sub (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); hak_pfrc_t hak_pf_number_sub (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_mul (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); hak_pfrc_t hak_pf_number_mul (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_div (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); hak_pfrc_t hak_pf_number_div (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_process_current (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); hak_pfrc_t hak_pf_process_current (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
hak_pfrc_t hak_pf_process_fork (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); hak_pfrc_t hak_pf_process_fork (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);

View File

@ -65,12 +65,12 @@ static hak_ooi_t equalize_scale (hak_t* hak, hak_oop_t* x, hak_oop_t* y)
{ {
/* TODO: optmize this. less multiplications */ /* TODO: optmize this. less multiplications */
nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10)); nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10));
if (!nv) return -1; if (HAK_UNLIKELY(!nv)) return -1;
xs++; xs++;
} }
nv = hak_makefpdec(hak, nv, xs); nv = hak_makefpdec(hak, nv, xs);
if (!nv) return -1; if (HAK_UNLIKELY(!nv)) return -1;
*x = nv; *x = nv;
} }
@ -80,12 +80,12 @@ static hak_ooi_t equalize_scale (hak_t* hak, hak_oop_t* x, hak_oop_t* y)
while (ys < xs) while (ys < xs)
{ {
nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10)); nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10));
if (!nv) return -1; if (HAK_UNLIKELY(!nv)) return -1;
ys++; ys++;
} }
nv = hak_makefpdec(hak, nv, ys); nv = hak_makefpdec(hak, nv, ys);
if (!nv) return -1; if (HAK_UNLIKELY(!nv)) return -1;
*y = nv; *y = nv;
} }
@ -104,7 +104,7 @@ hak_oop_t hak_truncfpdecval (hak_t* hak, hak_oop_t iv, hak_ooi_t cs, hak_ooi_t n
{ {
/* TODO: optimizatino... less divisions */ /* TODO: optimizatino... less divisions */
iv = hak_divints(hak, iv, HAK_SMOOI_TO_OOP(10), 0, HAK_NULL); iv = hak_divints(hak, iv, HAK_SMOOI_TO_OOP(10), 0, HAK_NULL);
if (!iv) return HAK_NULL; if (HAK_UNLIKELY(!iv)) return HAK_NULL;
cs--; cs--;
} }
while (cs > ns); while (cs > ns);
@ -136,7 +136,7 @@ hak_oop_t hak_addnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
} }
v = hak_addints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value); v = hak_addints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value);
hak_popvolats(hak, 2); hak_popvolats(hak, 2);
if (!v) return HAK_NULL; if (HAK_UNLIKELY(!v)) return HAK_NULL;
return hak_makefpdec(hak, v, scale); return hak_makefpdec(hak, v, scale);
} }
@ -165,7 +165,7 @@ hak_oop_t hak_subnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
} }
v = hak_subints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value); v = hak_subints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value);
hak_popvolats(hak, 2); hak_popvolats(hak, 2);
if (!v) return HAK_NULL; if (HAK_UNLIKELY(!v)) return HAK_NULL;
return hak_makefpdec(hak, v, scale); return hak_makefpdec(hak, v, scale);
} }
@ -204,7 +204,7 @@ static hak_oop_t mul_nums (hak_t* hak, hak_oop_t x, hak_oop_t y, int mult)
} }
nv = hak_mulints(hak, xv, yv); nv = hak_mulints(hak, xv, yv);
if (!nv) return HAK_NULL; if (HAK_UNLIKELY(!nv)) return HAK_NULL;
cs = xs + ys; cs = xs + ys;
if (cs <= 0) return nv; /* the result must be an integer */ if (cs <= 0) return nv; /* the result must be an integer */
@ -216,20 +216,20 @@ static hak_oop_t mul_nums (hak_t* hak, hak_oop_t x, hak_oop_t y, int mult)
HAK_ASSERT(hak, ns <= HAK_SMOOI_MAX); HAK_ASSERT(hak, ns <= HAK_SMOOI_MAX);
nv = hak_truncfpdecval(hak, nv, cs, ns); nv = hak_truncfpdecval(hak, nv, cs, ns);
if (!nv) return HAK_NULL; if (HAK_UNLIKELY(!nv)) return HAK_NULL;
return (ns <= 0)? nv: hak_makefpdec(hak, nv, ns); return (ns <= 0)? nv: hak_makefpdec(hak, nv, ns);
} }
hak_oop_t hak_mulnums (hak_t* hak, hak_oop_t x, hak_oop_t y) hak_oop_t hak_mulnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
{ {
/* (* 1.00 12.123) => 12.123 */ /* * 1.00 12.123 => 12.123, use the wider precision of the either operands */
return mul_nums(hak, x, y, 0); return mul_nums(hak, x, y, 0);
} }
hak_oop_t hak_mltnums (hak_t* hak, hak_oop_t x, hak_oop_t y) hak_oop_t hak_mltnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
{ {
/* (mlt 1.00 12.123) => 12.12 */ /* mlt 1.00 12.123 => 12.12, use the precision of the first operand */
return mul_nums(hak, x, y, 1); return mul_nums(hak, x, y, 1);
} }

View File

@ -787,7 +787,7 @@ static hak_pfrc_t pf_or (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
rv = hak->_false; rv = hak->_false;
for (i = 1; i < nargs; i++) for (i = 1; i < nargs; i++)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
if (arg == hak->_true) if (arg == hak->_true)
{ {
rv = hak->_true; rv = hak->_true;
@ -821,7 +821,7 @@ hak_pfrc_t hak_pf_number_add (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
/*ret = hak_addints(hak, ret, arg);*/ /*ret = hak_addints(hak, ret, arg);*/
ret = hak_addnums(hak, ret, arg); ret = hak_addnums(hak, ret, arg);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -839,7 +839,7 @@ hak_pfrc_t hak_pf_number_sub (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
/*ret = hak_subints(hak, ret, arg);*/ /*ret = hak_subints(hak, ret, arg);*/
ret = hak_subnums(hak, ret, arg); ret = hak_subnums(hak, ret, arg);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -857,7 +857,7 @@ hak_pfrc_t hak_pf_number_mul (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
/*ret = hak_mulints(hak, ret, arg);*/ /*ret = hak_mulints(hak, ret, arg);*/
ret = hak_mulnums(hak, ret, arg); ret = hak_mulnums(hak, ret, arg);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -874,7 +874,7 @@ static hak_pfrc_t pf_number_mlt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_mltnums(hak, ret, arg); ret = hak_mltnums(hak, ret, arg);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -891,7 +891,7 @@ hak_pfrc_t hak_pf_number_div (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_divnums(hak, ret, arg); ret = hak_divnums(hak, ret, arg);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -908,7 +908,7 @@ static hak_pfrc_t pf_integer_quo (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_divints(hak, ret, arg, 0, HAK_NULL); ret = hak_divints(hak, ret, arg, 0, HAK_NULL);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -925,7 +925,7 @@ static hak_pfrc_t pf_integer_rem (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_divints(hak, ret, arg, 0, &rem); ret = hak_divints(hak, ret, arg, 0, &rem);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
ret = rem; ret = rem;
} }
@ -943,7 +943,7 @@ static hak_pfrc_t pf_integer_mquo (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_divints(hak, ret, arg, 1, HAK_NULL); ret = hak_divints(hak, ret, arg, 1, HAK_NULL);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
} }
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
@ -960,7 +960,7 @@ static hak_pfrc_t pf_integer_mod (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
arg = HAK_STACK_GETARG(hak, nargs, i); arg = HAK_STACK_GETARG(hak, nargs, i);
ret = hak_divints(hak, ret, arg, 1, &rem); ret = hak_divints(hak, ret, arg, 1, &rem);
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
ret = rem; ret = rem;
} }
@ -968,79 +968,79 @@ static hak_pfrc_t pf_integer_mod (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_sqrtnum(hak, HAK_STACK_GETARG(hak, nargs, 0)); ret = hak_sqrtnum(hak, HAK_STACK_GETARG(hak, nargs, 0));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_absnum(hak, HAK_STACK_GETARG(hak, nargs, 0)); ret = hak_absnum(hak, HAK_STACK_GETARG(hak, nargs, 0));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_gtnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_gtnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_genums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_genums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_ltnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_ltnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_lenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_lenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_eqnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_eqnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
static hak_pfrc_t pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) hak_pfrc_t hak_pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t ret; hak_oop_t ret;
ret = hak_nenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1)); ret = hak_nenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
if (!ret) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
HAK_STACK_SETRET(hak, nargs, ret); HAK_STACK_SETRET(hak, nargs, ret);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
@ -1321,16 +1321,16 @@ static pf_t builtin_prims[] =
{ 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_mul, 1, { '*' } }, { 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_mul, 1, { '*' } },
{ 1, HAK_TYPE_MAX(hak_oow_t), pf_number_mlt, 3, { 'm','l','t' } }, { 1, HAK_TYPE_MAX(hak_oow_t), pf_number_mlt, 3, { 'm','l','t' } },
{ 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_div, 1, { '/' } }, { 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_div, 1, { '/' } },
{ 1, 1, pf_number_sqrt, 4, { 's','q','r','t' } }, { 1, 1, hak_pf_number_sqrt, 4, { 's','q','r','t' } },
{ 1, 1, pf_number_abs, 3, { 'a','b','s' } }, { 1, 1, hak_pf_number_abs, 3, { 'a','b','s' } },
{ 2, 2, pf_number_gt, 1, { '>' } }, { 2, 2, hak_pf_number_gt, 1, { '>' } },
{ 2, 2, pf_number_ge, 2, { '>','=' } }, { 2, 2, hak_pf_number_ge, 2, { '>','=' } },
{ 2, 2, pf_number_lt, 1, { '<' } }, { 2, 2, hak_pf_number_lt, 1, { '<' } },
{ 2, 2, pf_number_le, 2, { '<','=' } }, { 2, 2, hak_pf_number_le, 2, { '<','=' } },
{ 2, 2, pf_number_eq, 1, { '=' } }, { 2, 2, hak_pf_number_eq, 1, { '=' } },
{ 2, 2, pf_number_eq, 2, { '=', '=' } }, { 2, 2, hak_pf_number_eq, 2, { '=', '=' } },
{ 2, 2, pf_number_ne, 2, { '~','=' } }, { 2, 2, hak_pf_number_ne, 2, { '~','=' } },
/* bitwise operations are supported for integers only */ /* bitwise operations are supported for integers only */
{ 2, 2, pf_integer_band, 7, { 'b','i','t','-','a','n','d' } }, { 2, 2, pf_integer_band, 7, { 'b','i','t','-','a','n','d' } },

View File

@ -30,7 +30,7 @@
static hak_pfrc_t pf_core_basic_new (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) static hak_pfrc_t pf_core_basic_new (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
{ {
hak_oop_t obj, size, inst; hak_oop_t obj, inst;
hak_ooi_t nsize; hak_ooi_t nsize;
obj = HAK_STACK_GETARG(hak, nargs, 0); obj = HAK_STACK_GETARG(hak, nargs, 0);
@ -40,24 +40,30 @@ static hak_pfrc_t pf_core_basic_new (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs
return HAK_PF_FAILURE; return HAK_PF_FAILURE;
} }
size = HAK_STACK_GETARG(hak, nargs, 1); nsize = 0;
if (!HAK_OOP_IS_SMOOI(size)) if (nargs >= 2)
{ {
hak_seterrbfmt (hak, HAK_EINVAL, "size not numeric - %O", size); hak_oop_t size;
return HAK_PF_FAILURE;
}
nsize = HAK_OOP_TO_SMOOI(size); size = HAK_STACK_GETARG(hak, nargs, 1);
if (nsize < 0) if (!HAK_OOP_IS_SMOOI(size))
{ {
hak_seterrbfmt (hak, HAK_EINVAL, "size not valid - %zd", nsize); hak_seterrbfmt (hak, HAK_EINVAL, "size not numeric - %O", size);
return HAK_PF_FAILURE; return HAK_PF_FAILURE;
}
nsize = HAK_OOP_TO_SMOOI(size);
if (nsize < 0)
{
hak_seterrbfmt (hak, HAK_EINVAL, "size not valid - %zd", nsize);
return HAK_PF_FAILURE;
}
} }
inst = hak_instantiate(hak, (hak_oop_class_t)obj, HAK_NULL, nsize); inst = hak_instantiate(hak, (hak_oop_class_t)obj, HAK_NULL, nsize);
if (HAK_UNLIKELY(!inst)) return HAK_PF_FAILURE; if (HAK_UNLIKELY(!inst)) return HAK_PF_FAILURE;
HAK_STACK_SETRET (hak, nargs, inst); HAK_STACK_SETRET(hak, nargs, inst);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -149,7 +155,7 @@ static hak_pfrc_t __basic_at (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs, int s
} }
HAK_STACK_SETRET (hak, nargs, val); HAK_STACK_SETRET(hak, nargs, val);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -273,7 +279,7 @@ static hak_pfrc_t __basic_at_put (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs, i
} }
HAK_STACK_SETRET (hak, nargs, val); HAK_STACK_SETRET(hak, nargs, val);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -303,7 +309,7 @@ static hak_pfrc_t pf_core_basic_size (hak_t* hak, hak_mod_t* mod, hak_ooi_t narg
size = hak_oowtoint(hak, HAK_OBJ_GET_SIZE(src)); size = hak_oowtoint(hak, HAK_OBJ_GET_SIZE(src));
if (!size) return HAK_PF_FAILURE; if (!size) return HAK_PF_FAILURE;
HAK_STACK_SETRET (hak, nargs, size); HAK_STACK_SETRET(hak, nargs, size);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -324,7 +330,7 @@ static hak_pfrc_t pf_core_class_name (hak_t* hak, hak_mod_t* mod, hak_ooi_t narg
#endif #endif
} }
HAK_STACK_SETRET (hak, nargs, ((hak_oop_class_t)obj)->name); HAK_STACK_SETRET(hak, nargs, ((hak_oop_class_t)obj)->name);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -348,7 +354,7 @@ static hak_pfrc_t pf_core_class_responds_to (hak_t* hak, hak_mod_t* mod, hak_ooi
} }
x = hak_class_responds_to(hak, obj, msg); x = hak_class_responds_to(hak, obj, msg);
HAK_STACK_SETRET (hak, nargs, (x? hak->_true: hak->_false)); HAK_STACK_SETRET(hak, nargs, (x? hak->_true: hak->_false));
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -367,7 +373,7 @@ static hak_pfrc_t pf_core_inst_responds_to (hak_t* hak, hak_mod_t* mod, hak_ooi_
} }
x = hak_inst_responds_to(hak, obj, msg); x = hak_inst_responds_to(hak, obj, msg);
HAK_STACK_SETRET (hak, nargs, (x? hak->_true: hak->_false)); HAK_STACK_SETRET(hak, nargs, (x? hak->_true: hak->_false));
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -441,7 +447,7 @@ static hak_pfrc_t pf_core_slice (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
goto unsliceable; goto unsliceable;
} }
HAK_STACK_SETRET (hak, nargs, slice); HAK_STACK_SETRET(hak, nargs, slice);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -459,7 +465,7 @@ static hak_pfrc_t pf_core_char_to_smooi (hak_t* hak, hak_mod_t* mod, hak_ooi_t n
code = HAK_OOP_TO_CHAR(rcv); code = HAK_OOP_TO_CHAR(rcv);
out = HAK_SMOOI_TO_OOP(code); out = HAK_SMOOI_TO_OOP(code);
HAK_STACK_SETRET (hak, nargs, out); HAK_STACK_SETRET(hak, nargs, out);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -477,7 +483,7 @@ static hak_pfrc_t pf_core_smooi_to_char (hak_t* hak, hak_mod_t* mod, hak_ooi_t n
code = HAK_OOP_TO_SMOOI(rcv); code = HAK_OOP_TO_SMOOI(rcv);
out = HAK_CHAR_TO_OOP(code); out = HAK_CHAR_TO_OOP(code);
HAK_STACK_SETRET (hak, nargs, out); HAK_STACK_SETRET(hak, nargs, out);
return HAK_PF_SUCCESS; return HAK_PF_SUCCESS;
} }
@ -487,10 +493,17 @@ static hak_pfinfo_t pfinfos[] =
{ "+", { HAK_PFBASE_FUNC, hak_pf_number_add, 1, HAK_TYPE_MAX(hak_oow_t) } }, { "+", { HAK_PFBASE_FUNC, hak_pf_number_add, 1, HAK_TYPE_MAX(hak_oow_t) } },
{ "-", { HAK_PFBASE_FUNC, hak_pf_number_sub, 1, HAK_TYPE_MAX(hak_oow_t) } }, { "-", { HAK_PFBASE_FUNC, hak_pf_number_sub, 1, HAK_TYPE_MAX(hak_oow_t) } },
{ "/", { HAK_PFBASE_FUNC, hak_pf_number_div, 1, HAK_TYPE_MAX(hak_oow_t) } }, { "/", { HAK_PFBASE_FUNC, hak_pf_number_div, 1, HAK_TYPE_MAX(hak_oow_t) } },
{ "<", { HAK_PFBASE_FUNC, hak_pf_number_lt, 2, 2 } },
{ "<=", { HAK_PFBASE_FUNC, hak_pf_number_le, 2, 2 } },
{ "=", { HAK_PFBASE_FUNC, hak_pf_number_eq, 2, 2 } },
{ "==", { HAK_PFBASE_FUNC, hak_pf_number_eq, 2, 2 } },
{ ">", { HAK_PFBASE_FUNC, hak_pf_number_gt, 2, 2 } },
{ ">=", { HAK_PFBASE_FUNC, hak_pf_number_ge, 2, 2 } },
/* TODO: add more builtin primitives here... */ /* TODO: add more builtin primitives here... */
{ "abs", { HAK_PFBASE_FUNC, hak_pf_number_abs, 1, 1 } },
{ "basicAt", { HAK_PFBASE_FUNC, pf_core_basic_at, 2, 2 } }, { "basicAt", { HAK_PFBASE_FUNC, pf_core_basic_at, 2, 2 } },
{ "basicAtPut", { HAK_PFBASE_FUNC, pf_core_basic_at_put, 3, 3 } }, { "basicAtPut", { HAK_PFBASE_FUNC, pf_core_basic_at_put, 3, 3 } },
{ "basicNew", { HAK_PFBASE_FUNC, pf_core_basic_new, 2, 2 } }, { "basicNew", { HAK_PFBASE_FUNC, pf_core_basic_new, 1, 2 } },
{ "basicSize", { HAK_PFBASE_FUNC, pf_core_basic_size, 1, 1 } }, { "basicSize", { HAK_PFBASE_FUNC, pf_core_basic_size, 1, 1 } },
{ "charToSmooi", { HAK_PFBASE_FUNC, pf_core_char_to_smooi, 1, 1 } }, { "charToSmooi", { HAK_PFBASE_FUNC, pf_core_char_to_smooi, 1, 1 } },
{ "className", { HAK_PFBASE_FUNC, pf_core_class_name, 1, 1 } }, { "className", { HAK_PFBASE_FUNC, pf_core_class_name, 1, 1 } },
@ -500,6 +513,8 @@ static hak_pfinfo_t pfinfos[] =
{ "primAtPut", { HAK_PFBASE_FUNC, pf_core_prim_at_put, 3, 3 } }, { "primAtPut", { HAK_PFBASE_FUNC, pf_core_prim_at_put, 3, 3 } },
{ "slice", { HAK_PFBASE_FUNC, pf_core_slice, 3, 3 } }, { "slice", { HAK_PFBASE_FUNC, pf_core_slice, 3, 3 } },
{ "smooiToChar", { HAK_PFBASE_FUNC, pf_core_smooi_to_char, 1, 1 } }, { "smooiToChar", { HAK_PFBASE_FUNC, pf_core_smooi_to_char, 1, 1 } },
{ "sqrt", { HAK_PFBASE_FUNC, hak_pf_number_sqrt, 1, 1 } },
{ "~=", { HAK_PFBASE_FUNC, hak_pf_number_ne, 2, 2 } },
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */