Skip to content

Commit

Permalink
Showing 3 changed files with 58 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;

import org.jcodings.specific.USASCIIEncoding;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
@@ -30,6 +31,7 @@
import org.jruby.truffle.core.cast.BooleanCastNode;
import org.jruby.truffle.core.cast.BooleanCastNodeGen;
import org.jruby.truffle.core.cast.ToIntNode;
import org.jruby.truffle.core.numeric.BignumNodesFactory.DivNodeFactory;
import org.jruby.truffle.language.NotProvided;
import org.jruby.truffle.language.SnippetNode;
import org.jruby.truffle.language.control.RaiseException;
@@ -136,9 +138,11 @@ public Object mul(

}

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

public abstract Object executeDiv(VirtualFrame frame, Object a, Object b);

@TruffleBoundary
@Specialization
public Object div(DynamicObject a, long b) {
@@ -173,6 +177,29 @@ public Object div(DynamicObject a, DynamicObject b) {

}

// Defined in Java as we need to statically call #/
@CoreMethod(names = "div", required = 1)
public abstract static class IDivNode extends BignumNodes.BignumCoreMethodNode {

@Child DivNode divNode = DivNodeFactory.create(null);
@Child FloatNodes.FloorNode floorNode = FloatNodesFactory.FloorNodeFactory.create(null, null, null);

@Specialization
public Object idiv(VirtualFrame frame, Object a, Object b,
@Cached("createBinaryProfile()") ConditionProfile zeroProfile) {
Object quotient = divNode.executeDiv(frame, a, b);
if (quotient instanceof Double) {
if (zeroProfile.profile((double) b == 0.0)) {
throw new RaiseException(coreExceptions().zeroDivisionError(this));
}
return floorNode.executeFloor((double) quotient);
} else {
return quotient;
}
}

}

@CoreMethod(names = {"%", "modulo"}, required = 1)
public abstract static class ModNode extends BignumCoreMethodNode {

Original file line number Diff line number Diff line change
@@ -20,6 +20,7 @@
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;

import org.jcodings.specific.USASCIIEncoding;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
@@ -29,6 +30,7 @@
import org.jruby.truffle.builtins.Primitive;
import org.jruby.truffle.builtins.PrimitiveArrayArgumentsNode;
import org.jruby.truffle.core.CoreLibrary;
import org.jruby.truffle.core.numeric.FixnumNodesFactory.DivNodeFactory;
import org.jruby.truffle.core.rope.LazyIntRope;
import org.jruby.truffle.language.NotProvided;
import org.jruby.truffle.language.SnippetNode;
@@ -237,7 +239,7 @@ public Object mulCoerced(
}
}

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

private final BranchProfile bGreaterZero = BranchProfile.create();
@@ -249,6 +251,8 @@ public abstract static class DivNode extends CoreMethodArrayArgumentsNode {
private final BranchProfile bMinusOneANotMinimum = BranchProfile.create();
private final BranchProfile finalCase = BranchProfile.create();

public abstract Object executeDiv(VirtualFrame frame, Object a, Object b);

// int

@Specialization(rewriteOn = ArithmeticException.class)
@@ -370,6 +374,29 @@ protected static boolean isLongMinValue(long a) {

}

// Defined in Java as we need to statically call #/
@CoreMethod(names = "div", required = 1)
public abstract static class IDivNode extends BignumNodes.BignumCoreMethodNode {

@Child DivNode divNode = DivNodeFactory.create(null);
@Child FloatNodes.FloorNode floorNode = FloatNodesFactory.FloorNodeFactory.create(null, null, null);

@Specialization
public Object idiv(VirtualFrame frame, Object a, Object b,
@Cached("createBinaryProfile()") ConditionProfile zeroProfile) {
Object quotient = divNode.executeDiv(frame, a, b);
if (quotient instanceof Double) {
if (zeroProfile.profile((double) b == 0.0)) {
throw new RaiseException(coreExceptions().zeroDivisionError(this));
}
return floorNode.executeFloor((double) quotient);
} else {
return quotient;
}
}

}

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

Original file line number Diff line number Diff line change
@@ -576,6 +576,8 @@ public FloorNode(RubyContext context, SourceSection sourceSection) {
fixnumOrBignum = new FixnumOrBignumNode(context, sourceSection);
}

public abstract Object executeFloor(double n);

@Specialization
public Object floor(double n) {
return fixnumOrBignum.fixnumOrBignum(Math.floor(n));

0 comments on commit 050f340

Please sign in to comment.