
NAME=java simple switch statement 4 values no breaks
FILE=malloc://128
CMDS=<<EOF
e asm.arch=java
wx 033b043ca700371a08703d1caa00000000000029000000000000000300000020000000230000002900000026840202840203840209033c1b1c823c1a100aa1ffc91bac
pi 29 @ 0
EOF
EXPECT=<<EOF
iconst_0
istore_0
iconst_1
istore_1
goto 0x3b
iload_0
iconst_5
irem
istore_2
iload_2
tableswitch default: 0x35
case 0: goto 0x2c
case 1: goto 0x2f
case 2: goto 0x35
case 3: goto 0x32
iinc 2 2
iinc 2 3
iinc 2 9
iconst_0
istore_1
iload_1
iload_2
ixor
istore_1
iload_0
bipush 10
if_icmplt 0x7
iload_1
ireturn
EOF
RUN


NAME=java simple switch statement 3 values no breaks
FILE=malloc://128
CMDS=<<EOF
e asm.arch=java
wx 033b043ca7002c1a08703d1caa0000000000001e0000000000000001000000180000001b8402fe8402ff033c1b1c823c1a100aa1ffd41bac00000003000a0000
pi 26 @ 0
EOF
EXPECT=<<EOF
iconst_0
istore_0
iconst_1
istore_1
goto 0x30
iload_0
iconst_5
irem
istore_2
iload_2
tableswitch default: 0x2a
case 0: goto 0x24
case 1: goto 0x27
iinc 2 254
iinc 2 255
iconst_0
istore_1
iload_1
iload_2
ixor
istore_1
iload_0
bipush 10
if_icmplt 0x7
iload_1
ireturn
EOF
RUN


NAME=java simple switch statement 4 values
FILE=malloc://128
CMDS=<<EOF
e asm.arch=java
wx 033b033ca7003c1a08703d1caa0000000000003200000000000000030000002000000026000000320000002c840202a70011840203a7000b840209a70005033c1a100aa1ffc41bac00000003000a0000
pi 28 @ 0
EOF
EXPECT=<<EOF
iconst_0
istore_0
iconst_0
istore_1
goto 0x40
iload_0
iconst_5
irem
istore_2
iload_2
tableswitch default: 0x3e
case 0: goto 0x2c
case 1: goto 0x32
case 2: goto 0x3e
case 3: goto 0x38
iinc 2 2
goto 0x40
iinc 2 3
goto 0x40
iinc 2 9
goto 0x40
iconst_0
istore_1
iload_0
bipush 10
if_icmplt 0x7
iload_1
ireturn
EOF
RUN


NAME=java simple switch statement 3 values
FILE=malloc://128
CMDS=<<EOF
e asm.arch=java
wx 033b033ca7003c1a08703d1caa0000000000003200000000000000030000002000000026000000320000002c840202a70011840203a7000b840209a70005033c1a100aa1ffc41bac00000003000a0000
pi 28 @ 0
EOF
EXPECT=<<EOF
iconst_0
istore_0
iconst_0
istore_1
goto 0x40
iload_0
iconst_5
irem
istore_2
iload_2
tableswitch default: 0x3e
case 0: goto 0x2c
case 1: goto 0x32
case 2: goto 0x3e
case 3: goto 0x38
iinc 2 2
goto 0x40
iinc 2 3
goto 0x40
iinc 2 9
goto 0x40
iconst_0
istore_1
iload_0
bipush 10
if_icmplt 0x7
iload_1
ireturn
EOF
RUN


