@@ -612,136 +612,6 @@ flo_eq(mrb_state *mrb, mrb_value x)
612612 }
613613}
614614
615- 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)
13721242 return mrb_int_value (mrb , ~val );
13731243}
13741244
1375- #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
13881248
13891249/* 15.2.8.3.9 */
13901250/*
@@ -2287,12 +2147,6 @@ mrb_init_numeric(mrb_state *mrb)
22872147 mrb_define_method_id (mrb , fl , MRB_OPSYM (gt ), num_gt , MRB_ARGS_REQ (1 ));
22882148 mrb_define_method_id (mrb , fl , MRB_OPSYM (ge ), num_ge , MRB_ARGS_REQ (1 ));
22892149 mrb_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 ));
22962150 mrb_define_method_id (mrb , fl , MRB_SYM (ceil ), flo_ceil , MRB_ARGS_OPT (1 )); /* 15.2.9.3.8 */
22972151 mrb_define_method_id (mrb , fl , MRB_SYM_Q (finite ), flo_finite_p , MRB_ARGS_NONE ()); /* 15.2.9.3.9 */
22982152 mrb_define_method_id (mrb , fl , MRB_SYM (floor ), flo_floor , MRB_ARGS_OPT (1 )); /* 15.2.9.3.10 */
0 commit comments