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:
		@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								lib/number.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										70
									
								
								lib/prim.c
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								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' } },
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										59
									
								
								mod/core.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								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 } },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* ------------------------------------------------------------------------ */
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user