NAME=af java multiple classes loaded via malloc and ib
FILE=malloc://1024
CMDS=<<EOF
e asm.calls=false
e asm.comments=false
e asm.cmt.flgrefs=false
e scr.color=false
e asm.lines.bb=false
e asm.xrefs=false
e asm.flags.middle=0
wx cafebabe00000033001707000201001b7261646172655f746573745f63617365732f6368616c6c656e67650700040100106a6176612f6c616e672f4f626a6563740100063c696e69743e010003282956010004436f64650a000300090c0005000601000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301001d4c7261646172655f746573745f63617365732f6368616c6c656e67653b01001573696d706c655f636173655f73746d745f3476616c01000328294901000169010001490100016a0100016b01000d537461636b4d61705461626c6501000a536f7572636546696c6501000e6368616c6c656e67652e6a617661002100010003000000000002000100050006000100070000002f00010001000000052ab70008b100000002000a00000006000100000003000b0000000c000100000005000c000d00000008000e000f00010007000000c10002000300000048033b033ca7003c1a08703d1caa0000000000003200000000000000030000002000000026000000320000002c840202a70011840203a7000b840209a70005033c1a100aa1ffc41bac00000003000a0000002a000a000000050004000600070007000b0008002c00090032000a0038000b003e000c004000060046000f000b0000002000030002004600100011000000040044001200110001000b00350013001100020014000000110006fd00070101fc002401050505fa000100010015000000020016
obR
i
pd 3 @ sym.radare_test_cases.challenge.void__init
o malloc://1024 0xa00~a
s 0xa00
wx cafebabe0000003300180700020100177261646172655f746573745f63617365732f6c6f6f70730700040100106a6176612f6c616e672f4f626a6563740100063c696e69743e010003282956010004436f64650a000300090c0005000601000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869730100194c7261646172655f746573745f63617365732f6c6f6f70733b01000f73696d706c655f666f725f6c6f6f7001000328294201000169010001490100016a0100016b01000d537461636b4d61705461626c6501001c73696d706c655f666f725f6c6f6f705f6d756c74695f72657475726e01000a536f7572636546696c6501000a6c6f6f70732e6a617661002100010003000000000003000100050006000100070000002f00010001000000052ab70008b100000002000a00000006000100000003000b0000000c000100000005000c000d00000008000e000f000100070000006c0002000300000017033d033b043d10643ca700068400011a1ba1fffb1c91ac00000003000a0000000e000300000006000200080014000b000b000000200003000400130010001100000009000e001200110001000200150013001100020014000000090002fe000c0101010200080015000f0001000700000095000200030000002b033d033b043d10643ca7001a1c1a823d1c1100ffa000061c91ac1c1100ff703d8400011a1ba1ffe71c91ac00000003000a0000002200080000000e00020010000c00110010001300170014001a00150020001000280018000b00000020000300040027001000110000000900220012001100010002002900130011000200140000000a0003fe000c0101010d0800010016000000020017
oba 0xa00
pdf
obR
af
s sym.radare_test_cases.loops.byte_simple_for_loop_multi_return
pdf
EOF
EXPECT=<<EOF
fd       3
file     malloc://1024
size     0x400
humansz  1K
mode     rwx
format   java
iorw     true
block    0x100
type     JAVA CLASS
arch     java
cpu      N/A
baddr    0x00000000
binsz    0x00000400
bintype  class
bits     32
retguard false
class    Java SE 1.7
compiler N/A
dbg_file N/A
endian   BE
hdr.csum N/A
guid     N/A
intrp    N/A
laddr    0x00000000
lang     java
machine  jvm
maxopsz  16
minopsz  1
os       any
cc       N/A
pcalign  0
rpath    N/A
subsys   any
stripped false
crypto   false
havecode true
va       false
sanitiz  false
static   false
linenum  true
lsyms    true
canary   false
PIE      false
RELROCS  false
NX       false
  ;-- entry0:
  ;-- section.class.methods._init_.attr.0.code:
  ;-- sym.radare_test_cases.challenge.void__init:
  ;-- method.public.radare_test_cases.challenge.void__init:
  0x0000012d      aload_0
  0x0000012e      invokespecial Ljava/lang/Object;.<init>()V
  0x00000131      return
  ;-- entry2:
  ;-- section.class.methods.simple_for_loop_multi_return.attr.0.code:
  ;-- sym.radare_test_cases.loops.byte_simple_for_loop_multi_return:
/ method.static.radare_test_cases.loops.byte_simple_for_loop_multi_return();
| 0x000001f1      iconst_0
| 0x000001f2      istore_2
| 0x000001f3      iconst_0
| 0x000001f4      istore_0
| 0x000001f5      iconst_1
| 0x000001f6      istore_2
| 0x000001f7      bipush 100
| 0x000001f9      istore_1
| 0x000001fa      goto  0x214
| 0x000001fd      iload_2
| 0x000001fe      iload_0
| 0x000001ff      ixor
| 0x00000200      istore_2
| 0x00000201      iload_2
| 0x00000202      sipush 255
| 0x00000205      if_icmpne 0x20b
| 0x00000208      iload_2
| 0x00000209      i2b
| 0x0000020a      ireturn
| 0x0000020b      iload_2
| 0x0000020c      sipush 255
| 0x0000020f      irem
| 0x00000210      istore_2
| 0x00000211      iinc  0 1
| 0x00000214      iload_0
| 0x00000215      iload_1
| 0x00000216      if_icmplt 0x1fd
| 0x00000219      iload_2
| 0x0000021a      i2b
\ 0x0000021b      ireturn
EOF
RUN


NAME=Output java class source-code-like
FILE=bins/java/jdwpexeccmd.class
CMDS=javas ; icc
EXPECT=<<EOF
import java.lang.Object;
import java.lang.StringBuilder;
import java.lang.Runtime;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.Process;
import java.lang.String;
import java.lang.Exception;
import JDWPExecCmd;

class public JDWPExecCmd {
  public void <init>();
  public static String run(String);
}
package defpackage;

public class JDWPExecCmd {
  public void JDWPExecCmd();
  public static String run(String);
}

EOF
RUN


