Skip to content

Commit db8368f

Browse files
committed
numeric.c: remove bit operations methods from Float class; #6197
mruby used to use float numbers for overflown integers before we implemented big integers. Now we don't need bit operations for float numbers anymore. Also removed tests for shift operations for float numbers.
1 parent 39e3db2 commit db8368f

2 files changed

Lines changed: 0 additions & 168 deletions

File tree

‎src/numeric.c‎

Lines changed: 0 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

‎test/t/float.rb‎

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -239,28 +239,6 @@ def check_floats(exp, act)
239239
assert_not_predicate(-1.0/0.0, :nan?)
240240
end
241241

242-
assert('Float#<<') do
243-
# Left Shift by one
244-
assert_equal 46, 23.0 << 1
245-
246-
# Left Shift by a negative is Right Shift
247-
assert_equal 23, 46.0 << -1
248-
end
249-
250-
assert('Float#>>') do
251-
# Right Shift by one
252-
assert_equal 23, 46.0 >> 1
253-
254-
# Right Shift by a negative is Left Shift
255-
assert_equal 46, 23.0 >> -1
256-
257-
# Don't raise on large Right Shift
258-
assert_equal 0, 23.0 >> 128
259-
260-
# Don't raise on large Right Shift
261-
assert_equal(-1, -23.0 >> 128)
262-
end
263-
264242
assert('Float#to_s') do
265243
uses_float = 4e38.infinite? # enable MRB_USE_FLOAT32?
266244

0 commit comments

Comments
 (0)