Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8010907

Nashorn generates unreachable exception bytecode for some finallies

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 10
    • 9
    • core-libs
    • None

      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.

            sdama Srinivas Dama (Inactive)
            lagergren Marcus Lagergren
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: