changeset 22489:8b24fab0a573

Move reflection and service lookups only in static initializers
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 19 Aug 2015 16:11:29 -0700
parents f89487f1d185
children 386dddf89b6f
files graal/com.oracle.graal.code/src/com/oracle/graal/code/HexCodeFileDisassemblerProvider.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java
diffstat 2 files changed, 19 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.code/src/com/oracle/graal/code/HexCodeFileDisassemblerProvider.java	Wed Aug 19 16:05:14 2015 -0700
+++ b/graal/com.oracle.graal.code/src/com/oracle/graal/code/HexCodeFileDisassemblerProvider.java	Wed Aug 19 16:11:29 2015 -0700
@@ -22,7 +22,7 @@
  */
 package com.oracle.graal.code;
 
-import java.lang.reflect.*;
+import java.lang.invoke.*;
 import java.util.*;
 
 import jdk.internal.jvmci.code.*;
@@ -115,12 +115,12 @@
      * {@link HexCodeFile}.
      */
     static class HexCodeFileDisTool {
-        static final Method processMethod;
+        static final MethodHandle processMethod;
         static {
-            Method toolMethod = null;
+            MethodHandle toolMethod = null;
             try {
                 Class<?> toolClass = Class.forName("com.oracle.max.hcfdis.HexCodeFileDis", true, ClassLoader.getSystemClassLoader());
-                toolMethod = toolClass.getDeclaredMethod("processEmbeddedString", String.class);
+                toolMethod = MethodHandles.lookup().unreflect(toolClass.getDeclaredMethod("processEmbeddedString", String.class));
             } catch (Exception e) {
                 // Tool not available on the class path
             }
@@ -130,8 +130,8 @@
         public static String tryDisassemble(String hcfEmbeddedString) {
             if (processMethod != null) {
                 try {
-                    return (String) processMethod.invoke(null, hcfEmbeddedString);
-                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+                    return (String) processMethod.invokeExact(hcfEmbeddedString);
+                } catch (Throwable e) {
                     // If the tool is available, for now let's be noisy when it fails
                     throw new InternalError(e);
                 }
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java	Wed Aug 19 16:05:14 2015 -0700
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java	Wed Aug 19 16:11:29 2015 -0700
@@ -224,17 +224,12 @@
         return object instanceof List<?> && ((List<?>) object).size() > 0 && ((List<?>) object).get(0) instanceof AbstractBlockBase<?>;
     }
 
-    private static DisassemblerProvider disassembler;
+    /** Lazy initialization to delay service lookup until disassembler is actually needed. */
+    static class DisassemblerHolder {
+        private static final DisassemblerProvider disassembler;
 
-    private static final DisassemblerProvider NOP_DISASSEMBLER = new DisassemblerProvider() {
-        public String getName() {
-            return null;
-        }
-    };
-
-    private static DisassemblerProvider getDisassembler() {
-        if (disassembler == null) {
-            DisassemblerProvider selected = NOP_DISASSEMBLER;
+        static {
+            DisassemblerProvider selected = null;
             for (DisassemblerProvider d : Services.load(DisassemblerProvider.class)) {
                 String name = d.getName().toLowerCase();
                 if (name.contains("hcf") || name.contains("hexcodefile")) {
@@ -242,13 +237,19 @@
                     break;
                 }
             }
+            if (selected == null) {
+                selected = new DisassemblerProvider() {
+                    public String getName() {
+                        return "nop";
+                    }
+                };
+            }
             disassembler = selected;
         }
-        return disassembler;
     }
 
     private static String disassemble(CodeCacheProvider codeCache, CompilationResult compResult, InstalledCode installedCode) {
-        DisassemblerProvider dis = getDisassembler();
+        DisassemblerProvider dis = DisassemblerHolder.disassembler;
         if (installedCode != null) {
             return dis.disassembleInstalledCode(codeCache, compResult, installedCode);
         }