Mercurial > hg > graal-compiler
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) { + } }