Skip to content

Commit

Permalink
Showing 7 changed files with 51 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -299,9 +299,9 @@ public RubyArray divMod(double a, double b) {
return divModNode.execute(a, b);
}

@Specialization
public RubyArray divMod(double a, RubyBignum b) {
return divModNode.execute(a, b);
@Specialization(guards = "isRubyBignum(b)")
public RubyArray divMod(double a, RubyBasicObject b) {
return divModNode.execute(a, BignumNodes.getBigIntegerValue(b));
}

}
Original file line number Diff line number Diff line change
@@ -92,8 +92,8 @@ public RubyArray execute(double a, long b) {
return divMod(a, b);
}

public RubyArray execute(double a, RubyBignum b) {
return divMod(a, BignumNodes.getBigIntegerValue(b).doubleValue());
public RubyArray execute(double a, BigInteger b) {
return divMod(a, b.doubleValue());
}

public RubyArray execute(double a, double b) {
Original file line number Diff line number Diff line change
@@ -20,6 +20,7 @@
import org.jruby.truffle.runtime.control.NextException;
import org.jruby.truffle.runtime.control.RedoException;
import org.jruby.truffle.runtime.core.RubyArray;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBignum;
import org.jruby.truffle.runtime.core.RubyProc;

@@ -207,8 +208,8 @@ public Object times(VirtualFrame frame, long n, RubyProc block) {
return n;
}

@Specialization
public Object times(VirtualFrame frame, RubyBignum n, RubyProc block) {
@Specialization(guards = "isRubyBignum(n)")
public Object times(VirtualFrame frame, RubyBasicObject n, RubyProc block) {
if (fixnumOrBignum == null) {
CompilerDirectives.transferToInterpreter();
fixnumOrBignum = insert(new FixnumOrBignumNode(getContext(), getSourceSection()));
@@ -250,8 +251,8 @@ public long toI(long n) {
return n;
}

@Specialization
public RubyBignum toI(RubyBignum n) {
@Specialization(guards = "isRubyBignum(n)")
public RubyBasicObject toI(RubyBasicObject n) {
return n;
}

Original file line number Diff line number Diff line change
@@ -1830,8 +1830,8 @@ public String toHexString(long value) {
return Long.toHexString(value);
}

@Specialization
public String toHexString(RubyBignum value) {
@Specialization(guards = "isRubyBignum(value)")
public String toHexString(RubyBasicObject value) {
return BignumNodes.getBigIntegerValue(value).toString(16);
}

57 changes: 29 additions & 28 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/MathNodes.java
Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@
import org.jruby.truffle.runtime.UndefinedPlaceholder;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.RubyArray;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBignum;

@CoreClass(name = "Math")
@@ -332,8 +333,8 @@ public RubyArray frexp(long a) {
return frexp((double) a);
}

@Specialization
public RubyArray frexp(RubyBignum a) {
@Specialization(guards = "isRubyBignum(a)")
public RubyArray frexp(RubyBasicObject a) {
return frexp(BignumNodes.getBigIntegerValue(a).doubleValue());
}

@@ -492,18 +493,18 @@ public double function(long a, double b) {
return function((double) a, b);
}

@Specialization
public double function(RubyBignum a, int b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, int b) {
return function(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@Specialization
public double function(RubyBignum a, long b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, long b) {
return function(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@Specialization
public double function(RubyBignum a, double b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, double b) {
return function(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@@ -572,8 +573,8 @@ public RubyArray lgamma(long a) {
return lgamma((double) a);
}

@Specialization
public RubyArray lgamma(RubyBignum a) {
@Specialization(guards = "isRubyBignum(a)")
public RubyArray lgamma(RubyBasicObject a) {
return lgamma(BignumNodes.getBigIntegerValue(a).doubleValue());
}

@@ -627,8 +628,8 @@ public double function(long a, UndefinedPlaceholder b) {
return doFunction(a);
}

@Specialization
public double function(RubyBignum a, UndefinedPlaceholder b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, UndefinedPlaceholder b) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue());
}

@@ -813,8 +814,8 @@ public double function(long a) {
return doFunction(a);
}

@Specialization
public double function(RubyBignum a) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue());
}

@@ -871,8 +872,8 @@ public double function(int a, long b) {
return doFunction(a, b);
}

@Specialization
public double function(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public double function(int a, RubyBasicObject b) {
return doFunction(a, BignumNodes.getBigIntegerValue(b).doubleValue());
}

@@ -891,8 +892,8 @@ public double function(long a, long b) {
return doFunction(a, b);
}

@Specialization
public double function(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(long a, RubyBasicObject b) {
return doFunction(a, BignumNodes.getBigIntegerValue(b).doubleValue());
}

@@ -901,23 +902,23 @@ public double function(long a, double b) {
return doFunction(a, b);
}

@Specialization
public double function(RubyBignum a, int b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, int b) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@Specialization
public double function(RubyBignum a, long b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, long b) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@Specialization
public double function(RubyBignum a, RubyBignum b) {
@Specialization(guards = {"isRubyBignum(a)", "isRubyBignum(b)"})
public double function(RubyBasicObject a, RubyBasicObject b) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue(), BignumNodes.getBigIntegerValue(b).doubleValue());
}

@Specialization
public double function(RubyBignum a, double b) {
@Specialization(guards = "isRubyBignum(a)")
public double function(RubyBasicObject a, double b) {
return doFunction(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@@ -931,8 +932,8 @@ public double function(double a, long b) {
return doFunction(a, b);
}

@Specialization
public double function(double a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public double function(double a, RubyBasicObject b) {
return doFunction(a, BignumNodes.getBigIntegerValue(b).doubleValue());
}

Original file line number Diff line number Diff line change
@@ -56,21 +56,21 @@ public Object id2Ref(long id) {
}
}

@Specialization(guards = "isLargeFixnumID(id)")
public Object id2RefLargeFixnum(RubyBignum id) {
@Specialization(guards = {"isRubyBignum(id)", "isLargeFixnumID(id)"})
public Object id2RefLargeFixnum(RubyBasicObject id) {
return BignumNodes.getBigIntegerValue(id).longValue();
}

@Specialization(guards = "isFloatID(id)")
public double id2RefFloat(RubyBignum id) {
@Specialization(guards = {"isRubyBignum(id)", "isFloatID(id)"})
public double id2RefFloat(RubyBasicObject id) {
return Double.longBitsToDouble(BignumNodes.getBigIntegerValue(id).longValue());
}

protected boolean isLargeFixnumID(RubyBignum id) {
protected boolean isLargeFixnumID(RubyBasicObject id) {
return ObjectIDOperations.isLargeFixnumID(BignumNodes.getBigIntegerValue(id));
}

protected boolean isFloatID(RubyBignum id) {
protected boolean isFloatID(RubyBasicObject id) {
return ObjectIDOperations.isFloatID(BignumNodes.getBigIntegerValue(id));
}

Original file line number Diff line number Diff line change
@@ -137,8 +137,8 @@ public RubyString multiply(RubyString string, int times) {
return ret;
}

@Specialization
public RubyString multiply(RubyString string, RubyBignum times) {
@Specialization(guards = "isRubyBignum(times)")
public RubyString multiply(RubyString string, RubyBasicObject times) {
CompilerDirectives.transferToInterpreter();

throw new RaiseException(
@@ -309,8 +309,8 @@ public RubyString concat(RubyString string, long other) {
return concatNumeric(string, (int) other);
}

@Specialization
public RubyString concat(RubyString string, RubyBignum other) {
@Specialization(guards = "isRubyBignum(other)")
public RubyString concat(RubyString string, RubyBasicObject other) {
if (BignumNodes.getBigIntegerValue(other).signum() < 0) {
CompilerDirectives.transferToInterpreter();

0 comments on commit 1314884

Please sign in to comment.