Skip to content

Commit cfb1d1c

Browse files
committed
simplify PythonBuiltinClassTypes and allow python objects to reference a class as PythonBuiltinClassType
1 parent ec5b05c commit cfb1d1c

File tree

18 files changed

+255
-291
lines changed

18 files changed

+255
-291
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ declare_type(PyByteArray_Type, bytearray, PyByteArrayObject);
131131
declare_type(PyCFunction_Type, builtin_function_or_method, PyCFunctionObject);
132132
declare_type(PyMethodDescr_Type, method_descriptor, PyMethodDescrObject);
133133
declare_type(PyGetSetDescr_Type, getset_descriptor, PyGetSetDescrObject);
134-
declare_type(PyWrapperDescr_Type, wrapper_descriptor, PyWrapperDescrObject);
135-
declare_type(PyMemberDescr_Type, member_descriptor, PyMemberDescrObject);
134+
declare_type(PyWrapperDescr_Type, method_descriptor, PyWrapperDescrObject); // LS: previously wrapper_descriptor
135+
declare_type(PyMemberDescr_Type, property, PyMemberDescrObject); // LS: previously member_descriptor
136136
declare_type(_PyExc_BaseException, BaseException, PyBaseExceptionObject);
137137
declare_type(PyBuffer_Type, buffer, PyBufferDecorator);
138138
declare_type(PyFunction_Type, function, PyFunctionObject);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ public PythonModule lookupBuiltinModule(String name) {
416416
}
417417

418418
public PythonBuiltinClass lookupType(PythonBuiltinClassType type) {
419+
assert builtinTypes[type.ordinal()] != null;
419420
return builtinTypes[type.ordinal()];
420421
}
421422

@@ -468,19 +469,24 @@ public void exportCInterface(PythonContext context) {
468469
}
469470
}
470471

472+
private PythonClass initializeBuiltinClass(PythonBuiltinClassType type) {
473+
int index = type.ordinal();
474+
if (builtinTypes[index] == null) {
475+
if (type.getBase() == type) {
476+
// object case
477+
builtinTypes[index] = new PythonBuiltinClass(type, null);
478+
} else {
479+
builtinTypes[index] = new PythonBuiltinClass(type, initializeBuiltinClass(type.getBase()));
480+
}
481+
}
482+
return builtinTypes[index];
483+
}
484+
471485
private void initializeTypes() {
472-
// Make prebuilt classes known
473-
typeClass = new PythonBuiltinClass(null, TYPE, null);
474-
objectClass = new PythonBuiltinClass(typeClass, OBJECT, null);
475-
moduleClass = new PythonBuiltinClass(typeClass, MODULE, objectClass);
476-
foreignClass = new PythonBuiltinClass(typeClass, FOREIGN, objectClass);
477-
typeClass.unsafeSetSuperClass(objectClass);
478-
// Prepare core classes that are required all for core setup
479-
addType(PythonBuiltinClassType.PythonClass, typeClass);
480-
addType(PythonBuiltinClassType.PythonBuiltinClass, typeClass);
481-
addType(PythonBuiltinClassType.PythonObject, objectClass);
482-
addType(PythonBuiltinClassType.PythonModule, moduleClass);
483-
addType(PythonBuiltinClassType.TruffleObject, foreignClass);
486+
// create class objects for builtin types
487+
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.values()) {
488+
initializeBuiltinClass(builtinClass);
489+
}
484490
// n.b.: the builtin modules and classes and their constructors are initialized first here,
485491
// so we have the mapping from java classes to python classes and builtin names to modules
486492
// available.
@@ -489,12 +495,12 @@ private void initializeTypes() {
489495
if (annotation.defineModule().length() > 0) {
490496
createModule(annotation.defineModule());
491497
}
492-
builtin.initializeClasses(this);
493-
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtin.getBuiltinClasses().entrySet()) {
494-
PythonBuiltinClass pythonClass = entry.getKey();
495-
for (PythonBuiltinClassType klass : entry.getValue().getKey()) {
496-
addType(klass, pythonClass);
497-
}
498+
}
499+
// publish builtin types in the "builtins" module
500+
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.values()) {
501+
String module = builtinClass.getPublicInModule();
502+
if (module != null) {
503+
lookupBuiltinModule(module).setAttribute(builtinClass.getShortName(), lookupType(builtinClass));
498504
}
499505
}
500506
// now initialize well-known objects
@@ -525,11 +531,6 @@ private void populateBuiltins() {
525531
builtinModules.put("_frozen_importlib", bootstrap);
526532
}
527533

