ported the portability fix in bigint.c

This commit is contained in:
2025-08-05 22:35:17 +09:00
parent 9afb8e3898
commit 0da2d2abd3
37 changed files with 1992 additions and 1988 deletions

View File

@ -304,6 +304,11 @@ static MOO_INLINE int bigint_to_oow_noseterr (moo_t* moo, moo_oop_t num, moo_oow
*w = MAKE_WORD(MOO_OBJ_GET_HALFWORD_VAL(num, 0), MOO_OBJ_GET_HALFWORD_VAL(num, 1)); *w = MAKE_WORD(MOO_OBJ_GET_HALFWORD_VAL(num, 0), MOO_OBJ_GET_HALFWORD_VAL(num, 1));
return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1; return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1;
} }
if (MOO_OBJ_GET_SIZE(num) == 1)
{
*w = MOO_OBJ_GET_HALFWORD_VAL(num, 0);
return (MOO_POINTER_IS_NBIGINT(moo, num))? -1: 1;
}
#else #else
# error UNSUPPORTED LIW BIT SIZE # error UNSUPPORTED LIW BIT SIZE
#endif #endif
@ -413,7 +418,7 @@ int moo_inttoooi_noseterr (moo_t* moo, moo_oop_t x, moo_ooi_t* i)
{ {
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_ooi_t) + MOO_TYPE_MIN(moo_ooi_t) == -1); /* assume 2's complement */ MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_ooi_t) + MOO_TYPE_MIN(moo_ooi_t) == -1); /* assume 2's complement */
if (w > (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t) + 1) return 0; /* too small */ if (w > (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t) + 1) return 0; /* too small */
*i = -w; /* negate back */ *i = (w <= (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t))? -(moo_ooi_t)w: MOO_TYPE_MIN(moo_ooi_t); /* negate back */
} }
else if (n > 0) else if (n > 0)
{ {
@ -449,7 +454,7 @@ int moo_inttoooi (moo_t* moo, moo_oop_t x, moo_ooi_t* i)
moo_seterrnum (moo, MOO_ERANGE); moo_seterrnum (moo, MOO_ERANGE);
return 0; /* too small */ return 0; /* too small */
} }
*i = -w; /* negate back */ *i = (w <= (moo_oow_t)MOO_TYPE_MAX(moo_ooi_t))? -(moo_ooi_t)w: MOO_TYPE_MIN(moo_ooi_t); /* negate back */
} }
else if (n > 0) else if (n > 0)
{ {
@ -525,30 +530,30 @@ static MOO_INLINE int bigint_to_uintmax_noseterr (moo_t* moo, moo_oop_t num, moo
goto done; goto done;
case 4: case 4:
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 3) | *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 3)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 2) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 2)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 1) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 1)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3)); ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3));
goto done; goto done;
#if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4) #if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4)
case 6: case 6:
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 5) | *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 5)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 4) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 4)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 3) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 3)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 2) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << (MOO_LIW_BITS * 2)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 1) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << (MOO_LIW_BITS * 1)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5)); ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5));
goto done; goto done;
case 8: case 8:
*w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 7) | *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << (MOO_LIW_BITS * 7)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 6) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << (MOO_LIW_BITS * 6)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 5) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << (MOO_LIW_BITS * 5)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 4) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << (MOO_LIW_BITS * 4)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 3) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << (MOO_LIW_BITS * 3)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5) << MOO_LIW_BITS * 2) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5) << (MOO_LIW_BITS * 2)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 6) << MOO_LIW_BITS * 1) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 6) << (MOO_LIW_BITS * 1)) |
((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 7)); ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 7));
goto done; goto done;
#endif #endif
@ -637,7 +642,7 @@ int moo_inttointmax_noseterr (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
/* negative number negated to a positve number */ /* negative number negated to a positve number */
MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_intmax_t) + MOO_TYPE_MIN(moo_intmax_t) == -1); /* assume 2's complement */ MOO_STATIC_ASSERT (MOO_TYPE_MAX(moo_intmax_t) + MOO_TYPE_MIN(moo_intmax_t) == -1); /* assume 2's complement */
if (w > (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t) + 1) return 0; /* not convertable - too small */ if (w > (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t) + 1) return 0; /* not convertable - too small */
*i = -w; /* negate it back */ *i = (w <= (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t))? -(moo_intmax_t)w: MOO_TYPE_MIN(moo_intmax_t); /* negate back */
} }
else if (n > 0) else if (n > 0)
{ {
@ -648,7 +653,6 @@ int moo_inttointmax_noseterr (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
return n; return n;
} }
moo_seterrbfmt (moo, MOO_EINVAL, "not an integer - %O", x);
return 0; /* not convertable - not an integer */ return 0; /* not convertable - not an integer */
} }
@ -675,7 +679,7 @@ int moo_inttointmax (moo_t* moo, moo_oop_t x, moo_intmax_t* i)
moo_seterrnum (moo, MOO_ERANGE); moo_seterrnum (moo, MOO_ERANGE);
return 0; /* not convertable. too small */ return 0; /* not convertable. too small */
} }
*i = -w; /* negate it back */ *i = (w <= (moo_uintmax_t)MOO_TYPE_MAX(moo_intmax_t))? -(moo_intmax_t)w: MOO_TYPE_MIN(moo_intmax_t); /* negate back */
} }
else if (n > 0) else if (n > 0)
{ {