# HG changeset patch # User Doug Simon # Date 1431167754 -7200 # Node ID 9f6733155647d3096b1fa38f9e26d35b43e54186 # Parent 40ca261ba43a615f564f757b5ec382428a8464a8 ensure RegisterFinalizerNode is created when Object:: is the compilation root diff -r 40ca261ba43a -r 9f6733155647 graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestResolvedJavaMethod.java --- 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 e : methods.entrySet()) { + ResolvedJavaMethod m = e.getValue(); + assertFalse(m.isJavaLangObjectInit()); + } + for (Map.Entry, 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()) { diff -r 40ca261ba43a -r 9f6733155647 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaMethod.java --- 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(""); + } } diff -r 40ca261ba43a -r 9f6733155647 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- 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. 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)); }