@@ -612,136 +612,6 @@ flo_eq(mrb_state *mrb, mrb_value x)
612612 }
613613}
614614615-static int64_t
616-value_int64(mrb_state *mrb, mrb_value x)
617-{
618-switch (mrb_type(x)) {
619-case MRB_TT_INTEGER:
620-return (int64_t)mrb_integer(x);
621-case MRB_TT_FLOAT:
622- {
623-double f = mrb_float(x);
624-625-if ((mrb_float)INT64_MAX >= f && f >= (mrb_float)INT64_MIN)
626-return (int64_t)f;
627- }
628-default:
629-mrb_raise(mrb, E_TYPE_ERROR, "cannot convert to Integer");
630-break;
631- }
632-/* not reached */
633-return 0;
634-}
635-636-static mrb_value
637-int64_value(mrb_state *mrb, int64_t v)
638-{
639-if (!TYPED_FIXABLE(v,int64_t)) {
640-mrb_int_overflow(mrb, "bit operation");
641- }
642-return mrb_fixnum_value((mrb_int)v);
643-}
644-645-static mrb_value
646-flo_rev(mrb_state *mrb, mrb_value x)
647-{
648-int64_t v1 = value_int64(mrb, x);
649-return int64_value(mrb, ~v1);
650-}
651-652-static mrb_value
653-flo_and(mrb_state *mrb, mrb_value x)
654-{
655-mrb_value y = mrb_get_arg1(mrb);
656-int64_t v1, v2;
657-658-v1 = value_int64(mrb, x);
659-v2 = value_int64(mrb, y);
660-return int64_value(mrb, v1 & v2);
661-}
662-663-static mrb_value
664-flo_or(mrb_state *mrb, mrb_value x)
665-{
666-mrb_value y = mrb_get_arg1(mrb);
667-int64_t v1, v2;
668-669-v1 = value_int64(mrb, x);
670-v2 = value_int64(mrb, y);
671-return int64_value(mrb, v1 | v2);
672-}
673-674-static mrb_value
675-flo_xor(mrb_state *mrb, mrb_value x)
676-{
677-mrb_value y = mrb_get_arg1(mrb);
678-int64_t v1, v2;
679-680-v1 = value_int64(mrb, x);
681-v2 = value_int64(mrb, y);
682-return int64_value(mrb, v1 ^ v2);
683-}
684-685-static mrb_value
686-flo_shift(mrb_state *mrb, mrb_value x, mrb_int width)
687-{
688-mrb_float val;
689-690-if (width == 0) {
691-return x;
692- }
693-val = mrb_float(x);
694-if (width < -MRB_INT_BIT/2) {
695-if (val < 0) return mrb_fixnum_value(-1);
696-return mrb_fixnum_value(0);
697- }
698-if (width < 0) {
699-while (width++) {
700-val /= 2;
701-if (val < 1.0) {
702-val = 0;
703-break;
704- }
705- }
706-#if defined(_ISOC99_SOURCE)
707-val = trunc(val);
708-#else
709-if (val > 0){
710-val = floor(val);
711- }
712-else {
713-val = ceil(val);
714- }
715-#endif
716-if (val == 0 && mrb_float(x) < 0) {
717-return mrb_fixnum_value(-1);
718- }
719- }
720-else {
721-while (width--) {
722-val *= 2;
723- }
724- }
725-if (FIXABLE_FLOAT(val))
726-return mrb_int_value(mrb, (mrb_int)val);
727-return mrb_float_value(mrb, val);
728-}
729-730-static mrb_value
731-flo_rshift(mrb_state *mrb, mrb_value x)
732-{
733-mrb_int width = mrb_as_int(mrb, mrb_get_arg1(mrb));
734-if (width == MRB_INT_MIN) return flo_shift(mrb, x, -MRB_INT_BIT);
735-return flo_shift(mrb, x, -width);
736-}
737-738-static mrb_value
739-flo_lshift(mrb_state *mrb, mrb_value x)
740-{
741-mrb_int width = mrb_as_int(mrb, mrb_get_arg1(mrb));
742-return flo_shift(mrb, x, width);
743-}
744-745615/* 15.2.9.3.13 */
746616/*
747617 * Document-method: Float#to_f
@@ -1372,19 +1242,9 @@ int_rev(mrb_state *mrb, mrb_value num)
13721242return mrb_int_value(mrb, ~val);
13731243}
137412441375-#ifdef MRB_NO_FLOAT
13761245#define bit_op(x,y,op1,op2) do {\
13771246 return mrb_int_value(mrb, (mrb_integer(x) op2 mrb_integer(y)));\
13781247} while(0)
1379-#else
1380-static mrb_value flo_and(mrb_state *mrb, mrb_value x);
1381-static mrb_value flo_or(mrb_state *mrb, mrb_value x);
1382-static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
1383-#define bit_op(x,y,op1,op2) do {\
1384- if (mrb_integer_p(y)) return mrb_int_value(mrb, (mrb_integer(x) op2 mrb_integer(y))); \
1385- return flo_ ## op1(mrb, mrb_float_value(mrb, (mrb_float)mrb_integer(x)));\
1386-} while(0)
1387-#endif
1388124813891249/* 15.2.8.3.9 */
13901250/*
@@ -2287,12 +2147,6 @@ mrb_init_numeric(mrb_state *mrb)
22872147mrb_define_method_id(mrb, fl, MRB_OPSYM(gt), num_gt, MRB_ARGS_REQ(1));
22882148mrb_define_method_id(mrb, fl, MRB_OPSYM(ge), num_ge, MRB_ARGS_REQ(1));
22892149mrb_define_method_id(mrb, fl, MRB_OPSYM(eq), flo_eq, MRB_ARGS_REQ(1)); /* 15.2.9.3.2 */
2290-mrb_define_method_id(mrb, fl, MRB_OPSYM(neg), flo_rev, MRB_ARGS_NONE());
2291-mrb_define_method_id(mrb, fl, MRB_OPSYM(and), flo_and, MRB_ARGS_REQ(1));
2292-mrb_define_method_id(mrb, fl, MRB_OPSYM(or), flo_or, MRB_ARGS_REQ(1));
2293-mrb_define_method_id(mrb, fl, MRB_OPSYM(xor), flo_xor, MRB_ARGS_REQ(1));
2294-mrb_define_method_id(mrb, fl, MRB_OPSYM(rshift), flo_rshift, MRB_ARGS_REQ(1));
2295-mrb_define_method_id(mrb, fl, MRB_OPSYM(lshift), flo_lshift, MRB_ARGS_REQ(1));
22962150mrb_define_method_id(mrb, fl, MRB_SYM(ceil), flo_ceil, MRB_ARGS_OPT(1)); /* 15.2.9.3.8 */
22972151mrb_define_method_id(mrb, fl, MRB_SYM_Q(finite), flo_finite_p, MRB_ARGS_NONE()); /* 15.2.9.3.9 */
22982152mrb_define_method_id(mrb, fl, MRB_SYM(floor), flo_floor, MRB_ARGS_OPT(1)); /* 15.2.9.3.10 */