@@ -165,15 +165,37 @@ private Method getFindActiveEngines() {
165165 }
166166
167167 private Map getEngines () {
168+ Map engines = null ;
168169 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+ }
173175 } catch (ClassNotFoundException ex ) {
174176 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 );
175187 } catch (NoSuchFieldException ex ) {
188+ Logger .getLogger (Truffle .class .getName ()).log (TruffleJMX .DEBUG ? Level .INFO : Level .FINE , null , ex );
189+ } catch (SecurityException ex ) {
176190 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 ));
177199 } catch (SecurityException ex ) {
178200 Logger .getLogger (Truffle .class .getName ()).log (Level .SEVERE , null , ex );
179201 }
@@ -185,8 +207,14 @@ private Collection<Engine> getAllEngineInstances() {
185207 if (Engine_findActiveEngines == null ) {
186208 Collection <Engine > en = new ArrayList ();
187209 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+ }
190218 en .add (e );
191219 }
192220 return en ;
0 commit comments