changeset 22074:312ecf78fb2d

compute lock depth for MonitorIdNodes correctly when inlining during parsing
author Doug Simon <doug.simon@oracle.com>
date Tue, 23 Jun 2015 18:10:30 +0200
parents bc502be71702
children 9aca6f6126ef
files graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java
diffstat 2 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Tue Jun 23 08:34:21 2015 -0700
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Tue Jun 23 18:10:30 2015 +0200
@@ -1649,13 +1649,13 @@
         }
 
         synchronizedEpilogue(BytecodeFrame.AFTER_BCI, x, kind);
-        if (frameState.lockDepth() != 0) {
+        if (frameState.lockDepth(false) != 0) {
             throw bailout("unbalanced monitors");
         }
     }
 
     protected void genMonitorEnter(ValueNode x, int bci) {
-        MonitorIdNode monitorId = graph.add(new MonitorIdNode(frameState.lockDepth()));
+        MonitorIdNode monitorId = graph.add(new MonitorIdNode(frameState.lockDepth(true)));
         MonitorEnterNode monitorEnter = append(new MonitorEnterNode(x, monitorId));
         frameState.pushLock(x, monitorId);
         monitorEnter.setStateAfter(createFrameState(bci, monitorEnter));
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java	Tue Jun 23 08:34:21 2015 -0700
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java	Tue Jun 23 18:10:30 2015 +0200
@@ -534,9 +534,13 @@
     /**
      * @return the current lock depth
      */
-    public int lockDepth() {
-        assert lockedObjects.length == monitorIds.length;
-        return lockedObjects.length;
+    public int lockDepth(boolean includeParents) {
+        int depth = lockedObjects.length;
+        assert depth == monitorIds.length;
+        if (includeParents && parser.getParent() != null) {
+            depth += parser.getParent().frameState.lockDepth(true);
+        }
+        return depth;
     }
 
     public boolean contains(ValueNode value) {