Mercurial > hg > graal-compiler
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); }