Skip to content

Commit c4cb66f

Browse files
committed
[GR-23207] Various fixes for test_class
PullRequest: graalpython/1119
2 parents c0c27fa + 7d0295c commit c4cb66f

File tree

10 files changed

+129
-10
lines changed

10 files changed

+129
-10
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
*graalpython.lib-python.3.test.test_class.ClassTests.testBadTypeReturned
2+
*graalpython.lib-python.3.test.test_class.ClassTests.testBinaryOps
23
*graalpython.lib-python.3.test.test_class.ClassTests.testForExceptionsRaisedInInstanceGetattr2
34
*graalpython.lib-python.3.test.test_class.ClassTests.testGetSetAndDel
5+
*graalpython.lib-python.3.test.test_class.ClassTests.testHashStuff
46
*graalpython.lib-python.3.test.test_class.ClassTests.testInit
7+
*graalpython.lib-python.3.test.test_class.ClassTests.testListAndDictOps
58
*graalpython.lib-python.3.test.test_class.ClassTests.testMisc
69
*graalpython.lib-python.3.test.test_class.ClassTests.testSFBug532646
10+
*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrNonStringName
711
*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrWrapperNameIntern
812
*graalpython.lib-python.3.test.test_class.ClassTests.testUnaryOps

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__WEAKREF__;
7272
import static com.oracle.graal.python.nodes.SpecialMethodNames.DECODE;
7373
import static com.oracle.graal.python.nodes.SpecialMethodNames.__COMPLEX__;
74+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
75+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__HASH__;
7476
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INDEX__;
7577
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INT__;
7678
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
@@ -2332,6 +2334,16 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
23322334
}
23332335
}
23342336

2337+
// CPython masks the __hash__ method with None when __eq__ is overriden, but __hash__ is
2338+
// not
2339+
Object hashMethod = nslib.getItem(namespace.getDictStorage(), __HASH__);
2340+
if (hashMethod == null) {
2341+
Object eqMethod = nslib.getItem(namespace.getDictStorage(), __EQ__);
2342+
if (eqMethod != null) {
2343+
pythonClass.setAttribute(__HASH__, PNone.NONE);
2344+
}
2345+
}
2346+
23352347
boolean addDict = false;
23362348
if (slots == null) {
23372349
// takes care of checking if we may_add_dict and adds it if needed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,13 @@ public PTuple doDouble(double a, double b) {
524524
}
525525

