Skip to content

Commit 5110a0f

Browse files
committed
intrinsified type.py
1 parent 577e02d commit 5110a0f

File tree

4 files changed

+98
-50
lines changed

4 files changed

+98
-50
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -1967,6 +1967,8 @@ Object setAttr(VirtualFrame frame, Object object, Object key, Object value,
19671967
@GenerateNodeFactory
19681968
public abstract static class SortedNode extends PythonClinicBuiltinNode {
19691969

1970+
public abstract Object executeInternal(VirtualFrame frame, Object iterable, Object keyfunc, boolean reverse);
1971+
19701972
@Specialization
19711973
Object sorted(VirtualFrame frame, Object iterable, Object keyfunc, boolean reverse,
19721974
@Cached ConstructListNode constructListNode,
@@ -1980,6 +1982,11 @@ Object sorted(VirtualFrame frame, Object iterable, Object keyfunc, boolean rever
19801982
protected ArgumentClinicProvider getArgumentClinic() {
19811983
return BuiltinFunctionsClinicProviders.SortedNodeClinicProviderGen.INSTANCE;
19821984
}
1985+
1986+
public static SortedNode create() {
1987+
return BuiltinFunctionsFactory.SortedNodeFactory.create(null);
1988+
}
1989+
19831990
}
19841991

19851992
@Builtin(name = BREAKPOINT, takesVarArgs = true, takesVarKeywordArgs = true)

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -28,7 +28,6 @@
2828

2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__BASICSIZE__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CLASS__;
31-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
3231
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__ITEMSIZE__;
3332
import static com.oracle.graal.python.nodes.SpecialMethodNames.RICHCMP;
3433
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELATTR__;
@@ -66,7 +65,6 @@
6665
import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory;
6766
import com.oracle.graal.python.builtins.objects.PNone;
6867
import com.oracle.graal.python.builtins.objects.PNotImplemented;
69-
import com.oracle.graal.python.builtins.objects.array.ArrayBuiltinsClinicProviders.ReduceExNodeClinicProviderGen;
7068
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
7169
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
7270
import com.oracle.graal.python.builtins.objects.dict.PDict;
@@ -79,7 +77,9 @@
7977
import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker;
8078
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
8179
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsClinicProviders.FormatNodeClinicProviderGen;
80+
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsClinicProviders.ReduceExNodeClinicProviderGen;
8281
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory;
82+
import com.oracle.graal.python.builtins.objects.set.PSet;
8383
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
8484
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
8585
import com.oracle.graal.python.builtins.objects.type.TypeNodes.CheckCompatibleForAssigmentNode;
@@ -90,6 +90,8 @@
9090
import com.oracle.graal.python.lib.PyObjectSizeNode;
9191
import com.oracle.graal.python.nodes.ErrorMessages;
9292
import com.oracle.graal.python.nodes.PGuards;
93+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
94+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__;
9395
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
9496
import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode;
9597
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
@@ -99,6 +101,7 @@
99101
import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
100102
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
101103
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
104+
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
102105
import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
103106
import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode;
104107
import com.oracle.graal.python.nodes.expression.ExpressionNode;
@@ -838,4 +841,29 @@ static Object doit(VirtualFrame frame, Object obj, int proto,
838841
return commonReduceNode.execute(frame, obj, proto);
839842
}
840843
}
844+
845+
@Builtin(name = __DIR__, minNumOfPositionalArgs = 1, doc = "__dir__ for generic objects\n\n\tReturns __dict__, __class__ and recursively up the\n\t__class__.__bases__ chain.")
846+
@GenerateNodeFactory
847+
public abstract static class DirNode extends PythonBuiltinNode {
848+
@Specialization
849+
Object dir(VirtualFrame frame, Object obj,
850+
@Cached PyObjectLookupAttr lookupAttrNode,
851+
@Cached CallNode callNode,
852+
@Cached GetClassNode getClassNode,
853+
@Cached IsSubtypeNode isSubtypeNode,
854+
@Cached com.oracle.graal.python.builtins.objects.type.TypeBuiltins.DirNode dirNode) {
855+
PSet names = factory().createSet();
856+
Object updateCallable = lookupAttrNode.execute(frame, names, "update");
857+
Object ns = lookupAttrNode.execute(frame, obj, __DICT__);
858+
if (isSubtypeNode.execute(frame, getClassNode.execute(ns), PythonBuiltinClassType.PDict)) {
859+
callNode.execute(frame, updateCallable, ns);
860+
}
861+
Object klass = lookupAttrNode.execute(frame, obj, __CLASS__);
862+
if (klass != PNone.NO_VALUE) {
863+
callNode.execute(frame, updateCallable, dirNode.execute(frame, klass));
864+
}
865+
return names;
866+
}
867+
}
868+
841869
}

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

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -45,6 +45,7 @@
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.MRO;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ALLOC__;
4747
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__;
4849
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__;
4950
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GET__;
5051
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
@@ -54,6 +55,7 @@
5455
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETATTR__;
5556
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUBCLASSCHECK__;
5657
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUBCLASSES__;
58+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUBCLASSHOOK__;
5759
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
5860
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
5961

@@ -69,6 +71,7 @@
6971
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
7072
import com.oracle.graal.python.builtins.PythonBuiltins;
7173
import com.oracle.graal.python.builtins.objects.PNone;
74+
import com.oracle.graal.python.builtins.objects.PNotImplemented;
7275
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
7376
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
7477
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
@@ -77,6 +80,7 @@
7780
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
7881
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
7982
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
83+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode;
8084
import com.oracle.graal.python.builtins.objects.dict.PDict;
8185
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
8286
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -87,6 +91,7 @@
8791
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
8892
import com.oracle.graal.python.builtins.objects.object.ObjectNodes.AbstractSetattrNode;
8993
import com.oracle.graal.python.builtins.objects.object.PythonObject;
94+
import com.oracle.graal.python.builtins.objects.set.PSet;
9095
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
9196
import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
9297
import com.oracle.graal.python.builtins.objects.type.TypeNodes.CheckCompatibleForAssigmentNode;
@@ -100,6 +105,7 @@
100105
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
101106
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
102107
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
108+
import com.oracle.graal.python.lib.PyObjectLookupAttr;
103109
import com.oracle.graal.python.nodes.BuiltinNames;
104110
import com.oracle.graal.python.nodes.ErrorMessages;
105111
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
@@ -966,6 +972,16 @@ protected boolean isSameType(Object a, Object b) {
966972
}
967973
}
968974

