-
Bug
-
Resolution: Fixed
-
P3
-
9
-
None
-
generic
-
generic
The following:
for(;;) {
try {
print("a");
break;
}
finally {
print("b");
}
}
turns into:
public static java.lang.Object runScript(jdk.nashorn.internal.runtime.ScriptFunction, java.lang.Object);
Code:
0: aload_0
1: invokevirtual #24 // Method jdk/nashorn/internal/runtime/ScriptFunction.getScope:()Ljdk/nashorn/internal/runtime/ScriptObject;
4: astore_2
5: new #26 // class jdk/nashorn/internal/scripts/JO0P0
8: dup
9: iconst_0
10: invokestatic #30 // Method $getMap:(I)Ljdk/nashorn/internal/runtime/PropertyMap;
13: aload_2
14: invokespecial #33 // Method jdk/nashorn/internal/scripts/JO0P0."<init>":(Ljdk/nashorn/internal/runtime/PropertyMap;Ljdk/nashorn/internal/runtime/ScriptObject;)V
17: invokestatic #39 // Method jdk/nashorn/internal/runtime/ScriptRuntime.mergeScope:(Ljdk/nashorn/internal/runtime/ScriptObject;)Ljdk/nashorn/internal/runtime/ScriptObject;
20: astore_2
21: getstatic #43 // Field jdk/nashorn/internal/runtime/ScriptRuntime.UNDEFINED:Ljdk/nashorn/internal/runtime/Undefined;
24: astore_3
25: goto 99
28: aload_2
29: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
34: aconst_null
35: ldc #57 // String a
37: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
42: astore_3
43: aload_2
44: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
49: aconst_null
50: ldc #64 // String b
52: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
57: astore_3
58: goto 102
61: nop
62: nop
63: athrow
64: astore 4
66: aload_2
67: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
72: aconst_null
73: ldc #64 // String b
75: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
80: astore_3
81: aload 4
83: athrow
84: nop
85: nop
86: nop
87: nop
88: nop
89: nop
90: nop
91: nop
92: nop
93: nop
94: nop
95: nop
96: nop
97: nop
98: athrow
99: goto 28
102: aload_3
103: areturn
Exception table:
from to target type
28 61 64 Class java/lang/Throwable
With the telltale nopnopnopathrow sequence from ASM indicating that code cannot be reached. Even though it seems semantically correct we should ensure that this kind of code isn't generated, as it reveals that something is wrong with the control flow analysis code, which potentially might lead to real problems.
for(;;) {
try {
print("a");
break;
}
finally {
print("b");
}
}
turns into:
public static java.lang.Object runScript(jdk.nashorn.internal.runtime.ScriptFunction, java.lang.Object);
Code:
0: aload_0
1: invokevirtual #24 // Method jdk/nashorn/internal/runtime/ScriptFunction.getScope:()Ljdk/nashorn/internal/runtime/ScriptObject;
4: astore_2
5: new #26 // class jdk/nashorn/internal/scripts/JO0P0
8: dup
9: iconst_0
10: invokestatic #30 // Method $getMap:(I)Ljdk/nashorn/internal/runtime/PropertyMap;
13: aload_2
14: invokespecial #33 // Method jdk/nashorn/internal/scripts/JO0P0."<init>":(Ljdk/nashorn/internal/runtime/PropertyMap;Ljdk/nashorn/internal/runtime/ScriptObject;)V
17: invokestatic #39 // Method jdk/nashorn/internal/runtime/ScriptRuntime.mergeScope:(Ljdk/nashorn/internal/runtime/ScriptObject;)Ljdk/nashorn/internal/runtime/ScriptObject;
20: astore_2
21: getstatic #43 // Field jdk/nashorn/internal/runtime/ScriptRuntime.UNDEFINED:Ljdk/nashorn/internal/runtime/Undefined;
24: astore_3
25: goto 99
28: aload_2
29: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
34: aconst_null
35: ldc #57 // String a
37: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
42: astore_3
43: aload_2
44: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
49: aconst_null
50: ldc #64 // String b
52: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
57: astore_3
58: goto 102
61: nop
62: nop
63: athrow
64: astore 4
66: aload_2
67: invokedynamic #55, 0 // InvokeDynamic #0:"dyn:getMethod|getProp|getElem:print":(Ljava/lang/Object;)Ljava/lang/Object;
72: aconst_null
73: ldc #64 // String b
75: invokedynamic #62, 0 // InvokeDynamic #1:"dyn:call":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
80: astore_3
81: aload 4
83: athrow
84: nop
85: nop
86: nop
87: nop
88: nop
89: nop
90: nop
91: nop
92: nop
93: nop
94: nop
95: nop
96: nop
97: nop
98: athrow
99: goto 28
102: aload_3
103: areturn
Exception table:
from to target type
28 61 64 Class java/lang/Throwable
With the telltale nopnopnopathrow sequence from ASM indicating that code cannot be reached. Even though it seems semantically correct we should ensure that this kind of code isn't generated, as it reveals that something is wrong with the control flow analysis code, which potentially might lead to real problems.