Skip to content

Commit 2fae385

Browse files
committed
add references from PythonBuiltinClass objects (which are per-context) to PythonBuiltinClassType enum value, for easier class checks and a better second level cache
1 parent 2f00ef3 commit 2fae385

File tree

62 files changed

+231
-198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+231
-198
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.oracle.graal.python.nodes.PNode;
4747
import com.oracle.graal.python.nodes.call.InvokeNode;
4848
import com.oracle.graal.python.nodes.control.TopLevelExceptionHandler;
49+
import com.oracle.graal.python.nodes.object.GetClassNode;
4950
import com.oracle.graal.python.nodes.statement.ImportNode;
5051
import com.oracle.graal.python.parser.PythonParserImpl;
5152
import com.oracle.graal.python.runtime.PythonContext;
@@ -301,7 +302,7 @@ protected Object findMetaObject(PythonContext context, Object value) {
301302
value instanceof Number ||
302303
value instanceof String ||
303304
value instanceof Boolean) {
304-
return getCore().lookupType(value.getClass());
305+
return GetClassNode.getItSlowPath(value);
305306
}
306307
}
307308
return null;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535

3636
String doc() default "";
3737

38-
Class<?>[] constructsClass() default {};
38+
PythonBuiltinClassType[] constructsClass() default {};
3939

40-
Class<?>[] base() default {};
40+
PythonBuiltinClassType[] base() default {};
4141

4242
int fixedNumOfArguments() default 0;
4343

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@
3434

3535
String publicName() default "";
3636

37-
Class<?>[] extendClasses() default {};
37+
PythonBuiltinClassType[] extendClasses() default {};
3838
}

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

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@
137137
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
138138
import com.oracle.truffle.api.TruffleFile;
139139
import com.oracle.truffle.api.TruffleLanguage.Env;
140-
import com.oracle.truffle.api.interop.TruffleObject;
141140
import com.oracle.truffle.api.nodes.Node;
142141
import com.oracle.truffle.api.source.Source;
143142

@@ -408,11 +407,6 @@ public PythonBuiltinClass lookupType(PythonBuiltinClassType type) {
408407
return builtinTypes[type.ordinal()];
409408
}
410409

