Skip to content

Commit 0aeacf1

Browse files
committed
[GR-69004] Lazy initialize PythonContext#polyglotForeignClasses
PullRequest: graalpython/3967
2 parents c69b88c + 2a4cd1e commit 0aeacf1

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
@@ -849,7 +849,7 @@ private static PythonBuiltins[] initializeBuiltins(TruffleLanguage.Env env) {
849849
@CompilationFinal private PInt pyFalse;
850850
@CompilationFinal private PFloat pyNaN;
851851

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

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

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

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)