Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 121a98384d1f
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: f2a80a8082b0
Choose a head ref
  • 1 commit
  • 6 files changed
  • 1 contributor

Commits on May 10, 2015

  1. Copy the full SHA
    f2a80a8 View commit details
Original file line number Diff line number Diff line change
@@ -48,8 +48,8 @@ public RubyArray execute(int a, long b) {
return divMod(a, b);
}

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

public RubyArray execute(int a, double b) {
@@ -64,8 +64,8 @@ public RubyArray execute(long a, long b) {
return divMod(a, b);
}

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

public RubyArray execute(long a, double b) {
Original file line number Diff line number Diff line change
@@ -58,12 +58,12 @@ public Object id2Ref(long id) {

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

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

protected boolean isLargeFixnumID(RubyBignum id) {
Original file line number Diff line number Diff line change
@@ -108,8 +108,8 @@ public Object addWithOverflow(int a, long b) {
return fixnumOrBignum(BigInteger.valueOf(a).add(BigInteger.valueOf(b)));
}

@Specialization
public Object add(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object add(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).add(BignumNodes.getBigIntegerValue(b)));
}

@@ -143,8 +143,8 @@ public double add(long a, double b) {
return a + b;
}

@Specialization
public Object add(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object add(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).add(BignumNodes.getBigIntegerValue(b)));
}

@@ -182,8 +182,8 @@ public Object subWithOverflow(int a, long b) {
return fixnumOrBignum(BigInteger.valueOf(a).subtract(BigInteger.valueOf(b)));
}

@Specialization
public Object sub(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object sub(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).subtract(BignumNodes.getBigIntegerValue(b)));
}

@@ -222,8 +222,8 @@ public double sub(long a, double b) {
return a - b;
}

@Specialization
public Object sub(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object sub(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).subtract(BignumNodes.getBigIntegerValue(b)));
}

@@ -268,8 +268,8 @@ public double mul(int a, double b) {
}

@TruffleBoundary
@Specialization
public Object mul(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object mul(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).multiply(BignumNodes.getBigIntegerValue(b)));
}

@@ -306,8 +306,8 @@ public double mul(long a, double b) {
}

@TruffleBoundary
@Specialization
public Object mul(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object mul(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).multiply(BignumNodes.getBigIntegerValue(b)));
}

@@ -406,8 +406,8 @@ public double div(int a, double b) {
return a / b;
}

@Specialization
public int div(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int div(int a, RubyBasicObject b) {
return 0;
}

@@ -489,8 +489,8 @@ public double div(long a, double b) {
return a / b;
}

@Specialization
public int div(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int div(long a, RubyBasicObject b) {
// TODO(CS): not entirely sure this is correct
return 0;
}
@@ -566,13 +566,13 @@ public long mod(long a, long b) {
return mod;
}

@Specialization
public Object mod(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object mod(int a, RubyBasicObject b) {
return mod((long) a, b);
}

@Specialization
public Object mod(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object mod(long a, RubyBasicObject b) {
CompilerDirectives.transferToInterpreter();

// TODO(CS): why are we getting this case?
@@ -609,9 +609,9 @@ public RubyArray divMod(int a, long b) {
return divModNode.execute(a, b);
}

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

@Specialization
@@ -629,9 +629,9 @@ public RubyArray divMod(long a, long b) {
return divModNode.execute(a, b);
}

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

@Specialization
@@ -663,8 +663,8 @@ public boolean less(int a, double b) {
return a < b;
}

@Specialization
public boolean less(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean less(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) < 0;
}

@@ -683,8 +683,8 @@ public boolean less(long a, double b) {
return a < b;
}

@Specialization
public boolean less(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean less(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) < 0;
}

@@ -722,8 +722,8 @@ public boolean lessEqual(int a, double b) {
return a <= b;
}

@Specialization
public boolean lessEqual(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean lessEqual(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) <= 0;
}

@@ -742,8 +742,8 @@ public boolean lessEqual(long a, double b) {
return a <= b;
}

@Specialization
public boolean lessEqual(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean lessEqual(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) <= 0;
}
}
@@ -773,8 +773,8 @@ public boolean equal(int a, double b) {
return a == b;
}

@Specialization
public boolean equal(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean equal(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).equals(BignumNodes.getBigIntegerValue(b));
}

@@ -793,8 +793,8 @@ public boolean equal(long a, double b) {
return a == b;
}

@Specialization
public boolean equal(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean equal(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).equals(BignumNodes.getBigIntegerValue(b));
}

@@ -831,8 +831,8 @@ public int compare(int a, double b) {
return Double.compare(a, b);
}

@Specialization
public int compare(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int compare(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b));
}

@@ -851,8 +851,8 @@ public int compare(long a, double b) {
return Double.compare(a, b);
}

@Specialization
public int compare(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int compare(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b));
}

@@ -889,8 +889,8 @@ public boolean greaterEqual(int a, double b) {
return a >= b;
}

@Specialization
public boolean greaterEqual(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean greaterEqual(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) >= 0;
}

@@ -909,8 +909,8 @@ public boolean greaterEqual(long a, double b) {
return a >= b;
}

@Specialization
public boolean greaterEqual(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean greaterEqual(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) >= 0;
}
}
@@ -937,8 +937,8 @@ public boolean greater(int a, double b) {
return a > b;
}

@Specialization
public boolean greater(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean greater(int a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)
) > 0;
}
@@ -958,8 +958,8 @@ public boolean greater(long a, double b) {
return a > b;
}

