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: 73bbd147ed94
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e68ebae8f498
Choose a head ref
  • 4 commits
  • 6 files changed
  • 1 contributor

Commits on Apr 7, 2015

  1. Copy the full SHA
    5b8b933 View commit details
  2. Copy the full SHA
    275b940 View commit details
  3. Copy the full SHA
    ae1150f View commit details
  4. Copy the full SHA
    e68ebae View commit details
Original file line number Diff line number Diff line change
@@ -237,17 +237,12 @@ public Object mod(RubyBignum a, RubyBignum b) {
@CoreMethod(names = "<", required = 1)
public abstract static class LessNode extends CoreMethodNode {

@Child private CallDispatchHeadNode rationalConvertNode;
@Child private CallDispatchHeadNode rationalLessNode;

public LessNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LessNode(LessNode prev) {
super(prev);
rationalConvertNode = prev.rationalConvertNode;
rationalLessNode = prev.rationalLessNode;
}

@Specialization
@@ -270,18 +265,11 @@ public boolean less(RubyBignum a, RubyBignum b) {
return a.bigIntegerValue().compareTo(b.bigIntegerValue()) < 0;
}

@Specialization(guards = "isRational(arguments[1])")
public Object pow(VirtualFrame frame, Object a, RubyBasicObject b) {
if (rationalConvertNode == null) {
CompilerDirectives.transferToInterpreter();
rationalConvertNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext(), true));
rationalLessNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

final Object aRational = rationalConvertNode.call(frame, getContext().getCoreLibrary().getRationalClass(), "convert", null, a, 1);

return rationalLessNode.call(frame, aRational, "<", null, b);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object lessCoerced(VirtualFrame frame, RubyBignum a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :<, b", "b", b);
}

}

@CoreMethod(names = "<=", required = 1)
128 changes: 30 additions & 98 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/FixnumNodes.java
Original file line number Diff line number Diff line change
@@ -86,8 +86,6 @@ public Object negWithOverflow(long value) {
@CoreMethod(names = "+", required = 1)
public abstract static class AddNode extends BignumNodes.BignumCoreMethodNode {

@Child private CallDispatchHeadNode rationalAdd;

public AddNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}
@@ -126,19 +124,9 @@ public Object add(int a, RubyBignum b) {
return fixnumOrBignum(BigInteger.valueOf(a).add(b.bigIntegerValue()));
}

@Specialization(guards = "isRational(arguments[1])")
public Object add(VirtualFrame frame, int a, RubyBasicObject b) {
if (rationalAdd == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
rationalAdd = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

return rationalAdd.call(frame, b, "+", null, a);
}

@Specialization(guards = "isComplex(arguments[1])")
public Object addComplex(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "b + a", "b", b, "a", a);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object addCoerced(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :+, b", "b", b);
}

@Specialization(rewriteOn = ArithmeticException.class)
@@ -171,38 +159,22 @@ public Object add(long a, RubyBignum b) {
return fixnumOrBignum(BigInteger.valueOf(a).add(b.bigIntegerValue()));
}

@Specialization(guards = "isRational(arguments[1])")
public Object add(VirtualFrame frame, long a, RubyBasicObject b) {
if (rationalAdd == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();

rationalAdd = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

return rationalAdd.call(frame, b, "+", null, a);
}

@Specialization(guards = "isComplex(arguments[1])")
public Object addComplex(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "b + a", "b", b, "a", a);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object addCoerced(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :+, b", "b", b);
}

}

@CoreMethod(names = "-", required = 1)
public abstract static class SubNode extends BignumNodes.BignumCoreMethodNode {

@Child private CallDispatchHeadNode rationalConvertNode;
@Child private CallDispatchHeadNode rationalSubNode;

public SubNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public SubNode(SubNode prev) {
super(prev);
rationalConvertNode = prev.rationalConvertNode;
rationalSubNode = prev.rationalSubNode;
}

@Specialization(rewriteOn = ArithmeticException.class)
@@ -235,30 +207,9 @@ public double sub(int a, double b) {
return a - b;
}

@Specialization(guards = "isRational(arguments[1])")
public Object sub(VirtualFrame frame, int a, RubyBasicObject b) {
if (rationalConvertNode == null) {
CompilerDirectives.transferToInterpreter();
rationalConvertNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext(), true));
rationalSubNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

final Object aRational = rationalConvertNode.call(frame, getContext().getCoreLibrary().getRationalClass(), "convert", null, a, 1);

return rationalSubNode.call(frame, aRational, "-", null, b);
}

@Specialization(guards = "isRational(arguments[1])")
public Object sub(VirtualFrame frame, long a, RubyBasicObject b) {
if (rationalConvertNode == null) {
CompilerDirectives.transferToInterpreter();
rationalConvertNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext(), true));
rationalSubNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

final Object aRational = rationalConvertNode.call(frame, getContext().getCoreLibrary().getRationalClass(), "convert", null, a, 1);

return rationalSubNode.call(frame, aRational, "-", null, b);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object subCoerced(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :-, b", "b", b);
}

@Specialization(rewriteOn = ArithmeticException.class)
@@ -291,20 +242,22 @@ public Object sub(long a, RubyBignum b) {
return fixnumOrBignum(BigInteger.valueOf(a).subtract(b.bigIntegerValue()));
}

@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object subCoerced(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :-, b", "b", b);
}

}

@CoreMethod(names = "*", required = 1)
public abstract static class MulNode extends BignumNodes.BignumCoreMethodNode {

@Child private CallDispatchHeadNode rationalMulNode;

public MulNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public MulNode(MulNode prev) {
super(prev);
rationalMulNode = prev.rationalMulNode;
}

@Specialization(rewriteOn = ArithmeticException.class)
@@ -339,6 +292,11 @@ public Object mul(int a, RubyBignum b) {
return fixnumOrBignum(BigInteger.valueOf(a).multiply(b.bigIntegerValue()));
}

@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object mulCoerced(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :*, b", "b", b);
}

@Specialization(rewriteOn = ArithmeticException.class)
public long mul(long a, int b) {
return ExactMath.multiplyExact(a, b);
@@ -372,39 +330,15 @@ public Object mul(long a, RubyBignum b) {
return fixnumOrBignum(BigInteger.valueOf(a).multiply(b.bigIntegerValue()));
}

@Specialization(guards = "isRational(arguments[1])")
public Object mul(VirtualFrame frame, int a, RubyBasicObject b) {
return mulRational(frame, (long) a, b);
}

@Specialization(guards = "isRational(arguments[1])")
public Object mulRational(VirtualFrame frame, long a, RubyBasicObject b) {
if (rationalMulNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
rationalMulNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

return rationalMulNode.call(frame, b, "*", null, a);
}

@Specialization(guards = "isComplex(arguments[1])")
public Object mulComplex(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "b * a", "b", b, "a", a);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object mulCoerced(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :*, b", "b", b);
}

@Specialization(guards = "isComplex(arguments[1])")
public Object mulComplex(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "b * a", "b", b, "a", a);
}

}

@CoreMethod(names = {"/", "__slash__"}, required = 1)
public abstract static class DivNode extends CoreMethodNode {

@Child private CallDispatchHeadNode rationalConvertNode;
@Child private CallDispatchHeadNode rationalDivNode;

private final BranchProfile bGreaterZero = BranchProfile.create();
private final BranchProfile bGreaterZeroAGreaterEqualZero = BranchProfile.create();
private final BranchProfile bGreaterZeroALessZero = BranchProfile.create();
@@ -420,8 +354,6 @@ public DivNode(RubyContext context, SourceSection sourceSection) {

public DivNode(DivNode prev) {
super(prev);
rationalConvertNode = prev.rationalConvertNode;
rationalDivNode = prev.rationalDivNode;
}

@Specialization(rewriteOn = UnexpectedResultException.class)
@@ -503,6 +435,11 @@ public int div(@SuppressWarnings("unused") int a, @SuppressWarnings("unused") Ru
return 0;
}

@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object divCoerced(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :/, b", "b", b);
}

@Specialization(rewriteOn = UnexpectedResultException.class)
public long div(long a, int b) throws UnexpectedResultException {
return div(a, (long) b);
@@ -582,14 +519,9 @@ public int div(@SuppressWarnings("unused") long a, @SuppressWarnings("unused") R
return 0;
}

@Specialization(guards = {"!isRubyBignum(arguments[1])"})
public Object divFallback(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :/, o", "o", b);
}

@Specialization(guards = {"!isRubyBignum(arguments[1])"})
public Object divFallback(VirtualFrame frame, int a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :/, o", "o", b);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object divCoerced(VirtualFrame frame, long a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :/, b", "b", b);
}

}
33 changes: 6 additions & 27 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/FloatNodes.java
Original file line number Diff line number Diff line change
@@ -115,17 +115,12 @@ public double sub(double a, RubyBignum b) {
@CoreMethod(names = "*", required = 1)
public abstract static class MulNode extends CoreMethodNode {

@Child private CallDispatchHeadNode rationalConvertNode;
@Child private CallDispatchHeadNode rationalPowNode;

public MulNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public MulNode(MulNode prev) {
super(prev);
rationalConvertNode = prev.rationalConvertNode;
rationalPowNode = prev.rationalPowNode;
}

@Specialization
@@ -148,17 +143,9 @@ public double mul(double a, RubyBignum b) {
return a * b.bigIntegerValue().doubleValue();
}

@Specialization(guards = "isRational(arguments[1])")
public Object mul(VirtualFrame frame, double a, RubyBasicObject b) {
if (rationalConvertNode == null) {
CompilerDirectives.transferToInterpreter();
rationalConvertNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext(), true));
rationalPowNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext()));
}

final Object aRational = rationalConvertNode.call(frame, getContext().getCoreLibrary().getRationalClass(), "convert", null, a, 1);

return rationalPowNode.call(frame, aRational, "*", null, b);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object mulCoerced(VirtualFrame frame, double a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :*, b", "b", b);
}

}
@@ -169,8 +156,6 @@ public abstract static class PowNode extends CoreMethodNode {
@Child private CallDispatchHeadNode complexConvertNode;
@Child private CallDispatchHeadNode complexPowNode;

@Child private CallDispatchHeadNode rationalPowNode;

private final ConditionProfile complexProfile = ConditionProfile.createBinaryProfile();

public PowNode(RubyContext context, SourceSection sourceSection) {
@@ -179,7 +164,6 @@ public PowNode(RubyContext context, SourceSection sourceSection) {

public PowNode(PowNode prev) {
super(prev);
rationalPowNode = prev.rationalPowNode;
}

@Specialization
@@ -214,14 +198,9 @@ public double pow(double a, RubyBignum b) {
return Math.pow(a, b.bigIntegerValue().doubleValue());
}

@Specialization(guards = "isRational(arguments[1])")
public Object pow(VirtualFrame frame, double a, RubyBasicObject b) {
if (rationalPowNode == null) {
CompilerDirectives.transferToInterpreter();
rationalPowNode = insert(DispatchHeadNodeFactory.createMethodCall(getContext(), true));
}

return rationalPowNode.call(frame, a, "pow_rational", null, b);
@Specialization(guards = "!isRubyBignum(arguments[1])")
public Object powCoerced(VirtualFrame frame, double a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :**, b", "b", b);
}

}
Original file line number Diff line number Diff line change
@@ -37,8 +37,9 @@ public InternalGMTNode(InternalGMTNode prev) {

@Specialization
public boolean internalGMT(RubyTime time) {
// TODO CS 15-Feb-15 we've ended up with both null and nil here - should simplify
return (time.getOffset() == null || time.getOffset() == nil()) && (time.getDateTime().getZone().equals(DateTimeZone.UTC) || time.getDateTime().getZone().getOffset(time.getDateTime().getMillis()) == 0);
return time.getOffset() == nil() &&
(time.getDateTime().getZone().equals(DateTimeZone.UTC) ||
time.getDateTime().getZone().getOffset(time.getDateTime().getMillis()) == 0);
}
}

@@ -74,13 +75,7 @@ public InternalOffsetNode(InternalOffsetNode prev) {

@Specialization
public Object internalOffset(RubyTime time) {
final Object offset = time.getOffset();

if (offset == null) {
return nil();
} else {
return offset;
}
return time.getOffset();
}
}

Loading