526526
@Specialization
527-
public PTuple doObject(VirtualFrame frame, Object a, Object b,
528-
@Cached("FloorDiv.create()") LookupAndCallBinaryNode floordivNode,
529-
@Cached("Mod.create()") LookupAndCallBinaryNode modNode) {
530-
Object div = floordivNode.executeObject(frame, a, b);
531-
Object mod = modNode.executeObject(frame, a, b);
532-
return factory().createTuple(new Object[]{div, mod});
527+
public Object doObject(VirtualFrame frame, Object a, Object b,
528+
@Cached("createDivmod()") LookupAndCallBinaryNode callDivmod) {
529+
return callDivmod.executeObject(frame, a, b);
530+
}
531+
532+
protected static LookupAndCallBinaryNode createDivmod() {
533+
return BinaryArithmetic.DivMod.create();
533534
}
534535

535536
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POS__;
6060
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POW__;
6161
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
62+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
6263
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
6364
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
6465
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RPOW__;
@@ -401,6 +402,7 @@ PNotImplemented doComplex(Object left, Object right) {
401402
}
402403

403404
@GenerateNodeFactory
405+
@Builtin(name = __RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
404406
@Builtin(name = __DIVMOD__, minNumOfPositionalArgs = 2)
405407
abstract static class DivModNode extends PythonBinaryBuiltinNode {
406408

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

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.floats;
2727

28-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
2928
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
29+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
3030
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
3131
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ABS__;
3232
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
3333
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
34+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIVMOD__;
3435
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
3536
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOAT__;
3637
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOORDIV__;
@@ -48,6 +49,7 @@
4849
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POS__;
4950
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POW__;
5051
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
52+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
5153
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5254
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RFLOORDIV__;
5355
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMOD__;
@@ -598,6 +600,47 @@ PNotImplemented doGeneric(Object left, Object right) {
598600
}
599601
}
600602

603+
@Builtin(name = __RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
604+
@Builtin(name = __DIVMOD__, minNumOfPositionalArgs = 2)
605+
@TypeSystemReference(PythonArithmeticTypes.class)
606+
@GenerateNodeFactory
607+
abstract static class DivModNode extends FloatBinaryBuiltinNode {
608+
@Specialization
609+
PTuple doDL(double left, long right) {
610+
raiseDivisionByZero(right == 0);
611+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
612+
}
613+
614+
@Specialization
615+
PTuple doDD(double left, double right) {
616+
raiseDivisionByZero(right == 0.0);
617+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
618+
}
619+
620+
@Specialization
621+
PTuple doLD(long left, double right) {
622+
raiseDivisionByZero(right == 0.0);
623+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
624+
}
625+
626+
@Specialization(guards = {"accepts(left)", "accepts(right)"})
627+
PTuple doGenericFloat(VirtualFrame frame, Object left, Object right,
628+
@Cached FloorDivNode floorDivNode,
629+
@Cached ModNode modNode) {
630+
return factory().createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
631+
}
632+
633+
@SuppressWarnings("unused")
634+
@Fallback
635+
PNotImplemented doGeneric(Object left, Object right) {
636+
return PNotImplemented.NOT_IMPLEMENTED;
637+
}
638+
639+
protected static boolean accepts(Object obj) {
640+
return obj instanceof Double || obj instanceof Integer || obj instanceof Long || obj instanceof PInt || obj instanceof PFloat;
641+
}
642+
}
643+
601644
@Builtin(name = SpecialMethodNames.__HASH__, minNumOfPositionalArgs = 1)
602645
@GenerateNodeFactory
603646
@TypeSystemReference(PythonArithmeticTypes.class)

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELATTR__;
3636
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
3737
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__;
38+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIVMOD__;
3839
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
3940
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOORDIV__;
4041
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
@@ -50,6 +51,7 @@
5051
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEW__;
5152
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
5253
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
54+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
5355
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5456
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RFLOORDIV__;
5557
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
@@ -415,6 +417,22 @@ abstract static class RFloorDivNode extends ForeignBinaryNode {
415417
}
416418
}
417419

420+
@Builtin(name = __DIVMOD__, minNumOfPositionalArgs = 2)
421+
@GenerateNodeFactory
422+
abstract static class DivModNode extends ForeignBinaryNode {
423+
DivModNode() {
424+
super(BinaryArithmetic.DivMod.create(), false);
425+
}
426+
}
427+
428+
@Builtin(name = __RDIVMOD__, minNumOfPositionalArgs = 2)
429+
@GenerateNodeFactory
430+
abstract static class RDivModNode extends ForeignBinaryNode {
431+
RDivModNode() {
432+
super(BinaryArithmetic.DivMod.create(), true);
433+
}
434+
}
435+
418436
public abstract static class ForeignBinaryComparisonNode extends PythonBinaryBuiltinNode {
419437
@Child private BinaryComparisonNode comparisonNode;
420438

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,41 @@ PNotImplemented doGeneric(Object right, Object left) {
609609

610610
}
611611

612+
@Builtin(name = SpecialMethodNames.__RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
613+
@Builtin(name = SpecialMethodNames.__DIVMOD__, minNumOfPositionalArgs = 2)
614+
@TypeSystemReference(PythonArithmeticTypes.class)
615+
@GenerateNodeFactory
616+
abstract static class DivModNode extends IntBinaryBuiltinNode {
617+
@Specialization
618+
PTuple doLL(int left, int right) {
619+
raiseDivisionByZero(right == 0);
620+
return factory().createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
621+
}
622+
623+
@Specialization
624+
PTuple doLL(long left, long right) {
625+
raiseDivisionByZero(right == 0);
626+
return factory().createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
627+
}
628+
629+
@Specialization(guards = {"accepts(left)", "accepts(right)"})
630+
PTuple doGenericInt(VirtualFrame frame, Object left, Object right,
631+
@Cached FloorDivNode floorDivNode,
632+
@Cached ModNode modNode) {
633+
return factory().createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
634+
}
635+
636+
@SuppressWarnings("unused")
637+
@Fallback
638+
PNotImplemented doGeneric(Object left, Object right) {
639+
return PNotImplemented.NOT_IMPLEMENTED;
640+
}
641+
642+
protected static boolean accepts(Object obj) {
643+
return obj instanceof Integer || obj instanceof Long || obj instanceof PInt;
644+
}
645+
}
646+
612647
@Builtin(name = SpecialMethodNames.__MOD__, minNumOfPositionalArgs = 2)
613648
@TypeSystemReference(PythonArithmeticTypes.class)
614649
@GenerateNodeFactory

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
7171
import com.oracle.graal.python.builtins.objects.function.PKeyword;
7272
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory;
73+
import com.oracle.graal.python.builtins.objects.str.StringNodes;
7374
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
7475
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
7576
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
@@ -616,13 +617,15 @@ public static GetAttributeNode create() {
616617
@GenerateNodeFactory
617618
public abstract static class SetattrNode extends PythonTernaryBuiltinNode {
618619
@Specialization(limit = "3")
619-
protected PNone doIt(VirtualFrame frame, Object object, Object key, Object value,
620+
protected PNone doIt(VirtualFrame frame, Object object, Object keyObject, Object value,
620621
@CachedLibrary("object") PythonObjectLibrary libObj,
622+
@Cached StringNodes.CastToJavaStringCheckedNode castToString,
621623
@Cached("create()") LookupAttributeInMRONode.Dynamic getExisting,
622624
@Cached("create()") GetClassNode getDataClassNode,
623625
@Cached("create(__SET__)") LookupAttributeInMRONode lookupSetNode,
624626
@Cached("create()") CallTernaryMethodNode callSetNode,
625627
@Cached("create()") WriteAttributeToObjectNode writeNode) {
628+
String key = castToString.cast(keyObject, "attribute name must be string, not '%p'", keyObject);
626629
Object type = libObj.getLazyPythonClass(object);
627630
Object descr = getExisting.execute(type, key);
628631
if (descr != PNone.NO_VALUE) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryArithmetic.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public enum BinaryArithmetic {
6464
Or(SpecialMethodNames.__OR__, "|"),
6565
Xor(SpecialMethodNames.__XOR__, "^"),
6666
MatMul(SpecialMethodNames.__MATMUL__, "@"),
67-
Pow(SpecialMethodNames.__POW__, "**");
67+
Pow(SpecialMethodNames.__POW__, "**"),
68+
DivMod(SpecialMethodNames.__DIVMOD__, "divmod");
6869

6970
private final String methodName;
7071
private final String reverseMethodName;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/SliceLiteralNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private int castStop(VirtualFrame frame, Object o) {
104104
private int castStep(VirtualFrame frame, Object o) {
105105
if (castStepNode == null) {
106106
CompilerDirectives.transferToInterpreterAndInvalidate();
107-
castStepNode = insert(CastToSliceComponentNode.create(1, Integer.MAX_VALUE));
107+
castStepNode = insert(CastToSliceComponentNode.create(MISSING_INDEX, Integer.MAX_VALUE));
108108
}
109109
return castStepNode.execute(frame, o);
110110
}

0 commit comments

Comments
 (0)