528-
private void addType(PythonBuiltinClassType klass, PythonBuiltinClass typ) {
529-
builtinTypes[klass.ordinal()] = typ;
530-
typ.setType(klass);
531-
}
532-
533534
private PythonModule createModule(String name) {
534535
PythonModule mod = builtinModules.get(name);
535536
if (mod == null) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 95 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -25,85 +25,113 @@
2525
*/
2626
package com.oracle.graal.python.builtins;
2727

28+
import java.util.HashSet;
29+
30+
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
2831
import com.oracle.truffle.api.CompilerAsserts;
32+
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
33+
import com.oracle.truffle.api.object.Shape;
2934

30-
public enum PythonBuiltinClassType {
35+
public enum PythonBuiltinClassType implements LazyPythonClass {
3136

32-
TruffleObject(com.oracle.truffle.api.interop.TruffleObject.class, "truffle_object"),
33-
Boolean(java.lang.Boolean.class, "bool"),
34-
GetSetDescriptor(com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor.class, "get_set_desc"),
35-
PArray(com.oracle.graal.python.builtins.objects.array.PArray.class, "array"),
36-
PArrayIterator(com.oracle.graal.python.builtins.objects.iterator.PArrayIterator.class, "arrayiterator"),
37-
PBaseException(com.oracle.graal.python.builtins.objects.exception.PBaseException.class, "BaseException"),
38-
PBaseSetIterator(com.oracle.graal.python.builtins.objects.iterator.PBaseSetIterator.class, "iterator"),
39-
PBuiltinFunction(com.oracle.graal.python.builtins.objects.function.PBuiltinFunction.class, "method_descriptor"),
40-
PBuiltinMethod(com.oracle.graal.python.builtins.objects.method.PBuiltinMethod.class, "builtin_function_or_method"),
41-
PByteArray(com.oracle.graal.python.builtins.objects.bytes.PByteArray.class, "bytearray"),
42-
PBytes(com.oracle.graal.python.builtins.objects.bytes.PBytes.class, "bytes"),
43-
PCell(com.oracle.graal.python.builtins.objects.cell.PCell.class, "cell"),
44-
PComplex(com.oracle.graal.python.builtins.objects.complex.PComplex.class, "complex"),
45-
PDict(com.oracle.graal.python.builtins.objects.dict.PDict.class, "dict"),
46-
PDictKeysView(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictKeysView.class, "dict_keys"),
47-
PDictItemsIterator(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictItemsIterator.class, "dict_itemsiterator"),
48-
PDictItemsView(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictItemsView.class, "dict_items"),
49-
PDictKeysIterator(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictKeysIterator.class, "dict_keysiterator"),
50-
PDictValuesIterator(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictValuesIterator.class, "dict_valuesiterator"),
51-
PDictValuesView(com.oracle.graal.python.builtins.objects.dict.PDictView.PDictValuesView.class, "dict_values"),
52-
PDoubleSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PDoubleSequenceIterator.class, "iterator"),
53-
PEllipsis(com.oracle.graal.python.builtins.objects.PEllipsis.class, "ellipsis"),
54-
PEnumerate(com.oracle.graal.python.builtins.objects.enumerate.PEnumerate.class, "enumerate"),
55-
PFloat(com.oracle.graal.python.builtins.objects.floats.PFloat.class, "float"),
56-
PFrame(com.oracle.graal.python.builtins.objects.frame.PFrame.class, "frame"),
57-
PFrozenSet(com.oracle.graal.python.builtins.objects.set.PFrozenSet.class, "frozenset"),
58-
PFunction(com.oracle.graal.python.builtins.objects.function.PFunction.class, "function"),
59-
PGenerator(com.oracle.graal.python.builtins.objects.generator.PGenerator.class, "generator"),
60-
PGeneratorFunction(com.oracle.graal.python.builtins.objects.function.PGeneratorFunction.class, "function"),
61-
PInt(com.oracle.graal.python.builtins.objects.ints.PInt.class, "int"),
62-
PythonNativeVoidPtr(com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr.class, "int"),
63-
PIntegerSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator.class, "iterator"),
64-
PList(com.oracle.graal.python.builtins.objects.list.PList.class, "list"),
65-
PLongSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator.class, "iterator"),
66-
PMappingproxy(com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy.class, "mappingproxy"),
67-
PMemoryView(com.oracle.graal.python.builtins.objects.memoryview.PMemoryView.class, "memoryview"),
68-
PMethod(com.oracle.graal.python.builtins.objects.method.PMethod.class, "method"),
69-
PNone(com.oracle.graal.python.builtins.objects.PNone.class, "NoneType"),
70-
PNotImplemented(com.oracle.graal.python.builtins.objects.PNotImplemented.class, "NotImplementedType"),
71-
PRandom(com.oracle.graal.python.builtins.objects.random.PRandom.class, "random"),
72-
PRange(com.oracle.graal.python.builtins.objects.range.PRange.class, "range"),
73-
PRangeIterator(com.oracle.graal.python.builtins.objects.iterator.PRangeIterator.class, "iterator"),
74-
PRangeReverseIterator(com.oracle.graal.python.builtins.objects.iterator.PRangeIterator.PRangeReverseIterator.class, "iterator"),
75-
PReferenceType(com.oracle.graal.python.builtins.objects.referencetype.PReferenceType.class, "ReferenceType"),
76-
PSentinelIterator(com.oracle.graal.python.builtins.objects.iterator.PSentinelIterator.class, "callable_iterator"),
77-
PSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator.class, "iterator"),
78-
PForeignArrayIterator(com.oracle.graal.python.builtins.objects.iterator.PForeignArrayIterator.class, "foreign_iterator"),
79-
PSequenceReverseIterator(com.oracle.graal.python.builtins.objects.reversed.PSequenceReverseIterator.class, "reversed"),
80-
PSet(com.oracle.graal.python.builtins.objects.set.PSet.class, "set"),
81-
PSlice(com.oracle.graal.python.builtins.objects.slice.PSlice.class, "slice"),
82-
PString(com.oracle.graal.python.builtins.objects.str.PString.class, "str"),
83-
PStringIterator(com.oracle.graal.python.builtins.objects.iterator.PStringIterator.class, "iterator"),
84-
PStringReverseIterator(com.oracle.graal.python.builtins.objects.reversed.PStringReverseIterator.class, "reversed"),
85-
PTraceback(com.oracle.graal.python.builtins.objects.traceback.PTraceback.class, "traceback"),
86-
PTuple(com.oracle.graal.python.builtins.objects.tuple.PTuple.class, "tuple"),
87-
PythonBuiltinClass(com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass.class, "type"),
88-
PythonClass(com.oracle.graal.python.builtins.objects.type.PythonClass.class, "type"),
89-
PythonNativeClass(com.oracle.graal.python.builtins.objects.cext.PythonNativeClass.class, "type"),
90-
PythonModule(com.oracle.graal.python.builtins.objects.module.PythonModule.class, "module"),
91-
PythonObject(com.oracle.graal.python.builtins.objects.object.PythonObject.class, "object"),
92-
PythonNativeObject(com.oracle.graal.python.builtins.objects.cext.PythonNativeObject.class, "object"),
93-
Super(com.oracle.graal.python.builtins.objects.superobject.SuperObject.class, "super"),
94-
PCode(com.oracle.graal.python.builtins.objects.code.PCode.class, "code"),
95-
PZip(com.oracle.graal.python.builtins.objects.iterator.PZip.class, "zip"),
96-
PBuffer(com.oracle.graal.python.builtins.objects.memoryview.PBuffer.class, "buffer");
37+
TruffleObject("truffle_object"),
38+
Boolean("bool", "builtins"),
39+
GetSetDescriptor("get_set_desc"),
40+
PArray("array", "array"),
41+
PArrayIterator("arrayiterator"),
42+
PBaseException("BaseException", "builtins"),
43+
PIterator("iterator"),
44+
PBuiltinFunction("method_descriptor"),
45+
PBuiltinMethod("builtin_function_or_method"),
46+
PByteArray("bytearray", "builtins"),
47+
PBytes("bytes", "builtins"),
48+
PCell("cell"),
49+
PComplex("complex", "builtins"),
50+
PDict("dict", "builtins"),
51+
PDictKeysView("dict_keys"),
52+
PDictItemsIterator("dict_itemsiterator"),
53+
PDictItemsView("dict_items"),
54+
PDictKeysIterator("dict_keysiterator"),
55+
PDictValuesIterator("dict_valuesiterator"),
56+
PDictValuesView("dict_values"),
57+
PEllipsis("ellipsis"),
58+
PEnumerate("enumerate", "builtins"),
59+
PFloat("float", "builtins"),
60+
PFrame("frame"),
61+
PFrozenSet("frozenset", "builtins"),
62+
PFunction("function"),
63+
PGenerator("generator"),
64+
PInt("int", "builtins"),
65+
PList("list", "builtins"),
66+
PMappingproxy("mappingproxy"),
67+
PMemoryView("memoryview", "builtins"),
68+
PMethod("method"),
69+
PNone("NoneType"),
70+
PNotImplemented("NotImplementedType"),
71+
PRandom("Random", "_random"),
72+
PRange("range", "builtins"),
73+
PReferenceType("ReferenceType", "_weakref"),
74+
PSentinelIterator("callable_iterator"),
75+
PForeignArrayIterator("foreign_iterator"),
76+
PReverseIterator("reversed", "builtins"),
77+
PSet("set", "builtins"),
78+
PSlice("slice", "builtins"),
79+
PString("str", "builtins"),
80+
PTraceback("traceback"),
81+
PTuple("tuple", "builtins"),
82+
PythonClass("type", "builtins"),
83+
PythonModule("module"),
84+
PythonObject("object", "builtins"),
85+
Super("super", "builtins"),
86+
PCode("code"),
87+
PZip("zip", "builtins"),
88+
PBuffer("buffer");
9789