411-
@TruffleBoundary
412-
public PythonBuiltinClass lookupType(Class<? extends Object> clazz) {
413-
return lookupType(PythonBuiltinClassType.fromClass(clazz));
414-
}
415-
416410
@TruffleBoundary
417411
public String[] builtinModuleNames() {
418412
return builtinModules.keySet().toArray(new String[0]);
@@ -494,11 +488,11 @@ private void initializeTypes() {
494488
foreignClass = new PythonBuiltinClass(typeClass, FOREIGN, objectClass);
495489
typeClass.unsafeSetSuperClass(objectClass);
496490
// Prepare core classes that are required all for core setup
497-
addType(PythonClass.class, typeClass);
498-
addType(PythonBuiltinClass.class, typeClass);
499-
addType(PythonObject.class, objectClass);
500-
addType(PythonModule.class, moduleClass);
501-
addType(TruffleObject.class, foreignClass);
491+
addType(PythonBuiltinClassType.PythonClass, typeClass);
492+
addType(PythonBuiltinClassType.PythonBuiltinClass, typeClass);
493+
addType(PythonBuiltinClassType.PythonObject, objectClass);
494+
addType(PythonBuiltinClassType.PythonModule, moduleClass);
495+
addType(PythonBuiltinClassType.TruffleObject, foreignClass);
502496
// n.b.: the builtin modules and classes and their constructors are initialized first here,
503497
// so we have the mapping from java classes to python classes and builtin names to modules
504498
// available.
@@ -508,9 +502,9 @@ private void initializeTypes() {
508502
createModule(annotation.defineModule());
509503
}
510504
builtin.initializeClasses(this);
511-
for (Entry<PythonBuiltinClass, Entry<Class<?>[], Boolean>> entry : builtin.getBuiltinClasses().entrySet()) {
505+
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtin.getBuiltinClasses().entrySet()) {
512506
PythonBuiltinClass pythonClass = entry.getKey();
513-
for (Class<?> klass : entry.getValue().getKey()) {
507+
for (PythonBuiltinClassType klass : entry.getValue().getKey()) {
514508
addType(klass, pythonClass);
515509
}
516510
}
@@ -524,7 +518,7 @@ private void populateBuiltins() {
524518
if (annotation.defineModule().length() > 0) {
525519
addBuiltinsTo(builtinModules.get(annotation.defineModule()), builtin);
526520
}
527-
for (Class<?> klass : annotation.extendClasses()) {
521+
for (PythonBuiltinClassType klass : annotation.extendClasses()) {
528522
addBuiltinsTo(lookupType(klass), builtin);
529523
}
530524
}
@@ -540,8 +534,9 @@ private void populateBuiltins() {
540534
builtinModules.put("_frozen_importlib", bootstrap);
541535
}
542536

543-
private void addType(Class<? extends Object> clazz, PythonBuiltinClass typ) {
544-
builtinTypes[PythonBuiltinClassType.fromClass(clazz).ordinal()] = typ;
537+
private void addType(PythonBuiltinClassType klass, PythonBuiltinClass typ) {
538+
builtinTypes[klass.ordinal()] = typ;
539+
typ.setType(klass);
545540
}
546541

547542
private PythonModule createModule(String name) {
@@ -572,8 +567,8 @@ private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtins) {
572567
obj.setAttribute(methodName, value);
573568
}
574569

575-
Map<PythonBuiltinClass, Entry<Class<?>[], Boolean>> builtinClasses = builtins.getBuiltinClasses();
576-
for (Entry<PythonBuiltinClass, Entry<Class<?>[], Boolean>> entry : builtinClasses.entrySet()) {
570+
Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = builtins.getBuiltinClasses();
571+
for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> entry : builtinClasses.entrySet()) {
577572
boolean isPublic = entry.getValue().getValue();
578573
if (isPublic) {
579574
PythonBuiltinClass pythonClass = entry.getKey();

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
*/
2626
package com.oracle.graal.python.builtins;
2727

28-
import java.util.HashMap;
29-
3028
import com.oracle.truffle.api.CompilerAsserts;
3129

3230
public enum PythonBuiltinClassType {
@@ -95,11 +93,9 @@ public enum PythonBuiltinClassType {
9593
PZip(com.oracle.graal.python.builtins.objects.iterator.PZip.class, "zip"),
9694
PBuffer(com.oracle.graal.python.builtins.objects.memoryview.PBuffer.class, "buffer");
9795

98-
private final Class<?> clazz;
9996
private final String shortName;
10097

101-
PythonBuiltinClassType(Class<?> clazz, String shortName) {
102-
this.clazz = clazz;
98+
PythonBuiltinClassType(@SuppressWarnings("unused") Class<?> clazz, String shortName) {
10399
this.shortName = shortName;
104100
}
105101

@@ -108,21 +104,4 @@ public String toString() {
108104
CompilerAsserts.neverPartOfCompilation();
109105
return shortName;
110106
}
111-
112-
private static final HashMap<Class<?>, PythonBuiltinClassType> fromJavaClass = new HashMap<>();
113-
114-
static {
115-
for (PythonBuiltinClassType builtinClass : values()) {
116-
fromJavaClass.put(builtinClass.clazz, builtinClass);
117-
}
118-
fromJavaClass.put(String.class, PString);
119-
fromJavaClass.put(Integer.class, PInt);
120-
fromJavaClass.put(Long.class, PInt);
121-
fromJavaClass.put(Double.class, PFloat);
122-
}
123-
124-
public static PythonBuiltinClassType fromClass(Class<?> clazz) {
125-
assert fromJavaClass.containsKey(clazz) : clazz + " is not in list of known classes";
126-
return fromJavaClass.get(clazz);
127-
}
128107
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
public abstract class PythonBuiltins {
5353
protected final Map<String, Object> builtinConstants = new HashMap<>();
5454
private final Map<String, BoundBuiltinCallable<?>> builtinFunctions = new HashMap<>();
55-
private final Map<PythonBuiltinClass, Map.Entry<Class<?>[], Boolean>> builtinClasses = new HashMap<>();
55+
private final Map<PythonBuiltinClass, Map.Entry<PythonBuiltinClassType[], Boolean>> builtinClasses = new HashMap<>();
5656

5757
protected abstract List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories();
5858

@@ -101,22 +101,22 @@ public final void initializeClasses(PythonCore core) {
101101

102102
private PythonBuiltinClass createBuiltinClassFor(PythonCore core, Builtin builtin) {
103103
PythonBuiltinClass builtinClass = null;
104-
for (Class<?> klass : builtin.constructsClass()) {
104+
for (PythonBuiltinClassType klass : builtin.constructsClass()) {
105105
builtinClass = core.lookupType(klass);
106106
if (builtinClass != null) {
107107
break;
108108
}
109109
}
110110
if (builtinClass == null) {
111-
Class<?>[] bases = builtin.base();
111+
PythonBuiltinClassType[] bases = builtin.base();
112112
PythonBuiltinClass base = null;
113113
if (bases.length == 0) {
114114
base = core.lookupType(PythonBuiltinClassType.PythonObject);
115115
} else {
116116
assert bases.length == 1;
117117
// Search the "local scope" for builtin classes to inherit from
118-
outer: for (Entry<PythonBuiltinClass, Entry<Class<?>[], Boolean>> localClasses : builtinClasses.entrySet()) {
119-
for (Class<?> o : localClasses.getValue().getKey()) {
118+
outer: for (Entry<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> localClasses : builtinClasses.entrySet()) {
119+
for (PythonBuiltinClassType o : localClasses.getValue().getKey()) {
120120
if (o == bases[0]) {
121121
base = localClasses.getKey();
122122
break outer;
@@ -166,17 +166,17 @@ private void setBuiltinFunction(String name, BoundBuiltinCallable<?> function) {
166166
builtinFunctions.put(name, function);
167167
}
168168

169-
private void setBuiltinClass(PythonBuiltinClass builtinClass, Class<?>[] classes, boolean isPublic) {
170-
SimpleEntry<Class<?>[], Boolean> simpleEntry = new AbstractMap.SimpleEntry<>(classes, isPublic);
169+
private void setBuiltinClass(PythonBuiltinClass builtinClass, PythonBuiltinClassType[] pythonBuiltinClassTypes, boolean isPublic) {
170+
SimpleEntry<PythonBuiltinClassType[], Boolean> simpleEntry = new AbstractMap.SimpleEntry<>(pythonBuiltinClassTypes, isPublic);
171171
builtinClasses.put(builtinClass, simpleEntry);
172172
}
173173

174174
protected Map<String, BoundBuiltinCallable<?>> getBuiltinFunctions() {
175175
return builtinFunctions;
176176
}
177177

178-
protected Map<PythonBuiltinClass, Entry<Class<?>[], Boolean>> getBuiltinClasses() {
179-
Map<PythonBuiltinClass, Entry<Class<?>[], Boolean>> tmp = builtinClasses;
178+
protected Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> getBuiltinClasses() {
179+
Map<PythonBuiltinClass, Entry<PythonBuiltinClassType[], Boolean>> tmp = builtinClasses;
180180
assert (tmp = Collections.unmodifiableMap(tmp)) != null;
181181
return tmp;
182182
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import com.oracle.graal.python.builtins.Builtin;
3434
import com.oracle.graal.python.builtins.CoreFunctions;
35+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3536
import com.oracle.graal.python.builtins.PythonBuiltins;
3637
import com.oracle.graal.python.builtins.objects.PNone;
3738
import com.oracle.graal.python.builtins.objects.array.PArray;
@@ -61,7 +62,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
6162
}
6263

6364
// array.array(typecode[, initializer])
64-
@Builtin(name = "array", minNumOfArguments = 2, maxNumOfArguments = 3, constructsClass = PArray.class)
65+
@Builtin(name = "array", minNumOfArguments = 2, maxNumOfArguments = 3, constructsClass = PythonBuiltinClassType.PArray)
6566
@GenerateNodeFactory
6667
abstract static class PythonArrayNode extends PythonBuiltinNode {
6768

0 commit comments

Comments
 (0)