Skip to content

Commit 610c23e

Browse files
committed
Refactor float.__eq/ne/lt/le/gt/ge__
1 parent 60d1387 commit 610c23e

File tree

2 files changed

+64
-52
lines changed

2 files changed

+64
-52
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -633,12 +633,12 @@ static boolean doComplex(PComplex left, PComplex right) {
633633
static boolean doComplexInt(PComplex left, long right,
634634
@Bind("this") Node inliningTarget,
635635
@Cached InlinedConditionProfile longFitsToDoubleProfile) {
636-
return left.getImag() == 0 && FloatBuiltins.EqNode.compareDoubleToLong(inliningTarget, left.getReal(), right, longFitsToDoubleProfile) == 0;
636+
return left.getImag() == 0 && FloatBuiltins.ComparisonHelperNode.compareDoubleToLong(inliningTarget, left.getReal(), right, longFitsToDoubleProfile) == 0;
637637
}
638638

639639
@Specialization
640640
static boolean doComplexInt(PComplex left, PInt right) {
641-
return left.getImag() == 0 && FloatBuiltins.EqNode.compareDoubleToLargeInt(left.getReal(), right) == 0;
641+
return left.getImag() == 0 && FloatBuiltins.ComparisonHelperNode.compareDoubleToLargeInt(left.getReal(), right) == 0;
642642
}
643643

644644
@Specialization
@@ -706,12 +706,12 @@ static boolean doComplex(PComplex left, PComplex right) {
706706
static boolean doComplex(PComplex left, long right,
707707
@Bind("this") Node inliningTarget,
708708
@Cached InlinedConditionProfile longFitsToDoubleProfile) {
709-
return left.getImag() != 0 || FloatBuiltins.EqNode.compareDoubleToLong(inliningTarget, left.getReal(), right, longFitsToDoubleProfile) != 0;
709+
return left.getImag() != 0 || FloatBuiltins.ComparisonHelperNode.compareDoubleToLong(inliningTarget, left.getReal(), right, longFitsToDoubleProfile) != 0;
710710
}
711711

712712
@Specialization
713713
static boolean doComplex(PComplex left, PInt right) {
714-
return left.getImag() != 0 || FloatBuiltins.EqNode.compareDoubleToLargeInt(left.getReal(), right) != 0;
714+
return left.getImag() != 0 || FloatBuiltins.ComparisonHelperNode.compareDoubleToLargeInt(left.getReal(), right) != 0;
715715
}
716716

717717
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
import com.oracle.truffle.api.dsl.Cached.Shared;
120120
import com.oracle.truffle.api.dsl.Fallback;
121121
import com.oracle.truffle.api.dsl.GenerateCached;
122+
import com.oracle.truffle.api.dsl.GenerateInline;
122123
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
123124
import com.oracle.truffle.api.dsl.NodeFactory;
124125
import com.oracle.truffle.api.dsl.Specialization;
@@ -729,69 +730,68 @@ private static BigInteger toBigInteger(double d) {
729730
}
730731
}
731732

733+
@GenerateInline
732734
@GenerateCached(false)
733-
public abstract static class AbstractComparisonNode extends PythonBinaryBuiltinNode {
735+
public abstract static class ComparisonHelperNode extends Node {
734736

735-
protected abstract boolean op(double a, double b);
737+
@FunctionalInterface
738+
interface Op {
739+
boolean compute(double a, double b);
740+
}
741+
742+
abstract Object execute(Node inliningTarget, Object left, Object right, Op op);
736743

737744
@Specialization
738-
boolean doDD(double a, double b) {
739-
return op(a, b);
745+
static boolean doDD(double a, double b, Op op) {
746+
return op.compute(a, b);
740747
}
741748

742749
@Specialization
743-
boolean doDI(double a, int b) {
744-
return op(a, b);
750+
static boolean doDI(double a, int b, Op op) {
751+
return op.compute(a, b);
745752
}
746753

747754
@Specialization(guards = "check.execute(inliningTarget, bObj)", replaces = "doDD", limit = "1")
748-
@SuppressWarnings("truffle-static-method")
749-
boolean doOO(Object aObj, Object bObj,
750-
@Bind("this") Node inliningTarget,
755+
static boolean doOO(Node inliningTarget, Object aObj, Object bObj, Op op,
751756
@SuppressWarnings("unused") @Cached PyFloatCheckNode check,
752757
@Exclusive @Cached CastToJavaDoubleNode cast) {
753758
double a = castToDoubleChecked(inliningTarget, aObj, cast);
754759
double b = castToDoubleChecked(inliningTarget, bObj, cast);
755-
return op(a, b);
760+
return op.compute(a, b);
756761
}
757762

758763
@Specialization(replaces = "doDI")
759-
boolean doOI(Object aObj, int b,
760-
@Bind("this") Node inliningTarget,
764+
static boolean doOI(Node inliningTarget, Object aObj, int b, Op op,
761765
@Shared @Cached CastToJavaDoubleNode cast) {
762766
double a = castToDoubleChecked(inliningTarget, aObj, cast);
763-
return op(a, b);
767+
return op.compute(a, b);
764768
}
765769

766770
@Specialization
767-
@SuppressWarnings("truffle-static-method")
768-
boolean doOL(Object aObj, long b,
769-
@Bind("this") Node inliningTarget,
771+
static boolean doOL(Node inliningTarget, Object aObj, long b, Op op,
770772
@Exclusive @Cached CastToJavaDoubleNode cast,
771773
@Cached InlinedConditionProfile longFitsToDoubleProfile) {
772774
double a = castToDoubleChecked(inliningTarget, aObj, cast);
773-
return op(compareDoubleToLong(inliningTarget, a, b, longFitsToDoubleProfile), 0.0);
775+
return op.compute(compareDoubleToLong(inliningTarget, a, b, longFitsToDoubleProfile), 0.0);
774776
}
775777

776778
@Specialization
777-
boolean doOPInt(Object aObj, PInt b,
778-
@Bind("this") Node inliningTarget,
779+
static boolean doOPInt(Node inliningTarget, Object aObj, PInt b, Op op,
779780
@Shared @Cached CastToJavaDoubleNode cast) {
780781
double a = castToDoubleChecked(inliningTarget, aObj, cast);
781-
return op(compareDoubleToLargeInt(a, b), 0.0);
782+
return op.compute(compareDoubleToLargeInt(a, b), 0.0);
782783
}
783784

784785
@Specialization
785-
boolean doOB(Object aObj, boolean b,
786-
@Bind("this") Node inliningTarget,
786+
static boolean doOB(Node inliningTarget, Object aObj, boolean b, Op op,
787787
@Shared @Cached CastToJavaDoubleNode cast) {
788788
double a = castToDoubleChecked(inliningTarget, aObj, cast);
789-
return op(a, b ? 1 : 0);
789+
return op.compute(a, b ? 1 : 0);
790790
}
791791

792792
@Fallback
793793
@SuppressWarnings("unused")
794-
static PNotImplemented fallback(Object a, Object b) {
794+
static PNotImplemented fallback(Object a, Object b, Op op) {
795795
return PNotImplemented.NOT_IMPLEMENTED;
796796
}
797797

@@ -833,55 +833,67 @@ private static double compareUsingBigDecimal(double v, BigInteger w) {
833833

834834
@Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
835835
@GenerateNodeFactory
836-
public abstract static class EqNode extends AbstractComparisonNode {
837-
@Override
838-
protected boolean op(double a, double b) {
839-
return a == b;
836+
public abstract static class EqNode extends PythonBinaryBuiltinNode {
837+
@Specialization
838+
static Object doIt(double left, double right,
839+
@Bind("this") Node inliningTarget,
840+
@Cached ComparisonHelperNode comparisonHelperNode) {
841+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a == b);
840842
}
841843
}
842844

843845
@Builtin(name = J___NE__, minNumOfPositionalArgs = 2)
844846
@GenerateNodeFactory
845-
abstract static class NeNode extends AbstractComparisonNode {
846-
@Override
847-
protected boolean op(double a, double b) {
848-
return a != b;
847+
abstract static class NeNode extends PythonBinaryBuiltinNode {
848+
@Specialization
849+
static Object doIt(double left, double right,
850+
@Bind("this") Node inliningTarget,
851+
@Cached ComparisonHelperNode comparisonHelperNode) {
852+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a != b);
849853
}
850854
}
851855

852856
@Builtin(name = J___LT__, minNumOfPositionalArgs = 2)
853857
@GenerateNodeFactory
854-
public abstract static class LtNode extends AbstractComparisonNode {
855-
@Override
856-
protected boolean op(double a, double b) {
857-
return a < b;
858+
public abstract static class LtNode extends PythonBinaryBuiltinNode {
859+
@Specialization
860+
static Object doIt(double left, double right,
861+
@Bind("this") Node inliningTarget,
862+
@Cached ComparisonHelperNode comparisonHelperNode) {
863+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a < b);
858864
}
859865
}
860866

861867
@Builtin(name = J___LE__, minNumOfPositionalArgs = 2)
862868
@GenerateNodeFactory
863-
public abstract static class LeNode extends AbstractComparisonNode {
864-
@Override
865-
protected boolean op(double a, double b) {
866-
return a <= b;
869+
public abstract static class LeNode extends PythonBinaryBuiltinNode {
870+
@Specialization
871+
static Object doIt(double left, double right,
872+
@Bind("this") Node inliningTarget,
873+
@Cached ComparisonHelperNode comparisonHelperNode) {
874+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a <= b);
867875
}
868876
}
869877

870878
@Builtin(name = J___GT__, minNumOfPositionalArgs = 2)
871879
@GenerateNodeFactory
872-
public abstract static class GtNode extends AbstractComparisonNode {
873-
@Override
874-
protected boolean op(double a, double b) {
875-
return a > b;
880+
public abstract static class GtNode extends PythonBinaryBuiltinNode {
881+
@Specialization
882+
static Object doIt(double left, double right,
883+
@Bind("this") Node inliningTarget,
884+
@Cached ComparisonHelperNode comparisonHelperNode) {
885+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a > b);
876886
}
877887
}
878888

879889
@Builtin(name = J___GE__, minNumOfPositionalArgs = 2)
880890
@GenerateNodeFactory
881-
public abstract static class GeNode extends AbstractComparisonNode {
882-
@Override
883-
protected boolean op(double a, double b) {
884-
return a >= b;
891+
public abstract static class GeNode extends PythonBinaryBuiltinNode {
892+
@Specialization
893+
static Object doIt(double left, double right,
894+
@Bind("this") Node inliningTarget,
895+
@Cached ComparisonHelperNode comparisonHelperNode) {
896+
return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a >= b);
885897
}
886898
}
887899

0 commit comments

Comments
 (0)