9890
private final String shortName;
91+
private final Shape instanceShape;
92+
private final String publicInModule;
93+
94+
// initialized in static constructor
95+
@CompilationFinal private PythonBuiltinClassType base;
9996

100-
PythonBuiltinClassType(@SuppressWarnings("unused") Class<?> clazz, String shortName) {
97+
PythonBuiltinClassType(String shortName, String publicInModule) {
10198
this.shortName = shortName;
99+
this.publicInModule = publicInModule;
100+
this.instanceShape = com.oracle.graal.python.builtins.objects.type.PythonClass.freshShape();
101+
}
102+
103+
PythonBuiltinClassType(String shortName) {
104+
this(shortName, null);
105+
}
106+
107+
public String getShortName() {
108+
return shortName;
109+
}
110+
111+
public PythonBuiltinClassType getBase() {
112+
return base;
113+
}
114+
115+
public String getPublicInModule() {
116+
return publicInModule;
102117
}
103118

104119
@Override
105120
public String toString() {
106121
CompilerAsserts.neverPartOfCompilation();
107122
return shortName;
108123
}
124+
125+
public Shape getInstanceShape() {
126+
return instanceShape;
127+
}
128+
129+
static {
130+
HashSet<String> set = new HashSet<>();
131+
for (PythonBuiltinClassType type : values()) {
132+
assert set.add(type.shortName) : type.name();
133+
type.base = PythonObject;
134+
}
135+
Boolean.base = PInt;
136+
}
109137
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 5 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,11 @@ public void initialize(PythonCore core) {
7676
(b) -> Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory, declaresExplicitSelf)));
7777
if (builtin.constructsClass().length > 0) {
7878
PBuiltinFunction newFunc = core.factory().createBuiltinFunction(__NEW__, null, createArity(builtin, declaresExplicitSelf), callTarget);
79-
PythonBuiltinClass builtinClass = createBuiltinClassFor(core, builtin);
80-
builtinClass.setAttributeUnsafe(__NEW__, newFunc);
81-
builtinClass.setAttribute(__DOC__, builtin.doc());
79+
for (PythonBuiltinClassType type : builtin.constructsClass()) {
80+
PythonBuiltinClass builtinClass = core.lookupType(type);
81+
builtinClass.setAttributeUnsafe(__NEW__, newFunc);
82+
builtinClass.setAttribute(__DOC__, builtin.doc());
83+
}
8284
} else {
8385
PBuiltinFunction function = core.factory().createBuiltinFunction(builtin.name(), null, createArity(builtin, declaresExplicitSelf), callTarget);
8486
function.setAttribute(__DOC__, builtin.doc());
@@ -93,51 +95,6 @@ public void initialize(PythonCore core) {
9395
});
9496
}
9597

