Skip to content

Commit e9e4ec3

Browse files
committed
Fix foreign_number_list >/</... foreign_list
* The problem was BinaryComparisonNode was eagerly raising TypeError but here we want to try the reverse comparison and so need to return NotImplemented instead.
1 parent 0232729 commit e9e4ec3

File tree

2 files changed

+15
-17
lines changed

2 files changed

+15
-17
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_interop.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,20 +1057,17 @@ def test_foreign_number_list(self):
10571057

10581058
with self.assertRaisesRegex(TypeError, "'<' not supported between instances of 'ForeignList' and 'int'"):
10591059
assert l < 4
1060+
with self.assertRaisesRegex(TypeError, "'<' not supported between instances of 'int' and 'ForeignList'"):
1061+
assert 4 < l
10601062

10611063
assert l < n
1062-
1063-
# does not work because > resolves to ForeignNumberType.__gt__ which doesn't handle foreign list on LHS
1064-
with self.assertRaisesRegex(TypeError, "'>' not supported between instances of 'int' and 'ForeignList'"):
1065-
assert n > l
1064+
assert n > l
10661065

10671066
l[0] = 100
10681067
assert not l < n
1069-
with self.assertRaisesRegex(TypeError, "'>' not supported between instances of 'int' and 'ForeignList'"):
1070-
assert not n > l
1068+
assert not n > l
10711069
assert l > n
1072-
with self.assertRaisesRegex(TypeError, "'<' not supported between instances of 'int' and 'ForeignList'"):
1073-
assert n < l
1070+
assert n < l
10741071

10751072
def test_foreign_repl(self):
10761073
from java.util.logging import LogRecord

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignNumberBuiltins.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,19 @@
6666
import com.oracle.graal.python.builtins.objects.foreign.ForeignObjectBuiltins.NormalizeForeignForBinopNode;
6767
import com.oracle.graal.python.builtins.objects.ints.PInt;
6868
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
69+
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
6970
import com.oracle.graal.python.builtins.objects.type.TpSlots;
7071
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
7172
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode;
7273
import com.oracle.graal.python.lib.PyNumberAddNode;
7374
import com.oracle.graal.python.lib.PyNumberMultiplyNode;
7475
import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode;
7576
import com.oracle.graal.python.nodes.PRaiseNode;
77+
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
7678
import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
7779
import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitAndNode;
7880
import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitOrNode;
7981
import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitXorNode;
80-
import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
8182
import com.oracle.graal.python.nodes.expression.BinaryOpNode;
8283
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
8384
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -381,10 +382,10 @@ abstract static class RDivModNode extends ForeignBinaryNode {
381382
}
382383

383384
public abstract static class ForeignBinaryComparisonNode extends PythonBinaryBuiltinNode {
384-
@Child private BinaryComparisonNode comparisonNode;
385+
@Child private LookupAndCallBinaryNode comparisonNode;
385386

386-
protected ForeignBinaryComparisonNode(BinaryComparisonNode op) {
387-
this.comparisonNode = op;
387+
protected ForeignBinaryComparisonNode(SpecialMethodSlot slot, SpecialMethodSlot rslot) {
388+
comparisonNode = LookupAndCallBinaryNode.create(slot, rslot, true, true);
388389
}
389390

390391
@Specialization(guards = {"lib.isBoolean(left)"})
@@ -493,39 +494,39 @@ public static PNotImplemented doGeneric(Object left, Object right) {
493494
@GenerateNodeFactory
494495
public abstract static class LtNode extends ForeignBinaryComparisonNode {
495496
protected LtNode() {
496-
super(BinaryComparisonNode.LtNode.create());
497+
super(SpecialMethodSlot.Lt, SpecialMethodSlot.Gt);
497498
}
498499
}
499500

500501
@Builtin(name = J___LE__, minNumOfPositionalArgs = 2)
501502
@GenerateNodeFactory
502503
public abstract static class LeNode extends ForeignBinaryComparisonNode {
503504
protected LeNode() {
504-
super(BinaryComparisonNode.LeNode.create());
505+
super(SpecialMethodSlot.Le, SpecialMethodSlot.Ge);
505506
}
506507
}
507508

508509
@Builtin(name = J___GT__, minNumOfPositionalArgs = 2)
509510
@GenerateNodeFactory
510511
public abstract static class GtNode extends ForeignBinaryComparisonNode {
511512
protected GtNode() {
512-
super(BinaryComparisonNode.GtNode.create());
513+
super(SpecialMethodSlot.Gt, SpecialMethodSlot.Lt);
513514
}
514515
}
515516

516517
@Builtin(name = J___GE__, minNumOfPositionalArgs = 2)
517518
@GenerateNodeFactory
518519
public abstract static class GeNode extends ForeignBinaryComparisonNode {
519520
protected GeNode() {
520-
super(BinaryComparisonNode.GeNode.create());
521+
super(SpecialMethodSlot.Ge, SpecialMethodSlot.Le);
521522
}
522523
}
523524

524525
@Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
525526
@GenerateNodeFactory
526527
public abstract static class EqNode extends ForeignBinaryComparisonNode {
527528
protected EqNode() {
528-
super(BinaryComparisonNode.EqNode.create());
529+
super(SpecialMethodSlot.Eq, SpecialMethodSlot.Eq);
529530
}
530531
}
531532

0 commit comments

Comments
 (0)