GitHub

@@ -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)

13721242

return 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)

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 */

Read the original on github.com ↗