NAME=Output java class source-code-like from a zip
FILE=zip://bins/java/example.zip::0
CMDS=javas
EXPECT=<<EOF
import java.lang.Object;
import java.lang.String;
import c;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import a;
import java.lang.NumberFormatException;
import [C;

class public c {
  public void <init>();
  public static String a(String);
  public static String b(String);
  static void <clinit>();

  public static a Z
  private static final z Ljava.lang.String;
}
EOF
RUN


NAME=Output java class structure
FILE=bins/java/jdwpexeccmd.class
CMDS=javac
EXPECT=<<EOF
Version: (51.0) Java SE 1.7
Flags: (0x0021) public super
Class: (#18) LJDWPExecCmd;
Super: (#19) Ljava/lang/Object;
Constant pool: 71
   #1 = Methodref           #19:#33        // void Object.<init>()
   #2 = Class               #34            // StringBuilder
   #3 = Methodref           #2:#33         // void StringBuilder.<init>()
   #4 = Methodref           #2:#35         // StringBuilder StringBuilder.append(String)
   #5 = String              #36            // " output:\n"
   #6 = Methodref           #2:#37         // String StringBuilder.toString()
   #7 = Methodref           #38:#39        // Runtime Runtime.getRuntime()
   #8 = Methodref           #38:#40        // Process Runtime.exec(String)
   #9 = Class               #41            // java.io.BufferedReader
  #10 = Class               #42            // java.io.InputStreamReader
  #11 = Methodref           #43:#44        // java.io.InputStream Process.getInputStream()
  #12 = Methodref           #10:#45        // void java.io.InputStreamReader.<init>(java.io.InputStream)
  #13 = Methodref           #9:#46         // void java.io.BufferedReader.<init>(java.io.Reader)
  #14 = Methodref           #9:#47         // String java.io.BufferedReader.readLine()
  #15 = Methodref           #48:#49        // String String.trim()
  #16 = String              #50            // "\n"
  #17 = Class               #51            // Exception
  #18 = Class               #52            // JDWPExecCmd
  #19 = Class               #53            // Object
  #20 = Utf8                <init>
  #21 = Utf8                ()V
  #22 = Utf8                Code
  #23 = Utf8                LineNumberTable
  #24 = Utf8                run
  #25 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #26 = Utf8                StackMapTable
  #27 = Class               #54            // String
  #28 = Class               #55            // Process
  #29 = Class               #41            // java.io.BufferedReader
  #30 = Class               #51            // Exception
  #31 = Utf8                SourceFile
  #32 = Utf8                JDWPExecCmd.java
  #33 = NameAndType         #20:#21        // void <init>()
  #34 = Utf8                java/lang/StringBuilder
  #35 = NameAndType         #56:#57        // StringBuilder append(String)
  #36 = Utf8                 output:\n
  #37 = NameAndType         #58:#59        // String toString()
  #38 = Class               #60            // Runtime
  #39 = NameAndType         #61:#62        // Runtime getRuntime()
  #40 = NameAndType         #63:#64        // Process exec(String)
  #41 = Utf8                java/io/BufferedReader
  #42 = Utf8                java/io/InputStreamReader
  #43 = Class               #55            // Process
  #44 = NameAndType         #65:#66        // java.io.InputStream getInputStream()
  #45 = NameAndType         #20:#67        // void <init>(java.io.InputStream)
  #46 = NameAndType         #20:#68        // void <init>(java.io.Reader)
  #47 = NameAndType         #69:#59        // String readLine()
  #48 = Class               #54            // String
  #49 = NameAndType         #70:#59        // String trim()
  #50 = Utf8                \n
  #51 = Utf8                java/lang/Exception
  #52 = Utf8                JDWPExecCmd
  #53 = Utf8                java/lang/Object
  #54 = Utf8                java/lang/String
  #55 = Utf8                java/lang/Process
  #56 = Utf8                append
  #57 = Utf8                (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #58 = Utf8                toString
  #59 = Utf8                ()Ljava/lang/String;
  #60 = Utf8                java/lang/Runtime
  #61 = Utf8                getRuntime
  #62 = Utf8                ()Ljava/lang/Runtime;
  #63 = Utf8                exec
  #64 = Utf8                (Ljava/lang/String;)Ljava/lang/Process;
  #65 = Utf8                getInputStream
  #66 = Utf8                ()Ljava/io/InputStream;
  #67 = Utf8                (Ljava/io/InputStream;)V
  #68 = Utf8                (Ljava/io/Reader;)V
  #69 = Utf8                readLine
  #70 = Utf8                trim
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #22    size: 29    Code
  public static run(Ljava/lang/String;)Ljava/lang/String;;
    name: run
    descriptor: (Ljava/lang/String;)Ljava/lang/String;
    flags: (0x0009) public static
    attributes: 1
      #0  = #22    size: 233   Code
Fields: 0
Attributes: 1
  #0  = #31    size: 2     SourceFile
EOF
RUN


NAME=Output java class structure (json)
FILE=bins/java/jdwpexeccmd.class
CMDS=javacj
EXPECT=<<EOF
{"version":{"minor":0,"major":51,"version":"Java SE 1.7"},"constant_pool_count":71,"constant_pool":[{"index":1,"tag_n":10,"tag_s":"Methodref","value":"#19:#33","resolved":"Ljava/lang/Object;.<init>()V"},{"index":2,"tag_n":7,"tag_s":"Class","value":"#34","resolved":"Ljava/lang/StringBuilder;"},{"index":3,"tag_n":10,"tag_s":"Methodref","value":"#2:#33","resolved":"Ljava/lang/StringBuilder;.<init>()V"},{"index":4,"tag_n":10,"tag_s":"Methodref","value":"#2:#35","resolved":"Ljava/lang/StringBuilder;.append(Ljava/lang/String;)Ljava/lang/StringBuilder;"},{"index":5,"tag_n":8,"tag_s":"String","value":"#36","resolved":"\" output:\\n\""},{"index":6,"tag_n":10,"tag_s":"Methodref","value":"#2:#37","resolved":"Ljava/lang/StringBuilder;.toString()Ljava/lang/String;"},{"index":7,"tag_n":10,"tag_s":"Methodref","value":"#38:#39","resolved":"Ljava/lang/Runtime;.getRuntime()Ljava/lang/Runtime;"},{"index":8,"tag_n":10,"tag_s":"Methodref","value":"#38:#40","resolved":"Ljava/lang/Runtime;.exec(Ljava/lang/String;)Ljava/lang/Process;"},{"index":9,"tag_n":7,"tag_s":"Class","value":"#41","resolved":"Ljava/io/BufferedReader;"},{"index":10,"tag_n":7,"tag_s":"Class","value":"#42","resolved":"Ljava/io/InputStreamReader;"},{"index":11,"tag_n":10,"tag_s":"Methodref","value":"#43:#44","resolved":"Ljava/lang/Process;.getInputStream()Ljava/io/InputStream;"},{"index":12,"tag_n":10,"tag_s":"Methodref","value":"#10:#45","resolved":"Ljava/io/InputStreamReader;.<init>(Ljava/io/InputStream;)V"},{"index":13,"tag_n":10,"tag_s":"Methodref","value":"#9:#46","resolved":"Ljava/io/BufferedReader;.<init>(Ljava/io/Reader;)V"},{"index":14,"tag_n":10,"tag_s":"Methodref","value":"#9:#47","resolved":"Ljava/io/BufferedReader;.readLine()Ljava/lang/String;"},{"index":15,"tag_n":10,"tag_s":"Methodref","value":"#48:#49","resolved":"Ljava/lang/String;.trim()Ljava/lang/String;"},{"index":16,"tag_n":8,"tag_s":"String","value":"#50","resolved":"\"\\n\""},{"index":17,"tag_n":7,"tag_s":"Class","value":"#51","resolved":"Ljava/lang/Exception;"},{"index":18,"tag_n":7,"tag_s":"Class","value":"#52","resolved":"LJDWPExecCmd;"},{"index":19,"tag_n":7,"tag_s":"Class","value":"#53","resolved":"Ljava/lang/Object;"},{"index":20,"tag_n":1,"tag_s":"Utf8","value":"<init>"},{"index":21,"tag_n":1,"tag_s":"Utf8","value":"()V"},{"index":22,"tag_n":1,"tag_s":"Utf8","value":"Code"},{"index":23,"tag_n":1,"tag_s":"Utf8","value":"LineNumberTable"},{"index":24,"tag_n":1,"tag_s":"Utf8","value":"run"},{"index":25,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/lang/String;)Ljava/lang/String;"},{"index":26,"tag_n":1,"tag_s":"Utf8","value":"StackMapTable"},{"index":27,"tag_n":7,"tag_s":"Class","value":"#54","resolved":"Ljava/lang/String;"},{"index":28,"tag_n":7,"tag_s":"Class","value":"#55","resolved":"Ljava/lang/Process;"},{"index":29,"tag_n":7,"tag_s":"Class","value":"#41","resolved":"Ljava/io/BufferedReader;"},{"index":30,"tag_n":7,"tag_s":"Class","value":"#51","resolved":"Ljava/lang/Exception;"},{"index":31,"tag_n":1,"tag_s":"Utf8","value":"SourceFile"},{"index":32,"tag_n":1,"tag_s":"Utf8","value":"JDWPExecCmd.java"},{"index":33,"tag_n":12,"tag_s":"NameAndType","value":"#20:#21","resolved":"<init>()V"},{"index":34,"tag_n":1,"tag_s":"Utf8","value":"java/lang/StringBuilder"},{"index":35,"tag_n":12,"tag_s":"NameAndType","value":"#56:#57","resolved":"append(Ljava/lang/String;)Ljava/lang/StringBuilder;"},{"index":36,"tag_n":1,"tag_s":"Utf8","value":" output:\\n"},{"index":37,"tag_n":12,"tag_s":"NameAndType","value":"#58:#59","resolved":"toString()Ljava/lang/String;"},{"index":38,"tag_n":7,"tag_s":"Class","value":"#60","resolved":"Ljava/lang/Runtime;"},{"index":39,"tag_n":12,"tag_s":"NameAndType","value":"#61:#62","resolved":"getRuntime()Ljava/lang/Runtime;"},{"index":40,"tag_n":12,"tag_s":"NameAndType","value":"#63:#64","resolved":"exec(Ljava/lang/String;)Ljava/lang/Process;"},{"index":41,"tag_n":1,"tag_s":"Utf8","value":"java/io/BufferedReader"},{"index":42,"tag_n":1,"tag_s":"Utf8","value":"java/io/InputStreamReader"},{"index":43,"tag_n":7,"tag_s":"Class","value":"#55","resolved":"Ljava/lang/Process;"},{"index":44,"tag_n":12,"tag_s":"NameAndType","value":"#65:#66","resolved":"getInputStream()Ljava/io/InputStream;"},{"index":45,"tag_n":12,"tag_s":"NameAndType","value":"#20:#67","resolved":"<init>(Ljava/io/InputStream;)V"},{"index":46,"tag_n":12,"tag_s":"NameAndType","value":"#20:#68","resolved":"<init>(Ljava/io/Reader;)V"},{"index":47,"tag_n":12,"tag_s":"NameAndType","value":"#69:#59","resolved":"readLine()Ljava/lang/String;"},{"index":48,"tag_n":7,"tag_s":"Class","value":"#54","resolved":"Ljava/lang/String;"},{"index":49,"tag_n":12,"tag_s":"NameAndType","value":"#70:#59","resolved":"trim()Ljava/lang/String;"},{"index":50,"tag_n":1,"tag_s":"Utf8","value":"\\n"},{"index":51,"tag_n":1,"tag_s":"Utf8","value":"java/lang/Exception"},{"index":52,"tag_n":1,"tag_s":"Utf8","value":"JDWPExecCmd"},{"index":53,"tag_n":1,"tag_s":"Utf8","value":"java/lang/Object"},{"index":54,"tag_n":1,"tag_s":"Utf8","value":"java/lang/String"},{"index":55,"tag_n":1,"tag_s":"Utf8","value":"java/lang/Process"},{"index":56,"tag_n":1,"tag_s":"Utf8","value":"append"},{"index":57,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/lang/String;)Ljava/lang/StringBuilder;"},{"index":58,"tag_n":1,"tag_s":"Utf8","value":"toString"},{"index":59,"tag_n":1,"tag_s":"Utf8","value":"()Ljava/lang/String;"},{"index":60,"tag_n":1,"tag_s":"Utf8","value":"java/lang/Runtime"},{"index":61,"tag_n":1,"tag_s":"Utf8","value":"getRuntime"},{"index":62,"tag_n":1,"tag_s":"Utf8","value":"()Ljava/lang/Runtime;"},{"index":63,"tag_n":1,"tag_s":"Utf8","value":"exec"},{"index":64,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/lang/String;)Ljava/lang/Process;"},{"index":65,"tag_n":1,"tag_s":"Utf8","value":"getInputStream"},{"index":66,"tag_n":1,"tag_s":"Utf8","value":"()Ljava/io/InputStream;"},{"index":67,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/io/InputStream;)V"},{"index":68,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/io/Reader;)V"},{"index":69,"tag_n":1,"tag_s":"Utf8","value":"readLine"},{"index":70,"tag_n":1,"tag_s":"Utf8","value":"trim"}],"access_flags_n":33,"access_flags_s":"public super","class_n":18,"class_s":"LJDWPExecCmd;","super_n":19,"super_s":"Ljava/lang/Object;","interfaces_count":0,"interfaces":[],"methods_count":2,"methods":[{"offset":803,"access_flags_n":1,"access_flags_s":"public","name_n":20,"name_s":"<init>","descriptor_n":21,"descriptor_s":"()V","attributes_count":1,"attributes":[{"offset":811,"size":29,"name_n":22,"name_s":"Code"}]},{"offset":846,"access_flags_n":9,"access_flags_s":"public static","name_n":24,"name_s":"run","descriptor_n":25,"descriptor_s":"(Ljava/lang/String;)Ljava/lang/String;","attributes_count":1,"attributes":[{"offset":854,"size":233,"name_n":22,"name_s":"Code"}]}],"fields_count":0,"fields":[],"attributes_count":1,"attributes":[{"offset":1095,"size":2,"name_n":31,"name_s":"SourceFile"}]}
EOF
RUN


NAME=Output OAK class structure
FILE=bins/java/invisible.class
CMDS=javac
EXPECT=<<EOF
Version: (45.2) Java SE 1.0.2
Flags: (0x0001) public
Class: (#2) LTest;
Super: (#3) Ljava/lang/Object;
Constant pool: 22
   #1 = String              #21            // "See if you can decompile/disassemble me!"
   #2 = Class               #20            // Test
   #3 = Class               #19            // Object
   #4 = Utf8                main
   #5 = Utf8                ([Ljava/lang/String;)V
   #6 = Utf8                Code
   #7 = Fieldref            #14:#15        // System.out:java.io.PrintStream
   #8 = Methodref           #9:#10         // void java.io.PrintStream.println(String)
   #9 = Class               #13            // java.io.PrintStream
  #10 = NameAndType         #11:#12        // void println(String)
  #11 = Utf8                println
  #12 = Utf8                (Ljava/lang/String;)V
  #13 = Utf8                java/io/PrintStream
  #14 = Class               #18            // System
  #15 = NameAndType         #16:#17        // out:java.io.PrintStream
  #16 = Utf8                out
  #17 = Utf8                Ljava/io/PrintStream;
  #18 = Utf8                java/lang/System
  #19 = Utf8                java/lang/Object
  #20 = Utf8                Test
  #21 = Utf8                See if you can decompile/disassemble me!
Interfaces: 0
Methods: 1
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #6     size: 17    Code
Fields: 0
Attributes: 0
EOF
RUN


NAME=Output OAK class structure (json)
FILE=bins/java/invisible.class
CMDS=javacj
EXPECT=<<EOF
{"version":{"minor":2,"major":45,"version":"Java SE 1.0.2"},"constant_pool_count":22,"constant_pool":[{"index":1,"tag_n":8,"tag_s":"String","value":"#21","resolved":"\"See if you can decompile/disassemble me!\""},{"index":2,"tag_n":7,"tag_s":"Class","value":"#20","resolved":"LTest;"},{"index":3,"tag_n":7,"tag_s":"Class","value":"#19","resolved":"Ljava/lang/Object;"},{"index":4,"tag_n":1,"tag_s":"Utf8","value":"main"},{"index":5,"tag_n":1,"tag_s":"Utf8","value":"([Ljava/lang/String;)V"},{"index":6,"tag_n":1,"tag_s":"Utf8","value":"Code"},{"index":7,"tag_n":9,"tag_s":"Fieldref","value":"#14:#15","resolved":"Ljava/lang/System;.out.Ljava/io/PrintStream;"},{"index":8,"tag_n":10,"tag_s":"Methodref","value":"#9:#10","resolved":"Ljava/io/PrintStream;.println(Ljava/lang/String;)V"},{"index":9,"tag_n":7,"tag_s":"Class","value":"#13","resolved":"Ljava/io/PrintStream;"},{"index":10,"tag_n":12,"tag_s":"NameAndType","value":"#11:#12","resolved":"println(Ljava/lang/String;)V"},{"index":11,"tag_n":1,"tag_s":"Utf8","value":"println"},{"index":12,"tag_n":1,"tag_s":"Utf8","value":"(Ljava/lang/String;)V"},{"index":13,"tag_n":1,"tag_s":"Utf8","value":"java/io/PrintStream"},{"index":14,"tag_n":7,"tag_s":"Class","value":"#18","resolved":"Ljava/lang/System;"},{"index":15,"tag_n":12,"tag_s":"NameAndType","value":"#16:#17","resolved":"out.Ljava/io/PrintStream;"},{"index":16,"tag_n":1,"tag_s":"Utf8","value":"out"},{"index":17,"tag_n":1,"tag_s":"Utf8","value":"Ljava/io/PrintStream;"},{"index":18,"tag_n":1,"tag_s":"Utf8","value":"java/lang/System"},{"index":19,"tag_n":1,"tag_s":"Utf8","value":"java/lang/Object"},{"index":20,"tag_n":1,"tag_s":"Utf8","value":"Test"},{"index":21,"tag_n":1,"tag_s":"Utf8","value":"See if you can decompile/disassemble me!"}],"access_flags_n":1,"access_flags_s":"public","class_n":2,"class_s":"LTest;","super_n":3,"super_s":"Ljava/lang/Object;","interfaces_count":0,"interfaces":[],"methods_count":1,"methods":[{"offset":270,"access_flags_n":9,"access_flags_s":"public static","name_n":4,"name_s":"main","descriptor_n":5,"descriptor_s":"([Ljava/lang/String;)V","attributes_count":1,"attributes":[{"offset":278,"size":17,"name_n":6,"name_s":"Code"}]}],"fields_count":0,"fields":[],"attributes_count":0,"attributes":[]}
EOF
RUN


NAME=Output OAK main code
FILE=bins/java/invisible.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- main:
            ;-- entry0:
            ;-- section.class.methods.main.attr.0.code:
            ;-- sym.Test.void_main_String:
/ method.public.static.Test.void_main_String();
|           0x00000120      getstatic Ljava/lang/System;.out.Ljava/io/PrintStream; ; [03] -r-x section size 17 named class.methods.main.attr.0.code
|           0x00000123      ldc   "See if you can decompile/disassemble me!"
|           0x00000125      invokevirtual Ljava/io/PrintStream;.println(Ljava/lang/String;)V
\           0x00000128      return
EOF
RUN


NAME=Output Java 1.7 class structure
FILE=bins/java/Main.java.1.7.class
CMDS=javac
EXPECT=<<EOF
Version: (51.0) Java SE 1.7
Flags: (0x0021) public super
Class: (#65) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 78
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = Class               #37            // StringBuilder
  #37 = Utf8                java/lang/StringBuilder
  #38 = Methodref           #36:#3         // void StringBuilder.<init>()
  #39 = String              #40            // "Line: "
  #40 = Utf8                Line: 
  #41 = Methodref           #36:#42        // StringBuilder StringBuilder.append(String)
  #42 = NameAndType         #43:#44        // StringBuilder append(String)
  #43 = Utf8                append
  #44 = Utf8                (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #45 = Methodref           #36:#46        // String StringBuilder.toString()
  #46 = NameAndType         #47:#35        // String toString()
  #47 = Utf8                toString
  #48 = Methodref           #23:#49        // void java.io.BufferedReader.close()
  #49 = NameAndType         #50:#6         // void close()
  #50 = Utf8                close
  #51 = Class               #52            // Exception
  #52 = Utf8                java/lang/Exception
  #53 = Fieldref            #8:#54         // System.err:java.io.PrintStream
  #54 = NameAndType         #55:#12        // err:java.io.PrintStream
  #55 = Utf8                err
  #56 = String              #57            // "Exception occurred trying to read '%s'."
  #57 = Utf8                Exception occurred trying to read '%s'.
  #58 = Methodref           #16:#59        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #59 = NameAndType         #60:#61        // java.io.PrintStream format(String, Object[])
  #60 = Utf8                format
  #61 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #62 = Methodref           #51:#63        // void Exception.printStackTrace()
  #63 = NameAndType         #64:#6         // void printStackTrace()
  #64 = Utf8                printStackTrace
  #65 = Class               #66            // Main
  #66 = Utf8                Main
  #67 = Utf8                Code
  #68 = Utf8                LineNumberTable
  #69 = Utf8                main
  #70 = Utf8                ([Ljava/lang/String;)V
  #71 = Utf8                StackMapTable
  #72 = Class               #73            // String
  #73 = Utf8                java/lang/String
  #74 = Class               #75            // String[]
  #75 = Utf8                [Ljava/lang/String;
  #76 = Utf8                SourceFile
  #77 = Utf8                Main.java
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #67    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #67    size: 206   Code
Fields: 0
Attributes: 1
  #0  = #76    size: 2     SourceFile
EOF
RUN


NAME=Output Java 1.8 class structure
FILE=bins/java/Main.java.1.8.class
CMDS=javac
EXPECT=<<EOF
Version: (52.0) Java SE 1.8
Flags: (0x0021) public super
Class: (#65) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 78
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = Class               #37            // StringBuilder
  #37 = Utf8                java/lang/StringBuilder
  #38 = Methodref           #36:#3         // void StringBuilder.<init>()
  #39 = String              #40            // "Line: "
  #40 = Utf8                Line: 
  #41 = Methodref           #36:#42        // StringBuilder StringBuilder.append(String)
  #42 = NameAndType         #43:#44        // StringBuilder append(String)
  #43 = Utf8                append
  #44 = Utf8                (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #45 = Methodref           #36:#46        // String StringBuilder.toString()
  #46 = NameAndType         #47:#35        // String toString()
  #47 = Utf8                toString
  #48 = Methodref           #23:#49        // void java.io.BufferedReader.close()
  #49 = NameAndType         #50:#6         // void close()
  #50 = Utf8                close
  #51 = Class               #52            // Exception
  #52 = Utf8                java/lang/Exception
  #53 = Fieldref            #8:#54         // System.err:java.io.PrintStream
  #54 = NameAndType         #55:#12        // err:java.io.PrintStream
  #55 = Utf8                err
  #56 = String              #57            // "Exception occurred trying to read '%s'."
  #57 = Utf8                Exception occurred trying to read '%s'.
  #58 = Methodref           #16:#59        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #59 = NameAndType         #60:#61        // java.io.PrintStream format(String, Object[])
  #60 = Utf8                format
  #61 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #62 = Methodref           #51:#63        // void Exception.printStackTrace()
  #63 = NameAndType         #64:#6         // void printStackTrace()
  #64 = Utf8                printStackTrace
  #65 = Class               #66            // Main
  #66 = Utf8                Main
  #67 = Utf8                Code
  #68 = Utf8                LineNumberTable
  #69 = Utf8                main
  #70 = Utf8                ([Ljava/lang/String;)V
  #71 = Utf8                StackMapTable
  #72 = Class               #73            // String
  #73 = Utf8                java/lang/String
  #74 = Class               #75            // String[]
  #75 = Utf8                [Ljava/lang/String;
  #76 = Utf8                SourceFile
  #77 = Utf8                Main.java
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #67    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #67    size: 206   Code
Fields: 0
Attributes: 1
  #0  = #76    size: 2     SourceFile
EOF
RUN


NAME=Output Java 1.9 class structure
FILE=bins/java/Main.java.1.9.class
CMDS=javac
EXPECT=<<EOF
Version: (53.0) Java SE 1.9
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 10 class structure
FILE=bins/java/Main.java.10.class
CMDS=javac
EXPECT=<<EOF
Version: (54.0) Java SE 10
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 11 class structure
FILE=bins/java/Main.java.11.class
CMDS=javac
EXPECT=<<EOF
Version: (55.0) Java SE 11
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 12 class structure
FILE=bins/java/Main.java.12.class
CMDS=javac
EXPECT=<<EOF
Version: (56.0) Java SE 12
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 13 class structure
FILE=bins/java/Main.java.13.class
CMDS=javac
EXPECT=<<EOF
Version: (57.0) Java SE 13
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 14 class structure
FILE=bins/java/Main.java.14.class
CMDS=javac
EXPECT=<<EOF
Version: (58.0) Java SE 14
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 15 class structure
FILE=bins/java/Main.java.15.class
CMDS=javac
EXPECT=<<EOF
Version: (59.0) Java SE 15
Flags: (0x0021) public super
Class: (#57) LMain;
Super: (#2) Ljava/lang/Object;
Constant pool: 85
   #1 = Methodref           #2:#3          // void Object.<init>()
   #2 = Class               #4             // Object
   #3 = NameAndType         #5:#6          // void <init>()
   #4 = Utf8                java/lang/Object
   #5 = Utf8                <init>
   #6 = Utf8                ()V
   #7 = Fieldref            #8:#9          // System.out:java.io.PrintStream
   #8 = Class               #10            // System
   #9 = NameAndType         #11:#12        // out:java.io.PrintStream
  #10 = Utf8                java/lang/System
  #11 = Utf8                out
  #12 = Utf8                Ljava/io/PrintStream;
  #13 = String              #14            // "Hello World"
  #14 = Utf8                Hello World
  #15 = Methodref           #16:#17        // void java.io.PrintStream.println(String)
  #16 = Class               #18            // java.io.PrintStream
  #17 = NameAndType         #19:#20        // void println(String)
  #18 = Utf8                java/io/PrintStream
  #19 = Utf8                println
  #20 = Utf8                (Ljava/lang/String;)V
  #21 = String              #22            // "/etc/services"
  #22 = Utf8                /etc/services
  #23 = Class               #24            // java.io.BufferedReader
  #24 = Utf8                java/io/BufferedReader
  #25 = Class               #26            // java.io.FileReader
  #26 = Utf8                java/io/FileReader
  #27 = Methodref           #25:#28        // void java.io.FileReader.<init>(String)
  #28 = NameAndType         #5:#20         // void <init>(String)
  #29 = Methodref           #23:#30        // void java.io.BufferedReader.<init>(java.io.Reader)
  #30 = NameAndType         #5:#31         // void <init>(java.io.Reader)
  #31 = Utf8                (Ljava/io/Reader;)V
  #32 = Methodref           #23:#33        // String java.io.BufferedReader.readLine()
  #33 = NameAndType         #34:#35        // String readLine()
  #34 = Utf8                readLine
  #35 = Utf8                ()Ljava/lang/String;
  #36 = InvokeDynamic       #0:#37         // String makeConcatWithConstants(String)
  #37 = NameAndType         #38:#39        // String makeConcatWithConstants(String)
  #38 = Utf8                makeConcatWithConstants
  #39 = Utf8                (Ljava/lang/String;)Ljava/lang/String;
  #40 = Methodref           #23:#41        // void java.io.BufferedReader.close()
  #41 = NameAndType         #42:#6         // void close()
  #42 = Utf8                close
  #43 = Class               #44            // Exception
  #44 = Utf8                java/lang/Exception
  #45 = Fieldref            #8:#46         // System.err:java.io.PrintStream
  #46 = NameAndType         #47:#12        // err:java.io.PrintStream
  #47 = Utf8                err
  #48 = String              #49            // "Exception occurred trying to read '%s'."
  #49 = Utf8                Exception occurred trying to read '%s'.
  #50 = Methodref           #16:#51        // java.io.PrintStream java.io.PrintStream.format(String, Object[])
  #51 = NameAndType         #52:#53        // java.io.PrintStream format(String, Object[])
  #52 = Utf8                format
  #53 = Utf8                (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
  #54 = Methodref           #43:#55        // void Exception.printStackTrace()
  #55 = NameAndType         #56:#6         // void printStackTrace()
  #56 = Utf8                printStackTrace
  #57 = Class               #58            // Main
  #58 = Utf8                Main
  #59 = Utf8                Code
  #60 = Utf8                LineNumberTable
  #61 = Utf8                main
  #62 = Utf8                ([Ljava/lang/String;)V
  #63 = Utf8                StackMapTable
  #64 = Class               #65            // String
  #65 = Utf8                java/lang/String
  #66 = Class               #67            // String[]
  #67 = Utf8                [Ljava/lang/String;
  #68 = Utf8                SourceFile
  #69 = Utf8                Main.java
  #70 = Utf8                BootstrapMethods
  #71 = MethodHandle        6:#72
  #72 = Methodref           #73:#74        // java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #73 = Class               #75            // java.lang.invoke.StringConcatFactory
  #74 = NameAndType         #38:#76        // java.lang.invoke.CallSite makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, String, java.lang.invoke.MethodType, String, Object[])
  #75 = Utf8                java/lang/invoke/StringConcatFactory
  #76 = Utf8                (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #77 = String              #78            // "Line: \u0001"
  #78 = Utf8                Line: \u0001
  #79 = Utf8                InnerClasses
  #80 = Class               #81            // java.lang.invoke.MethodHandles$Lookup
  #81 = Utf8                java/lang/invoke/MethodHandles$Lookup
  #82 = Class               #83            // java.lang.invoke.MethodHandles
  #83 = Utf8                java/lang/invoke/MethodHandles
  #84 = Utf8                Lookup
Interfaces: 0
Methods: 2
  public <init>()V;
    name: <init>
    descriptor: ()V
    flags: (0x0001) public
    attributes: 1
      #0  = #59    size: 29    Code
  public static main([Ljava/lang/String;)V;
    name: main
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) public static
    attributes: 1
      #0  = #59    size: 193   Code
Fields: 0
Attributes: 3
  #0  = #68    size: 2     SourceFile
  #1  = #70    size: 8     BootstrapMethods
  #2  = #79    size: 10    InnerClasses
EOF
RUN


NAME=Output Java 1.7 main code
FILE=bins/java/Main.java.1.7.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x00000383      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x00000384      invokespecial Ljava/lang/Object;.<init>()V
\           0x00000387      return
EOF
RUN


NAME=Output Java 1.8 main code
FILE=bins/java/Main.java.1.8.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x00000383      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x00000384      invokespecial Ljava/lang/Object;.<init>()V
\           0x00000387      return
EOF
RUN


NAME=Output Java 1.9 main code
FILE=bins/java/Main.java.1.9.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 10 main code
FILE=bins/java/Main.java.10.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 11 main code
FILE=bins/java/Main.java.11.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 12 main code
FILE=bins/java/Main.java.12.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 13 main code
FILE=bins/java/Main.java.13.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 14 main code
FILE=bins/java/Main.java.14.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Output Java 15 main code
FILE=bins/java/Main.java.15.class
CMDS=af ; pdf
EXPECT=<<EOF
            ;-- entry0:
            ;-- section.class.methods._init_.attr.0.code:
            ;-- sym.Main.void__init:
/ method.public.Main.void__init();
|           0x000004a4      aload_0                                    ; [03] -r-x section size 29 named class.methods._init_.attr.0.code
|           0x000004a5      invokespecial Ljava/lang/Object;.<init>()V
\           0x000004a8      return
EOF
RUN


NAME=Resolve java constant pool index
FILE=bins/java/Pig.class
CMDS=javar 15
EXPECT=<<EOF
void java.io.PrintStream.println(java.lang.String)
EOF
RUN

NAME=Crash on analysis
FILE=bins/java/fba022731cfdd80bc65a899afefead1e
CMDS=e scr.prompt=false ; aaa
REGEXP_FILTER_OUT=ignoreme
EXPECT=<<EOF
EOF
RUN

NAME=Java Regs
FILE=
CMDS=<<EOF
e asm.arch=java
ar~!garbage
EOF
EXPECT=<<EOF
pc = 0x00000000
EOF
EXPECT_ERR=
RUN
