Skip to content

Commit 913eb35

Browse files
committed
[GR-9840] fix issubclass
PullRequest: graalpython-open/47
2 parents 9ea64be + f27c511 commit 913eb35

File tree

6 files changed

+72
-27
lines changed

6 files changed

+72
-27
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,13 @@ def test_subclass_tuple():
164164

165165
assert issubclass(int, (int, (float, int)))
166166
assert issubclass(str, (str, (Child, str)))
167+
168+
169+
def test_abstract_numbers_issubclass():
170+
from numbers import Number, Integral, Complex, Real
171+
assert issubclass(int, Number)
172+
assert issubclass(int, Integral)
173+
assert issubclass(int, Complex)
174+
175+
assert not issubclass(complex, Real)
176+
assert issubclass(complex, Complex)

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -731,11 +731,6 @@ private boolean isInstanceCheckInternal(Object derived, Object cls) {
731731

732732
public abstract boolean executeWith(Object derived, Object cls);
733733

734-
@Specialization
735-
public boolean isSubclassType(Object derived, PythonClass cls) {
736-
return derived == cls || isSubtypeNode.execute(derived, cls);
737-
}
738-
739734
@Specialization(guards = "clsTuple.len() == cachedLen", limit = "getVariableArgumentInlineCacheLimit()")
740735
@ExplodeLoop
741736
public boolean isSubclassTupleConstantLen(Object derived, PTuple clsTuple,

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

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,27 @@
3838
*/
3939
package com.oracle.graal.python.builtins.objects.complex;
4040

41+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ABS__;
42+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
43+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
44+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
4145
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETNEWARGS__;
46+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GE__;
47+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GT__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__HASH__;
49+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LE__;
50+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LT__;
51+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__MUL__;
52+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEG__;
53+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
54+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POS__;
55+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
56+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
57+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
58+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RTRUEDIV__;
59+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__STR__;
60+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUB__;
61+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__TRUEDIV__;
4262

4363
import java.util.List;
4464

@@ -47,7 +67,6 @@
4767
import com.oracle.graal.python.builtins.PythonBuiltins;
4868
import com.oracle.graal.python.builtins.objects.PNotImplemented;
4969
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
50-
import com.oracle.graal.python.nodes.SpecialMethodNames;
5170
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5271
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5372
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -64,7 +83,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactor
6483
}
6584

6685
@GenerateNodeFactory
67-
@Builtin(name = SpecialMethodNames.__ABS__, fixedNumOfArguments = 1)
86+
@Builtin(name = __ABS__, fixedNumOfArguments = 1)
6887
static abstract class AbsNode extends PythonBuiltinNode {
6988
@Specialization
7089
double abs(PComplex c) {
@@ -197,7 +216,7 @@ static int getExponent(final double d) {
197216
}
198217

199218
@GenerateNodeFactory
200-
@Builtin(name = SpecialMethodNames.__ADD__, fixedNumOfArguments = 2)
219+
@Builtin(name = __ADD__, fixedNumOfArguments = 2)
201220
static abstract class AddNode extends PythonBuiltinNode {
202221
@Specialization
203222
PComplex doComplexBoolean(PComplex left, boolean right) {
@@ -230,12 +249,12 @@ Object doComplex(Object left, Object right) {
230249
}
231250

232251
@GenerateNodeFactory
233-
@Builtin(name = SpecialMethodNames.__RADD__, fixedNumOfArguments = 2)
252+
@Builtin(name = __RADD__, fixedNumOfArguments = 2)
234253
static abstract class RAddNode extends AddNode {
235254
}
236255

237256
@GenerateNodeFactory
238-
@Builtin(name = SpecialMethodNames.__TRUEDIV__, fixedNumOfArguments = 2)
257+
@Builtin(name = __TRUEDIV__, fixedNumOfArguments = 2)
239258
static abstract class DivNode extends PythonBuiltinNode {
240259
@Specialization
241260
PComplex doComplexDouble(PComplex left, double right) {
@@ -255,7 +274,7 @@ PComplex doComplex(PComplex left, PComplex right) {
255274
}
256275

257276
@GenerateNodeFactory
258-
@Builtin(name = SpecialMethodNames.__RTRUEDIV__, fixedNumOfArguments = 2)
277+
@Builtin(name = __RTRUEDIV__, fixedNumOfArguments = 2)
259278
static abstract class RDivNode extends PythonBuiltinNode {
260279
@Specialization
261280
PComplex doComplexDouble(PComplex right, double left) {
@@ -267,7 +286,7 @@ PComplex doComplexDouble(PComplex right, double left) {
267286
}
268287

269288
@GenerateNodeFactory
270-
@Builtin(name = SpecialMethodNames.__MUL__, fixedNumOfArguments = 2)
289+
@Builtin(name = __MUL__, fixedNumOfArguments = 2)
271290
static abstract class MulNode extends PythonBuiltinNode {
272291
@Specialization
273292
PComplex doComplexDouble(PComplex left, double right) {
@@ -302,12 +321,12 @@ Object doGeneric(Object left, Object right) {
302321
}
303322

304323
@GenerateNodeFactory
305-
@Builtin(name = SpecialMethodNames.__RMUL__, fixedNumOfArguments = 2)
324+
@Builtin(name = __RMUL__, fixedNumOfArguments = 2)
306325
static abstract class RMulNode extends MulNode {
307326
}
308327

309328
@GenerateNodeFactory
310-
@Builtin(name = SpecialMethodNames.__SUB__, fixedNumOfArguments = 2)
329+
@Builtin(name = __SUB__, fixedNumOfArguments = 2)
311330
static abstract class SubNode extends PythonBuiltinNode {
312331
@Specialization
313332
PComplex doComplexDouble(PComplex left, double right) {
@@ -321,7 +340,7 @@ PComplex doComplex(PComplex left, PComplex right) {
321340
}
322341

323342
@GenerateNodeFactory
324-
@Builtin(name = SpecialMethodNames.__EQ__, fixedNumOfArguments = 2)
343+
@Builtin(name = __EQ__, fixedNumOfArguments = 2)
325344
static abstract class EqNode extends PythonBuiltinNode {
326345
@Specialization
327346
boolean doComplex(PComplex left, PComplex right) {
@@ -336,7 +355,7 @@ boolean doElse(Object left, Object right) {
336355
}
337356

338357
@GenerateNodeFactory
339-
@Builtin(name = SpecialMethodNames.__GE__, fixedNumOfArguments = 2)
358+
@Builtin(name = __GE__, fixedNumOfArguments = 2)
340359
static abstract class GeNode extends PythonBuiltinNode {
341360
@Specialization
342361
boolean doComplex(PComplex left, PComplex right) {
@@ -351,7 +370,7 @@ boolean doElse(Object left, Object right) {
351370
}
352371

353372
@GenerateNodeFactory
354-
@Builtin(name = SpecialMethodNames.__GT__, fixedNumOfArguments = 2)
373+
@Builtin(name = __GT__, fixedNumOfArguments = 2)
355374
static abstract class GtNode extends PythonBuiltinNode {
356375
@Specialization
357376
boolean doComplex(PComplex left, PComplex right) {
@@ -366,7 +385,7 @@ boolean doElse(Object left, Object right) {
366385
}
367386

368387
@GenerateNodeFactory
369-
@Builtin(name = SpecialMethodNames.__LT__, fixedNumOfArguments = 2)
388+
@Builtin(name = __LT__, fixedNumOfArguments = 2)
370389
static abstract class LtNode extends PythonBuiltinNode {
371390
@Specialization
372391
boolean doComplex(PComplex left, PComplex right) {
@@ -381,7 +400,7 @@ boolean doElse(Object left, Object right) {
381400
}
382401

383402
@GenerateNodeFactory
384-
@Builtin(name = SpecialMethodNames.__LE__, fixedNumOfArguments = 2)
403+
@Builtin(name = __LE__, fixedNumOfArguments = 2)
385404
static abstract class LeNode extends PythonBuiltinNode {
386405
@Specialization
387406
boolean doComplex(PComplex left, PComplex right) {
@@ -396,7 +415,7 @@ boolean doElse(Object left, Object right) {
396415
}
397416

398417
@GenerateNodeFactory
399-
@Builtin(name = SpecialMethodNames.__NE__, fixedNumOfArguments = 2)
418+
@Builtin(name = __NE__, fixedNumOfArguments = 2)
400419
static abstract class NeNode extends PythonBuiltinNode {
401420
@Specialization
402421
boolean doComplex(PComplex left, PComplex right) {
@@ -411,7 +430,7 @@ boolean doElse(Object left, Object right) {
411430
}
412431

413432
@GenerateNodeFactory
414-
@Builtin(name = SpecialMethodNames.__REPR__, fixedNumOfArguments = 1)
433+
@Builtin(name = __REPR__, fixedNumOfArguments = 1)
415434
static abstract class ReprNode extends PythonBuiltinNode {
416435
@Specialization
417436
String repr(PComplex self) {
@@ -420,7 +439,7 @@ String repr(PComplex self) {
420439
}
421440

422441
@GenerateNodeFactory
423-
@Builtin(name = SpecialMethodNames.__STR__, fixedNumOfArguments = 1)
442+
@Builtin(name = __STR__, fixedNumOfArguments = 1)
424443
static abstract class StrNode extends PythonBuiltinNode {
425444
@Specialization
426445
String repr(PComplex self) {
@@ -429,7 +448,7 @@ String repr(PComplex self) {
429448
}
430449

431450
@GenerateNodeFactory
432-
@Builtin(name = SpecialMethodNames.__BOOL__, fixedNumOfArguments = 1)
451+
@Builtin(name = __BOOL__, fixedNumOfArguments = 1)
433452
static abstract class BoolNode extends PythonBuiltinNode {
434453
@Specialization
435454
boolean bool(PComplex self) {
@@ -438,7 +457,7 @@ boolean bool(PComplex self) {
438457
}
439458

440459
@GenerateNodeFactory
441-
@Builtin(name = SpecialMethodNames.__NEG__, fixedNumOfArguments = 1)
460+
@Builtin(name = __NEG__, fixedNumOfArguments = 1)
442461
static abstract class NegNode extends PythonBuiltinNode {
443462
@Specialization
444463
PComplex neg(PComplex self) {
@@ -447,7 +466,7 @@ PComplex neg(PComplex self) {
447466
}
448467

449468
@GenerateNodeFactory
450-
@Builtin(name = SpecialMethodNames.__POS__, fixedNumOfArguments = 1)
469+
@Builtin(name = __POS__, fixedNumOfArguments = 1)
451470
static abstract class PosNode extends PythonBuiltinNode {
452471
@Specialization
453472
PComplex pos(PComplex self) {
@@ -483,7 +502,7 @@ static abstract class ImagNode extends PythonBuiltinNode {
483502
}
484503

485504
@GenerateNodeFactory
486-
@Builtin(name = SpecialMethodNames.__HASH__, fixedNumOfArguments = 1)
505+
@Builtin(name = __HASH__, fixedNumOfArguments = 1)
487506
static abstract class HashNode extends PythonUnaryBuiltinNode {
488507
@Specialization
489508
@TruffleBoundary

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import static com.oracle.graal.python.nodes.SpecialMethodNames.__PREPARE__;
4040
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SET__;
4141
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUBCLASSCHECK__;
42+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUBCLASSES__;
4243
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
4344
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4445

@@ -51,6 +52,7 @@
5152
import com.oracle.graal.python.builtins.objects.PNone;
5253
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5354
import com.oracle.graal.python.builtins.objects.function.PythonCallable;
55+
import com.oracle.graal.python.builtins.objects.list.PList;
5456
import com.oracle.graal.python.builtins.objects.object.PythonObject;
5557
import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
5658
import com.oracle.graal.python.nodes.argument.positional.PositionalArgumentsNode;
@@ -413,7 +415,19 @@ static abstract class SubclassCheckNode extends PythonBinaryBuiltinNode {
413415

414416
@Specialization
415417
boolean instanceCheck(PythonClass cls, Object derived) {
416-
return isSubtypeNode.execute(derived, cls);
418+
return cls == derived || isSubtypeNode.execute(derived, cls);
419+
}
420+
}
421+
422+
@Builtin(name = __SUBCLASSES__, fixedNumOfArguments = 1)
423+
@GenerateNodeFactory
424+
static abstract class SubclassesNode extends PythonBinaryBuiltinNode {
425+
@Child private IsSubtypeNode isSubtypeNode = IsSubtypeNode.create();
426+
427+
@Specialization
428+
PList getSubclasses(PythonClass cls) {
429+
// TODO: missing: keep track of subclasses
430+
return factory().createList(cls.getSubClasses().toArray());
417431
}
418432
}
419433
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public abstract class SpecialMethodNames {
6969
public static final String __INIT_SUBCLASS__ = "__init_subclass__";
7070
public static final String __INSTANCECHECK__ = "__instancecheck__";
7171
public static final String __SUBCLASSCHECK__ = "__subclasscheck__";
72+
public static final String __SUBCLASSES__ = "__subclasses__";
73+
public static final String __SUBCLASSHOOK__ = "__subclasshook__";
7274
public static final String __CALL__ = "__call__";
7375
public static final String __LEN__ = "__len__";
7476
public static final String __LENGTH_HINT__ = "__length_hint__";

graalpython/lib-graalpython/type.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ def __dir__(obj):
7575
object.__dir__ = _objectdir
7676
type.__dir__ = _classdir
7777

78+
def __subclasshook(cls, subclass):
79+
return NotImplemented
80+
81+
type.__subclasshook__ = classmethod(__subclasshook)
82+
7883

7984
# TODO -----------------------------------------------------------------------------------------------------------------
8085
# TODO: REMOVEME, temporary patch for coroutines

0 commit comments

Comments
 (0)