@@ -165,15 +165,37 @@ private Method getFindActiveEngines() {
165
165
}
166
166
167
167
private Map getEngines () {
168
+ Map engines = null ;
168
169
try {
169
- Class POLY_CLASS = Class .forName (POLYGLOTENGINEIMPL_CLASS_NAME );
170
- Field f = POLY_CLASS .getDeclaredField ("ENGINES" );
171
- Object base = unsafe .staticFieldBase (f );
172
- return (Map ) unsafe .getObject (base , unsafe .staticFieldOffset (f ));
170
+ engines = getEnginesFromClass (Engine .class );
171
+ if (engines == null ) {
172
+ Class POLY_CLASS = Class .forName (POLYGLOTENGINEIMPL_CLASS_NAME );
173
+ engines = getEnginesFromClass (POLY_CLASS );
174
+ }
173
175
} catch (ClassNotFoundException ex ) {
174
176
Logger .getLogger (Truffle .class .getName ()).log (Level .SEVERE , null , ex );
177
+ } catch (SecurityException ex ) {
178
+ Logger .getLogger (Truffle .class .getName ()).log (Level .SEVERE , null , ex );
179
+ }
180
+ return engines ;
181
+ }
182
+
183
+ private Map getEnginesFromClass (Class engineClass ) {
184
+ try {
185
+ Field f = engineClass .getDeclaredField ("ENGINES" );
186
+ return getEnginesFromField (f );
175
187
} catch (NoSuchFieldException ex ) {
188
+ Logger .getLogger (Truffle .class .getName ()).log (TruffleJMX .DEBUG ? Level .INFO : Level .FINE , null , ex );
189
+ } catch (SecurityException ex ) {
176
190
Logger .getLogger (Truffle .class .getName ()).log (Level .SEVERE , null , ex );
191
+ }
192
+ return null ;
193
+ }
194
+
195
+ private Map getEnginesFromField (Field f ) {
196
+ try {
197
+ Object base = unsafe .staticFieldBase (f );
198
+ return (Map ) unsafe .getObject (base , unsafe .staticFieldOffset (f ));
177
199
} catch (SecurityException ex ) {
178
200
Logger .getLogger (Truffle .class .getName ()).log (Level .SEVERE , null , ex );
179
201
}
@@ -185,8 +207,14 @@ private Collection<Engine> getAllEngineInstances() {
185
207
if (Engine_findActiveEngines == null ) {
186
208
Collection <Engine > en = new ArrayList ();
187
209
for (Object o : engines .keySet ()) {
188
- Field cf = TruffleJMX .getDeclaredField (o , "creatorApi" , "api" );
189
- Engine e = (Engine ) unsafe .getObject (o , unsafe .objectFieldOffset (cf ));
210
+ Engine e ;
211
+
212
+ if (o instanceof Engine ) {
213
+ e = (Engine ) o ;
214
+ } else {
215
+ Field cf = TruffleJMX .getDeclaredField (o , "creatorApi" , "api" );
216
+ e = (Engine ) unsafe .getObject (o , unsafe .objectFieldOffset (cf ));
217
+ }
190
218
en .add (e );
191
219
}
192
220
return en ;
0 commit comments