Skip to content

Commit 4daeafd

Browse files
committed
[GR-58596] Fix duplicate class definition attempts for generated type-mapped proxies.
PullRequest: graal/18929
2 parents edc1423 + 2e336c3 commit 4daeafd

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/LookupProxyKlassNode.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,21 @@ private static Klass lookupOrDefineInBindingsLoader(EspressoForeignProxyGenerato
100100

101101
Symbol<Symbol.Type> proxyName = context.getTypes().fromClassGetName(proxyBytes.name);
102102
Klass proxyKlass = registry.findLoadedKlass(context.getClassLoadingEnv(), proxyName);
103-
if (proxyKlass == null) {
104-
try {
105-
proxyKlass = registry.defineKlass(context, proxyName, proxyBytes.bytes);
106-
} catch (EspressoClassLoadingException e) {
107-
throw EspressoError.shouldNotReachHere(e);
103+
if (proxyKlass != null) {
104+
return proxyKlass;
105+
}
106+
// double-checked locking on the proxy name
107+
synchronized (proxyName) {
108+
proxyKlass = registry.findLoadedKlass(context.getClassLoadingEnv(), proxyName);
109+
if (proxyKlass == null) {
110+
try {
111+
proxyKlass = registry.defineKlass(context, proxyName, proxyBytes.bytes);
112+
} catch (EspressoClassLoadingException e) {
113+
throw EspressoError.shouldNotReachHere(e);
114+
}
108115
}
116+
return proxyKlass;
109117
}
110-
return proxyKlass;
111118
}
112119

113120
private static ObjectKlass fillParents(Object metaObject, InteropLibrary interop, PolyglotTypeMappings mappings, Set<ObjectKlass> parents, EspressoContext context) throws ClassCastException {

0 commit comments

Comments
 (0)