added a parser to read text to BeeSource. Will require a lexer for the actual opcode
This commit is contained in:
parent
68c5b9e9a9
commit
138f14b8f3
32 changed files with 1660 additions and 60 deletions
719
out
Normal file
719
out
Normal file
|
|
@ -0,0 +1,719 @@
|
|||
Classfile /Users/Shautvast/IdeaProjects/beejava/target/classes/nl/sander/beejava/Compiler.class
|
||||
Last modified 19 Nov 2020; size 6572 bytes
|
||||
SHA-256 checksum 0fb294ea8b397e1710dc3017a3c9c31e9bbda5f5219ef646af238a9a0aa62e0a
|
||||
Compiled from "Compiler.java"
|
||||
public class nl.sander.beejava.Compiler
|
||||
minor version: 0
|
||||
major version: 59
|
||||
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
|
||||
this_class: #11 // nl/sander/beejava/Compiler
|
||||
super_class: #2 // java/lang/Object
|
||||
interfaces: 0, fields: 4, methods: 9, attributes: 3
|
||||
Constant pool:
|
||||
#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 = Class #8 // nl/sander/beejava/ConstantPoolCreator
|
||||
#8 = Utf8 nl/sander/beejava/ConstantPoolCreator
|
||||
#9 = Methodref #7.#3 // nl/sander/beejava/ConstantPoolCreator."<init>":()V
|
||||
#10 = Fieldref #11.#12 // nl/sander/beejava/Compiler.constantPoolCreator:Lnl/sander/beejava/ConstantPoolCreator;
|
||||
#11 = Class #13 // nl/sander/beejava/Compiler
|
||||
#12 = NameAndType #14:#15 // constantPoolCreator:Lnl/sander/beejava/ConstantPoolCreator;
|
||||
#13 = Utf8 nl/sander/beejava/Compiler
|
||||
#14 = Utf8 constantPoolCreator
|
||||
#15 = Utf8 Lnl/sander/beejava/ConstantPoolCreator;
|
||||
#16 = Fieldref #11.#17 // nl/sander/beejava/Compiler.compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
#17 = NameAndType #18:#19 // compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
#18 = Utf8 compiledClass
|
||||
#19 = Utf8 Lnl/sander/beejava/CompiledClass;
|
||||
#20 = Class #21 // nl/sander/beejava/ConstantPoolEntryCreator
|
||||
#21 = Utf8 nl/sander/beejava/ConstantPoolEntryCreator
|
||||
#22 = Methodref #20.#23 // nl/sander/beejava/ConstantPoolEntryCreator."<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
#23 = NameAndType #5:#24 // "<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
#24 = Utf8 (Lnl/sander/beejava/CompiledClass;)V
|
||||
#25 = Fieldref #11.#26 // nl/sander/beejava/Compiler.constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
#26 = NameAndType #27:#28 // constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
#27 = Utf8 constantPoolEntryCreator
|
||||
#28 = Utf8 Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
#29 = Class #30 // nl/sander/beejava/CompiledClass
|
||||
#30 = Utf8 nl/sander/beejava/CompiledClass
|
||||
#31 = Methodref #29.#32 // nl/sander/beejava/CompiledClass."<init>":(Lnl/sander/beejava/api/BeeSource;)V
|
||||
#32 = NameAndType #5:#33 // "<init>":(Lnl/sander/beejava/api/BeeSource;)V
|
||||
#33 = Utf8 (Lnl/sander/beejava/api/BeeSource;)V
|
||||
#34 = Methodref #11.#23 // nl/sander/beejava/Compiler."<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
#35 = Methodref #11.#36 // nl/sander/beejava/Compiler.compile:()Lnl/sander/beejava/CompiledClass;
|
||||
#36 = NameAndType #37:#38 // compile:()Lnl/sander/beejava/CompiledClass;
|
||||
#37 = Utf8 compile
|
||||
#38 = Utf8 ()Lnl/sander/beejava/CompiledClass;
|
||||
#39 = Methodref #11.#40 // nl/sander/beejava/Compiler.createConstantPool:()Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#40 = NameAndType #41:#42 // createConstantPool:()Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#41 = Utf8 createConstantPool
|
||||
#42 = Utf8 ()Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#43 = Methodref #29.#44 // nl/sander/beejava/CompiledClass.setConstantPool:(Lnl/sander/beejava/constantpool/ConstantPool;)V
|
||||
#44 = NameAndType #45:#46 // setConstantPool:(Lnl/sander/beejava/constantpool/ConstantPool;)V
|
||||
#45 = Utf8 setConstantPool
|
||||
#46 = Utf8 (Lnl/sander/beejava/constantpool/ConstantPool;)V
|
||||
#47 = Methodref #20.#48 // nl/sander/beejava/ConstantPoolEntryCreator.addInterfaces:()V
|
||||
#48 = NameAndType #49:#6 // addInterfaces:()V
|
||||
#49 = Utf8 addInterfaces
|
||||
#50 = Methodref #20.#51 // nl/sander/beejava/ConstantPoolEntryCreator.addFields:()V
|
||||
#51 = NameAndType #52:#6 // addFields:()V
|
||||
#52 = Utf8 addFields
|
||||
#53 = Methodref #11.#54 // nl/sander/beejava/Compiler.addConstructors:()V
|
||||
#54 = NameAndType #55:#6 // addConstructors:()V
|
||||
#55 = Utf8 addConstructors
|
||||
#56 = Methodref #11.#57 // nl/sander/beejava/Compiler.addMethods:()V
|
||||
#57 = NameAndType #58:#6 // addMethods:()V
|
||||
#58 = Utf8 addMethods
|
||||
#59 = Methodref #29.#60 // nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
#60 = NameAndType #61:#62 // getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
#61 = Utf8 getSource
|
||||
#62 = Utf8 ()Lnl/sander/beejava/api/BeeSource;
|
||||
#63 = Methodref #64.#65 // nl/sander/beejava/api/BeeSource.getConstructors:()Ljava/util/Set;
|
||||
#64 = Class #66 // nl/sander/beejava/api/BeeSource
|
||||
#65 = NameAndType #67:#68 // getConstructors:()Ljava/util/Set;
|
||||
#66 = Utf8 nl/sander/beejava/api/BeeSource
|
||||
#67 = Utf8 getConstructors
|
||||
#68 = Utf8 ()Ljava/util/Set;
|
||||
#69 = InvokeDynamic #0:#70 // #0:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
#70 = NameAndType #71:#72 // accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
#71 = Utf8 accept
|
||||
#72 = Utf8 (Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
#73 = InterfaceMethodref #74.#75 // java/util/Set.forEach:(Ljava/util/function/Consumer;)V
|
||||
#74 = Class #76 // java/util/Set
|
||||
#75 = NameAndType #77:#78 // forEach:(Ljava/util/function/Consumer;)V
|
||||
#76 = Utf8 java/util/Set
|
||||
#77 = Utf8 forEach
|
||||
#78 = Utf8 (Ljava/util/function/Consumer;)V
|
||||
#79 = Methodref #64.#80 // nl/sander/beejava/api/BeeSource.getMethods:()Ljava/util/Set;
|
||||
#80 = NameAndType #81:#68 // getMethods:()Ljava/util/Set;
|
||||
#81 = Utf8 getMethods
|
||||
#82 = InvokeDynamic #1:#70 // #1:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
#83 = Methodref #20.#84 // nl/sander/beejava/ConstantPoolEntryCreator.addThisClass:()Lnl/sander/beejava/constantpool/entry/ClassEntry;
|
||||
#84 = NameAndType #85:#86 // addThisClass:()Lnl/sander/beejava/constantpool/entry/ClassEntry;
|
||||
#85 = Utf8 addThisClass
|
||||
#86 = Utf8 ()Lnl/sander/beejava/constantpool/entry/ClassEntry;
|
||||
#87 = Methodref #29.#88 // nl/sander/beejava/CompiledClass.setThisClass:(Lnl/sander/beejava/constantpool/entry/ClassEntry;)V
|
||||
#88 = NameAndType #89:#90 // setThisClass:(Lnl/sander/beejava/constantpool/entry/ClassEntry;)V
|
||||
#89 = Utf8 setThisClass
|
||||
#90 = Utf8 (Lnl/sander/beejava/constantpool/entry/ClassEntry;)V
|
||||
#91 = String #92 // Code
|
||||
#92 = Utf8 Code
|
||||
#93 = Methodref #20.#94 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#94 = NameAndType #95:#96 // getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#95 = Utf8 getOrCreateUtf8
|
||||
#96 = Utf8 (Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#97 = Fieldref #11.#98 // nl/sander/beejava/Compiler.codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#98 = NameAndType #99:#100 // codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#99 = Utf8 codeAttributeNameEntry
|
||||
#100 = Utf8 Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
#101 = Methodref #29.#102 // nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
#102 = NameAndType #103:#104 // addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
#103 = Utf8 addConstantPoolEntry
|
||||
#104 = Utf8 (Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
#105 = Methodref #29.#106 // nl/sander/beejava/CompiledClass.getConstantTree:()Ljava/util/Set;
|
||||
#106 = NameAndType #107:#68 // getConstantTree:()Ljava/util/Set;
|
||||
#107 = Utf8 getConstantTree
|
||||
#108 = Methodref #7.#109 // nl/sander/beejava/ConstantPoolCreator.createConstantPool:(Ljava/util/Set;)Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#109 = NameAndType #41:#110 // createConstantPool:(Ljava/util/Set;)Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#110 = Utf8 (Ljava/util/Set;)Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
#111 = InterfaceMethodref #74.#112 // java/util/Set.stream:()Ljava/util/stream/Stream;
|
||||
#112 = NameAndType #113:#114 // stream:()Ljava/util/stream/Stream;
|
||||
#113 = Utf8 stream
|
||||
#114 = Utf8 ()Ljava/util/stream/Stream;
|
||||
#115 = InvokeDynamic #2:#116 // #2:apply:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Function;
|
||||
#116 = NameAndType #117:#118 // apply:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Function;
|
||||
#117 = Utf8 apply
|
||||
#118 = Utf8 (Lnl/sander/beejava/Compiler;)Ljava/util/function/Function;
|
||||
#119 = InterfaceMethodref #120.#121 // java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream;
|
||||
#120 = Class #122 // java/util/stream/Stream
|
||||
#121 = NameAndType #123:#124 // map:(Ljava/util/function/Function;)Ljava/util/stream/Stream;
|
||||
#122 = Utf8 java/util/stream/Stream
|
||||
#123 = Utf8 map
|
||||
#124 = Utf8 (Ljava/util/function/Function;)Ljava/util/stream/Stream;
|
||||
#125 = Methodref #126.#127 // java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
#126 = Class #128 // java/util/Objects
|
||||
#127 = NameAndType #129:#130 // requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
#128 = Utf8 java/util/Objects
|
||||
#129 = Utf8 requireNonNull
|
||||
#130 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object;
|
||||
#131 = InvokeDynamic #3:#132 // #3:accept:(Lnl/sander/beejava/CompiledClass;)Ljava/util/function/Consumer;
|
||||
#132 = NameAndType #71:#133 // accept:(Lnl/sander/beejava/CompiledClass;)Ljava/util/function/Consumer;
|
||||
#133 = Utf8 (Lnl/sander/beejava/CompiledClass;)Ljava/util/function/Consumer;
|
||||
#134 = InterfaceMethodref #120.#75 // java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V
|
||||
#135 = InterfaceMethodref #74.#136 // java/util/Set.iterator:()Ljava/util/Iterator;
|
||||
#136 = NameAndType #137:#138 // iterator:()Ljava/util/Iterator;
|
||||
#137 = Utf8 iterator
|
||||
#138 = Utf8 ()Ljava/util/Iterator;
|
||||
#139 = InterfaceMethodref #140.#141 // java/util/Iterator.hasNext:()Z
|
||||
#140 = Class #142 // java/util/Iterator
|
||||
#141 = NameAndType #143:#144 // hasNext:()Z
|
||||
#142 = Utf8 java/util/Iterator
|
||||
#143 = Utf8 hasNext
|
||||
#144 = Utf8 ()Z
|
||||
#145 = InterfaceMethodref #140.#146 // java/util/Iterator.next:()Ljava/lang/Object;
|
||||
#146 = NameAndType #147:#148 // next:()Ljava/lang/Object;
|
||||
#147 = Utf8 next
|
||||
#148 = Utf8 ()Ljava/lang/Object;
|
||||
#149 = Class #150 // nl/sander/beejava/api/BeeMethod
|
||||
#150 = Utf8 nl/sander/beejava/api/BeeMethod
|
||||
#151 = Methodref #11.#152 // nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#152 = NameAndType #153:#154 // createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#153 = Utf8 createMethod
|
||||
#154 = Utf8 (Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#155 = Methodref #29.#156 // nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#156 = NameAndType #157:#158 // addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#157 = Utf8 addMethod
|
||||
#158 = Utf8 (Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#159 = Class #160 // nl/sander/beejava/classinfo/MethodInfo
|
||||
#160 = Utf8 nl/sander/beejava/classinfo/MethodInfo
|
||||
#161 = Methodref #162.#163 // nl/sander/beejava/CodeContainer.getName:()Ljava/lang/String;
|
||||
#162 = Class #164 // nl/sander/beejava/CodeContainer
|
||||
#163 = NameAndType #165:#166 // getName:()Ljava/lang/String;
|
||||
#164 = Utf8 nl/sander/beejava/CodeContainer
|
||||
#165 = Utf8 getName
|
||||
#166 = Utf8 ()Ljava/lang/String;
|
||||
#167 = Methodref #162.#168 // nl/sander/beejava/CodeContainer.getSignature:()Ljava/lang/String;
|
||||
#168 = NameAndType #169:#166 // getSignature:()Ljava/lang/String;
|
||||
#169 = Utf8 getSignature
|
||||
#170 = Methodref #159.#171 // nl/sander/beejava/classinfo/MethodInfo."<init>":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V
|
||||
#171 = NameAndType #5:#172 // "<init>":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V
|
||||
#172 = Utf8 (Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V
|
||||
#173 = Methodref #162.#174 // nl/sander/beejava/CodeContainer.getAccessFlags:()Ljava/util/Set;
|
||||
#174 = NameAndType #175:#68 // getAccessFlags:()Ljava/util/Set;
|
||||
#175 = Utf8 getAccessFlags
|
||||
#176 = Methodref #159.#177 // nl/sander/beejava/classinfo/MethodInfo.addAccessFlags:(Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#177 = NameAndType #178:#179 // addAccessFlags:(Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#178 = Utf8 addAccessFlags
|
||||
#179 = Utf8 (Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#180 = Methodref #181.#182 // nl/sander/beejava/MethodCodeCreator.createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute;
|
||||
#181 = Class #183 // nl/sander/beejava/MethodCodeCreator
|
||||
#182 = NameAndType #184:#185 // createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute;
|
||||
#183 = Utf8 nl/sander/beejava/MethodCodeCreator
|
||||
#184 = Utf8 createCodeAttribute
|
||||
#185 = Utf8 (Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute;
|
||||
#186 = Methodref #159.#187 // nl/sander/beejava/classinfo/MethodInfo.addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info;
|
||||
#187 = NameAndType #188:#189 // addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info;
|
||||
#188 = Utf8 addAttribute
|
||||
#189 = Utf8 (Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info;
|
||||
#190 = Methodref #162.#191 // nl/sander/beejava/CodeContainer.getCode:()Ljava/util/List;
|
||||
#191 = NameAndType #192:#193 // getCode:()Ljava/util/List;
|
||||
#192 = Utf8 getCode
|
||||
#193 = Utf8 ()Ljava/util/List;
|
||||
#194 = InvokeDynamic #4:#70 // #4:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
#195 = InterfaceMethodref #196.#75 // java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
#196 = Class #197 // java/util/List
|
||||
#197 = Utf8 java/util/List
|
||||
#198 = Methodref #199.#200 // nl/sander/beejava/api/CodeLine.hasMethodCall:()Z
|
||||
#199 = Class #201 // nl/sander/beejava/api/CodeLine
|
||||
#200 = NameAndType #202:#144 // hasMethodCall:()Z
|
||||
#201 = Utf8 nl/sander/beejava/api/CodeLine
|
||||
#202 = Utf8 hasMethodCall
|
||||
#203 = Methodref #20.#204 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateMethodRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
#204 = NameAndType #205:#206 // getOrCreateMethodRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
#205 = Utf8 getOrCreateMethodRefEntry
|
||||
#206 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
#207 = Methodref #199.#208 // nl/sander/beejava/api/CodeLine.setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
#208 = NameAndType #209:#104 // setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
#209 = Utf8 setAssignedEntry
|
||||
#210 = Methodref #199.#211 // nl/sander/beejava/api/CodeLine.hasRefToOwnField:()Z
|
||||
#211 = NameAndType #212:#144 // hasRefToOwnField:()Z
|
||||
#212 = Utf8 hasRefToOwnField
|
||||
#213 = Methodref #199.#214 // nl/sander/beejava/api/CodeLine.hasRefToExternalField:()Z
|
||||
#214 = NameAndType #215:#144 // hasRefToExternalField:()Z
|
||||
#215 = Utf8 hasRefToExternalField
|
||||
#216 = Methodref #20.#217 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateFieldRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
#217 = NameAndType #218:#219 // getOrCreateFieldRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
#218 = Utf8 getOrCreateFieldRefEntry
|
||||
#219 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
#220 = Methodref #199.#221 // nl/sander/beejava/api/CodeLine.hasConstValue:()Z
|
||||
#221 = NameAndType #222:#144 // hasConstValue:()Z
|
||||
#222 = Utf8 hasConstValue
|
||||
#223 = Methodref #20.#224 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreatePrimitiveEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
#224 = NameAndType #225:#226 // getOrCreatePrimitiveEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
#225 = Utf8 getOrCreatePrimitiveEntry
|
||||
#226 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
#227 = Utf8 LineNumberTable
|
||||
#228 = Utf8 LocalVariableTable
|
||||
#229 = Utf8 this
|
||||
#230 = Utf8 Lnl/sander/beejava/Compiler;
|
||||
#231 = Utf8 (Lnl/sander/beejava/api/BeeSource;)Lnl/sander/beejava/CompiledClass;
|
||||
#232 = Utf8 beeSource
|
||||
#233 = Utf8 Lnl/sander/beejava/api/BeeSource;
|
||||
#234 = Utf8 method
|
||||
#235 = Utf8 Lnl/sander/beejava/api/BeeMethod;
|
||||
#236 = Utf8 StackMapTable
|
||||
#237 = Utf8 Lnl/sander/beejava/CodeContainer;
|
||||
#238 = Utf8 updateConstantPool
|
||||
#239 = Utf8 (Lnl/sander/beejava/CodeContainer;)V
|
||||
#240 = Utf8 codeContainer
|
||||
#241 = Utf8 (Lnl/sander/beejava/api/CodeLine;)V
|
||||
#242 = Utf8 methodRefEntry
|
||||
#243 = Utf8 Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
#244 = Utf8 fieldRefEntry
|
||||
#245 = Utf8 Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
#246 = Utf8 primitiveEntry
|
||||
#247 = Utf8 Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
#248 = Utf8 codeline
|
||||
#249 = Utf8 Lnl/sander/beejava/api/CodeLine;
|
||||
#250 = Utf8 SourceFile
|
||||
#251 = Utf8 Compiler.java
|
||||
#252 = Utf8 BootstrapMethods
|
||||
#253 = MethodHandle 6:#254 // REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
#254 = Methodref #255.#256 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
#255 = Class #257 // java/lang/invoke/LambdaMetafactory
|
||||
#256 = NameAndType #258:#259 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
#257 = Utf8 java/lang/invoke/LambdaMetafactory
|
||||
#258 = Utf8 metafactory
|
||||
#259 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
#260 = MethodType #261 // (Ljava/lang/Object;)V
|
||||
#261 = Utf8 (Ljava/lang/Object;)V
|
||||
#262 = MethodHandle 5:#263 // REF_invokeVirtual nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V
|
||||
#263 = Methodref #11.#264 // nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V
|
||||
#264 = NameAndType #238:#239 // updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V
|
||||
#265 = MethodType #266 // (Lnl/sander/beejava/api/BeeConstructor;)V
|
||||
#266 = Utf8 (Lnl/sander/beejava/api/BeeConstructor;)V
|
||||
#267 = MethodType #268 // (Lnl/sander/beejava/api/BeeMethod;)V
|
||||
#268 = Utf8 (Lnl/sander/beejava/api/BeeMethod;)V
|
||||
#269 = MethodType #130 // (Ljava/lang/Object;)Ljava/lang/Object;
|
||||
#270 = MethodHandle 5:#151 // REF_invokeVirtual nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#271 = MethodType #272 // (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#272 = Utf8 (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#273 = MethodHandle 5:#155 // REF_invokeVirtual nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#274 = MethodType #158 // (Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#275 = MethodHandle 5:#276 // REF_invokeVirtual nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V
|
||||
#276 = Methodref #11.#277 // nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V
|
||||
#277 = NameAndType #238:#241 // updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V
|
||||
#278 = MethodType #241 // (Lnl/sander/beejava/api/CodeLine;)V
|
||||
#279 = Utf8 InnerClasses
|
||||
#280 = Class #281 // java/lang/invoke/MethodHandles$Lookup
|
||||
#281 = Utf8 java/lang/invoke/MethodHandles$Lookup
|
||||
#282 = Class #283 // java/lang/invoke/MethodHandles
|
||||
#283 = Utf8 java/lang/invoke/MethodHandles
|
||||
#284 = Utf8 Lookup
|
||||
{
|
||||
private final nl.sander.beejava.CompiledClass compiledClass;
|
||||
descriptor: Lnl/sander/beejava/CompiledClass;
|
||||
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
|
||||
|
||||
private final nl.sander.beejava.ConstantPoolEntryCreator constantPoolEntryCreator;
|
||||
descriptor: Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
|
||||
|
||||
private final nl.sander.beejava.ConstantPoolCreator constantPoolCreator;
|
||||
descriptor: Lnl/sander/beejava/ConstantPoolCreator;
|
||||
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
|
||||
|
||||
private nl.sander.beejava.constantpool.entry.Utf8Entry codeAttributeNameEntry;
|
||||
descriptor: Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
flags: (0x0002) ACC_PRIVATE
|
||||
|
||||
public nl.sander.beejava.Compiler(nl.sander.beejava.CompiledClass);
|
||||
descriptor: (Lnl/sander/beejava/CompiledClass;)V
|
||||
flags: (0x0001) ACC_PUBLIC
|
||||
Code:
|
||||
stack=4, locals=2, args_size=2
|
||||
0: aload_0
|
||||
1: invokespecial #1 // Method java/lang/Object."<init>":()V
|
||||
4: aload_0
|
||||
5: new #7 // class nl/sander/beejava/ConstantPoolCreator
|
||||
8: dup
|
||||
9: invokespecial #9 // Method nl/sander/beejava/ConstantPoolCreator."<init>":()V
|
||||
12: putfield #10 // Field constantPoolCreator:Lnl/sander/beejava/ConstantPoolCreator;
|
||||
15: aload_0
|
||||
16: aload_1
|
||||
17: putfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
20: aload_0
|
||||
21: new #20 // class nl/sander/beejava/ConstantPoolEntryCreator
|
||||
24: dup
|
||||
25: aload_1
|
||||
26: invokespecial #22 // Method nl/sander/beejava/ConstantPoolEntryCreator."<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
29: putfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
32: return
|
||||
LineNumberTable:
|
||||
line 34: 0
|
||||
line 25: 4
|
||||
line 35: 15
|
||||
line 36: 20
|
||||
line 37: 32
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 33 0 this Lnl/sander/beejava/Compiler;
|
||||
0 33 1 compiledClass Lnl/sander/beejava/CompiledClass;
|
||||
|
||||
public static nl.sander.beejava.CompiledClass compile(nl.sander.beejava.api.BeeSource);
|
||||
descriptor: (Lnl/sander/beejava/api/BeeSource;)Lnl/sander/beejava/CompiledClass;
|
||||
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
|
||||
Code:
|
||||
stack=5, locals=1, args_size=1
|
||||
0: new #11 // class nl/sander/beejava/Compiler
|
||||
3: dup
|
||||
4: new #29 // class nl/sander/beejava/CompiledClass
|
||||
7: dup
|
||||
8: aload_0
|
||||
9: invokespecial #31 // Method nl/sander/beejava/CompiledClass."<init>":(Lnl/sander/beejava/api/BeeSource;)V
|
||||
12: invokespecial #34 // Method "<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
15: invokevirtual #35 // Method compile:()Lnl/sander/beejava/CompiledClass;
|
||||
18: areturn
|
||||
LineNumberTable:
|
||||
line 46: 0
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 19 0 beeSource Lnl/sander/beejava/api/BeeSource;
|
||||
|
||||
public nl.sander.beejava.CompiledClass compile();
|
||||
descriptor: ()Lnl/sander/beejava/CompiledClass;
|
||||
flags: (0x0001) ACC_PUBLIC
|
||||
Code:
|
||||
stack=2, locals=1, args_size=1
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: aload_0
|
||||
5: invokevirtual #39 // Method createConstantPool:()Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
8: invokevirtual #43 // Method nl/sander/beejava/CompiledClass.setConstantPool:(Lnl/sander/beejava/constantpool/ConstantPool;)V
|
||||
11: aload_0
|
||||
12: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
15: invokevirtual #47 // Method nl/sander/beejava/ConstantPoolEntryCreator.addInterfaces:()V
|
||||
18: aload_0
|
||||
19: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
22: invokevirtual #50 // Method nl/sander/beejava/ConstantPoolEntryCreator.addFields:()V
|
||||
25: aload_0
|
||||
26: invokevirtual #53 // Method addConstructors:()V
|
||||
29: aload_0
|
||||
30: invokevirtual #56 // Method addMethods:()V
|
||||
33: aload_0
|
||||
34: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
37: areturn
|
||||
LineNumberTable:
|
||||
line 53: 0
|
||||
line 55: 11
|
||||
line 56: 18
|
||||
line 57: 25
|
||||
line 58: 29
|
||||
line 60: 33
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 38 0 this Lnl/sander/beejava/Compiler;
|
||||
|
||||
private nl.sander.beejava.constantpool.ConstantPool createConstantPool();
|
||||
descriptor: ()Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
flags: (0x0002) ACC_PRIVATE
|
||||
Code:
|
||||
stack=3, locals=1, args_size=1
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: invokevirtual #59 // Method nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
7: invokevirtual #63 // Method nl/sander/beejava/api/BeeSource.getConstructors:()Ljava/util/Set;
|
||||
10: aload_0
|
||||
11: invokedynamic #69, 0 // InvokeDynamic #0:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
16: invokeinterface #73, 2 // InterfaceMethod java/util/Set.forEach:(Ljava/util/function/Consumer;)V
|
||||
21: aload_0
|
||||
22: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
25: invokevirtual #59 // Method nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
28: invokevirtual #79 // Method nl/sander/beejava/api/BeeSource.getMethods:()Ljava/util/Set;
|
||||
31: aload_0
|
||||
32: invokedynamic #82, 0 // InvokeDynamic #1:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
37: invokeinterface #73, 2 // InterfaceMethod java/util/Set.forEach:(Ljava/util/function/Consumer;)V
|
||||
42: aload_0
|
||||
43: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
46: aload_0
|
||||
47: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
50: invokevirtual #83 // Method nl/sander/beejava/ConstantPoolEntryCreator.addThisClass:()Lnl/sander/beejava/constantpool/entry/ClassEntry;
|
||||
53: invokevirtual #87 // Method nl/sander/beejava/CompiledClass.setThisClass:(Lnl/sander/beejava/constantpool/entry/ClassEntry;)V
|
||||
56: aload_0
|
||||
57: aload_0
|
||||
58: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
61: ldc #91 // String Code
|
||||
63: invokevirtual #93 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
66: putfield #97 // Field codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
69: aload_0
|
||||
70: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
73: aload_0
|
||||
74: getfield #97 // Field codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
77: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
80: aload_0
|
||||
81: getfield #10 // Field constantPoolCreator:Lnl/sander/beejava/ConstantPoolCreator;
|
||||
84: aload_0
|
||||
85: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
88: invokevirtual #105 // Method nl/sander/beejava/CompiledClass.getConstantTree:()Ljava/util/Set;
|
||||
91: invokevirtual #108 // Method nl/sander/beejava/ConstantPoolCreator.createConstantPool:(Ljava/util/Set;)Lnl/sander/beejava/constantpool/ConstantPool;
|
||||
94: areturn
|
||||
LineNumberTable:
|
||||
line 64: 0
|
||||
line 65: 21
|
||||
line 67: 42
|
||||
line 69: 56
|
||||
line 70: 69
|
||||
line 72: 80
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 95 0 this Lnl/sander/beejava/Compiler;
|
||||
|
||||
public void addConstructors();
|
||||
descriptor: ()V
|
||||
flags: (0x0001) ACC_PUBLIC
|
||||
Code:
|
||||
stack=3, locals=1, args_size=1
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: invokevirtual #59 // Method nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
7: invokevirtual #63 // Method nl/sander/beejava/api/BeeSource.getConstructors:()Ljava/util/Set;
|
||||
10: invokeinterface #111, 1 // InterfaceMethod java/util/Set.stream:()Ljava/util/stream/Stream;
|
||||
15: aload_0
|
||||
16: invokedynamic #115, 0 // InvokeDynamic #2:apply:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Function;
|
||||
21: invokeinterface #119, 2 // InterfaceMethod java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream;
|
||||
26: aload_0
|
||||
27: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
30: dup
|
||||
31: invokestatic #125 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
34: pop
|
||||
35: invokedynamic #131, 0 // InvokeDynamic #3:accept:(Lnl/sander/beejava/CompiledClass;)Ljava/util/function/Consumer;
|
||||
40: invokeinterface #134, 2 // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V
|
||||
45: return
|
||||
LineNumberTable:
|
||||
line 76: 0
|
||||
line 77: 21
|
||||
line 78: 31
|
||||
line 79: 45
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 46 0 this Lnl/sander/beejava/Compiler;
|
||||
|
||||
public void addMethods();
|
||||
descriptor: ()V
|
||||
flags: (0x0001) ACC_PUBLIC
|
||||
Code:
|
||||
stack=3, locals=3, args_size=1
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: aload_0
|
||||
5: getfield #97 // Field codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
8: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
11: aload_0
|
||||
12: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
15: invokevirtual #59 // Method nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
18: invokevirtual #79 // Method nl/sander/beejava/api/BeeSource.getMethods:()Ljava/util/Set;
|
||||
21: invokeinterface #135, 1 // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
|
||||
26: astore_1
|
||||
27: aload_1
|
||||
28: invokeinterface #139, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
33: ifeq 61
|
||||
36: aload_1
|
||||
37: invokeinterface #145, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
42: checkcast #149 // class nl/sander/beejava/api/BeeMethod
|
||||
45: astore_2
|
||||
46: aload_0
|
||||
47: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
50: aload_0
|
||||
51: aload_2
|
||||
52: invokevirtual #151 // Method createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
55: invokevirtual #155 // Method nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
58: goto 27
|
||||
61: return
|
||||
LineNumberTable:
|
||||
line 86: 0
|
||||
line 87: 11
|
||||
line 88: 46
|
||||
line 89: 58
|
||||
line 94: 61
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
46 12 2 method Lnl/sander/beejava/api/BeeMethod;
|
||||
0 62 0 this Lnl/sander/beejava/Compiler;
|
||||
StackMapTable: number_of_entries = 2
|
||||
frame_type = 252 /* append */
|
||||
offset_delta = 27
|
||||
locals = [ class java/util/Iterator ]
|
||||
frame_type = 250 /* chop */
|
||||
offset_delta = 33
|
||||
|
||||
private nl.sander.beejava.classinfo.MethodInfo createMethod(nl.sander.beejava.api.CodeContainer);
|
||||
descriptor: (Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
flags: (0x0002) ACC_PRIVATE
|
||||
Code:
|
||||
stack=5, locals=2, args_size=2
|
||||
0: new #159 // class nl/sander/beejava/classinfo/MethodInfo
|
||||
3: dup
|
||||
4: aload_0
|
||||
5: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
8: aload_1
|
||||
9: invokevirtual #161 // Method nl/sander/beejava/CodeContainer.getName:()Ljava/lang/String;
|
||||
12: invokevirtual #93 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
15: aload_0
|
||||
16: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
19: aload_1
|
||||
20: invokevirtual #167 // Method nl/sander/beejava/CodeContainer.getSignature:()Ljava/lang/String;
|
||||
23: invokevirtual #93 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
26: invokespecial #170 // Method nl/sander/beejava/classinfo/MethodInfo."<init>":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V
|
||||
29: aload_1
|
||||
30: invokevirtual #173 // Method nl/sander/beejava/CodeContainer.getAccessFlags:()Ljava/util/Set;
|
||||
33: invokevirtual #176 // Method nl/sander/beejava/classinfo/MethodInfo.addAccessFlags:(Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
36: aload_0
|
||||
37: getfield #97 // Field codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
40: aload_1
|
||||
41: invokestatic #180 // Method nl/sander/beejava/MethodCodeCreator.createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute;
|
||||
44: invokevirtual #186 // Method nl/sander/beejava/classinfo/MethodInfo.addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info;
|
||||
47: checkcast #159 // class nl/sander/beejava/classinfo/MethodInfo
|
||||
50: areturn
|
||||
LineNumberTable:
|
||||
line 101: 0
|
||||
line 102: 9
|
||||
line 103: 20
|
||||
line 104: 30
|
||||
line 105: 41
|
||||
line 101: 50
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 51 0 this Lnl/sander/beejava/Compiler;
|
||||
0 51 1 method Lnl/sander/beejava/CodeContainer;
|
||||
|
||||
private void updateConstantPool(nl.sander.beejava.api.CodeContainer);
|
||||
descriptor: (Lnl/sander/beejava/CodeContainer;)V
|
||||
flags: (0x0002) ACC_PRIVATE
|
||||
Code:
|
||||
stack=3, locals=2, args_size=2
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: aload_0
|
||||
5: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
8: aload_1
|
||||
9: invokevirtual #161 // Method nl/sander/beejava/CodeContainer.getName:()Ljava/lang/String;
|
||||
12: invokevirtual #93 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
15: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
18: aload_0
|
||||
19: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
22: aload_0
|
||||
23: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
26: aload_1
|
||||
27: invokevirtual #167 // Method nl/sander/beejava/CodeContainer.getSignature:()Ljava/lang/String;
|
||||
30: invokevirtual #93 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateUtf8:(Ljava/lang/String;)Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
33: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
36: aload_1
|
||||
37: invokevirtual #190 // Method nl/sander/beejava/CodeContainer.getCode:()Ljava/util/List;
|
||||
40: aload_0
|
||||
41: invokedynamic #194, 0 // InvokeDynamic #4:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer;
|
||||
46: invokeinterface #195, 2 // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V
|
||||
51: return
|
||||
LineNumberTable:
|
||||
line 112: 0
|
||||
line 113: 18
|
||||
line 114: 36
|
||||
line 115: 51
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
0 52 0 this Lnl/sander/beejava/Compiler;
|
||||
0 52 1 codeContainer Lnl/sander/beejava/CodeContainer;
|
||||
|
||||
private void updateConstantPool(nl.sander.beejava.api.CodeLine);
|
||||
descriptor: (Lnl/sander/beejava/api/CodeLine;)V
|
||||
flags: (0x0002) ACC_PRIVATE
|
||||
Code:
|
||||
stack=2, locals=3, args_size=2
|
||||
0: aload_1
|
||||
1: invokevirtual #198 // Method nl/sander/beejava/api/CodeLine.hasMethodCall:()Z
|
||||
4: ifeq 29
|
||||
7: aload_0
|
||||
8: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
11: aload_1
|
||||
12: invokevirtual #203 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateMethodRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
15: astore_2
|
||||
16: aload_1
|
||||
17: aload_2
|
||||
18: invokevirtual #207 // Method nl/sander/beejava/api/CodeLine.setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
21: aload_0
|
||||
22: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
25: aload_2
|
||||
26: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
29: aload_1
|
||||
30: invokevirtual #210 // Method nl/sander/beejava/api/CodeLine.hasRefToOwnField:()Z
|
||||
33: ifne 43
|
||||
36: aload_1
|
||||
37: invokevirtual #213 // Method nl/sander/beejava/api/CodeLine.hasRefToExternalField:()Z
|
||||
40: ifeq 65
|
||||
43: aload_0
|
||||
44: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
47: aload_1
|
||||
48: invokevirtual #216 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateFieldRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
51: astore_2
|
||||
52: aload_1
|
||||
53: aload_2
|
||||
54: invokevirtual #207 // Method nl/sander/beejava/api/CodeLine.setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
57: aload_0
|
||||
58: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
61: aload_2
|
||||
62: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
65: aload_1
|
||||
66: invokevirtual #220 // Method nl/sander/beejava/api/CodeLine.hasConstValue:()Z
|
||||
69: ifeq 94
|
||||
72: aload_0
|
||||
73: getfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
76: aload_1
|
||||
77: invokevirtual #223 // Method nl/sander/beejava/ConstantPoolEntryCreator.getOrCreatePrimitiveEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
80: astore_2
|
||||
81: aload_1
|
||||
82: aload_2
|
||||
83: invokevirtual #207 // Method nl/sander/beejava/api/CodeLine.setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
86: aload_0
|
||||
87: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
90: aload_2
|
||||
91: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
94: return
|
||||
LineNumberTable:
|
||||
line 127: 0
|
||||
line 128: 7
|
||||
line 129: 16
|
||||
line 130: 21
|
||||
line 133: 29
|
||||
line 134: 43
|
||||
line 135: 52
|
||||
line 136: 57
|
||||
line 139: 65
|
||||
line 140: 72
|
||||
line 141: 81
|
||||
line 142: 86
|
||||
line 144: 94
|
||||
LocalVariableTable:
|
||||
Start Length Slot Name Signature
|
||||
16 13 2 methodRefEntry Lnl/sander/beejava/constantpool/entry/MethodRefEntry;
|
||||
52 13 2 fieldRefEntry Lnl/sander/beejava/constantpool/entry/FieldRefEntry;
|
||||
81 13 2 primitiveEntry Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;
|
||||
0 95 0 this Lnl/sander/beejava/Compiler;
|
||||
0 95 1 codeline Lnl/sander/beejava/api/CodeLine;
|
||||
StackMapTable: number_of_entries = 4
|
||||
frame_type = 29 /* same */
|
||||
frame_type = 13 /* same */
|
||||
frame_type = 21 /* same */
|
||||
frame_type = 28 /* same */
|
||||
}
|
||||
SourceFile: "Compiler.java"
|
||||
BootstrapMethods:
|
||||
0: #253 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
Method arguments:
|
||||
#260 (Ljava/lang/Object;)V
|
||||
#262 REF_invokeVirtual nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V
|
||||
#265 (Lnl/sander/beejava/api/BeeConstructor;)V
|
||||
1: #253 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
Method arguments:
|
||||
#260 (Ljava/lang/Object;)V
|
||||
#262 REF_invokeVirtual nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V
|
||||
#267 (Lnl/sander/beejava/api/BeeMethod;)V
|
||||
2: #253 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
Method arguments:
|
||||
#269 (Ljava/lang/Object;)Ljava/lang/Object;
|
||||
#270 REF_invokeVirtual nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
#271 (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
3: #253 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
Method arguments:
|
||||
#260 (Ljava/lang/Object;)V
|
||||
#273 REF_invokeVirtual nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
#274 (Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
4: #253 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
|
||||
Method arguments:
|
||||
#260 (Ljava/lang/Object;)V
|
||||
#275 REF_invokeVirtual nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V
|
||||
#278 (Lnl/sander/beejava/api/CodeLine;)V
|
||||
InnerClasses:
|
||||
public static final #284= #280 of #282; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
|
||||
2
pom.xml
2
pom.xml
|
|
@ -21,8 +21,6 @@
|
|||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>15</maven.compiler.source>
|
||||
<maven.compiler.target>15</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
import nl.sander.beejava.api.BeeMethod;
|
||||
import nl.sander.beejava.api.BeeSource;
|
||||
import nl.sander.beejava.api.CodeContainer;
|
||||
import nl.sander.beejava.api.CodeLine;
|
||||
import nl.sander.beejava.classinfo.MethodInfo;
|
||||
import nl.sander.beejava.constantpool.ConstantPool;
|
||||
|
|
@ -83,9 +85,13 @@ public class Compiler {
|
|||
*/
|
||||
public void addMethods() {
|
||||
compiledClass.addConstantPoolEntry(codeAttributeNameEntry);
|
||||
compiledClass.getSource().getMethods().stream()
|
||||
.map(this::createMethod)
|
||||
.forEach(compiledClass::addMethod);
|
||||
for (BeeMethod method : compiledClass.getSource().getMethods()) {
|
||||
compiledClass.addMethod(createMethod(method));
|
||||
}
|
||||
|
||||
// compiledClass.getSource().getMethods().stream()
|
||||
// .map(this::createMethod)
|
||||
// .forEach(compiledClass::addMethod);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
import nl.sander.beejava.api.CodeContainer;
|
||||
import nl.sander.beejava.api.CodeLine;
|
||||
import nl.sander.beejava.classinfo.attributes.CodeAttribute;
|
||||
import nl.sander.beejava.constantpool.entry.ConstantPoolEntry;
|
||||
|
|
@ -12,7 +13,7 @@ public class MethodCodeCreator {
|
|||
public static CodeAttribute createCodeAttribute(Utf8Entry codeAttributeNameEntry, CodeContainer codeContainer) {
|
||||
CodeAttribute codeAttribute = new CodeAttribute(codeAttributeNameEntry);
|
||||
codeAttribute.setMaxStack(calculateMaxStack(codeContainer));
|
||||
codeAttribute.setMaxLocals(codeContainer.formalParameters.size() + 1);
|
||||
codeAttribute.setMaxLocals(codeContainer.getFormalParameters().size() + 1);
|
||||
ByteBuf byteBuf = new ByteBuf();
|
||||
|
||||
codeContainer.getCode().forEach(codeLine -> {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
import nl.sander.beejava.CodeContainer;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
|
@ -10,8 +9,8 @@ import java.util.*;
|
|||
*/
|
||||
public final class BeeConstructor extends CodeContainer {
|
||||
|
||||
private BeeConstructor(Set<MethodAccessFlags> accessFlags,
|
||||
List<BeeParameter> formalParameters,
|
||||
public BeeConstructor(Set<MethodAccessFlag> accessFlags,
|
||||
Set<BeeParameter> formalParameters,
|
||||
List<CodeLine> code) {
|
||||
this.formalParameters.addAll(formalParameters);
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
|
|
@ -57,8 +56,8 @@ public final class BeeConstructor extends CodeContainer {
|
|||
}
|
||||
|
||||
public static class Builder {
|
||||
private final Set<MethodAccessFlags> accessFlags = new HashSet<>();
|
||||
private final List<BeeParameter> formalParameters = new LinkedList<>();
|
||||
private final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||
private final Set<BeeParameter> formalParameters = new HashSet<>();
|
||||
private final List<CodeLine> code = new LinkedList<>();
|
||||
|
||||
private Builder() {
|
||||
|
|
@ -70,7 +69,7 @@ public final class BeeConstructor extends CodeContainer {
|
|||
return this;
|
||||
}
|
||||
|
||||
public Builder withAccessFlags(MethodAccessFlags... accessFlags) {
|
||||
public Builder withAccessFlags(MethodAccessFlag... accessFlags) {
|
||||
this.accessFlags.addAll(Arrays.asList(accessFlags));
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
import nl.sander.beejava.flags.FieldAccessFlags;
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
|
|
@ -12,11 +12,11 @@ import java.util.Set;
|
|||
*/
|
||||
public final class BeeField {
|
||||
|
||||
private final Set<FieldAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<FieldAccessFlag> accessFlags = new HashSet<>();
|
||||
private final Class<?> type;
|
||||
private final String name;
|
||||
|
||||
private BeeField(Set<FieldAccessFlags> accessFlags, Class<?> type, String name) {
|
||||
public BeeField(Set<FieldAccessFlag> accessFlags, Class<?> type, String name) {
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
|
|
@ -26,7 +26,7 @@ public final class BeeField {
|
|||
return new Builder();
|
||||
}
|
||||
|
||||
public Set<FieldAccessFlags> getAccessFlags() {
|
||||
public Set<FieldAccessFlag> getAccessFlags() {
|
||||
return accessFlags;
|
||||
}
|
||||
|
||||
|
|
@ -52,7 +52,7 @@ public final class BeeField {
|
|||
}
|
||||
|
||||
public static class Builder {
|
||||
private final Set<FieldAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<FieldAccessFlag> accessFlags = new HashSet<>();
|
||||
private Class<?> type;
|
||||
private String name;
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ public final class BeeField {
|
|||
|
||||
}
|
||||
|
||||
public BeeField.Builder withAccessFlags(FieldAccessFlags... accessFlags) {
|
||||
public BeeField.Builder withAccessFlags(FieldAccessFlag... accessFlags) {
|
||||
this.accessFlags.addAll(Arrays.asList(accessFlags));
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
import nl.sander.beejava.CodeContainer;
|
||||
import nl.sander.beejava.TypeMapper;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Models a method in a BeeClass
|
||||
|
|
@ -15,7 +12,7 @@ public final class BeeMethod extends CodeContainer {
|
|||
|
||||
private final Class<?> returnType;
|
||||
|
||||
private BeeMethod(String name, Set<MethodAccessFlags> accessFlags,
|
||||
private BeeMethod(String name, Set<MethodAccessFlag> accessFlags,
|
||||
List<BeeParameter> formalParameters,
|
||||
Class<?> returnType, List<CodeLine> code) {
|
||||
this.name = name;
|
||||
|
|
@ -52,7 +49,7 @@ public final class BeeMethod extends CodeContainer {
|
|||
}
|
||||
|
||||
public static class Builder {
|
||||
private final Set<MethodAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||
private final List<BeeParameter> formalParameters = new LinkedList<>();
|
||||
private final List<CodeLine> code = new LinkedList<>();
|
||||
private String name;
|
||||
|
|
@ -66,7 +63,7 @@ public final class BeeMethod extends CodeContainer {
|
|||
return this;
|
||||
}
|
||||
|
||||
public Builder withAccessFlags(MethodAccessFlags... accessFlags) {
|
||||
public Builder withAccessFlags(MethodAccessFlag... accessFlags) {
|
||||
this.accessFlags.addAll(Arrays.asList(accessFlags));
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ public final class BeeParameter {
|
|||
private final Class<?> type;
|
||||
private final String name;
|
||||
|
||||
private BeeParameter(Class<?> type, String name) {
|
||||
public BeeParameter(Class<?> type, String name) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
}
|
||||
|
|
|
|||
61
src/main/java/nl/sander/beejava/api/CodeContainer.java
Normal file
61
src/main/java/nl/sander/beejava/api/CodeContainer.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
import nl.sander.beejava.TypeMapper;
|
||||
import nl.sander.beejava.api.BeeParameter;
|
||||
import nl.sander.beejava.api.BeeSource;
|
||||
import nl.sander.beejava.api.CodeLine;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* parent of a constructor or a method.
|
||||
*/
|
||||
public abstract class CodeContainer {
|
||||
|
||||
protected final List<CodeLine> code = new LinkedList<>();
|
||||
protected final Set<BeeParameter> formalParameters = new HashSet<>();
|
||||
protected final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||
private BeeSource owner;
|
||||
|
||||
public List<CodeLine> getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getSignature() {
|
||||
return getParametersSignature() + TypeMapper.map(getReturnType());
|
||||
}
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
public abstract Class<?> getReturnType();
|
||||
|
||||
private String getParametersSignature() {
|
||||
return formalParameters.stream()
|
||||
.map(BeeParameter::getType)
|
||||
.map(TypeMapper::map)
|
||||
.collect(Collectors.joining(",", "(", ")"));
|
||||
}
|
||||
|
||||
public Set<MethodAccessFlag> getAccessFlags() {
|
||||
return accessFlags;
|
||||
}
|
||||
|
||||
public BeeSource getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public void setOwner(BeeSource beeSource) {
|
||||
if (owner != null) {
|
||||
throw new IllegalStateException("Owner set twice. Sue the developer!");
|
||||
}
|
||||
this.owner = beeSource;
|
||||
}
|
||||
|
||||
public abstract boolean isConstructor();
|
||||
|
||||
public Set<BeeParameter> getFormalParameters() {
|
||||
return formalParameters;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
|
||||
import nl.sander.beejava.CodeContainer;
|
||||
import nl.sander.beejava.JavaOpcode;
|
||||
import nl.sander.beejava.TypeMapper;
|
||||
import nl.sander.beejava.constantpool.entry.ConstantPoolEntry;
|
||||
|
|
@ -39,7 +38,7 @@ public final class CodeLine {
|
|||
return new CodeLine(opcode).withExternalFieldRef(fieldClass, fieldName);
|
||||
}
|
||||
|
||||
public static CodeLine line(Opcode opcode, Object constValue) {
|
||||
public static CodeLine line(Opcode opcode, String constValue) {
|
||||
return new CodeLine(opcode).withConstValue(constValue);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
package nl.sander.beejava.api;
|
||||
|
||||
import nl.sander.beejava.apiv2.Opcode;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public enum Version {
|
||||
V1_0_2(45),
|
||||
V1_1(45),
|
||||
|
|
@ -31,4 +35,13 @@ public enum Version {
|
|||
public int getMinor(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static Optional<Version> get(String text){
|
||||
for (Version version : Version.values()) {
|
||||
if (version.toString().equals(text)) {
|
||||
return Optional.of(version);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
53
src/main/java/nl/sander/beejava/apiv2/BeeConstructor.java
Normal file
53
src/main/java/nl/sander/beejava/apiv2/BeeConstructor.java
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Models a constructor
|
||||
*/
|
||||
public final class BeeConstructor extends CodeContainer {
|
||||
|
||||
public BeeConstructor(Set<MethodAccessFlag> accessFlags,
|
||||
Set<BeeParameter> formalParameters,
|
||||
List<CodeLine> code) {
|
||||
this.formalParameters.addAll(formalParameters);
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
super.code.addAll(code);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return "<init>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "BeeConstructor{" +
|
||||
"formalParameters=" + formalParameters +
|
||||
'}';
|
||||
}
|
||||
|
||||
public Class<?> getReturnType() {
|
||||
return Void.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isConstructor() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BeeConstructor that = (BeeConstructor) o;
|
||||
return formalParameters.equals(that.formalParameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(formalParameters);
|
||||
}
|
||||
|
||||
}
|
||||
82
src/main/java/nl/sander/beejava/apiv2/BeeField.java
Normal file
82
src/main/java/nl/sander/beejava/apiv2/BeeField.java
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Models a field in a BeeClass
|
||||
*/
|
||||
public final class BeeField {
|
||||
|
||||
private final Set<FieldAccessFlag> accessFlags = new HashSet<>();
|
||||
private final Class<?> type;
|
||||
private final String name;
|
||||
|
||||
public BeeField(Set<FieldAccessFlag> accessFlags, Class<?> type, String name) {
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public static Builder builder(){
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public Set<FieldAccessFlag> getAccessFlags() {
|
||||
return accessFlags;
|
||||
}
|
||||
|
||||
public Class<?> getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BeeField beeField = (BeeField) o;
|
||||
return name.equals(beeField.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name);
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
private final Set<FieldAccessFlag> accessFlags = new HashSet<>();
|
||||
private Class<?> type;
|
||||
private String name;
|
||||
|
||||
private Builder(){
|
||||
|
||||
}
|
||||
|
||||
public Builder withAccessFlags(FieldAccessFlag... accessFlags) {
|
||||
this.accessFlags.addAll(Arrays.asList(accessFlags));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder withType(Class<?> type) {
|
||||
this.type=type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder withName(String name) {
|
||||
this.name=name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BeeField build() {
|
||||
return new BeeField(accessFlags, type, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
46
src/main/java/nl/sander/beejava/apiv2/BeeMethod.java
Normal file
46
src/main/java/nl/sander/beejava/apiv2/BeeMethod.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Models a method in a BeeClass
|
||||
*/
|
||||
public final class BeeMethod extends CodeContainer {
|
||||
private final String name;
|
||||
|
||||
private final Class<?> returnType;
|
||||
|
||||
BeeMethod(String name, Set<MethodAccessFlag> accessFlags,
|
||||
Set<BeeParameter> formalParameters,
|
||||
Class<?> returnType, List<CodeLine> code) {
|
||||
this.name = name;
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
this.formalParameters.addAll(formalParameters);
|
||||
this.returnType = returnType;
|
||||
super.code.addAll(code);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Class<?> getReturnType() {
|
||||
return returnType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isConstructor() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void validate() {
|
||||
//TODO
|
||||
/*
|
||||
* here we could add checks like:
|
||||
* -If this method is in a class rather than an interface, and the name of the method is <init>, then the descriptor must denote a void method.
|
||||
* -If the name of the method is <clinit>, then the descriptor must denote avoid method, and, in a class file whose version number is 51.0 or above,a method that takes no arguments
|
||||
*/
|
||||
}
|
||||
}
|
||||
37
src/main/java/nl/sander/beejava/apiv2/BeeParameter.java
Normal file
37
src/main/java/nl/sander/beejava/apiv2/BeeParameter.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Models a formal parameter in a method declaration.
|
||||
*/
|
||||
public final class BeeParameter {
|
||||
private final Class<?> type;
|
||||
private final String name;
|
||||
|
||||
public BeeParameter(Class<?> type, String name) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Class<?> getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
BeeParameter that = (BeeParameter) o;
|
||||
return name.equals(that.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name);
|
||||
}
|
||||
}
|
||||
110
src/main/java/nl/sander/beejava/apiv2/BeeSource.java
Normal file
110
src/main/java/nl/sander/beejava/apiv2/BeeSource.java
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.api.Version;
|
||||
import nl.sander.beejava.flags.ClassAccessFlags;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Contains parsed class elements like constructors and methods, but the opcode is not compiled to bytecode yet.
|
||||
*/
|
||||
public final class BeeSource {
|
||||
private final Set<ClassAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<Class<?>> interfaces = new HashSet<>();
|
||||
private final Set<BeeField> fields = new HashSet<>();
|
||||
private final Set<BeeConstructor> constructors = new HashSet<>();
|
||||
private final Set<BeeMethod> methods = new HashSet<>();
|
||||
private Version classFileVersion;
|
||||
private String name;
|
||||
private Class<?> superClass;
|
||||
|
||||
/**
|
||||
* @return The classfile version
|
||||
*/
|
||||
public Version getClassFileVersion() {
|
||||
return classFileVersion;
|
||||
}
|
||||
|
||||
public void setClassFileVersion(Version classFileVersion) {
|
||||
this.classFileVersion = classFileVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all constructors that are provided with the class
|
||||
*/
|
||||
public Set<BeeConstructor> getConstructors() {
|
||||
return Collections.unmodifiableSet(constructors);
|
||||
}
|
||||
|
||||
public void addConstructors(BeeConstructor... constructors) {
|
||||
this.constructors.addAll(Set.of(constructors));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all methods that are provided with the class
|
||||
*/
|
||||
public Set<BeeMethod> getMethods() {
|
||||
return methods;
|
||||
}
|
||||
|
||||
public void addMethods(BeeMethod... methods) {
|
||||
this.methods.addAll(Set.of(methods));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The access flags for the class
|
||||
*/
|
||||
public Set<ClassAccessFlags> getAccessFlags() {
|
||||
return Collections.unmodifiableSet(accessFlags);
|
||||
}
|
||||
|
||||
public void addAccessFlags(ClassAccessFlags... classAccessFlags) {
|
||||
this.accessFlags.addAll(Set.of(classAccessFlags));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The full name, like java.lang.Class
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The superclass
|
||||
*/
|
||||
public Class<?> getSuperClass() {
|
||||
return superClass;
|
||||
}
|
||||
|
||||
public void setSuperClass(Class<?> superClass) {
|
||||
this.superClass = superClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a list of unique interfaces that the class will implements
|
||||
*/
|
||||
public Set<Class<?>> getInterfaces() {
|
||||
return Collections.unmodifiableSet(interfaces);
|
||||
}
|
||||
|
||||
public void addInterfaces(Class<?>... interfaces) {
|
||||
this.interfaces.addAll(Set.of(interfaces));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a list of unique fields that the class will contain
|
||||
*/
|
||||
public Set<BeeField> getFields() {
|
||||
return Collections.unmodifiableSet(fields);
|
||||
}
|
||||
|
||||
public void addFields(BeeField... fields) {
|
||||
this.fields.addAll(Set.of(fields));
|
||||
}
|
||||
}
|
||||
18
src/main/java/nl/sander/beejava/apiv2/ClassInstruction.java
Normal file
18
src/main/java/nl/sander/beejava/apiv2/ClassInstruction.java
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
public class ClassInstruction extends Instruction {
|
||||
private final ClassOperation classOperation;
|
||||
|
||||
public ClassInstruction(ClassOperation classOperation, String operand) {
|
||||
super(operand);
|
||||
this.classOperation = classOperation;
|
||||
}
|
||||
|
||||
public String getOperand() {
|
||||
return operand;
|
||||
}
|
||||
|
||||
public ClassOperation getOperation() {
|
||||
return classOperation;
|
||||
}
|
||||
}
|
||||
22
src/main/java/nl/sander/beejava/apiv2/ClassOperation.java
Normal file
22
src/main/java/nl/sander/beejava/apiv2/ClassOperation.java
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public enum ClassOperation {
|
||||
CLASS,
|
||||
INTERFACE,
|
||||
ENUM,
|
||||
FIELD,
|
||||
CONSTRUCTOR,
|
||||
METHOD;
|
||||
|
||||
static Optional<ClassOperation> get(String text){
|
||||
String upper = text.toUpperCase();
|
||||
for (ClassOperation val: ClassOperation.values()){
|
||||
if (val.toString().equals(upper)){
|
||||
return Optional.of(val);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,7 @@
|
|||
package nl.sander.beejava;
|
||||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.api.BeeParameter;
|
||||
import nl.sander.beejava.api.BeeSource;
|
||||
import nl.sander.beejava.api.CodeLine;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.TypeMapper;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
|
|
@ -18,7 +16,7 @@ public abstract class CodeContainer {
|
|||
|
||||
protected final List<CodeLine> code = new LinkedList<>();
|
||||
protected final Set<BeeParameter> formalParameters = new HashSet<>();
|
||||
protected final Set<MethodAccessFlags> accessFlags = new HashSet<>();
|
||||
protected final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||
private BeeSource owner;
|
||||
|
||||
public List<CodeLine> getCode() {
|
||||
|
|
@ -40,7 +38,7 @@ public abstract class CodeContainer {
|
|||
.collect(Collectors.joining(",", "(", ")"));
|
||||
}
|
||||
|
||||
public Set<MethodAccessFlags> getAccessFlags() {
|
||||
public Set<MethodAccessFlag> getAccessFlags() {
|
||||
return accessFlags;
|
||||
}
|
||||
|
||||
28
src/main/java/nl/sander/beejava/apiv2/CodeLine.java
Normal file
28
src/main/java/nl/sander/beejava/apiv2/CodeLine.java
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
|
||||
public class CodeLine extends Instruction {
|
||||
private final Opcode opcode;
|
||||
private CodeContainer owner;
|
||||
|
||||
public CodeLine(Opcode opcode, String operand) {
|
||||
super(operand);
|
||||
this.opcode = opcode;
|
||||
}
|
||||
|
||||
public String getOperand() {
|
||||
return operand;
|
||||
}
|
||||
|
||||
public Opcode getOpcode() {
|
||||
return opcode;
|
||||
}
|
||||
|
||||
public void setOwner(CodeContainer owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
public CodeContainer getOwner() {
|
||||
return owner;
|
||||
}
|
||||
}
|
||||
9
src/main/java/nl/sander/beejava/apiv2/Instruction.java
Normal file
9
src/main/java/nl/sander/beejava/apiv2/Instruction.java
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
public class Instruction {
|
||||
protected final String operand;
|
||||
|
||||
public Instruction(String operand) {
|
||||
this.operand = operand;
|
||||
}
|
||||
}
|
||||
65
src/main/java/nl/sander/beejava/apiv2/Opcode.java
Normal file
65
src/main/java/nl/sander/beejava/apiv2/Opcode.java
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public enum Opcode {
|
||||
LOAD,
|
||||
STORE,
|
||||
CONST,
|
||||
RETURN,
|
||||
ARRAYLENGTH,
|
||||
THROW,
|
||||
CAST,
|
||||
ADD,
|
||||
COMPARE,
|
||||
DIVIDE,
|
||||
MULTIPLY,
|
||||
NEGATE,
|
||||
REMAINDER,
|
||||
SUBTRACT,
|
||||
GET,
|
||||
GOTO,
|
||||
TO_DOUBLE,
|
||||
TO_INT,
|
||||
TO_LONG,
|
||||
TO_BYTE,
|
||||
TO_CHAR,
|
||||
TO_FLOAT,
|
||||
TO_SHORT,
|
||||
AND,
|
||||
IF_EQUAL,
|
||||
IF_NOT_EQUAL,
|
||||
IF_LESS_THAN,
|
||||
IF_GREATER_OR_EQUAL,
|
||||
IF_GREATER_THAN,
|
||||
IF_LESS_OR_EQUAL,
|
||||
IF_NOT_NULL,
|
||||
IF_NULL,
|
||||
INCREMENT,
|
||||
INSTANCEOF,
|
||||
INVOKE,
|
||||
OR,
|
||||
SHIFT_LEFT,
|
||||
SHIFT_RIGHT,
|
||||
LOGICAL_SHIFT_RIGHT,
|
||||
XOR,
|
||||
LOOKUPSWITCH,
|
||||
MONITORENTER,
|
||||
MONITOREXIT,
|
||||
NEW,
|
||||
NEWARRAY,
|
||||
MULTIANEWARRAY,
|
||||
PUT,
|
||||
SWAP,
|
||||
TABLESWITCH,
|
||||
WIDE;
|
||||
|
||||
static Optional<Opcode> get(String text) {
|
||||
for (Opcode opcode : Opcode.values()) {
|
||||
if (opcode.toString().equals(text)) {
|
||||
return Optional.of(opcode);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
213
src/main/java/nl/sander/beejava/apiv2/SourceCompiler.java
Normal file
213
src/main/java/nl/sander/beejava/apiv2/SourceCompiler.java
Normal file
|
|
@ -0,0 +1,213 @@
|
|||
package nl.sander.beejava.apiv2;
|
||||
|
||||
import nl.sander.beejava.api.Version;
|
||||
import nl.sander.beejava.flags.ClassAccessFlags;
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Parses code as text to a BeeSource object
|
||||
*/
|
||||
public class SourceCompiler {
|
||||
private final static Pattern firstBlanksplitter = Pattern.compile("(.+?) (.+)");
|
||||
private final static Pattern parensplitter = Pattern.compile("(.+?)(\\(.*?\\))");
|
||||
private final static Pattern returntypesplitter = Pattern.compile("(.+?)->(.*?)");
|
||||
private final String sourcecode;
|
||||
private final List<Instruction> instructions = new ArrayList<>();
|
||||
private int currentLine = 0;
|
||||
|
||||
public SourceCompiler(String sourcecode) {
|
||||
this.sourcecode = sourcecode;
|
||||
}
|
||||
|
||||
public static BeeSource compile(String sourcecode) {
|
||||
return new SourceCompiler(sourcecode).doCompile();
|
||||
}
|
||||
|
||||
public BeeSource doCompile() {
|
||||
Arrays.stream(sourcecode.split("\n")).map(this::compileLine).forEach(instructions::add);
|
||||
|
||||
BeeSource beeSource = new nl.sander.beejava.apiv2.BeeSource();
|
||||
|
||||
for (currentLine = 0; currentLine < instructions.size(); currentLine++) {
|
||||
Instruction ins = instructions.get(currentLine);
|
||||
if (currentLine == 0) {
|
||||
parseClassDeclaration(ins, beeSource);
|
||||
} else {
|
||||
parseInstruction(ins, beeSource);
|
||||
}
|
||||
currentLine += 1;
|
||||
}
|
||||
|
||||
return beeSource;
|
||||
}
|
||||
|
||||
private void parseInstruction(Instruction instruction, BeeSource beeSource) {
|
||||
if (instruction instanceof ClassInstruction) {
|
||||
ClassInstruction classInstruction = (ClassInstruction) instruction;
|
||||
String operand = classInstruction.getOperand();
|
||||
switch (classInstruction.getOperation()) {
|
||||
case FIELD -> beeSource.addFields(parseField(operand));
|
||||
case CONSTRUCTOR -> beeSource.addConstructors(parseConstructor(operand));
|
||||
case METHOD -> beeSource.addMethods(parseMethod(operand));
|
||||
default -> throw new IllegalArgumentException("Not allowed here");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private BeeMethod parseMethod(String text) {
|
||||
String[] tokens = split(text, returntypesplitter);
|
||||
Class<?> returnType;
|
||||
try {
|
||||
returnType = Class.forName(tokens[1].trim());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalArgumentException("Not a valid type: "+tokens[1].trim());
|
||||
}
|
||||
|
||||
String first = tokens[0].trim();
|
||||
String[] flagsNameParameters = first.split(" ");
|
||||
|
||||
Set<MethodAccessFlag> flags = new HashSet<>();
|
||||
int i=0;
|
||||
Optional<MethodAccessFlag> maybeFlag = MethodAccessFlag.get(flagsNameParameters[i]);
|
||||
while (maybeFlag.isPresent()){
|
||||
flags.add(maybeFlag.get());
|
||||
i+=1;
|
||||
maybeFlag = MethodAccessFlag.get(flagsNameParameters[i]);
|
||||
}
|
||||
|
||||
String[] nameParams = split(flagsNameParameters[i], parensplitter);
|
||||
String methodName = nameParams[0];
|
||||
String params = nameParams[1];
|
||||
String[] paramTokens = params.split(",");
|
||||
Set<BeeParameter> parameters = new HashSet<>();
|
||||
for (String paramToken : paramTokens) {
|
||||
String[] declaration = paramToken.trim().split(" ");
|
||||
String type = declaration[0];
|
||||
String name = declaration[1];
|
||||
try {
|
||||
parameters.add(new BeeParameter(Class.forName(type), name));
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalArgumentException("field type " + type + " not found");
|
||||
}
|
||||
}
|
||||
currentLine += 1;
|
||||
List<CodeLine> lines = new ArrayList<>();
|
||||
Instruction nextInstruction = instructions.get(currentLine);
|
||||
while (nextInstruction instanceof CodeLine) {
|
||||
lines.add((CodeLine) nextInstruction);
|
||||
currentLine += 1;
|
||||
nextInstruction = instructions.get(currentLine);
|
||||
}
|
||||
|
||||
return new BeeMethod(methodName,flags, parameters, returnType, lines);
|
||||
}
|
||||
|
||||
private BeeConstructor parseConstructor(String text) {
|
||||
String[] tokens = split(text, parensplitter);
|
||||
String flag = tokens[0];
|
||||
MethodAccessFlag methodAccessFlag = MethodAccessFlag.get(flag).orElseThrow(illegalArgument("Not a valid flag " + flag));
|
||||
|
||||
String params = tokens[1];
|
||||
String[] paramTokens = params.split(",");
|
||||
Set<BeeParameter> parameters = new HashSet<>();
|
||||
for (String paramToken : paramTokens) {
|
||||
String[] declaration = paramToken.trim().split(" ");
|
||||
String type = declaration[0];
|
||||
String name = declaration[1];
|
||||
try {
|
||||
parameters.add(new BeeParameter(Class.forName(type), name));
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalArgumentException("field type " + type + " not found");
|
||||
}
|
||||
}
|
||||
currentLine += 1;
|
||||
List<CodeLine> lines = new ArrayList<>();
|
||||
Instruction nextInstruction = instructions.get(currentLine);
|
||||
while (nextInstruction instanceof CodeLine) {
|
||||
lines.add((CodeLine) nextInstruction);
|
||||
currentLine += 1;
|
||||
nextInstruction = instructions.get(currentLine);
|
||||
}
|
||||
|
||||
return new BeeConstructor(Set.of(methodAccessFlag), parameters, lines);
|
||||
}
|
||||
|
||||
private BeeField parseField(String operand) {
|
||||
String[] tokens = operand.split(" ");
|
||||
Set<FieldAccessFlag> flags = new HashSet<>();
|
||||
String type = null;
|
||||
String name = null;
|
||||
for (String token : tokens) {
|
||||
Optional<FieldAccessFlag> maybeFlag = FieldAccessFlag.get(token);
|
||||
if (maybeFlag.isPresent()) {
|
||||
flags.add(maybeFlag.get());
|
||||
} else {
|
||||
if (type == null) {
|
||||
type = token;
|
||||
} else {
|
||||
name = token;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
return new BeeField(flags, Class.forName(type), name);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalArgumentException("field type " + type + " not found");
|
||||
}
|
||||
}
|
||||
|
||||
private void parseClassDeclaration(Instruction firstLine, BeeSource beeSource) {
|
||||
if (firstLine instanceof ClassInstruction) {
|
||||
ClassInstruction classDeclaration = (ClassInstruction) firstLine;
|
||||
ClassOperation operation = classDeclaration.getOperation();
|
||||
switch (operation) {
|
||||
case CLASS -> {
|
||||
String[] tokens = split(classDeclaration.getOperand(), parensplitter);
|
||||
beeSource.addAccessFlags(ClassAccessFlags.PUBLIC, ClassAccessFlags.SUPER);
|
||||
beeSource.setName(tokens[0]);
|
||||
beeSource.setClassFileVersion(Version.get(tokens[1]).orElseThrow(illegalArgument(tokens[1])));
|
||||
}
|
||||
case INTERFACE -> {
|
||||
}//TODO
|
||||
case ENUM -> {
|
||||
}//TODO
|
||||
default -> throw new IllegalArgumentException("Not allowed here");
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException("class must start with 'class name(target.jdk.version)'");
|
||||
}
|
||||
}
|
||||
|
||||
private Instruction compileLine(String line) {
|
||||
String[] tokens = split(line, firstBlanksplitter);
|
||||
String operation = tokens[0];
|
||||
String operand = tokens[1];
|
||||
if (!line.startsWith(" ")) {
|
||||
ClassOperation classOperation = ClassOperation.get(operation).orElseThrow(illegalArgument(operation));
|
||||
return new ClassInstruction(classOperation, operand);
|
||||
} else {
|
||||
Opcode opcode = Opcode.get(operation).orElseThrow(illegalArgument(operation));
|
||||
return new CodeLine(opcode, operand);
|
||||
}
|
||||
}
|
||||
|
||||
private Supplier<IllegalArgumentException> illegalArgument(String text) {
|
||||
return () -> new IllegalArgumentException("Illegal: " + text);
|
||||
}
|
||||
|
||||
private String[] split(String text, Pattern splitter) {
|
||||
Matcher matcher = splitter.matcher(text);
|
||||
if (matcher.find()) {
|
||||
return new String[]{matcher.group(1), matcher.group(2)};
|
||||
} else {
|
||||
return new String[]{};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2,25 +2,25 @@ package nl.sander.beejava.classinfo;
|
|||
|
||||
import nl.sander.beejava.constantpool.entry.Utf8Entry;
|
||||
import nl.sander.beejava.flags.AccessFlags;
|
||||
import nl.sander.beejava.flags.FieldAccessFlags;
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
import nl.sander.beejava.util.ByteBuf;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class FieldInfo extends Info<FieldInfo> {
|
||||
private final Set<FieldAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<FieldAccessFlag> accessFlags = new HashSet<>();
|
||||
|
||||
public FieldInfo(Utf8Entry nameEntry, Utf8Entry descriptorEntry) {
|
||||
super(nameEntry, descriptorEntry);
|
||||
}
|
||||
|
||||
public FieldInfo addAccessFlags(Set<FieldAccessFlags> accessFlags) {
|
||||
public FieldInfo addAccessFlags(Set<FieldAccessFlag> accessFlags) {
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Set<FieldAccessFlags> getAccessFlags() {
|
||||
public Set<FieldAccessFlag> getAccessFlags() {
|
||||
return accessFlags;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,19 +2,19 @@ package nl.sander.beejava.classinfo;
|
|||
|
||||
import nl.sander.beejava.constantpool.entry.Utf8Entry;
|
||||
import nl.sander.beejava.flags.AccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
import nl.sander.beejava.util.ByteBuf;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class MethodInfo extends Info<MethodInfo> {
|
||||
private final Set<MethodAccessFlags> accessFlags = new HashSet<>();
|
||||
private final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||
|
||||
public MethodInfo(Utf8Entry nameEntry, Utf8Entry descriptorEntry) {
|
||||
super(nameEntry, descriptorEntry);
|
||||
}
|
||||
public MethodInfo addAccessFlags(Set<MethodAccessFlags> accessFlags) {
|
||||
public MethodInfo addAccessFlags(Set<MethodAccessFlag> accessFlags) {
|
||||
this.accessFlags.addAll(accessFlags);
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,4 +9,5 @@ public interface AccessFlags {
|
|||
|
||||
int getBytecode();
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,17 +11,15 @@ public enum ClassAccessFlags implements AccessFlags {
|
|||
ENUM(0x4000), // Declared as an enum type.
|
||||
MODULE(0x8000); // Is a module, not a class or interface.
|
||||
|
||||
|
||||
private final int bytecode;
|
||||
|
||||
ClassAccessFlags(int bytecode) {
|
||||
this.bytecode = bytecode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int getBytecode() {
|
||||
return bytecode;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
package nl.sander.beejava.flags;
|
||||
|
||||
public enum FieldAccessFlags implements AccessFlags {
|
||||
import java.util.Optional;
|
||||
|
||||
public enum FieldAccessFlag implements AccessFlags {
|
||||
PUBLIC(0x0001), // Declared public; may be accessed from outside itspackage.
|
||||
PRIVATE(0x0002), // Declared private; accessible only within the defining class and other classes belonging to the samenest (§5.4.4).
|
||||
PROTECTED(0x0004), // Declared protected; may be accessed within subclasses.
|
||||
|
|
@ -13,11 +15,20 @@ public enum FieldAccessFlags implements AccessFlags {
|
|||
|
||||
private final int bytecode;
|
||||
|
||||
FieldAccessFlags(int bytecode) {
|
||||
FieldAccessFlag(int bytecode) {
|
||||
this.bytecode = bytecode;
|
||||
}
|
||||
|
||||
public int getBytecode() {
|
||||
return bytecode;
|
||||
}
|
||||
|
||||
public static Optional<FieldAccessFlag> get(String text) {
|
||||
for (FieldAccessFlag flag : FieldAccessFlag.values()) {
|
||||
if (flag.toString().equals(text)) {
|
||||
return Optional.of(flag);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
package nl.sander.beejava.flags;
|
||||
|
||||
public enum MethodAccessFlags implements AccessFlags {
|
||||
import java.util.Optional;
|
||||
|
||||
public enum MethodAccessFlag implements AccessFlags {
|
||||
PUBLIC(0x0001), // Declared public; may be accessed from outside its package.
|
||||
PRIVATE(0x0002), // Declared private; accessible only within the defining class and other classes belonging to the same nest (§5.4.4).
|
||||
PROTECTED(0x0004), // Declared protected; may be accessed within subclasses.
|
||||
|
|
@ -16,11 +18,20 @@ public enum MethodAccessFlags implements AccessFlags {
|
|||
|
||||
private final int bytecode;
|
||||
|
||||
MethodAccessFlags(int bytecode) {
|
||||
MethodAccessFlag(int bytecode) {
|
||||
this.bytecode = bytecode;
|
||||
}
|
||||
|
||||
public int getBytecode() {
|
||||
return bytecode;
|
||||
}
|
||||
|
||||
public static Optional<MethodAccessFlag> get(String text) {
|
||||
for (MethodAccessFlag flag : MethodAccessFlag.values()) {
|
||||
if (flag.toString().equals(text)) {
|
||||
return Optional.of(flag);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
import nl.sander.beejava.api.*;
|
||||
import nl.sander.beejava.flags.FieldAccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
|
@ -38,7 +38,7 @@ public class TestData {
|
|||
public static BeeSource createClassWithTwoReferencesToSomeClass() throws ClassNotFoundException {
|
||||
BeeMethod print1 = BeeMethod.builder()
|
||||
.withName("print1")
|
||||
.withAccessFlags(MethodAccessFlags.PUBLIC)
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withCode(
|
||||
line(GET, "java.lang.System","out"),
|
||||
line(LD_CONST, "1"),
|
||||
|
|
@ -51,7 +51,7 @@ public class TestData {
|
|||
|
||||
BeeMethod print2 = BeeMethod.builder()
|
||||
.withName("print2")
|
||||
.withAccessFlags(MethodAccessFlags.PUBLIC)
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withCode(
|
||||
line(GET, "java.lang.System","out"),
|
||||
line(LD_CONST, "2"),
|
||||
|
|
@ -71,7 +71,7 @@ public class TestData {
|
|||
|
||||
public static BeeSource createClassWithField(Class<?> fieldType) throws ClassNotFoundException {
|
||||
BeeField field = BeeField.builder()
|
||||
.withAccessFlags(FieldAccessFlags.PRIVATE)
|
||||
.withAccessFlags(FieldAccessFlag.PRIVATE)
|
||||
.withType(fieldType)
|
||||
.withName("field")
|
||||
.build();
|
||||
|
|
@ -79,7 +79,7 @@ public class TestData {
|
|||
BeeParameter parameter = BeeParameter.create(fieldType, "value");
|
||||
|
||||
BeeConstructor constructor = BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlags.PUBLIC)
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withFormalParameters(parameter)
|
||||
.withCode(
|
||||
line(LD_VAR, Ref.THIS),
|
||||
|
|
@ -103,7 +103,7 @@ public class TestData {
|
|||
|
||||
public static BeeConstructor createDefaultConstructor() throws ClassNotFoundException {
|
||||
return BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlags.PUBLIC)
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withCode(
|
||||
line(LD_VAR, Ref.THIS),
|
||||
line(INVOKE, Ref.SUPER, "<init>", "()"),
|
||||
|
|
|
|||
106
src/test/java/nl/sander/beejava/TestData2.java
Normal file
106
src/test/java/nl/sander/beejava/TestData2.java
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
public class TestData2 {
|
||||
|
||||
public final String simpleBean= """
|
||||
public class simpleBean
|
||||
field value:int
|
||||
constructor()
|
||||
INVOKE super()
|
||||
RETURN
|
||||
method getValue()
|
||||
RETURN this.value
|
||||
method setValue(int newVale)
|
||||
LOAD newValue
|
||||
PUT this.value
|
||||
RETURN
|
||||
""";
|
||||
|
||||
String constructor_original = """
|
||||
0: aload_0
|
||||
1: invokespecial #1 // Method java/lang/Object."<init>":()V
|
||||
|
||||
4: aload_0
|
||||
5: new #7 // class nl/sander/beejava/ConstantPoolCreator
|
||||
8: dup
|
||||
9: invokespecial #9 // Method nl/sander/beejava/ConstantPoolCreator."<init>":()V
|
||||
12: putfield #10 // Field constantPoolCreator:Lnl/sander/beejava/ConstantPoolCreator;
|
||||
|
||||
15: aload_0
|
||||
16: aload_1
|
||||
17: putfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
20: aload_0
|
||||
21: new #20 // class nl/sander/beejava/ConstantPoolEntryCreator
|
||||
24: dup
|
||||
25: aload_1
|
||||
26: invokespecial #22 // Method nl/sander/beejava/ConstantPoolEntryCreator."<init>":(Lnl/sander/beejava/CompiledClass;)V
|
||||
29: putfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator;
|
||||
32: return
|
||||
""";
|
||||
|
||||
String constructor_opcope = """
|
||||
constructor nl.sander.beejava.Compiler(nl.sander.beejava.CompiledClass arg_0);
|
||||
INVOKE super()
|
||||
|
||||
NEW nl.sander.beejava.ConstantPoolCreator()
|
||||
PUT this.constantPoolCreator
|
||||
|
||||
LOAD arg_0
|
||||
PUT this.compiledClass
|
||||
NEW nl.sander.beejava.ConstantPoolEntryCreator(compiledClass)
|
||||
PUT this.constantPoolEntryCreator
|
||||
""";
|
||||
|
||||
String method_original = """
|
||||
public void addMethods()
|
||||
0: aload_0
|
||||
1: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
4: aload_0
|
||||
5: getfield #97 // Field codeAttributeNameEntry:Lnl/sander/beejava/constantpool/entry/Utf8Entry;
|
||||
8: invokevirtual #101 // Method nl/sander/beejava/CompiledClass.addConstantPoolEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V
|
||||
11: aload_0
|
||||
12: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
15: invokevirtual #59 // Method nl/sander/beejava/CompiledClass.getSource:()Lnl/sander/beejava/api/BeeSource;
|
||||
18: invokevirtual #79 // Method nl/sander/beejava/api/BeeSource.getMethods:()Ljava/util/Set;
|
||||
21: invokeinterface #135, 1 // InterfaceMethod java/util/Set.iterator:()Ljava/util/Iterator;
|
||||
26: astore_1
|
||||
27: aload_1
|
||||
28: invokeinterface #139, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
|
||||
33: ifeq 61
|
||||
36: aload_1
|
||||
37: invokeinterface #145, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
|
||||
42: checkcast #149 // class nl/sander/beejava/api/BeeMethod
|
||||
45: astore_2
|
||||
46: aload_0
|
||||
47: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass;
|
||||
50: aload_0
|
||||
51: aload_2
|
||||
52: invokevirtual #151 // Method createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo;
|
||||
55: invokevirtual #155 // Method nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V
|
||||
58: goto 27
|
||||
61: return
|
||||
""";
|
||||
|
||||
String method_opcode = """
|
||||
public void addMethods()
|
||||
INVOKE this.compiledClass.addConstantPoolEntry(this.codeAttributeNameEntry)
|
||||
|
||||
INVOKE this.compiledClass.getSource()
|
||||
INVOKE getMethods()
|
||||
INVOKE iterator()
|
||||
STORE it
|
||||
|
||||
:start-loop
|
||||
INVOKE it.hasNext
|
||||
IFEQ_false end
|
||||
INVOKE it.next()
|
||||
CAST nl.sander.beejava.api.BeeMethod
|
||||
STORE el
|
||||
INVOKE this.createMethod(el)
|
||||
INVOKE this.compiledClass.addMethod()
|
||||
GOTO start-loop
|
||||
:end
|
||||
RETURN
|
||||
""";
|
||||
|
||||
}
|
||||
|
|
@ -3,12 +3,11 @@ package nl.sander.beejava.e2e;
|
|||
import nl.sander.beejava.BytecodeGenerator;
|
||||
import nl.sander.beejava.CompiledClass;
|
||||
import nl.sander.beejava.Compiler;
|
||||
import nl.sander.beejava.TestData;
|
||||
import nl.sander.beejava.api.BeeConstructor;
|
||||
import nl.sander.beejava.api.BeeSource;
|
||||
import nl.sander.beejava.api.Ref;
|
||||
import nl.sander.beejava.api.Version;
|
||||
import nl.sander.beejava.flags.MethodAccessFlags;
|
||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
|
@ -59,7 +58,7 @@ public class EmptyBeanTest {
|
|||
|
||||
private BeeConstructor createDefaultConstructor() throws ClassNotFoundException {
|
||||
return BeeConstructor.builder()
|
||||
.withAccessFlags(MethodAccessFlags.PUBLIC)
|
||||
.withAccessFlags(MethodAccessFlag.PUBLIC)
|
||||
.withCode(
|
||||
line(LD_VAR, Ref.THIS),
|
||||
line(INVOKE, Ref.SUPER, "<init>", "()"),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue