changeset 8485:ba0458c143bb

finalizer registration is now done via method substitution (again)
author Doug Simon <doug.simon@oracle.com>
date Tue, 26 Mar 2013 16:16:58 +0100
parents 1d6adefaea93
children 391df429b4a0
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectSubstitutions.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java
diffstat 4 files changed, 13 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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 = "<init>", isStatic = false)
+    public static void init(Object thisObj) {
+        RegisterFinalizerNode.register(thisObj);
+    }
+
     @MacroSubstitution(macro = ObjectCloneNode.class, isStatic = false)
     public static native Object clone(Object obj);
 }
--- 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());
--- 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;
--- 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) {
+    }
 }