changeset 8449:7485b8a7cd24

Backed out changeset: 83fc36378013
author Doug Simon <doug.simon@oracle.com>
date Fri, 22 Mar 2013 18:24:29 +0100
parents 71a9f3a5d8c5
children ad673bbfb4e5
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, 18 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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 = "<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	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());
--- 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;
--- 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) {
-    }
 }