975+
@Builtin(name = __SUBCLASSHOOK__, minNumOfPositionalArgs = 2, isClassmethod = true)
976+
@GenerateNodeFactory
977+
abstract static class SubclassHookNode extends PythonBinaryBuiltinNode {
978+
@SuppressWarnings("unused")
979+
@Specialization
980+
Object hook(VirtualFrame frame, Object cls, Object subclass) {
981+
return PNotImplemented.NOT_IMPLEMENTED;
982+
}
983+
}
984+
969985
@Builtin(name = __SUBCLASSES__, minNumOfPositionalArgs = 1)
970986
@GenerateNodeFactory
971987
abstract static class SubclassesNode extends PythonUnaryBuiltinNode {
@@ -1391,4 +1407,45 @@ Object set(Object self, Object value) {
13911407
throw raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE_S, GetNameNode.getUncached().execute(self));
13921408
}
13931409
}
1410+
1411+
@Builtin(name = __DIR__, minNumOfPositionalArgs = 1, doc = "__dir__ for type objects\n\n\tThis includes all attributes of klass and all of the base\n\tclasses recursively.")
1412+
@GenerateNodeFactory
1413+
public abstract static class DirNode extends PythonUnaryBuiltinNode {
1414+
@Specialization
1415+
Object dir(VirtualFrame frame, Object klass,
1416+
@Cached PyObjectLookupAttr lookupAttrNode,
1417+
@Cached com.oracle.graal.python.nodes.call.CallNode callNode,
1418+
@Cached ToArrayNode toArrayNode,
1419+
@Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode,
1420+
@Cached DirNode dirNode) {
1421+
PSet names = dir(frame, klass, lookupAttrNode, callNode, getBasesNode, toArrayNode, dirNode);
1422+
return names;
1423+
}
1424+
1425+
private PSet dir(VirtualFrame frame, Object klass, PyObjectLookupAttr lookupAttrNode, com.oracle.graal.python.nodes.call.CallNode callNode, GetFixedAttributeNode getBasesNode,
1426+
ToArrayNode toArrayNode, DirNode dirNode) {
1427+
PSet names = factory().createSet();
1428+
Object updateCallable = lookupAttrNode.execute(frame, names, "update");
1429+
Object ns = lookupAttrNode.execute(frame, klass, __DICT__);
1430+
if (ns != PNone.NO_VALUE) {
1431+
callNode.execute(frame, updateCallable, ns);
1432+
}
1433+
Object basesAttr = getBasesNode.execute(frame, klass);
1434+
if (basesAttr instanceof PTuple) {
1435+
Object[] bases = toArrayNode.execute(((PTuple) basesAttr).getSequenceStorage());
1436+
for (Object cls : bases) {
1437+
// Note that since we are only interested in the keys, the order
1438+
// we merge classes is unimportant
1439+
Object baseNames = dir(frame, cls, lookupAttrNode, callNode, getBasesNode, toArrayNode, dirNode);
1440+
callNode.execute(frame, updateCallable, baseNames);
1441+
}
1442+
}
1443+
return names;
1444+
}
1445+
1446+
protected GetFixedAttributeNode createGetAttrNode() {
1447+
return GetFixedAttributeNode.create(__BASES__);
1448+
}
1449+
}
1450+
13941451
}

graalpython/lib-graalpython/type.py

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -37,50 +37,6 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939

40-
def __dir__(klass):
41-
"""__dir__ for type objects
42-
43-
This includes all attributes of klass and all of the base
44-
classes recursively.
45-
"""
46-
names = set()
47-
ns = getattr(klass, '__dict__', None)
48-
if ns is not None:
49-
names.update(ns)
50-
bases = getattr(klass, '__bases__', None)
51-
if bases is not None:
52-
# Note that since we are only interested in the keys, the order
53-
# we merge classes is unimportant
54-
for base in bases:
55-
names.update(_classdir(base))
56-
return sorted(names)
57-
_classdir = __dir__
58-
59-
60-
def __dir__(obj):
61-
"""__dir__ for generic objects
62-
63-
Returns __dict__, __class__ and recursively up the
64-
__class__.__bases__ chain.
65-
"""
66-
names = set()
67-
ns = getattr(obj, '__dict__', None)
68-
if isinstance(ns, dict):
69-
names.update(ns)
70-
klass = getattr(obj, '__class__', None)
71-
if klass is not None:
72-
names.update(_classdir(klass))
73-
return sorted(names)
74-
_objectdir = __dir__
75-
76-
77-
object.__dir__ = _objectdir
78-
type.__dir__ = _classdir
79-
80-
def __subclasshook(cls, subclass):
81-
return NotImplemented
82-
83-
type.__subclasshook__ = classmethod(__subclasshook)
8440

8541

8642
# TODO -----------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)