-
Bug
-
Resolution: Duplicate
-
P3
-
None
-
6
-
generic
-
generic
Javac creates two exception blocks on every synchronized section. Second block violates VM spec 4.9.5 (handling exception in proteced code) and differ from sample from 7.14.
Moreover, if inside syncronized section happens additional monitorexit instruction, offset 21 throws an error and runtime hangs up because second exception block.
It happens on any java from 1.4.2 upto 1.6.0 and jrockit. Maybe i miss something...
MonitorExitFail.java:
public class MonitorExitFail
{
public static void main(String[] args)
{
Object sync = new Object();
synchronized (sync) {
System.out.println("done!");
}
}
}
javap -c MonitorExitFail:
public class MonitorExitFail extends java.lang.Object{
public MonitorExitFail();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: astore_1
8: aload_1
9: dup
10: astore_2
11: monitorenter
12: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #4; //String done!
17: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: aload_2
21: monitorexit
22: goto 30
25: astore_3
26: aload_2
27: monitorexit
28: aload_3
29: athrow
30: return
Exception table:
from to target type
12 22 25 any
25 28 25 any
}
###@###.### 2005-06-16 14:33:23 GMT
Moreover, if inside syncronized section happens additional monitorexit instruction, offset 21 throws an error and runtime hangs up because second exception block.
It happens on any java from 1.4.2 upto 1.6.0 and jrockit. Maybe i miss something...
MonitorExitFail.java:
public class MonitorExitFail
{
public static void main(String[] args)
{
Object sync = new Object();
synchronized (sync) {
System.out.println("done!");
}
}
}
javap -c MonitorExitFail:
public class MonitorExitFail extends java.lang.Object{
public MonitorExitFail();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: astore_1
8: aload_1
9: dup
10: astore_2
11: monitorenter
12: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #4; //String done!
17: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: aload_2
21: monitorexit
22: goto 30
25: astore_3
26: aload_2
27: monitorexit
28: aload_3
29: athrow
30: return
Exception table:
from to target type
12 22 25 any
25 28 25 any
}
###@###.### 2005-06-16 14:33:23 GMT
- duplicates
-
JDK-4414101 synchronized statement generates catch around the monitorexit
-
- Closed
-
- relates to
-
JDK-4902932 exception target within the exception range that it's handling
-
- Closed
-