96-
public final void initializeClasses(PythonCore core) {
97-
assert builtinClasses.isEmpty();
98-
initializeEachFactoryWith((factory, builtin) -> {
99-
if (builtin.constructsClass().length > 0) {
100-
createBuiltinClassFor(core, builtin);
101-
}
102-
});
103-
}
104-
105-
private PythonBuiltinClass createBuiltinClassFor(PythonCore core, Builtin builtin) {
106-
PythonBuiltinClass builtinClass = null;
107-
for (PythonBuiltinClassType klass : builtin.constructsClass()) {
108-
builtinClass = core.lookupType(klass);
109-
if (builtinClass != null) {
110-
break;
111-
}
112-
}
113-
if (builtinClass == null) {
114-
PythonBuiltinClassType[] bases = builtin.base();
115-
PythonBuiltinClass base = null;
116-
if (bases.length == 0) {
117-
base = core.lookupType(PythonBuiltinClassType.PythonObject);
118-
} else {
119-
assert bases.length == 1;
120-
// Search the "local scope" for builtin classes to inherit from
121-
outer: for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> localClasses : builtinClasses.entrySet()) {
122-
for (PythonBuiltinClassType o : localClasses.getValue().getKey()) {
123-
if (o == bases[0]) {
124-
base = localClasses.getKey();
125-
break outer;
126-
}
127-
}
128-
}
129-
// Only take a globally known builtin class if we haven't found a local one
130-
if (base == null) {
131-
base = core.lookupType(bases[0]);
132-
}
133-
assert base != null;
134-
}
135-
builtinClass = new PythonBuiltinClass(core.lookupType(PythonBuiltinClassType.PythonBuiltinClass), builtin.name(), base);
136-
}
137-
setBuiltinClass(builtinClass, builtin.constructsClass(), builtin.isPublic());
138-
return builtinClass;
139-
}
140-
14198
private void initializeEachFactoryWith(BiConsumer<NodeFactory<? extends PythonBuiltinBaseNode>, Builtin> func) {
14299
List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> factories = getNodeFactories();
143100
assert factories != null : "No factories found. Override getFactories() to resolve this.";
@@ -174,11 +131,6 @@ private void setBuiltinFunction(String name, BoundBuiltinCallable<?> function) {
174131
builtinFunctions.put(name, function);
175132
}
176133

177-
private void setBuiltinClass(PythonBuiltinClass builtinClass, PythonBuiltinClassType[] pythonBuiltinClassTypes, boolean isPublic) {
178-
SimpleEntry<PythonBuiltinClassType[], Boolean> simpleEntry = new AbstractMap.SimpleEntry<>(pythonBuiltinClassTypes, isPublic);
179-
builtinClasses.put(builtinClass, simpleEntry);
180-
}
181-
182134
protected Map<String, BoundBuiltinCallable<?>> getBuiltinFunctions() {
183135
return builtinFunctions;
184136
}

0 commit comments

Comments
 (0)