From 4c000c2c9caadacc7ea8442da4671d4cec3732e2 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 25 Sep 2025 01:33:54 +0900 Subject: [PATCH] updated hak_sqrtint() to return an error if a negative number is given. added more primitives in the core module --- lib/bigint.c | 5 ++++ lib/hak-prv.h | 9 +++++++ lib/number.c | 22 ++++++++-------- lib/prim.c | 70 +++++++++++++++++++++++++-------------------------- mod/core.c | 59 +++++++++++++++++++++++++++---------------- 5 files changed, 97 insertions(+), 68 deletions(-) diff --git a/lib/bigint.c b/lib/bigint.c index d49cab9..e593050 100644 --- a/lib/bigint.c +++ b/lib/bigint.c @@ -4828,11 +4828,16 @@ hak_oop_t hak_sqrtint (hak_t* hak, hak_oop_t x) if (HAK_UNLIKELY(!a)) goto oops; if (a == hak->_true) { + #if 0 /* the given number is a negative number. * i will arrange the return value to be negative. */ x = hak_negateint(hak, x); if (HAK_UNLIKELY(!x)) goto oops; neg = 1; + #else + hak_seterrbfmt(hak, HAK_EINVAL, "negative number - %O", x); + goto oops; + #endif } else neg = 0; diff --git a/lib/hak-prv.h b/lib/hak-prv.h index 91b4fef..a0fdd02 100644 --- a/lib/hak-prv.h +++ b/lib/hak-prv.h @@ -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_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_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_fork (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs); diff --git a/lib/number.c b/lib/number.c index a42cf55..46eff3c 100644 --- a/lib/number.c +++ b/lib/number.c @@ -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 */ nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10)); - if (!nv) return -1; + if (HAK_UNLIKELY(!nv)) return -1; xs++; } nv = hak_makefpdec(hak, nv, xs); - if (!nv) return -1; + if (HAK_UNLIKELY(!nv)) return -1; *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) { nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10)); - if (!nv) return -1; + if (HAK_UNLIKELY(!nv)) return -1; ys++; } nv = hak_makefpdec(hak, nv, ys); - if (!nv) return -1; + if (HAK_UNLIKELY(!nv)) return -1; *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 */ 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--; } 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); hak_popvolats(hak, 2); - if (!v) return HAK_NULL; + if (HAK_UNLIKELY(!v)) return HAK_NULL; 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); hak_popvolats(hak, 2); - if (!v) return HAK_NULL; + if (HAK_UNLIKELY(!v)) return HAK_NULL; 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); - if (!nv) return HAK_NULL; + if (HAK_UNLIKELY(!nv)) return HAK_NULL; cs = xs + ys; 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); 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); } 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); } 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); } diff --git a/lib/prim.c b/lib/prim.c index b6a34a7..a01f9f9 100644 --- a/lib/prim.c +++ b/lib/prim.c @@ -787,7 +787,7 @@ static hak_pfrc_t pf_or (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs) rv = hak->_false; for (i = 1; i < nargs; i++) { - arg = HAK_STACK_GETARG(hak, nargs, i); + arg = HAK_STACK_GETARG(hak, nargs, i); if (arg == 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); /*ret = hak_addints(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); @@ -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); /*ret = hak_subints(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); @@ -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); /*ret = hak_mulints(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); @@ -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); 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); @@ -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); 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); @@ -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); 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); @@ -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); ret = hak_divints(hak, ret, arg, 0, &rem); - if (!ret) return HAK_PF_FAILURE; + if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE; 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); 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); @@ -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); ret = hak_divints(hak, ret, arg, 1, &rem); - if (!ret) return HAK_PF_FAILURE; + if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE; 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; } -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; 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); 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; 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); 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; 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); 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; 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); 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; 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); 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; 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); 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; 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); 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; 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); 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), pf_number_mlt, 3, { 'm','l','t' } }, { 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_div, 1, { '/' } }, - { 1, 1, pf_number_sqrt, 4, { 's','q','r','t' } }, - { 1, 1, pf_number_abs, 3, { 'a','b','s' } }, + { 1, 1, hak_pf_number_sqrt, 4, { 's','q','r','t' } }, + { 1, 1, hak_pf_number_abs, 3, { 'a','b','s' } }, - { 2, 2, pf_number_gt, 1, { '>' } }, - { 2, 2, pf_number_ge, 2, { '>','=' } }, - { 2, 2, pf_number_lt, 1, { '<' } }, - { 2, 2, pf_number_le, 2, { '<','=' } }, - { 2, 2, pf_number_eq, 1, { '=' } }, - { 2, 2, pf_number_eq, 2, { '=', '=' } }, - { 2, 2, pf_number_ne, 2, { '~','=' } }, + { 2, 2, hak_pf_number_gt, 1, { '>' } }, + { 2, 2, hak_pf_number_ge, 2, { '>','=' } }, + { 2, 2, hak_pf_number_lt, 1, { '<' } }, + { 2, 2, hak_pf_number_le, 2, { '<','=' } }, + { 2, 2, hak_pf_number_eq, 1, { '=' } }, + { 2, 2, hak_pf_number_eq, 2, { '=', '=' } }, + { 2, 2, hak_pf_number_ne, 2, { '~','=' } }, /* bitwise operations are supported for integers only */ { 2, 2, pf_integer_band, 7, { 'b','i','t','-','a','n','d' } }, diff --git a/mod/core.c b/mod/core.c index 4e2fad9..ebc3c6a 100644 --- a/mod/core.c +++ b/mod/core.c @@ -30,7 +30,7 @@ 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; 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; } - size = HAK_STACK_GETARG(hak, nargs, 1); - if (!HAK_OOP_IS_SMOOI(size)) + nsize = 0; + if (nargs >= 2) { - hak_seterrbfmt (hak, HAK_EINVAL, "size not numeric - %O", size); - return HAK_PF_FAILURE; - } + hak_oop_t size; - nsize = HAK_OOP_TO_SMOOI(size); - if (nsize < 0) - { - hak_seterrbfmt (hak, HAK_EINVAL, "size not valid - %zd", nsize); - return HAK_PF_FAILURE; + size = HAK_STACK_GETARG(hak, nargs, 1); + if (!HAK_OOP_IS_SMOOI(size)) + { + hak_seterrbfmt (hak, HAK_EINVAL, "size not numeric - %O", size); + 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); if (HAK_UNLIKELY(!inst)) return HAK_PF_FAILURE; - HAK_STACK_SETRET (hak, nargs, inst); + HAK_STACK_SETRET(hak, nargs, inst); 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; } @@ -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; } @@ -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)); if (!size) return HAK_PF_FAILURE; - HAK_STACK_SETRET (hak, nargs, size); + HAK_STACK_SETRET(hak, nargs, size); 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 } - 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; } @@ -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); - HAK_STACK_SETRET (hak, nargs, (x? hak->_true: hak->_false)); + HAK_STACK_SETRET(hak, nargs, (x? hak->_true: hak->_false)); 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); - HAK_STACK_SETRET (hak, nargs, (x? hak->_true: hak->_false)); + HAK_STACK_SETRET(hak, nargs, (x? hak->_true: hak->_false)); 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; } - HAK_STACK_SETRET (hak, nargs, slice); + HAK_STACK_SETRET(hak, nargs, slice); 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); out = HAK_SMOOI_TO_OOP(code); - HAK_STACK_SETRET (hak, nargs, out); + HAK_STACK_SETRET(hak, nargs, out); 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); out = HAK_CHAR_TO_OOP(code); - HAK_STACK_SETRET (hak, nargs, out); + HAK_STACK_SETRET(hak, nargs, out); 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_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_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... */ + { "abs", { HAK_PFBASE_FUNC, hak_pf_number_abs, 1, 1 } }, { "basicAt", { HAK_PFBASE_FUNC, pf_core_basic_at, 2, 2 } }, { "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 } }, { "charToSmooi", { HAK_PFBASE_FUNC, pf_core_char_to_smooi, 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 } }, { "slice", { HAK_PFBASE_FUNC, pf_core_slice, 3, 3 } }, { "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 } }, }; /* ------------------------------------------------------------------------ */