@Specialization
public boolean greater(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public boolean greater(long a, RubyBasicObject b) {
return BigInteger.valueOf(a).compareTo(BignumNodes.getBigIntegerValue(b)) > 0;
}

@@ -1001,8 +1001,8 @@ public long bitAnd(int a, long b) {
return a & b;
}

@Specialization
public Object bitAnd(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitAnd(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).and(BignumNodes.getBigIntegerValue(b)));
}

@@ -1016,8 +1016,8 @@ public long bitAnd(long a, long b) {
return a & b;
}

@Specialization
public Object bitAnd(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitAnd(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).and(BignumNodes.getBigIntegerValue(b)));
}
}
@@ -1039,8 +1039,8 @@ public long bitOr(int a, long b) {
return a | b;
}

@Specialization
public Object bitOr(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitOr(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).or(BignumNodes.getBigIntegerValue(b)));
}

@@ -1054,8 +1054,8 @@ public long bitOr(long a, long b) {
return a | b;
}

@Specialization
public Object bitOr(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitOr(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).or(BignumNodes.getBigIntegerValue(b)));
}
}
@@ -1077,8 +1077,8 @@ public long bitXOr(int a, long b) {
return a ^ b;
}

@Specialization
public Object bitXOr(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitXOr(int a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).xor(BignumNodes.getBigIntegerValue(b)));
}

@@ -1092,8 +1092,8 @@ public long bitXOr(long a, long b) {
return a ^ b;
}

@Specialization
public Object bitXOr(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object bitXOr(long a, RubyBasicObject b) {
return fixnumOrBignum(BigInteger.valueOf(a).xor(BignumNodes.getBigIntegerValue(b)));
}

@@ -1291,13 +1291,13 @@ public Object rightShift(VirtualFrame frame, long a, int b) {
}
}

@Specialization
public int rightShift(int a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int rightShift(int a, RubyBasicObject b) {
return 0;
}

@Specialization
public int rightShift(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public int rightShift(long a, RubyBasicObject b) {
return 0;
}

Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@
import com.oracle.truffle.api.utilities.ConditionProfile;
import org.jruby.truffle.nodes.core.BignumNodes;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBignum;

/**
@@ -32,12 +33,12 @@ public BignumPowPrimitiveNode(RubyContext context, SourceSection sourceSection)
}

@Specialization
public RubyBignum pow(RubyBignum a, int b) {
public RubyBignum pow(RubyBasicObject a, int b) {
return pow(a, (long) b);
}

@Specialization
public RubyBignum pow(RubyBignum a, long b) {
public RubyBignum pow(RubyBasicObject a, long b) {
if (negativeProfile.profile(b < 0)) {
return null; // Primitive failure
} else {
@@ -48,12 +49,12 @@ public RubyBignum pow(RubyBignum a, long b) {

@CompilerDirectives.TruffleBoundary
@Specialization
public double pow(RubyBignum a, double b) {
public double pow(RubyBasicObject a, double b) {
return Math.pow(BignumNodes.getBigIntegerValue(a).doubleValue(), b);
}

@Specialization
public RubyBignum pow(RubyBignum a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public RubyBignum pow(RubyBasicObject a, RubyBasicObject b) {
throw new UnsupportedOperationException();
}

Original file line number Diff line number Diff line change
@@ -94,9 +94,9 @@ public Object pow(int a, double b) {
return pow((long) a, b);
}

@Specialization
public Object pow(int a, RubyBignum b) {
return pow((long) a, b);
@Specialization(guards = "isRubyBignum(b)")
public Object powBignum(int a, RubyBasicObject b) {
return powBignum((long) a, b);
}

@Specialization(guards = "canShiftIntoLong(a, b)")
@@ -140,8 +140,8 @@ public Object pow(long a, double b) {
}

@CompilerDirectives.TruffleBoundary
@Specialization
public Object pow(long a, RubyBignum b) {
@Specialization(guards = "isRubyBignum(b)")
public Object powBignum(long a, RubyBasicObject b) {
if (a == 0) {
return 0;
}
Original file line number Diff line number Diff line change
@@ -91,18 +91,10 @@ public static boolean isLargeFixnumID(BigInteger id) {
return !id.and(LARGE_FIXNUM_FLAG).equals(BigInteger.ZERO);
}

public static long toFixnum(RubyBignum id) {
return BignumNodes.getBigIntegerValue(id).longValue();
}

public static boolean isFloatID(BigInteger id) {
return !id.and(FLOAT_FLAG).equals(BigInteger.ZERO);
}

public static double toFloat(RubyBignum id) {
return Double.longBitsToDouble(BignumNodes.getBigIntegerValue(id).longValue());
}

private static BigInteger unsignedBigInteger(long value) {
BigInteger big = BigInteger.valueOf(value);
if (value < 0) {