# HG changeset patch # User Doug Simon # Date 1363973069 -3600 # Node ID 7485b8a7cd244a63f96fbbdb74d42fc75efae31d # Parent 71a9f3a5d8c5a0729238d7dc9de9fc2f95802011 Backed out changeset: 83fc36378013 diff -r 71a9f3a5d8c5 -r 7485b8a7cd24 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java Fri Mar 22 18:18:55 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java Fri Mar 22 18:24:29 2013 +0100 @@ -27,7 +27,6 @@ import com.oracle.graal.api.replacements.*; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.java.*; import com.oracle.graal.replacements.*; import com.oracle.graal.word.*; @@ -48,11 +47,6 @@ return computeHashCode(thisObj); } - @MethodSubstitution(value = "", isStatic = false) - public static void init(Object thisObj) { - RegisterFinalizerNode.register(thisObj); - } - @MacroSubstitution(macro = ObjectCloneNode.class, isStatic = false) public static native Object clone(Object obj); } diff -r 71a9f3a5d8c5 -r 7485b8a7cd24 graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Mar 22 18:18:55 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Mar 22 18:24:29 2013 +0100 @@ -782,6 +782,14 @@ stream.setBCI(block.startBci); while (stream.currentBCI() <= block.endBci) { switch (stream.currentBC()) { + case RETURN: + if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { + // return from Object.init implicitly registers a finalizer + // for the receiver if needed, so keep it alive. + loadOne(block, 0); + } + break; + case LLOAD: case DLOAD: loadTwo(block, stream.readLocalIndex()); diff -r 71a9f3a5d8c5 -r 7485b8a7cd24 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 Mar 22 18:18:55 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Mar 22 18:24:29 2013 +0100 @@ -1143,6 +1143,11 @@ } } + private void callRegisterFinalizer() { + // append a call to the finalizer registration + append(currentGraph.add(new RegisterFinalizerNode(frameState.loadLocal(0)))); + } + private void genReturn(ValueNode x) { frameState.clearStack(); if (x != null) { @@ -1557,6 +1562,9 @@ } private void createReturn() { + if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { + callRegisterFinalizer(); + } Kind returnKind = method.getSignature().getReturnKind().getStackKind(); ValueNode x = returnKind == Kind.Void ? null : frameState.pop(returnKind); assert frameState.stackSize() == 0; diff -r 71a9f3a5d8c5 -r 7485b8a7cd24 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri Mar 22 18:18:55 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Fri Mar 22 18:24:29 2013 +0100 @@ -61,8 +61,8 @@ if (stamp.isExactType()) { needsCheck = stamp.type().hasFinalizer(); } else if (stamp.type() != null && !stamp.type().hasFinalizableSubclass()) { - // if either the declared type of receiver or the holder - // can be assumed to have no finalizers + // if either the declared type of receiver or the holder can be assumed to have no + // finalizers if (tool.assumptions().useOptimisticAssumptions() && tool.assumptions().recordNoFinalizableSubclassAssumption(stamp.type())) { needsCheck = false; } @@ -82,9 +82,4 @@ tool.delete(); } } - - @SuppressWarnings("unused") - @NodeIntrinsic - public static void register(Object thisObj) { - } }