From bbf0f6acd1024271e9e1a910a8b2abdfb9bc51eb Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Sat, 4 May 2019 17:53:16 +0000 Subject: [PATCH] migrated moo_isint() to moo-prv.h as a static inline function renamed is_bigint() to moo_isbigint() --- moo/lib/bigint.c | 122 ++++++++++++++++++++-------------------------- moo/lib/moo-prv.h | 19 ++++++-- moo/lib/moo.c | 2 +- moo/lib/moo.h | 4 +- 4 files changed, 71 insertions(+), 76 deletions(-) diff --git a/moo/lib/bigint.c b/moo/lib/bigint.c index 9664efc..f5bdb9d 100644 --- a/moo/lib/bigint.c +++ b/moo/lib/bigint.c @@ -279,22 +279,6 @@ static int is_normalized_integer (moo_t* moo, moo_oop_t oop) return 0; } -MOO_INLINE static int is_bigint (moo_t* moo, moo_oop_t x) -{ - if (!MOO_OOP_IS_POINTER(x)) return 0; - -/* TODO: is it better to introduce a special integer mark into the class itself */ -/* TODO: or should it check if it's a subclass, subsubclass, subsubsubclass, etc of a large_integer as well? */ - return MOO_POINTER_IS_BIGINT(moo, x); -} - -MOO_INLINE int moo_isint (moo_t* moo, moo_oop_t x) -{ - if (MOO_OOP_IS_SMOOI(x)) return 1; - if (MOO_OOP_IS_POINTER(x)) return is_bigint(moo, x); - return 0; -} - static MOO_INLINE int bigint_to_oow (moo_t* moo, moo_oop_t num, moo_oow_t* w) { MOO_ASSERT (moo, MOO_OOP_IS_POINTER(num)); @@ -353,7 +337,7 @@ static MOO_INLINE int integer_to_oow (moo_t* moo, moo_oop_t x, moo_oow_t* w) } } - MOO_ASSERT (moo, is_bigint(moo, x)); + MOO_ASSERT (moo, moo_isbigint(moo, x)); return bigint_to_oow(moo, x, w); } @@ -376,7 +360,7 @@ int moo_inttooow (moo_t* moo, moo_oop_t x, moo_oow_t* w) } } - if (is_bigint(moo, x)) return bigint_to_oow(moo, x, w); + if (moo_isbigint(moo, x)) return bigint_to_oow(moo, x, w); moo_seterrbfmt (moo, MOO_EINVAL, "not an integer - %O", x); return 0; /* not convertable - too big, too small, or not an integer */ @@ -420,7 +404,7 @@ static MOO_INLINE moo_oop_t make_bigint_with_oow (moo_t* moo, moo_oow_t w) moo_liw_t hw[2]; hw[0] = w /*& MOO_LBMASK(moo_oow_t,MOO_LIW_BITS)*/; hw[1] = w >> MOO_LIW_BITS; - return moo_instantiate(moo, moo->_large_positive_integer, &hw, (hw[1] > 0? 2: 1)); + return moo_instantiate(moo, moo->_large_positive_integer, hw, (hw[1] > 0? 2: 1)); #else # error UNSUPPORTED LIW BIT SIZE #endif @@ -455,7 +439,7 @@ static MOO_INLINE moo_oop_t make_bigint_with_ooi (moo_t* moo, moo_ooi_t i) w = i; hw[0] = w /*& MOO_LBMASK(moo_oow_t,MOO_LIW_BITS)*/; hw[1] = w >> MOO_LIW_BITS; - return moo_instantiate(moo, moo->_large_positive_integer, &hw, (hw[1] > 0? 2: 1)); + return moo_instantiate(moo, moo->_large_positive_integer, hw, (hw[1] > 0? 2: 1)); } else { @@ -463,7 +447,7 @@ static MOO_INLINE moo_oop_t make_bigint_with_ooi (moo_t* moo, moo_ooi_t i) w = -i; hw[0] = w /*& MOO_LBMASK(moo_oow_t,MOO_LIW_BITS)*/; hw[1] = w >> MOO_LIW_BITS; - return moo_instantiate(moo, moo->_large_negative_integer, &hw, (hw[1] > 0? 2: 1)); + return moo_instantiate(moo, moo->_large_negative_integer, hw, (hw[1] > 0? 2: 1)); } #else # error UNSUPPORTED LIW BIT SIZE @@ -2134,7 +2118,7 @@ moo_oop_t moo_addints (moo_t* moo, moo_oop_t x, moo_oop_t y) if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) return clone_bigint(moo, y, MOO_OBJ_GET_SIZE(y)); @@ -2146,7 +2130,7 @@ moo_oop_t moo_addints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return clone_bigint(moo, x, MOO_OBJ_GET_SIZE(x)); @@ -2158,8 +2142,8 @@ moo_oop_t moo_addints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else { - if (!is_bigint(moo,x)) goto oops_einval; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; } if (MOO_OBJ_GET_CLASS(x) != MOO_OBJ_GET_CLASS(y)) @@ -2238,7 +2222,7 @@ moo_oop_t moo_subints (moo_t* moo, moo_oop_t x, moo_oop_t y) if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) @@ -2254,7 +2238,7 @@ moo_oop_t moo_subints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return clone_bigint(moo, x, MOO_OBJ_GET_SIZE(x)); @@ -2266,8 +2250,8 @@ moo_oop_t moo_subints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else { - if (!is_bigint(moo,x)) goto oops_einval; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; } if (MOO_OBJ_GET_CLASS(x) != MOO_OBJ_GET_CLASS(y)) @@ -2351,7 +2335,7 @@ moo_oop_t moo_mulints (moo_t* moo, moo_oop_t x, moo_oop_t y) if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); switch (v) @@ -2371,7 +2355,7 @@ moo_oop_t moo_mulints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); switch (v) @@ -2391,8 +2375,8 @@ moo_oop_t moo_mulints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else { - if (!is_bigint(moo,x)) goto oops_einval; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; } full_multiply: @@ -2522,7 +2506,7 @@ moo_oop_t moo_divints (moo_t* moo, moo_oop_t x, moo_oop_t y, int modulo, moo_oop { moo_ooi_t xv; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; /* divide a small integer by a big integer. * the dividend is guaranteed to be greater than the divisor @@ -2549,7 +2533,7 @@ moo_oop_t moo_divints (moo_t* moo, moo_oop_t x, moo_oop_t y, int modulo, moo_oop { moo_ooi_t yv; - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; /* divide a big integer by a small integer. */ @@ -2642,8 +2626,8 @@ moo_oop_t moo_divints (moo_t* moo, moo_oop_t x, moo_oop_t y, int modulo, moo_oop } else { - if (!is_bigint(moo,x)) goto oops_einval; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; } } @@ -2733,7 +2717,7 @@ moo_oop_t moo_negateint (moo_t* moo, moo_oop_t x) } else { - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; return clone_bigint_negated (moo, x, MOO_OBJ_GET_SIZE(x)); } @@ -2770,7 +2754,7 @@ moo_oop_t moo_bitatint (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; if (MOO_POINTER_IS_NBIGINT(moo, y)) return MOO_SMOOI_TO_OOP(0); @@ -2785,7 +2769,7 @@ moo_oop_t moo_bitatint (moo_t* moo, moo_oop_t x, moo_oop_t y) moo_ooi_t v; moo_oow_t wp, bp, xs; - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v < 0) return MOO_SMOOI_TO_OOP(0); @@ -2826,7 +2810,7 @@ moo_oop_t moo_bitatint (moo_t* moo, moo_oop_t x, moo_oop_t y) int sign; #endif - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; #if defined(MOO_LIMIT_OBJ_SIZE) if (MOO_POINTER_IS_NBIGINT(moo, y)) return MOO_SMOOI_TO_OOP(0); @@ -2924,7 +2908,7 @@ moo_oop_t moo_bitandints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) return MOO_SMOOI_TO_OOP(0); @@ -2940,7 +2924,7 @@ moo_oop_t moo_bitandints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return MOO_SMOOI_TO_OOP(0); @@ -2958,7 +2942,7 @@ moo_oop_t moo_bitandints (moo_t* moo, moo_oop_t x, moo_oop_t y) moo_oow_t i, xs, ys, zs, zalloc; int negx, negy; - if (!is_bigint(moo,x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo,x) || !moo_isbigint(moo, y)) goto oops_einval; bigint_and_bigint: xs = MOO_OBJ_GET_SIZE(x); @@ -3137,7 +3121,7 @@ moo_oop_t moo_bitorints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) return clone_bigint(moo, y, MOO_OBJ_GET_SIZE(y)); @@ -3153,7 +3137,7 @@ moo_oop_t moo_bitorints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return clone_bigint(moo, x, MOO_OBJ_GET_SIZE(x)); @@ -3171,7 +3155,7 @@ moo_oop_t moo_bitorints (moo_t* moo, moo_oop_t x, moo_oop_t y) moo_oow_t i, xs, ys, zs, zalloc; int negx, negy; - if (!is_bigint(moo,x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo,x) || !moo_isbigint(moo, y)) goto oops_einval; bigint_and_bigint: xs = MOO_OBJ_GET_SIZE(x); @@ -3355,7 +3339,7 @@ moo_oop_t moo_bitxorints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) return clone_bigint(moo, y, MOO_OBJ_GET_SIZE(y)); @@ -3371,7 +3355,7 @@ moo_oop_t moo_bitxorints (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return clone_bigint(moo, x, MOO_OBJ_GET_SIZE(x)); @@ -3389,7 +3373,7 @@ moo_oop_t moo_bitxorints (moo_t* moo, moo_oop_t x, moo_oop_t y) moo_oow_t i, xs, ys, zs, zalloc; int negx, negy; - if (!is_bigint(moo,x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo,x) || !moo_isbigint(moo, y)) goto oops_einval; bigint_and_bigint: xs = MOO_OBJ_GET_SIZE(x); @@ -3573,7 +3557,7 @@ moo_oop_t moo_bitinvint (moo_t* moo, moo_oop_t x) moo_oow_t i, xs, zs, zalloc; int negx; - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; xs = MOO_OBJ_GET_SIZE(x); negx = (MOO_POINTER_IS_NBIGINT(moo, x))? 1: 0; @@ -3994,7 +3978,7 @@ moo_oop_t moo_bitshiftint (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo,y)) goto oops_einval; + if (!moo_isbigint(moo,y)) goto oops_einval; v = MOO_OOP_TO_SMOOI(x); if (v == 0) return MOO_SMOOI_TO_OOP(0); @@ -4019,7 +4003,7 @@ moo_oop_t moo_bitshiftint (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_ooi_t v; - if (!is_bigint(moo,x)) goto oops_einval; + if (!moo_isbigint(moo,x)) goto oops_einval; v = MOO_OOP_TO_SMOOI(y); if (v == 0) return clone_bigint(moo, x, MOO_OBJ_GET_SIZE(x)); @@ -4044,7 +4028,7 @@ moo_oop_t moo_bitshiftint (moo_t* moo, moo_oop_t x, moo_oop_t y) { moo_oop_t z; - if (!is_bigint(moo,x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo,x) || !moo_isbigint(moo, y)) goto oops_einval; bigint_and_bigint: negx = (MOO_POINTER_IS_NBIGINT(moo, x))? 1: 0; @@ -4207,7 +4191,7 @@ moo_oop_t moo_strtoint (moo_t* moo, const moo_ooch_t* str, moo_oow_t len, int ra if (outlen > MOO_COUNTOF(hw)) { /* TODO: reuse this buffer? */ - hwp = moo_allocmem(moo, outlen * MOO_SIZEOF(hw[0])); + hwp = (moo_liw_t*)moo_allocmem(moo, outlen * MOO_SIZEOF(hw[0])); if (!hwp) return MOO_NULL; } else @@ -4392,7 +4376,7 @@ moo_oop_t moo_eqints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return is_equal(moo, x, y)? moo->_true: moo->_false; } @@ -4413,7 +4397,7 @@ moo_oop_t moo_neints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return !is_equal(moo, x, y)? moo->_true: moo->_false; } @@ -4430,17 +4414,17 @@ moo_oop_t moo_gtints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; return (MOO_POINTER_IS_NBIGINT(moo, y))? moo->_true: moo->_false; } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; return (MOO_POINTER_IS_PBIGINT(moo, x))? moo->_true: moo->_false; } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return is_greater(moo, x, y)? moo->_true: moo->_false; } @@ -4457,17 +4441,17 @@ moo_oop_t moo_geints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; return (MOO_POINTER_IS_NBIGINT(moo, y))? moo->_true: moo->_false; } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; return (MOO_POINTER_IS_PBIGINT(moo, x))? moo->_true: moo->_false; } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return (is_greater(moo, x, y) || is_equal(moo, x, y))? moo->_true: moo->_false; } @@ -4484,17 +4468,17 @@ moo_oop_t moo_ltints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; return (MOO_POINTER_IS_PBIGINT(moo, y))? moo->_true: moo->_false; } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; return (MOO_POINTER_IS_NBIGINT(moo, x))? moo->_true: moo->_false; } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return is_less(moo, x, y)? moo->_true: moo->_false; } @@ -4511,17 +4495,17 @@ moo_oop_t moo_leints (moo_t* moo, moo_oop_t x, moo_oop_t y) } else if (MOO_OOP_IS_SMOOI(x)) { - if (!is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, y)) goto oops_einval; return (MOO_POINTER_IS_PBIGINT(moo, y))? moo->_true: moo->_false; } else if (MOO_OOP_IS_SMOOI(y)) { - if (!is_bigint(moo, x)) goto oops_einval; + if (!moo_isbigint(moo, x)) goto oops_einval; return (MOO_POINTER_IS_NBIGINT(moo, x))? moo->_true: moo->_false; } else { - if (!is_bigint(moo, x) || !is_bigint(moo, y)) goto oops_einval; + if (!moo_isbigint(moo, x) || !moo_isbigint(moo, y)) goto oops_einval; return (is_less(moo, x, y) || is_equal(moo, x, y))? moo->_true: moo->_false; } diff --git a/moo/lib/moo-prv.h b/moo/lib/moo-prv.h index 7f1f3b3..50be4ce 100644 --- a/moo/lib/moo-prv.h +++ b/moo/lib/moo-prv.h @@ -1223,10 +1223,21 @@ void moo_deregallfinalizables (moo_t* moo); /* ========================================================================= */ /* bigint.c */ /* ========================================================================= */ -int moo_isint ( - moo_t* moo, - moo_oop_t x -); +static MOO_INLINE int moo_isbigint (moo_t* moo, moo_oop_t x) +{ + if (!MOO_OOP_IS_POINTER(x)) return 0; + +/* TODO: is it better to introduce a special integer mark into the class itself */ +/* TODO: or should it check if it's a subclass, subsubclass, subsubsubclass, etc of a large_integer as well? */ + return MOO_POINTER_IS_BIGINT(moo, x); +} + +static MOO_INLINE int moo_isint (moo_t* moo, moo_oop_t x) +{ + if (MOO_OOP_IS_SMOOI(x)) return 1; + if (MOO_OOP_IS_POINTER(x)) return MOO_POINTER_IS_BIGINT(moo, x); /* is_bigint? */ + return 0; +} moo_oop_t moo_addints ( moo_t* moo, diff --git a/moo/lib/moo.c b/moo/lib/moo.c index 9208b7a..cd67e99 100644 --- a/moo/lib/moo.c +++ b/moo/lib/moo.c @@ -477,7 +477,7 @@ void moo_freemem (moo_t* moo, void* ptr) static struct { - moo_bch_t* modname; + const moo_bch_t* modname; int (*modload) (moo_t* moo, moo_mod_t* mod); } static_modtab[] = diff --git a/moo/lib/moo.h b/moo/lib/moo.h index 802cf03..48d9c49 100644 --- a/moo/lib/moo.h +++ b/moo/lib/moo.h @@ -159,10 +159,10 @@ typedef struct moo_obj_word_t* moo_oop_word_t; * BIGINT TYPES AND MACROS * ========================================================================= */ #if defined(MOO_ENABLE_FULL_LIW) && (MOO_SIZEOF_UINTMAX_T > MOO_SIZEOF_OOW_T) -# define MOO_LIW_IS_OOW +# define MOO_USE_OOW_FOR_LIW #endif -#if defined(MOO_LIW_IS_OOW) +#if defined(MOO_USE_OOW_FOR_LIW) typedef moo_oow_t moo_liw_t; /* large integer word */ typedef moo_ooi_t moo_lii_t; typedef moo_uintmax_t moo_lidw_t; /* large integer double word */