Mercurial > hg > graal-compiler
changeset 21276:9f6733155647
ensure RegisterFinalizerNode is created when Object::<init> is the compilation root
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Sat, 09 May 2015 12:35:54 +0200 |
parents | 40ca261ba43a |
children | 2b8fb2b8b586 21607a6101eb |
files | graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaMethod.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaMethod.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java |
diffstat | 3 files changed, 37 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaMethod.java Fri May 08 17:52:59 2015 +0200 +++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaMethod.java Sat May 09 12:35:54 2015 +0200 @@ -312,6 +312,25 @@ } } + @Test + public void isJavaLangObjectInitTest() throws NoSuchMethodException { + ResolvedJavaMethod method = metaAccess.lookupJavaMethod(Object.class.getConstructor()); + assertTrue(method.isJavaLangObjectInit()); + for (Map.Entry<Method, ResolvedJavaMethod> e : methods.entrySet()) { + ResolvedJavaMethod m = e.getValue(); + assertFalse(m.isJavaLangObjectInit()); + } + for (Map.Entry<Constructor<?>, ResolvedJavaMethod> e : constructors.entrySet()) { + ResolvedJavaMethod m = e.getValue(); + Constructor<?> key = e.getKey(); + if (key.getDeclaringClass() == Object.class && key.getParameters().length == 0) { + assertTrue(m.isJavaLangObjectInit()); + } else { + assertFalse(m.isJavaLangObjectInit()); + } + } + } + private Method findTestMethod(Method apiMethod) { String testName = apiMethod.getName() + "Test"; for (Method m : getClass().getDeclaredMethods()) {
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaMethod.java Fri May 08 17:52:59 2015 +0200 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaMethod.java Sat May 09 12:35:54 2015 +0200 @@ -288,4 +288,11 @@ default boolean hasReceiver() { return !isStatic(); } + + /** + * Determines if this method is {@link java.lang.Object#Object()}. + */ + default boolean isJavaLangObjectInit() { + return getDeclaringClass().isJavaLangObject() && getName().equals("<init>"); + } }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri May 08 17:52:59 2015 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sat May 09 12:35:54 2015 +0200 @@ -121,6 +121,7 @@ ReplacementContext replacementContext = initialReplacementContext; BytecodeParser parser = new BytecodeParser(null, metaAccess, method, graphBuilderConfig, optimisticOpts, entryBCI, replacementContext); HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(parser, method, graph); + frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving() || replacementContext != null, graphBuilderConfig.getPlugins().getParameterPlugin()); parser.build(graph.start(), frameState); @@ -328,7 +329,13 @@ if (method.isSynchronized()) { startNode.setStateAfter(createFrameState(BytecodeFrame.BEFORE_BCI)); } else { - frameState.clearNonLiveLocals(startBlock, liveness, true); + + if (graph.method() != null && graph.method().isJavaLangObjectInit()) { + // Don't clear the receiver when Object.<init> is the compilation + // root. The receiver is needed as input to RegisterFinalizerNode. + } else { + frameState.clearNonLiveLocals(startBlock, liveness, true); + } assert bci() == 0; startNode.setStateAfter(createFrameState(bci())); } @@ -1440,6 +1447,9 @@ } private void beforeReturn(ValueNode x, Kind kind) { + if (graph.method() != null && graph.method().isJavaLangObjectInit()) { + append(new RegisterFinalizerNode(frameState.localAt(0))); + } if (graphBuilderConfig.insertNonSafepointDebugInfo()) { append(createInfoPointNode(InfopointReason.METHOD_END)); }