# HG changeset patch # User Doug Simon # Date 1364311018 -3600 # Node ID ba0458c143bb89a80081928dc2e3fb2fd41cadea # Parent 1d6adefaea93a9abe815e218d1d1862f09965eb6 finalizer registration is now done via method substitution (again) diff -r 1d6adefaea93 -r ba0458c143bb 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 Tue Mar 26 15:16:20 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java Tue Mar 26 16:16:58 2013 +0100 @@ -27,6 +27,7 @@ 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.*; @@ -47,6 +48,11 @@ 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 1d6adefaea93 -r ba0458c143bb 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 Tue Mar 26 15:16:20 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Tue Mar 26 16:16:58 2013 +0100 @@ -782,14 +782,6 @@ 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 1d6adefaea93 -r ba0458c143bb 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 Tue Mar 26 15:16:20 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Mar 26 16:16:58 2013 +0100 @@ -1143,11 +1143,6 @@ } } - 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) { @@ -1562,9 +1557,6 @@ } 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 1d6adefaea93 -r ba0458c143bb 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 Tue Mar 26 15:16:20 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Tue Mar 26 16:16:58 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,4 +82,9 @@ tool.delete(); } } + + @SuppressWarnings("unused") + @NodeIntrinsic + public static void register(Object thisObj) { + } }