Skip to content

Commit 2a4cd1e

Browse files
committed
[GR-69004] Lazy initialize PythonContext#polyglotForeignClasses
1 parent be97e4f commit 2a4cd1e

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ private static PythonBuiltins[] initializeBuiltins(TruffleLanguage.Env env) {
848848
@CompilationFinal private PInt pyFalse;
849849
@CompilationFinal private PFloat pyNaN;
850850

851-
@CompilationFinal(dimensions = 1) public final PythonManagedClass[] polyglotForeignClasses = new PythonManagedClass[GetForeignObjectClassNode.Trait.COMBINATIONS];
851+
@CompilationFinal(dimensions = 1) private PythonManagedClass[] polyglotForeignClasses = null;
852852

853853
private final SysModuleState sysModuleState = new SysModuleState();
854854

@@ -1362,4 +1362,19 @@ public static void writeInfo(String message) {
13621362
public static void writeInfo(Supplier<String> messageSupplier) {
13631363
PythonLanguage.getLogger(Python3Core.class).fine(messageSupplier);
13641364
}
1365+
1366+
public PythonManagedClass getPolyglotForeignClasses(int traits) {
1367+
assert getContext().ownsGil(); // if not it would need its own synchronization
1368+
PythonManagedClass[] classes = polyglotForeignClasses;
1369+
return classes == null ? null : classes[traits];
1370+
}
1371+
1372+
public void setPolyglotForeignClasses(int traits, PythonManagedClass pythonClass) {
1373+
assert getContext().ownsGil(); // if not it would need its own synchronization
1374+
if (polyglotForeignClasses == null) {
1375+
polyglotForeignClasses = new PythonManagedClass[GetForeignObjectClassNode.Trait.COMBINATIONS];
1376+
}
1377+
1378+
polyglotForeignClasses[traits] = pythonClass;
1379+
}
13651380
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetForeignObjectClassNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ protected static int getTraits(Object object, InteropLibrary interop) {
170170
}
171171

172172
private PythonManagedClass classForTraits(PythonContext context, int traits) {
173-
PythonManagedClass pythonClass = context.polyglotForeignClasses[traits];
173+
PythonManagedClass pythonClass = context.getPolyglotForeignClasses(traits);
174174
if (pythonClass == null) {
175175
if (isSingleContext(this)) {
176176
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -183,7 +183,7 @@ private PythonManagedClass classForTraits(PythonContext context, int traits) {
183183
@TruffleBoundary
184184
private PythonManagedClass resolvePolyglotForeignClassAndSetInCache(PythonContext context, int traits) {
185185
PythonManagedClass pythonClass = resolvePolyglotForeignClass(context, traits);
186-
context.polyglotForeignClasses[traits] = pythonClass;
186+
context.setPolyglotForeignClasses(traits, pythonClass);
187187
return pythonClass;
188188
}
189189

0 commit comments

Comments
 (0)