rizin/test/db/analysis/java
Giovanni 7cfddb1da8
Java rewrite with LGPL license (#804)
* Rewritten RzBin java plugin (LGPL3)
* Rewritten java_core.c (LGPL3)
* Rewritten java RzAsm plugin (LGPL3)
* Rewritten java RzAnalysis plugin (LGPL3)
* Resolve constant_pool.<index> when rzbin is available.
* Updated tests with proper ones
* Support java <1.0.2 (i.e. OAK) file format
* Added constant pool resolver `javar`
* Added tests from java 1.7 to 15
2021-03-19 22:00:19 +08:00

1661 lines
No EOL
82 KiB
Text

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
ib
i
pd 3 @ sym.radare_test_cases_challenge.radare_test_cases.challenge._init
o malloc://1024 0xa00~a
s 0xa00
wx cafebabe0000003300180700020100177261646172655f746573745f63617365732f6c6f6f70730700040100106a6176612f6c616e672f4f626a6563740100063c696e69743e010003282956010004436f64650a000300090c0005000601000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869730100194c7261646172655f746573745f63617365732f6c6f6f70733b01000f73696d706c655f666f725f6c6f6f7001000328294201000169010001490100016a0100016b01000d537461636b4d61705461626c6501001c73696d706c655f666f725f6c6f6f705f6d756c74695f72657475726e01000a536f7572636546696c6501000a6c6f6f70732e6a617661002100010003000000000003000100050006000100070000002f00010001000000052ab70008b100000002000a00000006000100000003000b0000000c000100000005000c000d00000008000e000f000100070000006c0002000300000017033d033b043d10643ca700068400011a1ba1fffb1c91ac00000003000a0000000e000300000006000200080014000b000b000000200003000400130010001100000009000e001200110001000200150013001100020014000000090002fe000c0101010200080015000f0001000700000095000200030000002b033d033b043d10643ca7001a1c1a823d1c1100ffa000061c91ac1c1100ff703d8400011a1ba1ffe71c91ac00000003000a0000002200080000000e00020010000c00110010001300170014001a00150020001000280018000b00000020000300040027001000110000000900220012001100010002002900130011000200140000000a0003fe000c0101010d0800010016000000020017
oba 0xa00
pdf
ib
af
s sym.rizin_test_cases_challenge.simple_case_stmt_4val; 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
baddr 0x0
binsz 1024
bintype class
bits 32
canary false
retguard false
class Java SE 1.7
crypto false
endian big
havecode true
laddr 0x0
lang java
linenum true
lsyms true
machine jvm
maxopsz 16
minopsz 1
nx false
os any
pcalign 0
pic false
relocs false
sanitiz false
static false
stripped false
subsys any
va false
;-- entry0:
;-- section.class.methods._init_.attr.0.code:
;-- sym.radare_test_cases_challenge.radare_test_cases.challenge._init:
;-- method.radare_test_cases_challenge.radare_test_cases.challenge._init:
0x0000012d aload_0
0x0000012e invokespecial void java.lang.Object:<init>: ()
0x00000131 return
;-- entry2:
;-- section.class.methods.simple_for_loop_multi_return.attr.0.code:
;-- sym.radare_test_cases_loops.radare_test_cases.loops.simple_for_loop_multi_return:
/ method.radare_test_cases_loops.radare_test_cases.loops.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
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 java.lang.String run(java.lang.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 java.lang.String a(java.lang.String);
public static java.lang.String b(java.lang.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) JDWPExecCmd
Super: (#19) java/lang/Object
Constant pool: 71
#1 = Methodref #19:#33 // java.lang.Object:<init>:()V
#2 = Class #34 // java.lang.StringBuilder
#3 = Methodref #2:#33 // java.lang.StringBuilder:<init>:()V
#4 = Methodref #2:#35 // java.lang.StringBuilder:append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#5 = String #36 // " output:\n"
#6 = Methodref #2:#37 // java.lang.StringBuilder:toString:()Ljava.lang.String;
#7 = Methodref #38:#39 // java.lang.Runtime:getRuntime:()Ljava.lang.Runtime;
#8 = Methodref #38:#40 // java.lang.Runtime:exec:(Ljava.lang.String;)Ljava.lang.Process;
#9 = Class #41 // java.io.BufferedReader
#10 = Class #42 // java.io.InputStreamReader
#11 = Methodref #43:#44 // java.lang.Process:getInputStream:()Ljava.io.InputStream;
#12 = Methodref #10:#45 // java.io.InputStreamReader:<init>:(Ljava.io.InputStream;)V
#13 = Methodref #9:#46 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#14 = Methodref #9:#47 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#15 = Methodref #48:#49 // java.lang.String:trim:()Ljava.lang.String;
#16 = String #50 // "\n"
#17 = Class #51 // java.lang.Exception
#18 = Class #52 // JDWPExecCmd
#19 = Class #53 // java.lang.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 // java.lang.String
#28 = Class #55 // java.lang.Process
#29 = Class #41 // java.io.BufferedReader
#30 = Class #51 // java.lang.Exception
#31 = Utf8 SourceFile
#32 = Utf8 JDWPExecCmd.java
#33 = NameAndType #20:#21 // <init>:()V
#34 = Utf8 java/lang/StringBuilder
#35 = NameAndType #56:#57 // append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#36 = Utf8 output:\n
#37 = NameAndType #58:#59 // toString:()Ljava.lang.String;
#38 = Class #60 // java.lang.Runtime
#39 = NameAndType #61:#62 // getRuntime:()Ljava.lang.Runtime;
#40 = NameAndType #63:#64 // exec:(Ljava.lang.String;)Ljava.lang.Process;
#41 = Utf8 java/io/BufferedReader
#42 = Utf8 java/io/InputStreamReader
#43 = Class #55 // java.lang.Process
#44 = NameAndType #65:#66 // getInputStream:()Ljava.io.InputStream;
#45 = NameAndType #20:#67 // <init>:(Ljava.io.InputStream;)V
#46 = NameAndType #20:#68 // <init>:(Ljava.io.Reader;)V
#47 = NameAndType #69:#59 // readLine:()Ljava.lang.String;
#48 = Class #54 // java.lang.String
#49 = NameAndType #70:#59 // trim:()Ljava.lang.String;
#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":"java.lang.Object:<init>:()V"},{"index":2,"tag_n":7,"tag_s":"Class","value":"#34","resolved":"java.lang.StringBuilder"},{"index":3,"tag_n":10,"tag_s":"Methodref","value":"#2:#33","resolved":"java.lang.StringBuilder:<init>:()V"},{"index":4,"tag_n":10,"tag_s":"Methodref","value":"#2:#35","resolved":"java.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":"java.lang.StringBuilder:toString:()Ljava.lang.String;"},{"index":7,"tag_n":10,"tag_s":"Methodref","value":"#38:#39","resolved":"java.lang.Runtime:getRuntime:()Ljava.lang.Runtime;"},{"index":8,"tag_n":10,"tag_s":"Methodref","value":"#38:#40","resolved":"java.lang.Runtime:exec:(Ljava.lang.String;)Ljava.lang.Process;"},{"index":9,"tag_n":7,"tag_s":"Class","value":"#41","resolved":"java.io.BufferedReader"},{"index":10,"tag_n":7,"tag_s":"Class","value":"#42","resolved":"java.io.InputStreamReader"},{"index":11,"tag_n":10,"tag_s":"Methodref","value":"#43:#44","resolved":"java.lang.Process:getInputStream:()Ljava.io.InputStream;"},{"index":12,"tag_n":10,"tag_s":"Methodref","value":"#10:#45","resolved":"java.io.InputStreamReader:<init>:(Ljava.io.InputStream;)V"},{"index":13,"tag_n":10,"tag_s":"Methodref","value":"#9:#46","resolved":"java.io.BufferedReader:<init>:(Ljava.io.Reader;)V"},{"index":14,"tag_n":10,"tag_s":"Methodref","value":"#9:#47","resolved":"java.io.BufferedReader:readLine:()Ljava.lang.String;"},{"index":15,"tag_n":10,"tag_s":"Methodref","value":"#48:#49","resolved":"java.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":"java.lang.Exception"},{"index":18,"tag_n":7,"tag_s":"Class","value":"#52","resolved":"JDWPExecCmd"},{"index":19,"tag_n":7,"tag_s":"Class","value":"#53","resolved":"java.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":"java.lang.String"},{"index":28,"tag_n":7,"tag_s":"Class","value":"#55","resolved":"java.lang.Process"},{"index":29,"tag_n":7,"tag_s":"Class","value":"#41","resolved":"java.io.BufferedReader"},{"index":30,"tag_n":7,"tag_s":"Class","value":"#51","resolved":"java.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":"java.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":"java.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":"java.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":"JDWPExecCmd","super_n":19,"super_s":"java/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) Test
Super: (#3) java/lang/Object
Constant pool: 22
#1 = String #21 // "See if you can decompile/disassemble me!"
#2 = Class #20 // Test
#3 = Class #19 // java.lang.Object
#4 = Utf8 main
#5 = Utf8 ([Ljava/lang/String;)V
#6 = Utf8 Code
#7 = Fieldref #14:#15 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Methodref #9:#10 // java.io.PrintStream:println:(Ljava.lang.String;)V
#9 = Class #13 // java.io.PrintStream
#10 = NameAndType #11:#12 // println:(Ljava.lang.String;)V
#11 = Utf8 println
#12 = Utf8 (Ljava/lang/String;)V
#13 = Utf8 java/io/PrintStream
#14 = Class #18 // java.lang.System
#15 = NameAndType #16:#17 // out:Ljava.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":"Test"},{"index":3,"tag_n":7,"tag_s":"Class","value":"#19","resolved":"java.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":"java.lang.System:out:Ljava.io.PrintStream;"},{"index":8,"tag_n":10,"tag_s":"Methodref","value":"#9:#10","resolved":"java.io.PrintStream:println:(Ljava.lang.String;)V"},{"index":9,"tag_n":7,"tag_s":"Class","value":"#13","resolved":"java.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":"java.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":"Test","super_n":3,"super_s":"java/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.Test.main:
/ method.Test.Test.main ();
| 0x00000120 getstatic java.lang.System:out:Ljava.io.PrintStream; ; [01] -r-x section size 17 named class.methods.main.attr.0.code
| 0x00000123 ldc "See if you can decompile/disassemble me!"
| 0x00000125 invokevirtual void java.io.PrintStream:println: (short, java.lang.String)
\ 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) Main
Super: (#2) java/lang/Object
Constant pool: 78
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = Class #37 // java.lang.StringBuilder
#37 = Utf8 java/lang/StringBuilder
#38 = Methodref #36:#3 // java.lang.StringBuilder:<init>:()V
#39 = String #40 // "Line: "
#40 = Utf8 Line:
#41 = Methodref #36:#42 // java.lang.StringBuilder:append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#42 = NameAndType #43:#44 // append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#43 = Utf8 append
#44 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#45 = Methodref #36:#46 // java.lang.StringBuilder:toString:()Ljava.lang.String;
#46 = NameAndType #47:#35 // toString:()Ljava.lang.String;
#47 = Utf8 toString
#48 = Methodref #23:#49 // java.io.BufferedReader:close:()V
#49 = NameAndType #50:#6 // close:()V
#50 = Utf8 close
#51 = Class #52 // java.lang.Exception
#52 = Utf8 java/lang/Exception
#53 = Fieldref #8:#54 // java.lang.System:err:Ljava.io.PrintStream;
#54 = NameAndType #55:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#59 = NameAndType #60:#61 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#60 = Utf8 format
#61 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#62 = Methodref #51:#63 // java.lang.Exception:printStackTrace:()V
#63 = NameAndType #64:#6 // printStackTrace:()V
#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 // java.lang.String
#73 = Utf8 java/lang/String
#74 = Class #75 // [Ljava.lang.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) Main
Super: (#2) java/lang/Object
Constant pool: 78
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = Class #37 // java.lang.StringBuilder
#37 = Utf8 java/lang/StringBuilder
#38 = Methodref #36:#3 // java.lang.StringBuilder:<init>:()V
#39 = String #40 // "Line: "
#40 = Utf8 Line:
#41 = Methodref #36:#42 // java.lang.StringBuilder:append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#42 = NameAndType #43:#44 // append:(Ljava.lang.String;)Ljava.lang.StringBuilder;
#43 = Utf8 append
#44 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#45 = Methodref #36:#46 // java.lang.StringBuilder:toString:()Ljava.lang.String;
#46 = NameAndType #47:#35 // toString:()Ljava.lang.String;
#47 = Utf8 toString
#48 = Methodref #23:#49 // java.io.BufferedReader:close:()V
#49 = NameAndType #50:#6 // close:()V
#50 = Utf8 close
#51 = Class #52 // java.lang.Exception
#52 = Utf8 java/lang/Exception
#53 = Fieldref #8:#54 // java.lang.System:err:Ljava.io.PrintStream;
#54 = NameAndType #55:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#59 = NameAndType #60:#61 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#60 = Utf8 format
#61 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#62 = Methodref #51:#63 // java.lang.Exception:printStackTrace:()V
#63 = NameAndType #64:#6 // printStackTrace:()V
#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 // java.lang.String
#73 = Utf8 java/lang/String
#74 = Class #75 // [Ljava.lang.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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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) Main
Super: (#2) java/lang/Object
Constant pool: 85
#1 = Methodref #2:#3 // java.lang.Object:<init>:()V
#2 = Class #4 // java.lang.Object
#3 = NameAndType #5:#6 // <init>:()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8:#9 // java.lang.System:out:Ljava.io.PrintStream;
#8 = Class #10 // java.lang.System
#9 = NameAndType #11:#12 // out:Ljava.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 // java.io.PrintStream:println:(Ljava.lang.String;)V
#16 = Class #18 // java.io.PrintStream
#17 = NameAndType #19:#20 // println:(Ljava.lang.String;)V
#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 // java.io.FileReader:<init>:(Ljava.lang.String;)V
#28 = NameAndType #5:#20 // <init>:(Ljava.lang.String;)V
#29 = Methodref #23:#30 // java.io.BufferedReader:<init>:(Ljava.io.Reader;)V
#30 = NameAndType #5:#31 // <init>:(Ljava.io.Reader;)V
#31 = Utf8 (Ljava/io/Reader;)V
#32 = Methodref #23:#33 // java.io.BufferedReader:readLine:()Ljava.lang.String;
#33 = NameAndType #34:#35 // readLine:()Ljava.lang.String;
#34 = Utf8 readLine
#35 = Utf8 ()Ljava/lang/String;
#36 = InvokeDynamic #0:#37 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#37 = NameAndType #38:#39 // makeConcatWithConstants:(Ljava.lang.String;)Ljava.lang.String;
#38 = Utf8 makeConcatWithConstants
#39 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#40 = Methodref #23:#41 // java.io.BufferedReader:close:()V
#41 = NameAndType #42:#6 // close:()V
#42 = Utf8 close
#43 = Class #44 // java.lang.Exception
#44 = Utf8 java/lang/Exception
#45 = Fieldref #8:#46 // java.lang.System:err:Ljava.io.PrintStream;
#46 = NameAndType #47:#12 // err:Ljava.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:format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#51 = NameAndType #52:#53 // format:(Ljava.lang.String;[Ljava.lang.Object;)Ljava.io.PrintStream;
#52 = Utf8 format
#53 = Utf8 (Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
#54 = Methodref #43:#55 // java.lang.Exception:printStackTrace:()V
#55 = NameAndType #56:#6 // printStackTrace:()V
#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 // java.lang.String
#65 = Utf8 java/lang/String
#66 = Class #67 // [Ljava.lang.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.StringConcatFactory:makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#73 = Class #75 // java.lang.invoke.StringConcatFactory
#74 = NameAndType #38:#76 // makeConcatWithConstants:(Ljava.lang.invoke.MethodHandles$Lookup;Ljava.lang.String;Ljava.lang.invoke.MethodType;Ljava.lang.String;[Ljava.lang.Object;)Ljava.lang.invoke.CallSite;
#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.Main._init:
/ method.Main.Main._init ();
| 0x00000383 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x00000384 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x00000383 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x00000384 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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.Main._init:
/ method.Main.Main._init ();
| 0x000004a4 aload_0 ; [01] -r-x section size 29 named class.methods._init_.attr.0.code
| 0x000004a5 invokespecial void java.lang.Object:<init>: ()
\ 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: (short, java.lang.String)
EOF
RUN