# HG changeset patch # User Lukas Stadler # Date 1302513906 -7200 # Node ID 6190d20bd6d6d09b2de409e5da879e84251fddf2 # Parent 8c426c2891c86efc016c8153d1f53edf8203cee3# Parent f21664b3dd1ccaa46469e7e6711c92b79514cac8 merge diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java Mon Apr 11 11:25:06 2011 +0200 @@ -1,217 +1,33 @@ -/* - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. - * - * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product - * that is described in this document. In particular, and without limitation, these intellectual property - * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or - * more additional patents or pending patent applications in the U.S. and in other countries. - * - * U.S. Government Rights - Commercial software. Government users are subject to the Sun - * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its - * supplements. - * - * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or - * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks - * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the - * U.S. and other countries. - * - * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open - * Company, Ltd. - */ -package com.sun.hotspot.c1x; - -import java.lang.management.*; -import java.lang.reflect.Proxy; -import java.net.*; - -import com.sun.c1x.*; -import com.sun.c1x.target.amd64.*; -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; -import com.sun.cri.xir.*; -import com.sun.hotspot.c1x.logging.*; -import com.sun.hotspot.c1x.server.CompilationServer.ReplacingInputStream; -import com.sun.hotspot.c1x.server.CompilationServer.ReplacingOutputStream; - -/** - * Singleton class holding the instance of the C1XCompiler. - * - * @author Thomas Wuerthinger, Lukas Stadler - */ -public final class Compiler { - - private static Compiler theInstance; - private static boolean PrintGCStats = false; - - public static Compiler getInstance() { - if (theInstance == null) { - theInstance = new Compiler(); - Runtime.getRuntime().addShutdownHook(new ShutdownThread()); - } - return theInstance; - } - - private static VMEntries vmEntries; - - - public static class ShutdownThread extends Thread { - @Override - public void run() { - VMExitsNative.compileMethods = false; - if (C1XOptions.PrintMetrics) { - C1XMetrics.print(); - } - if (C1XOptions.PrintTimers) { - C1XTimers.print(); - } - - if (PrintGCStats) { - printGCStats(); - } - } - } - - public static void printGCStats() { - long totalGarbageCollections = 0; - long garbageCollectionTime = 0; - - for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { - long count = gc.getCollectionCount(); - if (count >= 0) { - totalGarbageCollections += count; - } - - long time = gc.getCollectionTime(); - if (time >= 0) { - garbageCollectionTime += time; - } - } - - System.out.println("Total Garbage Collections: " + totalGarbageCollections); - System.out.println("Total Garbage Collection Time (ms): " + garbageCollectionTime); - } - - public static VMExits initializeServer(VMEntries entries) { - if (Logger.ENABLED) { - vmEntries = LoggingProxy.getProxy(VMEntries.class, entries); - vmExits = LoggingProxy.getProxy(VMExits.class, new VMExitsNative()); - } else { - vmEntries = entries; - vmExits = new VMExitsNative(); - } - return vmExits; - } - - private static VMEntries initializeClient(VMExits exits) { - vmEntries = new VMEntriesNative(); - vmExits = exits; - return vmEntries; - } - - public static VMEntries getVMEntries() { - if (vmEntries == null) { - try { - vmEntries = new VMEntriesNative(); - if (CountingProxy.ENABLED) { - vmEntries = CountingProxy.getProxy(VMEntries.class, vmEntries); - } - if (Logger.ENABLED) { - vmEntries = LoggingProxy.getProxy(VMEntries.class, vmEntries); - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - return vmEntries; - } - - private static VMExits vmExits; - - public static VMExits getVMExits() { - if (vmExits == null) { - String remote = System.getProperty("c1x.remote"); - assert theInstance == null; - assert vmEntries == null; - try { - if (remote != null) { - System.out.println("C1X compiler started in client/server mode, connection to server " + remote); - Socket socket = new Socket(remote, 1199); - ReplacingOutputStream output = new ReplacingOutputStream(socket.getOutputStream()); - ReplacingInputStream input = new ReplacingInputStream(socket.getInputStream()); - - InvocationSocket invocation = new InvocationSocket(output, input); - VMExits exits = (VMExits) Proxy.newProxyInstance(VMExits.class.getClassLoader(), new Class[] {VMExits.class}, invocation); - VMEntries entries = Compiler.initializeClient(exits); - invocation.setDelegate(entries); - } else { - vmExits = new VMExitsNative(); - if (CountingProxy.ENABLED) { - vmExits = CountingProxy.getProxy(VMExits.class, vmExits); - } - if (Logger.ENABLED) { - vmExits = LoggingProxy.getProxy(VMExits.class, vmExits); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - return vmExits; - } - - private final C1XCompiler compiler; - private final HotSpotVMConfig config; - private final HotSpotRuntime runtime; - private final HotSpotRegisterConfig registerConfig; - private final CiTarget target; - private final RiXirGenerator generator; - - private Compiler() { - config = getVMEntries().getConfiguration(); - config.check(); - - runtime = new HotSpotRuntime(config); - final int wordSize = 8; - final int stackFrameAlignment = 16; - registerConfig = runtime.globalStubRegConfig; - target = new HotSpotTarget(new AMD64(), true, wordSize, stackFrameAlignment, config.vmPageSize, wordSize, true); - - if (Logger.ENABLED) { - generator = LoggingProxy.getProxy(RiXirGenerator.class, new HotSpotXirGenerator(config, target, registerConfig)); - } else { - generator = new HotSpotXirGenerator(config, target, registerConfig); - } - compiler = new C1XCompiler(runtime, target, generator, registerConfig); - - // these options are important - c1x4hotspot will not generate correct code without them - C1XOptions.GenSpecialDivChecks = true; - C1XOptions.NullCheckUniquePc = true; - C1XOptions.InvokeSnippetAfterArguments = true; - C1XOptions.StackShadowPages = config.stackShadowPages; - } - - public C1XCompiler getCompiler() { - return compiler; - } - - public HotSpotVMConfig getConfig() { - return config; - } - - public HotSpotRuntime getRuntime() { - return runtime; - } - - public RiRegisterConfig getRegisterConfig() { - return registerConfig; - } - - public CiTarget getTarget() { - return target; - } - - public RiXirGenerator getGenerator() { - return generator; - } - -} +/* + * Copyright (c) 2011 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product + * that is described in this document. In particular, and without limitation, these intellectual property + * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or + * more additional patents or pending patent applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun + * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its + * supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or + * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks + * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the + * U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open + * Company, Ltd. + */ +package com.sun.hotspot.c1x; + +import com.sun.c1x.*; + +public interface Compiler { + + public VMEntries getVMEntries(); + + public VMExits getVMExits(); + + public C1XCompiler getCompiler(); + +} \ No newline at end of file diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerImpl.java Mon Apr 11 11:25:06 2011 +0200 @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2011 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product + * that is described in this document. In particular, and without limitation, these intellectual property + * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or + * more additional patents or pending patent applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun + * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its + * supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or + * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks + * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the + * U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open + * Company, Ltd. + */ +package com.sun.hotspot.c1x; + +import java.io.*; +import java.lang.management.*; +import java.net.*; + +import com.sun.c1x.*; +import com.sun.c1x.target.amd64.*; +import com.sun.cri.xir.*; +import com.sun.hotspot.c1x.logging.*; +import com.sun.hotspot.c1x.server.*; + +/** + * Singleton class holding the instance of the C1XCompiler. + * + * @author Thomas Wuerthinger, Lukas Stadler + */ +public final class CompilerImpl implements Compiler, Remote { + + private static Compiler theInstance; + private static boolean PrintGCStats = false; + + private final VMEntries vmEntries; + private final VMExits vmExits; + + private final C1XCompiler compiler; + + public static Compiler getInstance() { + if (theInstance == null) { + // remote compilation (will not create a C1XCompiler) + String remote = System.getProperty("c1x.remote"); + if (remote != null) { + try { + System.out.println("C1X compiler started in client/server mode, server: " + remote); + Socket socket = new Socket(remote, 1199); + ReplacingStreams streams = new ReplacingStreams(socket.getOutputStream(), socket.getInputStream()); + streams.getInvocation().sendResult(new VMEntriesNative()); + + theInstance = (Compiler) streams.getInvocation().waitForResult(); + } catch (IOException e1) { + System.out.println("Connection to compilation server FAILED."); + throw new RuntimeException(e1); + } catch (ClassNotFoundException e2) { + System.out.println("Connection to compilation server FAILED."); + throw new RuntimeException(e2); + } + } else { + theInstance = new CompilerImpl(null); + Runtime.getRuntime().addShutdownHook(new ShutdownThread()); + } + } + return theInstance; + } + + public static class ShutdownThread extends Thread { + + @Override + public void run() { + VMExitsNative.compileMethods = false; + if (C1XOptions.PrintMetrics) { + C1XMetrics.print(); + } + if (C1XOptions.PrintTimers) { + C1XTimers.print(); + } + if (PrintGCStats) { + printGCStats(); + } + } + } + + public static void printGCStats() { + long totalGarbageCollections = 0; + long garbageCollectionTime = 0; + + for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { + long count = gc.getCollectionCount(); + if (count >= 0) { + totalGarbageCollections += count; + } + + long time = gc.getCollectionTime(); + if (time >= 0) { + garbageCollectionTime += time; + } + } + + System.out.println("Total Garbage Collections: " + totalGarbageCollections); + System.out.println("Total Garbage Collection Time (ms): " + garbageCollectionTime); + } + + public static Compiler initializeServer(VMEntries entries) { + assert theInstance == null; + theInstance = new CompilerImpl(entries); + Runtime.getRuntime().addShutdownHook(new ShutdownThread()); + return theInstance; + } + + @Override + public VMEntries getVMEntries() { + return vmEntries; + } + + @Override + public VMExits getVMExits() { + return vmExits; + } + + private CompilerImpl(VMEntries entries) { + + // initialize VMEntries + if (entries == null) + entries = new VMEntriesNative(); + + // initialize VMExits + VMExits exits = new VMExitsNative(this); + + // logging, etc. + if (CountingProxy.ENABLED) { + exits = CountingProxy.getProxy(VMExits.class, exits); + entries = CountingProxy.getProxy(VMEntries.class, entries); + } + if (Logger.ENABLED) { + exits = LoggingProxy.getProxy(VMExits.class, exits); + entries = LoggingProxy.getProxy(VMEntries.class, entries); + } + + // set the final fields + vmEntries = entries; + vmExits = exits; + + // initialize compiler and C1XOptions + HotSpotVMConfig config = vmEntries.getConfiguration(); + config.check(); + + // these options are important - c1x4hotspot will not generate correct code without them + C1XOptions.GenSpecialDivChecks = true; + C1XOptions.NullCheckUniquePc = true; + C1XOptions.InvokeSnippetAfterArguments = true; + C1XOptions.StackShadowPages = config.stackShadowPages; + + HotSpotRuntime runtime = new HotSpotRuntime(config, this); + HotSpotRegisterConfig registerConfig = runtime.globalStubRegConfig; + + final int wordSize = 8; + final int stackFrameAlignment = 16; + HotSpotTarget target = new HotSpotTarget(new AMD64(), true, wordSize, stackFrameAlignment, config.vmPageSize, wordSize, true); + + RiXirGenerator generator = new HotSpotXirGenerator(config, target, registerConfig, this); + if (Logger.ENABLED) { + generator = LoggingProxy.getProxy(RiXirGenerator.class, generator); + } + compiler = new C1XCompiler(runtime, target, generator, registerConfig); + } + + @Override + public C1XCompiler getCompiler() { + return compiler; + } + +} diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerObject.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerObject.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/CompilerObject.java Mon Apr 11 11:25:06 2011 +0200 @@ -29,4 +29,10 @@ * @author Lukas Stadler */ public abstract class CompilerObject implements Serializable { + protected final Compiler compiler; + + protected CompilerObject(Compiler compiler) { + this.compiler = compiler; + } + } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.java Mon Apr 11 11:25:06 2011 +0200 @@ -20,6 +20,7 @@ */ package com.sun.hotspot.c1x; +import java.io.*; import java.util.*; import com.sun.cri.ri.*; @@ -37,7 +38,7 @@ private final FastLRUIntCache fieldCache = new FastLRUIntCache(); private final FastLRUIntCache typeCache = new FastLRUIntCache(); - public static class FastLRUIntCache { + public static class FastLRUIntCache implements Serializable { private static final int InitialCapacity = 4; private int lastKey; @@ -96,26 +97,27 @@ } } - public HotSpotConstantPool(long vmId) { + public HotSpotConstantPool(Compiler compiler, long vmId) { + super(compiler); this.vmId = vmId; } @Override public Object lookupConstant(int cpi) { - Object constant = Compiler.getVMEntries().RiConstantPool_lookupConstant(vmId, cpi); + Object constant = compiler.getVMEntries().RiConstantPool_lookupConstant(vmId, cpi); return constant; } @Override public RiSignature lookupSignature(int cpi) { - return Compiler.getVMEntries().RiConstantPool_lookupSignature(vmId, cpi); + return compiler.getVMEntries().RiConstantPool_lookupSignature(vmId, cpi); } @Override public RiMethod lookupMethod(int cpi, int byteCode) { RiMethod result = methodCache.get(cpi); if (result == null) { - result = Compiler.getVMEntries().RiConstantPool_lookupMethod(vmId, cpi, (byte) byteCode); + result = compiler.getVMEntries().RiConstantPool_lookupMethod(vmId, cpi, (byte) byteCode); methodCache.add(cpi, result); } return result; @@ -125,7 +127,7 @@ public RiType lookupType(int cpi, int opcode) { RiType result = typeCache.get(cpi); if (result == null) { - result = Compiler.getVMEntries().RiConstantPool_lookupType(vmId, cpi); + result = compiler.getVMEntries().RiConstantPool_lookupType(vmId, cpi); typeCache.add(cpi, result); } return result; @@ -135,7 +137,7 @@ public RiField lookupField(int cpi, int opcode) { RiField result = fieldCache.get(cpi); if (result == null) { - result = Compiler.getVMEntries().RiConstantPool_lookupField(vmId, cpi, (byte) opcode); + result = compiler.getVMEntries().RiConstantPool_lookupField(vmId, cpi, (byte) opcode); fieldCache.add(cpi, result); } return result; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotExceptionHandler.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotExceptionHandler.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotExceptionHandler.java Mon Apr 11 11:25:06 2011 +0200 @@ -30,6 +30,10 @@ private int catchClassIndex; private RiType catchClass; + public HotSpotExceptionHandler() { + super(null); + } + @Override public int startBCI() { return startBci; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java Mon Apr 11 11:25:06 2011 +0200 @@ -42,7 +42,8 @@ private final int offset; private CiConstant constant; - public HotSpotField(RiType holder, String name, RiType type, int offset) { + public HotSpotField(Compiler compiler, RiType holder, String name, RiType type, int offset) { + super(compiler); this.holder = holder; this.name = name; this.type = type; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java Mon Apr 11 11:25:06 2011 +0200 @@ -28,6 +28,10 @@ protected RiType holder; protected String name; + protected HotSpotMethod(Compiler compiler) { + super(compiler); + } + @Override public final RiType holder() { return holder; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java Mon Apr 11 11:25:06 2011 +0200 @@ -43,16 +43,17 @@ private RiSignature signature; private Boolean hasBalancedMonitors; - public HotSpotMethodResolved(long vmId, String name) { + public HotSpotMethodResolved(Compiler compiler, long vmId, String name) { + super(compiler); this.vmId = vmId; this.name = name; - this.holder = Compiler.getVMEntries().RiMethod_holder(vmId); + this.holder = compiler.getVMEntries().RiMethod_holder(vmId); } @Override public int accessFlags() { if (accessFlags == -1) { - accessFlags = Compiler.getVMEntries().RiMethod_accessFlags(vmId); + accessFlags = compiler.getVMEntries().RiMethod_accessFlags(vmId); } return accessFlags; } @@ -65,7 +66,7 @@ @Override public byte[] code() { if (code == null) { - code = Compiler.getVMEntries().RiMethod_code(vmId); + code = compiler.getVMEntries().RiMethod_code(vmId); } return code; } @@ -73,7 +74,7 @@ @Override public RiExceptionHandler[] exceptionHandlers() { if (exceptionHandlers == null) { - exceptionHandlers = Compiler.getVMEntries().RiMethod_exceptionHandlers(vmId); + exceptionHandlers = compiler.getVMEntries().RiMethod_exceptionHandlers(vmId); } return exceptionHandlers; } @@ -81,7 +82,7 @@ @Override public boolean hasBalancedMonitors() { if (hasBalancedMonitors == null) { - hasBalancedMonitors = Compiler.getVMEntries().RiMethod_hasBalancedMonitors(vmId); + hasBalancedMonitors = compiler.getVMEntries().RiMethod_hasBalancedMonitors(vmId); } return hasBalancedMonitors; } @@ -128,7 +129,7 @@ @Override public int maxLocals() { if (maxLocals == -1) { - maxLocals = Compiler.getVMEntries().RiMethod_maxLocals(vmId); + maxLocals = compiler.getVMEntries().RiMethod_maxLocals(vmId); } return maxLocals; } @@ -136,7 +137,7 @@ @Override public int maxStackSize() { if (maxStackSize == -1) { - maxStackSize = Compiler.getVMEntries().RiMethod_maxStackSize(vmId); + maxStackSize = compiler.getVMEntries().RiMethod_maxStackSize(vmId); } return maxStackSize; } @@ -153,13 +154,13 @@ @Override public RiMethod uniqueConcreteMethod() { - return Compiler.getVMEntries().RiMethod_uniqueConcreteMethod(vmId); + return compiler.getVMEntries().RiMethod_uniqueConcreteMethod(vmId); } @Override public RiSignature signature() { if (signature == null) { - signature = new HotSpotSignature(Compiler.getVMEntries().RiMethod_signature(vmId)); + signature = new HotSpotSignature(compiler, compiler.getVMEntries().RiMethod_signature(vmId)); } return signature; } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java Mon Apr 11 11:25:06 2011 +0200 @@ -31,10 +31,11 @@ public final class HotSpotMethodUnresolved extends HotSpotMethod { private final RiSignature signature; - public HotSpotMethodUnresolved(String name, String signature, RiType holder) { + public HotSpotMethodUnresolved(Compiler compiler, String name, String signature, RiType holder) { + super(compiler); this.name = name; this.holder = holder; - this.signature = new HotSpotSignature(signature); + this.signature = new HotSpotSignature(compiler, signature); } @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java Mon Apr 11 11:25:06 2011 +0200 @@ -42,10 +42,12 @@ final HotSpotVMConfig config; final HotSpotRegisterConfig regConfig; final HotSpotRegisterConfig globalStubRegConfig; + private final Compiler compiler; - public HotSpotRuntime(HotSpotVMConfig config) { + public HotSpotRuntime(HotSpotVMConfig config, Compiler compiler) { this.config = config; + this.compiler = compiler; regConfig = new HotSpotRegisterConfig(config, false); globalStubRegConfig = new HotSpotRegisterConfig(config, true); } @@ -141,7 +143,7 @@ @Override public RiType getRiType(Class javaClass) { assert javaClass != null; - return Compiler.getVMEntries().getType(javaClass); + return compiler.getVMEntries().getType(javaClass); } @Override @@ -183,7 +185,7 @@ @Override public Object registerGlobalStub(CiTargetMethod targetMethod, String name) { - return HotSpotTargetMethod.installStub(targetMethod, name); + return HotSpotTargetMethod.installStub(compiler, targetMethod, name); } @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java Mon Apr 11 11:25:06 2011 +0200 @@ -38,7 +38,8 @@ private RiType[] argumentTypes; private RiType returnTypeCache; - public HotSpotSignature(String signature) { + public HotSpotSignature(Compiler compiler, String signature) { + super(compiler); assert signature.length() > 0; this.originalString = signature; @@ -116,7 +117,7 @@ } RiType type = argumentTypes[index]; if (type == null) { - type = Compiler.getVMEntries().RiSignature_lookupType(arguments.get(index), (HotSpotTypeResolved) accessingClass); + type = compiler.getVMEntries().RiSignature_lookupType(arguments.get(index), (HotSpotTypeResolved) accessingClass); argumentTypes[index] = type; } return type; @@ -135,7 +136,7 @@ @Override public RiType returnType(RiType accessingClass) { if (returnTypeCache == null) { - returnTypeCache = Compiler.getVMEntries().RiSignature_lookupType(returnType, (HotSpotTypeResolved) accessingClass); + returnTypeCache = compiler.getVMEntries().RiSignature_lookupType(returnType, (HotSpotTypeResolved) accessingClass); } return returnTypeCache; } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Mon Apr 11 11:25:06 2011 +0200 @@ -40,7 +40,8 @@ public final Site[] sites; public final ExceptionHandler[] exceptionHandlers; - private HotSpotTargetMethod(HotSpotMethodResolved method, CiTargetMethod targetMethod) { + private HotSpotTargetMethod(Compiler compiler, HotSpotMethodResolved method, CiTargetMethod targetMethod) { + super(compiler); this.method = method; this.targetMethod = targetMethod; this.name = null; @@ -53,7 +54,8 @@ } } - private HotSpotTargetMethod(CiTargetMethod targetMethod, String name) { + private HotSpotTargetMethod(Compiler compiler, CiTargetMethod targetMethod, String name) { + super(compiler); this.method = null; this.targetMethod = targetMethod; this.name = name; @@ -93,12 +95,12 @@ return result; } - public static void installMethod(HotSpotMethodResolved method, CiTargetMethod targetMethod) { - Compiler.getVMEntries().installMethod(new HotSpotTargetMethod(method, targetMethod)); + public static void installMethod(Compiler compiler, HotSpotMethodResolved method, CiTargetMethod targetMethod) { + compiler.getVMEntries().installMethod(new HotSpotTargetMethod(compiler, method, targetMethod)); } - public static Object installStub(CiTargetMethod targetMethod, String name) { - return Compiler.getVMEntries().installStub(new HotSpotTargetMethod(targetMethod, name)); + public static Object installStub(Compiler compiler, CiTargetMethod targetMethod, String name) { + return compiler.getVMEntries().installStub(new HotSpotTargetMethod(compiler, targetMethod, name)); } } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.java Mon Apr 11 11:25:06 2011 +0200 @@ -30,6 +30,10 @@ public abstract class HotSpotType extends CompilerObject implements RiType { protected String name; + protected HotSpotType(Compiler compiler) { + super(compiler); + } + @Override public final String name() { return name; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java Mon Apr 11 11:25:06 2011 +0200 @@ -33,17 +33,9 @@ private CiKind kind; - public static final HotSpotTypePrimitive Boolean = new HotSpotTypePrimitive(CiKind.Boolean); - public static final HotSpotTypePrimitive Char = new HotSpotTypePrimitive(CiKind.Char); - public static final HotSpotTypePrimitive Float = new HotSpotTypePrimitive(CiKind.Float); - public static final HotSpotTypePrimitive Double = new HotSpotTypePrimitive(CiKind.Double); - public static final HotSpotTypePrimitive Byte = new HotSpotTypePrimitive(CiKind.Byte); - public static final HotSpotTypePrimitive Short = new HotSpotTypePrimitive(CiKind.Short); - public static final HotSpotTypePrimitive Int = new HotSpotTypePrimitive(CiKind.Int); - public static final HotSpotTypePrimitive Long = new HotSpotTypePrimitive(CiKind.Long); - public static final HotSpotTypePrimitive Void = new HotSpotTypePrimitive(CiKind.Void); - private HotSpotTypePrimitive(CiKind kind) { + HotSpotTypePrimitive(Compiler compiler, CiKind kind) { + super(compiler); this.kind = kind; this.name = kind.toString(); } @@ -55,7 +47,7 @@ @Override public RiType arrayOf() { - return Compiler.getVMEntries().getPrimitiveArrayType(kind); + return compiler.getVMEntries().getPrimitiveArrayType(kind); } @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java Mon Apr 11 11:25:06 2011 +0200 @@ -1,202 +1,36 @@ -/* - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. - * - * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product - * that is described in this document. In particular, and without limitation, these intellectual property - * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or - * more additional patents or pending patent applications in the U.S. and in other countries. - * - * U.S. Government Rights - Commercial software. Government users are subject to the Sun - * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its - * supplements. - * - * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or - * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks - * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the - * U.S. and other countries. - * - * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open - * Company, Ltd. - */ -package com.sun.hotspot.c1x; - -import java.lang.reflect.*; -import java.util.*; - -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; - -/** - * Implementation of RiType for resolved non-primitive HotSpot classes. - * - * @author Thomas Wuerthinger, Lukas Stadler - */ -public class HotSpotTypeResolved extends HotSpotType { - - private Class javaMirror; - private String simpleName; - private int accessFlags; - private boolean hasFinalizer; - private boolean hasSubclass; - private boolean hasFinalizableSubclass; - private boolean isInitialized; - private boolean isArrayClass; - private boolean isInstanceClass; - private boolean isInterface; - private int instanceSize; - private RiType componentType; - private HashMap fieldCache; - private RiConstantPool pool; - - @Override - public int accessFlags() { - return accessFlags; - } - - @Override - public RiType arrayOf() { - return Compiler.getVMEntries().RiType_arrayOf(this); - } - - @Override - public RiType componentType() { - return Compiler.getVMEntries().RiType_componentType(this); - } - - @Override - public RiType uniqueConcreteSubtype() { - return Compiler.getVMEntries().RiType_uniqueConcreteSubtype(this); - } - - @Override - public RiType exactType() { - if (Modifier.isFinal(accessFlags)) { - return this; - } - return null; - } - - @Override - public CiConstant getEncoding(Representation r) { - switch (r) { - case JavaClass: - return CiConstant.forObject(javaClass()); - case ObjectHub: - return CiConstant.forObject(this); - case StaticFields: - return CiConstant.forObject(this); - case TypeInfo: - return CiConstant.forObject(this); - default: - return null; - } - } - - @Override - public CiKind getRepresentationKind(Representation r) { - return CiKind.Object; - } - - @Override - public boolean hasFinalizableSubclass() { - return hasFinalizableSubclass; - } - - @Override - public boolean hasFinalizer() { - return hasFinalizer; - } - - @Override - public boolean hasSubclass() { - return hasSubclass; - } - - @Override - public boolean isArrayClass() { - return isArrayClass; - } - - @Override - public boolean isInitialized() { - return isInitialized; - } - - @Override - public boolean isInstance(CiConstant obj) { - return javaMirror.isInstance(obj); - } - - @Override - public boolean isInstanceClass() { - return isInstanceClass; - } - - @Override - public boolean isInterface() { - return isInterface; - } - - @Override - public boolean isResolved() { - return true; - } - - @Override - public boolean isSubtypeOf(RiType other) { - if (other instanceof HotSpotTypeResolved) { - return Compiler.getVMEntries().RiType_isSubtypeOf(this, other); - } - // No resolved type is a subtype of an unresolved type. - return false; - } - - @Override - public Class javaClass() { - return javaMirror; - } - - @Override - public CiKind kind() { - return CiKind.Object; - } - - @Override - public RiMethod resolveMethodImpl(RiMethod method) { - assert method instanceof HotSpotMethod; - return Compiler.getVMEntries().RiType_resolveMethodImpl(this, method.name(), method.signature().asString()); - } - - @Override - public String toString() { - return "HotSpotType<" + simpleName + ", resolved>"; - } - - public RiConstantPool constantPool() { - // TODO: Implement constant pool without the need for VmId and cache the constant pool. - return Compiler.getVMEntries().RiType_constantPool(this); - } - - public int instanceSize() { - return instanceSize; - } - - public RiField createRiField(String name, RiType type, int offset) { - RiField result = null; - - // (tw) Must cache the fields, because the local load elimination only works if the objects from two field lookups are equal. - if (fieldCache == null) { - fieldCache = new HashMap(8); - } else { - result = fieldCache.get(offset); - } - - if (result == null) { - result = new HotSpotField(this, name, type, offset); - fieldCache.put(offset, result); - } - - return result; - } - -} +/* + * Copyright (c) 2011 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product + * that is described in this document. In particular, and without limitation, these intellectual property + * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or + * more additional patents or pending patent applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun + * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its + * supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or + * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks + * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the + * U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open + * Company, Ltd. + */ +package com.sun.hotspot.c1x; + +import com.sun.cri.ri.*; +import com.sun.hotspot.c1x.server.*; + +public interface HotSpotTypeResolved extends RiType, Remote { + + public String toString(); + + public RiConstantPool constantPool(); + + public int instanceSize(); + + public RiField createRiField(String name, RiType type, int offset); + +} \ No newline at end of file diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolvedImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolvedImpl.java Mon Apr 11 11:25:06 2011 +0200 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product + * that is described in this document. In particular, and without limitation, these intellectual property + * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or + * more additional patents or pending patent applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun + * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its + * supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or + * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks + * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the + * U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open + * Company, Ltd. + */ +package com.sun.hotspot.c1x; + +import java.lang.reflect.*; +import java.util.*; + +import com.sun.cri.ci.*; +import com.sun.cri.ri.*; + +/** + * Implementation of RiType for resolved non-primitive HotSpot classes. + * + * @author Thomas Wuerthinger, Lukas Stadler + */ +public class HotSpotTypeResolvedImpl extends HotSpotType implements HotSpotTypeResolved { + + private Class javaMirror; + private String simpleName; + private int accessFlags; + private boolean hasFinalizer; + private boolean hasSubclass; + private boolean hasFinalizableSubclass; + private boolean isInitialized; + private boolean isArrayClass; + private boolean isInstanceClass; + private boolean isInterface; + private int instanceSize; + private RiType componentType; + private HashMap fieldCache; + private RiConstantPool pool; + + private HotSpotTypeResolvedImpl() { + super(null); + } + + @Override + public int accessFlags() { + return accessFlags; + } + + @Override + public RiType arrayOf() { + return compiler.getVMEntries().RiType_arrayOf(this); + } + + @Override + public RiType componentType() { + return compiler.getVMEntries().RiType_componentType(this); + } + + @Override + public RiType uniqueConcreteSubtype() { + return compiler.getVMEntries().RiType_uniqueConcreteSubtype(this); + } + + @Override + public RiType exactType() { + if (Modifier.isFinal(accessFlags)) { + return this; + } + return null; + } + + @Override + public CiConstant getEncoding(Representation r) { + switch (r) { + case JavaClass: + return CiConstant.forObject(javaClass()); + case ObjectHub: + return CiConstant.forObject(this); + case StaticFields: + return CiConstant.forObject(this); + case TypeInfo: + return CiConstant.forObject(this); + default: + return null; + } + } + + @Override + public CiKind getRepresentationKind(Representation r) { + return CiKind.Object; + } + + @Override + public boolean hasFinalizableSubclass() { + return hasFinalizableSubclass; + } + + @Override + public boolean hasFinalizer() { + return hasFinalizer; + } + + @Override + public boolean hasSubclass() { + return hasSubclass; + } + + @Override + public boolean isArrayClass() { + return isArrayClass; + } + + @Override + public boolean isInitialized() { + return isInitialized; + } + + @Override + public boolean isInstance(CiConstant obj) { + return javaMirror.isInstance(obj); + } + + @Override + public boolean isInstanceClass() { + return isInstanceClass; + } + + @Override + public boolean isInterface() { + return isInterface; + } + + @Override + public boolean isResolved() { + return true; + } + + @Override + public boolean isSubtypeOf(RiType other) { + if (other instanceof HotSpotTypeResolved) { + return compiler.getVMEntries().RiType_isSubtypeOf(this, other); + } + // No resolved type is a subtype of an unresolved type. + return false; + } + + @Override + public Class javaClass() { + return javaMirror; + } + + @Override + public CiKind kind() { + return CiKind.Object; + } + + @Override + public RiMethod resolveMethodImpl(RiMethod method) { + assert method instanceof HotSpotMethod; + return compiler.getVMEntries().RiType_resolveMethodImpl(this, method.name(), method.signature().asString()); + } + + @Override + public String toString() { + return "HotSpotType<" + simpleName + ", resolved>"; + } + + @Override + public RiConstantPool constantPool() { + // TODO: Implement constant pool without the need for VmId and cache the constant pool. + return compiler.getVMEntries().RiType_constantPool(this); + } + + @Override + public int instanceSize() { + return instanceSize; + } + + @Override + public RiField createRiField(String name, RiType type, int offset) { + RiField result = null; + + // (tw) Must cache the fields, because the local load elimination only works if the objects from two field lookups are equal. + if (fieldCache == null) { + fieldCache = new HashMap(8); + } else { + result = fieldCache.get(offset); + } + + if (result == null) { + result = new HotSpotField(compiler, this, name, type, offset); + fieldCache.put(offset, result); + } + + return result; + } + +} diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java Mon Apr 11 11:25:06 2011 +0200 @@ -36,7 +36,8 @@ /** * Creates a new unresolved type for a specified type descriptor. */ - public HotSpotTypeUnresolved(String name) { + public HotSpotTypeUnresolved(Compiler compiler, String name) { + super(compiler); assert name.length() > 0 : "name cannot be empty"; int dimensions = 0; @@ -58,7 +59,8 @@ this.dimensions = dimensions; } - public HotSpotTypeUnresolved(String name, int dimensions) { + public HotSpotTypeUnresolved(Compiler compiler, String name, int dimensions) { + super(compiler); assert dimensions >= 0; this.simpleName = name; this.dimensions = dimensions; @@ -142,7 +144,7 @@ @Override public RiType componentType() { assert isArrayClass() : "no array class" + name(); - return new HotSpotTypeUnresolved(simpleName, dimensions - 1); + return new HotSpotTypeUnresolved(compiler, simpleName, dimensions - 1); } @Override @@ -152,7 +154,7 @@ @Override public RiType arrayOf() { - return new HotSpotTypeUnresolved(simpleName, dimensions + 1); + return new HotSpotTypeUnresolved(compiler, simpleName, dimensions + 1); } @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotVMConfig.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotVMConfig.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotVMConfig.java Mon Apr 11 11:25:06 2011 +0200 @@ -29,6 +29,10 @@ */ public class HotSpotVMConfig extends CompilerObject { + private HotSpotVMConfig() { + super(null); + } + // os information, register layout, code generation, ... public boolean windowsOs; public int codeEntryAlignment; diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java Mon Apr 11 11:25:06 2011 +0200 @@ -72,13 +72,15 @@ private final HotSpotVMConfig config; private final CiTarget target; private final RiRegisterConfig registerConfig; + private final Compiler compiler; private CiXirAssembler asm; - public HotSpotXirGenerator(HotSpotVMConfig config, CiTarget target, RiRegisterConfig registerConfig) { + public HotSpotXirGenerator(HotSpotVMConfig config, CiTarget target, RiRegisterConfig registerConfig, Compiler compiler) { this.config = config; this.target = target; this.registerConfig = registerConfig; + this.compiler = compiler; } private SimpleTemplates prologueTemplates = new SimpleTemplates(STATIC_METHOD) { @@ -336,8 +338,8 @@ } }; - private static CiRegister getGeneralParameterRegister(int index) { - return Compiler.getInstance().getRegisterConfig().getCallingConventionRegisters(CiCallingConvention.Type.RuntimeCall, RegisterFlag.CPU)[index]; + private CiRegister getGeneralParameterRegister(int index) { + return registerConfig.getCallingConventionRegisters(CiCallingConvention.Type.RuntimeCall, RegisterFlag.CPU)[index]; } private SimpleTemplates monitorExitTemplates = new SimpleTemplates(NULL_CHECK) { @@ -1144,7 +1146,7 @@ @Override public XirSnippet genResolveClass(XirSite site, RiType type, Representation rep) { assert rep == Representation.ObjectHub || rep == Representation.StaticFields || rep == Representation.JavaClass : "unexpected representation: " + rep; - if (type instanceof HotSpotTypeResolved) { + if (type.isResolved()) { return new XirSnippet(resolveClassTemplates.get(site), XirArgument.forObject(type)); } return new XirSnippet(resolveClassTemplates.get(site, UNRESOLVED)); @@ -1224,7 +1226,7 @@ @Override public XirSnippet genNewInstance(XirSite site, RiType type) { - if (type instanceof HotSpotTypeResolved) { + if (type.isResolved()) { int instanceSize = ((HotSpotTypeResolved) type).instanceSize(); return new XirSnippet(newInstanceTemplates.get(site, instanceSize), XirArgument.forObject(type)); } @@ -1234,13 +1236,13 @@ @Override public XirSnippet genNewArray(XirSite site, XirArgument length, CiKind elementKind, RiType componentType, RiType arrayType) { if (elementKind == CiKind.Object) { - if (arrayType instanceof HotSpotTypeResolved) { + if (arrayType.isResolved()) { return new XirSnippet(newObjectArrayTemplates.get(site), length, XirArgument.forObject(arrayType)); } return new XirSnippet(newObjectArrayTemplates.get(site, UNRESOLVED), length); } assert arrayType == null; - arrayType = Compiler.getVMEntries().getPrimitiveArrayType(elementKind); + arrayType = compiler.getVMEntries().getPrimitiveArrayType(elementKind); return new XirSnippet(newTypeArrayTemplates.get(site, elementKind), length, XirArgument.forObject(arrayType)); } @@ -1251,7 +1253,7 @@ @Override public XirSnippet genNewMultiArray(XirSite site, XirArgument[] lengths, RiType type) { - if (type instanceof HotSpotTypeResolved) { + if (type.isResolved()) { XirArgument[] params = Arrays.copyOf(lengths, lengths.length + 1); params[lengths.length] = XirArgument.forObject(type); return new XirSnippet(multiNewArrayTemplate.get(site, lengths.length), params); diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/InvocationSocket.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/InvocationSocket.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/InvocationSocket.java Mon Apr 11 11:25:06 2011 +0200 @@ -34,27 +34,24 @@ * * @author Lukas Stadler */ -public class InvocationSocket implements InvocationHandler { +public class InvocationSocket { private final ObjectOutputStream output; private final ObjectInputStream input; - private Object delegate; public InvocationSocket(ObjectOutputStream output, ObjectInputStream input) { this.output = output; this.input = input; } - public void setDelegate(Object delegate) { - this.delegate = delegate; - } - private static class Invocation implements Serializable { + public Object receiver; public String methodName; public Object[] args; - public Invocation(String methodName, Object[] args) { + public Invocation(Object receiver, String methodName, Object[] args) { + this.receiver = receiver; this.methodName = methodName; this.args = args; } @@ -69,18 +66,29 @@ } } - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try { - Logger.startScope("invoking remote " + method.getName()); - output.writeObject(new Invocation(method.getName(), args)); - output.flush(); - return waitForResult(); - } catch (Throwable t) { - t.printStackTrace(); - throw t; - } finally { - Logger.endScope(""); + public class Handler implements InvocationHandler { + private Object receiver; + + public Handler(Object receiver) { + this.receiver = receiver; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (!method.getDeclaringClass().isInterface()) { + return method.invoke(receiver, args); + } + try { + Logger.startScope("invoking remote " + method.getName()); + output.writeObject(new Invocation(receiver, method.getName(), args)); + output.flush(); + return waitForResult(); + } catch (Throwable t) { + t.printStackTrace(); + throw t; + } finally { + Logger.endScope(""); + } } } @@ -97,10 +105,12 @@ Invocation invoke = (Invocation) in; Method method = null; - for (Method m : delegate.getClass().getDeclaredMethods()) { - if (invoke.methodName.equals(m.getName())) { - method = m; - break; + for (Class clazz = invoke.receiver.getClass(); clazz != null; clazz = clazz.getSuperclass()) { + for (Method m : clazz.getDeclaredMethods()) { + if (invoke.methodName.equals(m.getName())) { + method = m; + break; + } } } if (method == null) { @@ -111,11 +121,21 @@ } else { Object result; try { - Logger.startScope("invoking local " + invoke.methodName); if (invoke.args == null) { - result = method.invoke(delegate); + Logger.startScope("invoking local " + invoke.methodName); + result = method.invoke(invoke.receiver); } else { - result = method.invoke(delegate, invoke.args); + if (Logger.ENABLED) { + StringBuilder str = new StringBuilder(); + str.append("invoking local " + invoke.methodName + "("); + for (int i = 0; i < invoke.args.length; i++) { + str.append(i == 0 ? "" : ", "); + str.append(Logger.pretty(invoke.args[i])); + } + str.append(")"); + Logger.startScope(str.toString()); + } + result = method.invoke(invoke.receiver, invoke.args); } result = new Result(result); } catch (IllegalArgumentException e) { @@ -139,4 +159,9 @@ } } + public void sendResult(Object obj) throws IOException { + output.writeObject(new Result(obj)); + output.flush(); + } + } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Mon Apr 11 11:25:06 2011 +0200 @@ -23,13 +23,14 @@ import com.sun.cri.ci.*; import com.sun.cri.ri.*; +import com.sun.hotspot.c1x.server.*; /** * Entries into the HotSpot VM from Java code. * * @author Thomas Wuerthinger, Lukas Stadler */ -public class VMEntriesNative implements VMEntries { +public class VMEntriesNative implements VMEntries, Remote { // Checkstyle: stop @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java Mon Apr 11 11:25:06 2011 +0200 @@ -30,17 +30,44 @@ import com.sun.cri.ci.*; import com.sun.cri.ri.*; import com.sun.hotspot.c1x.logging.*; +import com.sun.hotspot.c1x.server.*; /** * Exits from the HotSpot VM into Java code. * * @author Thomas Wuerthinger, Lukas Stadler */ -public class VMExitsNative implements VMExits { +public class VMExitsNative implements VMExits, Remote { public static final boolean LogCompiledMethods = false; public static boolean compileMethods = true; + private final Compiler compiler; + + public final HotSpotTypePrimitive TypeBoolean; + public final HotSpotTypePrimitive TypeChar; + public final HotSpotTypePrimitive TypeFloat; + public final HotSpotTypePrimitive TypeDouble; + public final HotSpotTypePrimitive TypeByte; + public final HotSpotTypePrimitive TypeShort; + public final HotSpotTypePrimitive TypeInt; + public final HotSpotTypePrimitive TypeLong; + public final HotSpotTypePrimitive TypeVoid; + + public VMExitsNative(Compiler compiler) { + this.compiler = compiler; + + TypeBoolean = new HotSpotTypePrimitive(compiler, CiKind.Boolean); + TypeChar = new HotSpotTypePrimitive(compiler, CiKind.Char); + TypeFloat = new HotSpotTypePrimitive(compiler, CiKind.Float); + TypeDouble = new HotSpotTypePrimitive(compiler, CiKind.Double); + TypeByte = new HotSpotTypePrimitive(compiler, CiKind.Byte); + TypeShort = new HotSpotTypePrimitive(compiler, CiKind.Short); + TypeInt = new HotSpotTypePrimitive(compiler, CiKind.Int); + TypeLong = new HotSpotTypePrimitive(compiler, CiKind.Long); + TypeVoid = new HotSpotTypePrimitive(compiler, CiKind.Void); + } + /** * Default option configuration for C1X. */ @@ -127,8 +154,7 @@ } try { - Compiler compiler = Compiler.getInstance(); - HotSpotMethodResolved riMethod = new HotSpotMethodResolved(methodVmId, name); + HotSpotMethodResolved riMethod = new HotSpotMethodResolved(compiler, methodVmId, name); CiResult result = compiler.getCompiler().compileMethod(riMethod, -1, null, null); if (LogCompiledMethods) { String qualifiedName = CiUtil.toJavaName(riMethod.holder()) + "::" + riMethod.name(); @@ -156,9 +182,9 @@ if (cause != null) { s = cause.getMessage(); } - Compiler.getVMEntries().recordBailout(s); + compiler.getVMEntries().recordBailout(s); } else { - HotSpotTargetMethod.installMethod(riMethod, result.targetMethod()); + HotSpotTargetMethod.installMethod(compiler, riMethod, result.targetMethod()); } } catch (Throwable t) { StringWriter out = new StringWriter(); @@ -170,17 +196,17 @@ @Override public RiMethod createRiMethodResolved(long vmId, String name) { - return new HotSpotMethodResolved(vmId, name); + return new HotSpotMethodResolved(compiler, vmId, name); } @Override public RiMethod createRiMethodUnresolved(String name, String signature, RiType holder) { - return new HotSpotMethodUnresolved(name, signature, holder); + return new HotSpotMethodUnresolved(compiler, name, signature, holder); } @Override public RiSignature createRiSignature(String signature) { - return new HotSpotSignature(signature); + return new HotSpotSignature(compiler, signature); } @Override @@ -189,7 +215,7 @@ HotSpotTypeResolved resolved = (HotSpotTypeResolved) holder; return resolved.createRiField(name, type, offset); } - return new HotSpotField(holder, name, type, offset); + return new HotSpotField(compiler, holder, name, type, offset); } @Override @@ -201,23 +227,23 @@ public RiType createRiTypePrimitive(int basicType) { switch (basicType) { case 4: - return HotSpotTypePrimitive.Boolean; + return TypeBoolean; case 5: - return HotSpotTypePrimitive.Char; + return TypeChar; case 6: - return HotSpotTypePrimitive.Float; + return TypeFloat; case 7: - return HotSpotTypePrimitive.Double; + return TypeDouble; case 8: - return HotSpotTypePrimitive.Byte; + return TypeByte; case 9: - return HotSpotTypePrimitive.Short; + return TypeShort; case 10: - return HotSpotTypePrimitive.Int; + return TypeInt; case 11: - return HotSpotTypePrimitive.Long; + return TypeLong; case 14: - return HotSpotTypePrimitive.Void; + return TypeVoid; default: throw new IllegalArgumentException("Unknown basic type: " + basicType); } @@ -225,12 +251,12 @@ @Override public RiType createRiTypeUnresolved(String name) { - return new HotSpotTypeUnresolved(name); + return new HotSpotTypeUnresolved(compiler, name); } @Override public RiConstantPool createRiConstantPool(long vmId) { - return new HotSpotConstantPool(vmId); + return new HotSpotConstantPool(compiler, vmId); } @Override diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/CountingProxy.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/CountingProxy.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/CountingProxy.java Mon Apr 11 11:25:06 2011 +0200 @@ -23,6 +23,8 @@ import java.lang.reflect.*; import java.util.*; +import com.sun.hotspot.c1x.server.*; + /** * A java.lang.reflect proxy that hierarchically logs all method invocations along with their parameters and return * values. @@ -66,7 +68,8 @@ } public static T getProxy(Class interf, T delegate) { - Object obj = Proxy.newProxyInstance(interf.getClassLoader(), new Class[] {interf}, new CountingProxy(delegate)); + Class[] interfaces = ReplacingStreams.getAllInterfaces(delegate.getClass()); + Object obj = Proxy.newProxyInstance(interf.getClassLoader(), interfaces, new CountingProxy(delegate)); return interf.cast(obj); } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/LoggingProxy.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/LoggingProxy.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/logging/LoggingProxy.java Mon Apr 11 11:25:06 2011 +0200 @@ -22,6 +22,8 @@ import java.lang.reflect.*; +import com.sun.hotspot.c1x.server.*; + /** * A java.lang.reflect proxy that hierarchically logs all method invocations along with their parameters and return values. * @@ -64,8 +66,12 @@ return result; } + /** + * The object returned by this method will implement all interfaces that are implemented by delegate. + */ public static T getProxy(Class interf, T delegate) { - Object obj = Proxy.newProxyInstance(interf.getClassLoader(), new Class[] {interf}, new LoggingProxy(delegate)); + Class[] interfaces = ReplacingStreams.getAllInterfaces(delegate.getClass()); + Object obj = Proxy.newProxyInstance(interf.getClassLoader(), interfaces, new LoggingProxy(delegate)); return interf.cast(obj); } } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/CompilationServer.java Mon Apr 11 11:25:06 2011 +0200 @@ -21,14 +21,10 @@ package com.sun.hotspot.c1x.server; import java.io.*; -import java.lang.reflect.Proxy; import java.net.*; -import java.rmi.registry.*; import javax.net.*; -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; import com.sun.hotspot.c1x.*; import com.sun.hotspot.c1x.Compiler; import com.sun.hotspot.c1x.logging.*; @@ -40,101 +36,33 @@ */ public class CompilationServer { - private Registry registry; - private ServerSocket serverSocket; - private Socket socket; - private ObjectOutputStream output; - private ObjectInputStream input; - public static void main(String[] args) throws Exception { new CompilationServer().run(); } - public static class Container implements Serializable { - - public final Class clazz; - public final Object[] values; - - public Container(Class clazz, Object... values) { - this.clazz = clazz; - this.values = values; - } - } - - /** - * Replaces certain cir objects that cannot easily be made Serializable. - */ - public static class ReplacingOutputStream extends ObjectOutputStream { - - public ReplacingOutputStream(OutputStream out) throws IOException { - super(out); - enableReplaceObject(true); - } - - @Override - protected Object replaceObject(Object obj) throws IOException { - Class clazz = obj.getClass(); - if (clazz == CiConstant.class) { - CiConstant o = (CiConstant) obj; - return new Container(clazz, o.kind, o.boxedValue()); - } else if (clazz == CiDebugInfo.class) { - CiDebugInfo o = (CiDebugInfo) obj; - return new Container(clazz, o.codePos, o.registerRefMap, o.frameRefMap); - } else if (clazz == CiCodePos.class) { - CiCodePos o = (CiCodePos) obj; - return new Container(clazz, o.caller, o.method, o.bci); - } - return obj; - } - } - - /** - * Replaces certain cir objects that cannot easily be made Serializable. - */ - public static class ReplacingInputStream extends ObjectInputStream { - - public ReplacingInputStream(InputStream in) throws IOException { - super(in); - enableResolveObject(true); - } - - @Override - protected Object resolveObject(Object obj) throws IOException { - if (obj instanceof Container) { - Container c = (Container) obj; - if (c.clazz == CiConstant.class) { - return CiConstant.forBoxed((CiKind) c.values[0], c.values[1]); - } else if (c.clazz == CiDebugInfo.class) { - return new CiDebugInfo((CiCodePos) c.values[0], (CiBitMap) c.values[2], (CiBitMap) c.values[3]); - } else if (c.clazz == CiCodePos.class) { - return new CiCodePos((CiCodePos) c.values[0], (RiMethod) c.values[1], (Integer) c.values[2]); - } - throw new RuntimeException("unexpected container class"); - } - return obj; - } - } - private void run() throws IOException, ClassNotFoundException { - serverSocket = ServerSocketFactory.getDefault().createServerSocket(1199); - while (true) { + ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(1199); + do { + Socket socket = null; try { Logger.log("Compilation server ready, waiting for client to connect..."); socket = serverSocket.accept(); Logger.log("Connected to " + socket.getRemoteSocketAddress()); - output = new ReplacingOutputStream(socket.getOutputStream()); - input = new ReplacingInputStream(socket.getInputStream()); + + ReplacingStreams streams = new ReplacingStreams(socket.getOutputStream(), socket.getInputStream()); - InvocationSocket invocation = new InvocationSocket(output, input); - VMEntries entries = (VMEntries) Proxy.newProxyInstance(VMEntries.class.getClassLoader(), new Class[] {VMEntries.class}, invocation); - VMExits exits = Compiler.initializeServer(entries); - invocation.setDelegate(exits); + VMEntries entries = (VMEntries) streams.getInvocation().waitForResult(); + Compiler compiler = CompilerImpl.initializeServer(entries); - invocation.waitForResult(); + streams.getInvocation().sendResult(compiler); + + streams.getInvocation().waitForResult(); } catch (IOException e) { e.printStackTrace(); - socket.close(); + if (socket != null) { + socket.close(); + } } - } + } while (false); } } diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/Remote.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/Remote.java Mon Apr 11 11:25:06 2011 +0200 @@ -0,0 +1,6 @@ +package com.sun.hotspot.c1x.server; + + +public interface Remote { + +} diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/ReplacingStreams.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/server/ReplacingStreams.java Mon Apr 11 11:25:06 2011 +0200 @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2011 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product + * that is described in this document. In particular, and without limitation, these intellectual property + * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or + * more additional patents or pending patent applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun + * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its + * supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or + * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks + * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the + * U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open + * Company, Ltd. + */ +package com.sun.hotspot.c1x.server; + +import java.io.*; +import java.lang.reflect.*; +import java.util.*; + +import com.sun.cri.ci.*; +import com.sun.hotspot.c1x.*; +import com.sun.hotspot.c1x.Compiler; + +public class ReplacingStreams { + + private IdentityHashMap objectMap = new IdentityHashMap(); + private ArrayList objectList = new ArrayList(); + + private ReplacingOutputStream output; + private ReplacingInputStream input; + + private InvocationSocket invocation; + + public ReplacingStreams(OutputStream outputStream, InputStream inputStream) throws IOException { + output = new ReplacingOutputStream(new BufferedOutputStream(outputStream)); + // required, because creating an ObjectOutputStream writes a header, but doesn't flush the stream + output.flush(); + input = new ReplacingInputStream(new BufferedInputStream(inputStream)); + invocation = new InvocationSocket(output, input); + + addStaticObject(CiValue.IllegalValue); + } + + public void setInvocationSocket(InvocationSocket invocation) { + this.invocation = invocation; + } + + public ReplacingOutputStream getOutput() { + return output; + } + + public ReplacingInputStream getInput() { + return input; + } + + public InvocationSocket getInvocation() { + return invocation; + } + + private void addStaticObject(Object obj) { + int id = objectList.size(); + objectList.add(obj); + objectMap.put(obj, new Placeholder(id)); + } + + public static class Placeholder implements Serializable { + + public final int id; + + public Placeholder(int id) { + this.id = id; + } + + @Override + public String toString() { + return "#<" + id + ">"; + } + } + + public static class NewRemoteCallPlaceholder implements Serializable { + + public final Class[] interfaces; + + public NewRemoteCallPlaceholder(Class[] interfaces) { + this.interfaces = interfaces; + } + } + + public static class NewDummyPlaceholder implements Serializable { + } + + /** + * Replaces certain cir objects that cannot easily be made Serializable. + */ + public class ReplacingInputStream extends ObjectInputStream { + + private Compiler compiler; + + public ReplacingInputStream(InputStream in) throws IOException { + super(in); + enableResolveObject(true); + } + + public void setCompiler(Compiler compiler) { + this.compiler = compiler; + } + + @Override + protected Object resolveObject(Object obj) throws IOException { + // see ReplacingInputStream.replaceObject for details on when these types of objects are created + + if (obj instanceof Placeholder) { + Placeholder placeholder = (Placeholder) obj; + obj = objectList.get(placeholder.id); + return obj; + } + + if (obj instanceof NewRemoteCallPlaceholder) { + NewRemoteCallPlaceholder newPlaceholder = (NewRemoteCallPlaceholder) obj; + Placeholder placeholder = new Placeholder(objectList.size()); + obj = Proxy.newProxyInstance(getClass().getClassLoader(), newPlaceholder.interfaces, invocation.new Handler(placeholder)); + objectMap.put(obj, placeholder); + objectList.add(obj); + return obj; + } + + if (obj instanceof NewDummyPlaceholder) { + obj = new Placeholder(objectList.size()); + objectMap.put(obj, (Placeholder) obj); + objectList.add(obj); + return obj; + } + + return obj; + } + } + + /** + * Replaces certain cir objects that cannot easily be made Serializable. + */ + public class ReplacingOutputStream extends ObjectOutputStream { + + public ReplacingOutputStream(OutputStream out) throws IOException { + super(out); + enableReplaceObject(true); + } + + @Override + protected Object replaceObject(Object obj) throws IOException { + // is the object a known instance? + Placeholder placeholder = objectMap.get(obj); + if (placeholder != null) { + return placeholder; + } + + // is the object an instance of a class that will always be executed remotely? + if (obj instanceof Remote) { + return createRemoteCallPlaceholder(obj); + } + + // is the object a constant of object type? + if (obj.getClass() == CiConstant.class) { + System.out.println("CiConstant " + obj); + CiConstant constant = (CiConstant) obj; + // don't replace if the object already is a placeholder + if (constant.kind == CiKind.Object && !(constant.asObject() instanceof Placeholder) && constant.asObject() != null) { + return CiConstant.forObject(createDummyPlaceholder(constant.asObject())); + } + } + return obj; + } + } + + public static Class[] getAllInterfaces(Class clazz) { + HashSet> interfaces = new HashSet>(); + getAllInterfaces(clazz, interfaces); + return interfaces.toArray(new Class[interfaces.size()]); + } + + private static void getAllInterfaces(Class clazz, HashSet> interfaces) { + for (Class< ? > iface : clazz.getInterfaces()) { + if (!interfaces.contains(iface)) { + interfaces.add(iface); + getAllInterfaces(iface, interfaces); + } + } + if (clazz.getSuperclass() != null) { + getAllInterfaces(clazz.getSuperclass(), interfaces); + } + } + + private Object createRemoteCallPlaceholder(Object obj) { + // collect all interfaces that this object's class implements (proxies only support interfaces) + objectMap.put(obj, new Placeholder(objectList.size())); + objectList.add(obj); + return new NewRemoteCallPlaceholder(getAllInterfaces(obj.getClass())); + } + + public Object createDummyPlaceholder(Object obj) { + objectMap.put(obj, new Placeholder(objectList.size())); + objectList.add(obj); + return new NewDummyPlaceholder(); + } +} diff -r f21664b3dd1c -r 6190d20bd6d6 c1x4hotspotsrc/hotspot/.cproject --- a/c1x4hotspotsrc/hotspot/.cproject Mon Apr 11 10:22:05 2011 +0200 +++ b/c1x4hotspotsrc/hotspot/.cproject Mon Apr 11 11:25:06 2011 +0200 @@ -20,14 +20,14 @@ - + -