Skip to content

Commit

Permalink
Showing 5 changed files with 71 additions and 4 deletions.
38 changes: 38 additions & 0 deletions core/src/main/java/org/jruby/RubyBignum.java
Original file line number Diff line number Diff line change
@@ -1028,6 +1028,44 @@ public static RubyNumeric unmarshalFrom(UnmarshalStream input) throws IOExceptio
return result;
}

// MRI: rb_big_fdiv_double
@Override
public IRubyObject fdivDouble(ThreadContext context, IRubyObject y) {
double dx, dy;

dx = getDoubleValue();
if (y instanceof RubyFixnum) {
dy = (double)fix2long(y);
if (Double.isInfinite(dx))
return fdivInt(context, RubyBignum.newBignum(context.runtime, fix2long(y)));
} else if (y instanceof RubyBignum) {
dy = RubyBignum.big2dbl((RubyBignum) y);
if (Double.isInfinite(dx) || Double.isInfinite(dy))
return fdivInt(context, (RubyBignum) y);
} else if (y instanceof RubyFloat) {
dy = ((RubyFloat) y).getDoubleValue();
if (Double.isNaN(dy)) {
return context.runtime.newFloat(dy);
}
if (Double.isInfinite(dx)) {
return fdivFloat(context, (RubyFloat) y);
}
} else {
return coerceBin(context, sites(context).fdiv, y);
}
return context.runtime.newFloat(dx / dy);
}

// MRI: big_fdiv_int and big_fdiv
public IRubyObject fdivInt(ThreadContext context, RubyBignum y) {
return context.runtime.newFloat(new BigDecimal(value).divide(new BigDecimal(y.getValue())).doubleValue());
}

// MRI: big_fdiv_float
public IRubyObject fdivFloat(ThreadContext context, RubyFloat y) {
return context.runtime.newFloat(new BigDecimal(value).divide(new BigDecimal(y.getValue())).doubleValue());
}

private static JavaSites.BignumSites sites(ThreadContext context) {
return context.sites.Bignum;
}
14 changes: 14 additions & 0 deletions core/src/main/java/org/jruby/RubyFixnum.java
Original file line number Diff line number Diff line change
@@ -1318,6 +1318,20 @@ public RubyInteger convertToInteger(String method) {
return this;
}

// MRI: fix_fdiv_double
@Override
public IRubyObject fdivDouble(ThreadContext context, IRubyObject y) {
if (y instanceof RubyFixnum) {
return context.runtime.newFloat(((double) value) / ((double) fix2long(y)));
} else if (y instanceof RubyBignum) {
return RubyBignum.newBignum(context.runtime, value).fdivDouble(context, y);
} else if (y instanceof RubyFloat) {
return context.runtime.newFloat(((double) value) / ((RubyFloat) y).getDoubleValue());
} else {
return coerceBin(context, sites(context).fdiv, y);
}
}

private static JavaSites.FixnumSites sites(ThreadContext context) {
return context.sites.Fixnum;
}
16 changes: 16 additions & 0 deletions core/src/main/java/org/jruby/RubyInteger.java
Original file line number Diff line number Diff line change
@@ -534,6 +534,22 @@ public IRubyObject gcd(ThreadContext context, IRubyObject other) {
return f_gcd(context, this, RubyRational.intValue(context, other));
}

// MRI: rb_int_fdiv_double and rb_int_fdiv in one
@Override
public IRubyObject fdiv(ThreadContext context, IRubyObject y) {
RubyInteger x = this;
if (y instanceof RubyInteger && !((RubyInteger) y).zero_p(context).isTrue()) {
IRubyObject gcd = gcd(context, y);
if (!((RubyInteger) gcd).zero_p(context).isTrue()) {
x = (RubyInteger) op_idiv(context, gcd);
y = ((RubyInteger) y).op_idiv(context, gcd);
}
}
return x.fdivDouble(context, y);
}

public abstract IRubyObject fdivDouble(ThreadContext context, IRubyObject y);

/** rb_lcm
*
*/
5 changes: 1 addition & 4 deletions core/src/main/java/org/jruby/RubyNumeric.java
Original file line number Diff line number Diff line change
@@ -58,10 +58,7 @@

import static org.jruby.RubyEnumerator.SizeFn;
import static org.jruby.RubyEnumerator.enumeratorizeWithSize;
import static org.jruby.util.Numeric.f_abs;
import static org.jruby.util.Numeric.f_arg;
import static org.jruby.util.Numeric.f_mul;
import static org.jruby.util.Numeric.f_negative_p;
import static org.jruby.util.Numeric.*;

/**
* Base class for all numerical types in ruby.
2 changes: 2 additions & 0 deletions core/src/main/java/org/jruby/runtime/JavaSites.java
Original file line number Diff line number Diff line change
@@ -223,6 +223,7 @@ public static class FixnumSites {
public final CallSite op_exp_complex = new FunctionalCachingCallSite("**");
public final CallSite op_lt_bignum = new FunctionalCachingCallSite("<");
public final CallSite op_exp_rational = new FunctionalCachingCallSite("**");
public final CallSite fdiv = new FunctionalCachingCallSite("fdiv");
}

public static class BignumSites {
@@ -240,6 +241,7 @@ public static class BignumSites {
public final CallSite op_or = new FunctionalCachingCallSite("|");
public final CallSite op_xor = new FunctionalCachingCallSite("^");
public final CallSite op_cmp = new FunctionalCachingCallSite("<=>");
public final CallSite fdiv = new FunctionalCachingCallSite("fdiv");
}

public static class FloatSites {

0 comments on commit d6174fa

Please sign in to comment.