diff --git a/README.md b/README.md index 914a57f..5a3384f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -# bejava -Bejava (backend java compiler) is a code creation library, somewhat comparable to javassist or bytebuddy. -* It let's you compile bejava-lang' to bytecode. +# bejava compiler +Bejava (backend java) compiler is a code creation library, somewhat comparable to javassist or bytebuddy. +* It let's you compile bejava-lang' to bytecode. As an alternative a BeSource object can be created programmatically and then compiled. +* In this way it is a backend compiler. +* Handles creation of the constant pool * It does not inspect or enhance existing bytecode, though it could be part of such functionality. What is 'bejava lang'? diff --git a/javap/nl.sander.beejava.testclasses.Compiler_javap.txt b/javap/nl.sander.beejava.testclasses.Compiler_javap.txt deleted file mode 100644 index 1dc6b67..0000000 --- a/javap/nl.sander.beejava.testclasses.Compiler_javap.txt +++ /dev/null @@ -1,699 +0,0 @@ -Classfile /Users/Shautvast/IdeaProjects/beejava/target/classes/nl/sander/beejava/Compiler.class - Last modified 18 Nov 2020; size 6433 bytes - SHA-256 checksum e76616828289ace3b62f79015aeb244229c29989e2c613a0ec860f075e5e4319 - Compiled from "Compiler.java" -public class nl.sander.beejava.Compiler - minor version: 0 - major version: 58 - 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."":()V - #2 = Class #4 // java/lang/Object - #3 = NameAndType #5:#6 // "":()V - #4 = Utf8 java/lang/Object - #5 = Utf8 - #6 = Utf8 ()V - #7 = Class #8 // nl/sander/beejava/ConstantPoolCreator - #8 = Utf8 nl/sander/beejava/ConstantPoolCreator - #9 = Methodref #7.#3 // nl/sander/beejava/ConstantPoolCreator."":()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."":(Lnl/sander/beejava/CompiledClass;)V - #23 = NameAndType #5:#24 // "":(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."":(Lnl/sander/beejava/api/BeeSource;)V - #32 = NameAndType #5:#33 // "":(Lnl/sander/beejava/api/BeeSource;)V - #33 = Utf8 (Lnl/sander/beejava/api/BeeSource;)V - #34 = Methodref #11.#23 // nl/sander/beejava/Compiler."":(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 = InvokeDynamic #4:#116 // #4:apply:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Function; - #136 = Class #137 // nl/sander/beejava/classinfo/MethodInfo - #137 = Utf8 nl/sander/beejava/classinfo/MethodInfo - #138 = Methodref #139.#140 // nl/sander/beejava/CodeContainer.getName:()Ljava/lang/String; - #139 = Class #141 // nl/sander/beejava/CodeContainer - #140 = NameAndType #142:#143 // getName:()Ljava/lang/String; - #141 = Utf8 nl/sander/beejava/CodeContainer - #142 = Utf8 getName - #143 = Utf8 ()Ljava/lang/String; - #144 = Methodref #139.#145 // nl/sander/beejava/CodeContainer.getSignature:()Ljava/lang/String; - #145 = NameAndType #146:#143 // getSignature:()Ljava/lang/String; - #146 = Utf8 getSignature - #147 = Methodref #136.#148 // nl/sander/beejava/classinfo/MethodInfo."":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V - #148 = NameAndType #5:#149 // "":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V - #149 = Utf8 (Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V - #150 = Methodref #139.#151 // nl/sander/beejava/CodeContainer.getAccessFlags:()Ljava/util/Set; - #151 = NameAndType #152:#68 // getAccessFlags:()Ljava/util/Set; - #152 = Utf8 getAccessFlags - #153 = Methodref #136.#154 // nl/sander/beejava/classinfo/MethodInfo.addAccessFlags:(Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo; - #154 = NameAndType #155:#156 // addAccessFlags:(Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo; - #155 = Utf8 addAccessFlags - #156 = Utf8 (Ljava/util/Set;)Lnl/sander/beejava/classinfo/MethodInfo; - #157 = Methodref #158.#159 // nl/sander/beejava/MethodCodeCreator.createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute; - #158 = Class #160 // nl/sander/beejava/MethodCodeCreator - #159 = NameAndType #161:#162 // createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute; - #160 = Utf8 nl/sander/beejava/MethodCodeCreator - #161 = Utf8 createCodeAttribute - #162 = Utf8 (Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute; - #163 = Methodref #136.#164 // nl/sander/beejava/classinfo/MethodInfo.addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info; - #164 = NameAndType #165:#166 // addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info; - #165 = Utf8 addAttribute - #166 = Utf8 (Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info; - #167 = Methodref #139.#168 // nl/sander/beejava/CodeContainer.getCode:()Ljava/util/List; - #168 = NameAndType #169:#170 // getCode:()Ljava/util/List; - #169 = Utf8 getCode - #170 = Utf8 ()Ljava/util/List; - #171 = InvokeDynamic #5:#70 // #5:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer; - #172 = InterfaceMethodref #173.#75 // java/util/List.forEach:(Ljava/util/function/Consumer;)V - #173 = Class #174 // java/util/List - #174 = Utf8 java/util/List - #175 = Methodref #176.#177 // nl/sander/beejava/api/CodeLine.hasMethodCall:()Z - #176 = Class #178 // nl/sander/beejava/api/CodeLine - #177 = NameAndType #179:#180 // hasMethodCall:()Z - #178 = Utf8 nl/sander/beejava/api/CodeLine - #179 = Utf8 hasMethodCall - #180 = Utf8 ()Z - #181 = Methodref #20.#182 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateMethodRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry; - #182 = NameAndType #183:#184 // getOrCreateMethodRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry; - #183 = Utf8 getOrCreateMethodRefEntry - #184 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/MethodRefEntry; - #185 = Methodref #176.#186 // nl/sander/beejava/api/CodeLine.setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V - #186 = NameAndType #187:#104 // setAssignedEntry:(Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry;)V - #187 = Utf8 setAssignedEntry - #188 = Methodref #176.#189 // nl/sander/beejava/api/CodeLine.hasRefToOwnField:()Z - #189 = NameAndType #190:#180 // hasRefToOwnField:()Z - #190 = Utf8 hasRefToOwnField - #191 = Methodref #176.#192 // nl/sander/beejava/api/CodeLine.hasRefToExternalField:()Z - #192 = NameAndType #193:#180 // hasRefToExternalField:()Z - #193 = Utf8 hasRefToExternalField - #194 = Methodref #20.#195 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreateFieldRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry; - #195 = NameAndType #196:#197 // getOrCreateFieldRefEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry; - #196 = Utf8 getOrCreateFieldRefEntry - #197 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/FieldRefEntry; - #198 = Methodref #176.#199 // nl/sander/beejava/api/CodeLine.hasConstValue:()Z - #199 = NameAndType #200:#180 // hasConstValue:()Z - #200 = Utf8 hasConstValue - #201 = Methodref #20.#202 // nl/sander/beejava/ConstantPoolEntryCreator.getOrCreatePrimitiveEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry; - #202 = NameAndType #203:#204 // getOrCreatePrimitiveEntry:(Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry; - #203 = Utf8 getOrCreatePrimitiveEntry - #204 = Utf8 (Lnl/sander/beejava/api/CodeLine;)Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry; - #205 = Utf8 LineNumberTable - #206 = Utf8 LocalVariableTable - #207 = Utf8 this - #208 = Utf8 Lnl/sander/beejava/Compiler; - #209 = Utf8 (Lnl/sander/beejava/api/BeeSource;)Lnl/sander/beejava/CompiledClass; - #210 = Utf8 beeSource - #211 = Utf8 Lnl/sander/beejava/api/BeeSource; - #212 = Utf8 createMethod - #213 = Utf8 (Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #214 = Utf8 method - #215 = Utf8 Lnl/sander/beejava/CodeContainer; - #216 = Utf8 updateConstantPool - #217 = Utf8 (Lnl/sander/beejava/CodeContainer;)V - #218 = Utf8 codeContainer - #219 = Utf8 (Lnl/sander/beejava/api/CodeLine;)V - #220 = Utf8 methodRefEntry - #221 = Utf8 Lnl/sander/beejava/constantpool/entry/MethodRefEntry; - #222 = Utf8 fieldRefEntry - #223 = Utf8 Lnl/sander/beejava/constantpool/entry/FieldRefEntry; - #224 = Utf8 primitiveEntry - #225 = Utf8 Lnl/sander/beejava/constantpool/entry/ConstantPoolEntry; - #226 = Utf8 codeline - #227 = Utf8 Lnl/sander/beejava/api/CodeLine; - #228 = Utf8 StackMapTable - #229 = Utf8 SourceFile - #230 = Utf8 Compiler.java - #231 = Utf8 BootstrapMethods - #232 = MethodHandle 6:#233 // 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; - #233 = Methodref #234.#235 // 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; - #234 = Class #236 // java/lang/invoke/LambdaMetafactory - #235 = NameAndType #237:#238 // 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; - #236 = Utf8 java/lang/invoke/LambdaMetafactory - #237 = Utf8 metafactory - #238 = 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; - #239 = MethodType #240 // (Ljava/lang/Object;)V - #240 = Utf8 (Ljava/lang/Object;)V - #241 = MethodHandle 7:#242 // REF_invokeSpecial nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V - #242 = Methodref #11.#243 // nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V - #243 = NameAndType #216:#217 // updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V - #244 = MethodType #245 // (Lnl/sander/beejava/api/BeeConstructor;)V - #245 = Utf8 (Lnl/sander/beejava/api/BeeConstructor;)V - #246 = MethodType #247 // (Lnl/sander/beejava/api/BeeMethod;)V - #247 = Utf8 (Lnl/sander/beejava/api/BeeMethod;)V - #248 = MethodType #130 // (Ljava/lang/Object;)Ljava/lang/Object; - #249 = MethodHandle 7:#250 // REF_invokeSpecial nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #250 = Methodref #11.#251 // nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #251 = NameAndType #212:#213 // createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #252 = MethodType #253 // (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo; - #253 = Utf8 (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo; - #254 = MethodHandle 5:#255 // REF_invokeVirtual nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V - #255 = Methodref #29.#256 // nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V - #256 = NameAndType #257:#258 // addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V - #257 = Utf8 addMethod - #258 = Utf8 (Lnl/sander/beejava/classinfo/MethodInfo;)V - #259 = MethodType #258 // (Lnl/sander/beejava/classinfo/MethodInfo;)V - #260 = MethodType #261 // (Lnl/sander/beejava/api/BeeMethod;)Lnl/sander/beejava/classinfo/MethodInfo; - #261 = Utf8 (Lnl/sander/beejava/api/BeeMethod;)Lnl/sander/beejava/classinfo/MethodInfo; - #262 = MethodHandle 7:#263 // REF_invokeSpecial nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V - #263 = Methodref #11.#264 // nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V - #264 = NameAndType #216:#219 // updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V - #265 = MethodType #219 // (Lnl/sander/beejava/api/CodeLine;)V - #266 = Utf8 InnerClasses - #267 = Class #268 // java/lang/invoke/MethodHandles$Lookup - #268 = Utf8 java/lang/invoke/MethodHandles$Lookup - #269 = Class #270 // java/lang/invoke/MethodHandles - #270 = Utf8 java/lang/invoke/MethodHandles - #271 = 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."":()V - 4: aload_0 - 5: new #7 // class nl/sander/beejava/ConstantPoolCreator - 8: dup - 9: invokespecial #9 // Method nl/sander/beejava/ConstantPoolCreator."":()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."":(Lnl/sander/beejava/CompiledClass;)V - 29: putfield #25 // Field constantPoolEntryCreator:Lnl/sander/beejava/ConstantPoolEntryCreator; - 32: return - LineNumberTable: - line 33: 0 - line 24: 4 - line 34: 15 - line 35: 20 - line 36: 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."":(Lnl/sander/beejava/api/BeeSource;)V - 12: invokespecial #34 // Method "":(Lnl/sander/beejava/CompiledClass;)V - 15: invokevirtual #35 // Method compile:()Lnl/sander/beejava/CompiledClass; - 18: areturn - LineNumberTable: - line 45: 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 52: 0 - line 54: 11 - line 55: 18 - line 56: 25 - line 57: 29 - line 59: 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 63: 0 - line 64: 21 - line 66: 42 - line 68: 56 - line 69: 69 - line 71: 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 75: 0 - line 76: 21 - line 77: 31 - line 78: 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=1, 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 #111, 1 // InterfaceMethod java/util/Set.stream:()Ljava/util/stream/Stream; - 26: aload_0 - 27: invokedynamic #135, 0 // InvokeDynamic #4:apply:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Function; - 32: invokeinterface #119, 2 // InterfaceMethod java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; - 37: aload_0 - 38: getfield #16 // Field compiledClass:Lnl/sander/beejava/CompiledClass; - 41: dup - 42: invokestatic #125 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; - 45: pop - 46: invokedynamic #131, 0 // InvokeDynamic #3:accept:(Lnl/sander/beejava/CompiledClass;)Ljava/util/function/Consumer; - 51: invokeinterface #134, 2 // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V - 56: return - LineNumberTable: - line 85: 0 - line 86: 11 - line 87: 32 - line 88: 42 - line 89: 56 - LocalVariableTable: - Start Length Slot Name Signature - 0 57 0 this Lnl/sander/beejava/Compiler; - - 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 #136 // 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 #138 // 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 #144 // 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 #147 // Method nl/sander/beejava/classinfo/MethodInfo."":(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/constantpool/entry/Utf8Entry;)V - 29: aload_1 - 30: invokevirtual #150 // Method nl/sander/beejava/CodeContainer.getAccessFlags:()Ljava/util/Set; - 33: invokevirtual #153 // 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 #157 // Method nl/sander/beejava/MethodCodeCreator.createCodeAttribute:(Lnl/sander/beejava/constantpool/entry/Utf8Entry;Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/attributes/CodeAttribute; - 44: invokevirtual #163 // Method nl/sander/beejava/classinfo/MethodInfo.addAttribute:(Lnl/sander/beejava/classinfo/attributes/Attribute;)Lnl/sander/beejava/classinfo/Info; - 47: checkcast #136 // class nl/sander/beejava/classinfo/MethodInfo - 50: areturn - LineNumberTable: - line 96: 0 - line 97: 9 - line 98: 20 - line 99: 30 - line 100: 41 - line 96: 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 #138 // 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 #144 // 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 #167 // Method nl/sander/beejava/CodeContainer.getCode:()Ljava/util/List; - 40: aload_0 - 41: invokedynamic #171, 0 // InvokeDynamic #5:accept:(Lnl/sander/beejava/Compiler;)Ljava/util/function/Consumer; - 46: invokeinterface #172, 2 // InterfaceMethod java/util/List.forEach:(Ljava/util/function/Consumer;)V - 51: return - LineNumberTable: - line 107: 0 - line 108: 18 - line 109: 36 - line 110: 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 #175 // 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 #181 // 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 #185 // 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 #188 // Method nl/sander/beejava/api/CodeLine.hasRefToOwnField:()Z - 33: ifne 43 - 36: aload_1 - 37: invokevirtual #191 // 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 #194 // 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 #185 // 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 #198 // 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 #201 // 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 #185 // 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 122: 0 - line 123: 7 - line 124: 16 - line 125: 21 - line 128: 29 - line 129: 43 - line 130: 52 - line 131: 57 - line 134: 65 - line 135: 72 - line 136: 81 - line 137: 86 - line 139: 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: #232 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: - #239 (Ljava/lang/Object;)V - #241 REF_invokeSpecial nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V - #244 (Lnl/sander/beejava/api/BeeConstructor;)V - 1: #232 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: - #239 (Ljava/lang/Object;)V - #241 REF_invokeSpecial nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/CodeContainer;)V - #246 (Lnl/sander/beejava/api/BeeMethod;)V - 2: #232 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: - #248 (Ljava/lang/Object;)Ljava/lang/Object; - #249 REF_invokeSpecial nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #252 (Lnl/sander/beejava/api/BeeConstructor;)Lnl/sander/beejava/classinfo/MethodInfo; - 3: #232 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: - #239 (Ljava/lang/Object;)V - #254 REF_invokeVirtual nl/sander/beejava/CompiledClass.addMethod:(Lnl/sander/beejava/classinfo/MethodInfo;)V - #259 (Lnl/sander/beejava/classinfo/MethodInfo;)V - 4: #232 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: - #248 (Ljava/lang/Object;)Ljava/lang/Object; - #249 REF_invokeSpecial nl/sander/beejava/Compiler.createMethod:(Lnl/sander/beejava/CodeContainer;)Lnl/sander/beejava/classinfo/MethodInfo; - #260 (Lnl/sander/beejava/api/BeeMethod;)Lnl/sander/beejava/classinfo/MethodInfo; - 5: #232 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: - #239 (Ljava/lang/Object;)V - #262 REF_invokeSpecial nl/sander/beejava/Compiler.updateConstantPool:(Lnl/sander/beejava/api/CodeLine;)V - #265 (Lnl/sander/beejava/api/CodeLine;)V -InnerClasses: - public static final #271= #267 of #269; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles diff --git a/javap/nl.sander.beejava.testclasses.BeanWithClassReferences_javap.txt b/javap/nl.sander.bejava.testclasses.BeanWithClassReferences_javap.txt similarity index 100% rename from javap/nl.sander.beejava.testclasses.BeanWithClassReferences_javap.txt rename to javap/nl.sander.bejava.testclasses.BeanWithClassReferences_javap.txt diff --git a/javap/nl.sander.beejava.testclasses.EmptyBeanWithInterface_javap.txt b/javap/nl.sander.bejava.testclasses.EmptyBeanWithInterface_javap.txt similarity index 100% rename from javap/nl.sander.beejava.testclasses.EmptyBeanWithInterface_javap.txt rename to javap/nl.sander.bejava.testclasses.EmptyBeanWithInterface_javap.txt diff --git a/javap/nl.sander.beejava.testclasses.IntBean_javap.txt b/javap/nl.sander.bejava.testclasses.IntBean_javap.txt similarity index 100% rename from javap/nl.sander.beejava.testclasses.IntBean_javap.txt rename to javap/nl.sander.bejava.testclasses.IntBean_javap.txt diff --git a/out b/out index f882b31..22276c3 100644 --- a/out +++ b/out @@ -241,7 +241,7 @@ Constant pool: #229 = Utf8 this #230 = Utf8 Lnl/sander/beejava/Compiler; #231 = Utf8 (Lnl/sander/beejava/api/BeeSource;)Lnl/sander/beejava/CompiledClass; - #232 = Utf8 beeSource + #232 = Utf8 beSource #233 = Utf8 Lnl/sander/beejava/api/BeeSource; #234 = Utf8 method #235 = Utf8 Lnl/sander/beejava/api/BeeMethod; @@ -362,7 +362,7 @@ Constant pool: line 46: 0 LocalVariableTable: Start Length Slot Name Signature - 0 19 0 beeSource Lnl/sander/beejava/api/BeeSource; + 0 19 0 beSource Lnl/sander/beejava/api/BeeSource; public nl.sander.beejava.CompiledClass compile(); descriptor: ()Lnl/sander/beejava/CompiledClass; diff --git a/src/main/java/nl/sander/beejava/OverallCompiler.java b/src/main/java/nl/sander/beejava/OverallCompiler.java deleted file mode 100644 index 52c13d8..0000000 --- a/src/main/java/nl/sander/beejava/OverallCompiler.java +++ /dev/null @@ -1,17 +0,0 @@ -package nl.sander.beejava; - -import nl.sander.beejava.api.BeeSource; - -public final class OverallCompiler { - - private OverallCompiler(){ - // - } - - public static byte[] compile(String sourcecode){ - BeeSource beeSource = SourceCompiler.compile(sourcecode); - OpcodeTranslator.translate(beeSource); - CompiledClass compiledClass = Compiler.compile(beeSource); - return BytecodeGenerator.generate(compiledClass); - } -} diff --git a/src/main/java/nl/sander/beejava/StackOp.java b/src/main/java/nl/sander/beejava/StackOp.java deleted file mode 100644 index 1446dba..0000000 --- a/src/main/java/nl/sander/beejava/StackOp.java +++ /dev/null @@ -1,5 +0,0 @@ -package nl.sander.beejava; - -public enum StackOp { - PUSH,POP -} diff --git a/src/main/java/nl/sander/beejava/api/BeeMethod.java b/src/main/java/nl/sander/beejava/api/BeeMethod.java deleted file mode 100644 index fa5c406..0000000 --- a/src/main/java/nl/sander/beejava/api/BeeMethod.java +++ /dev/null @@ -1,62 +0,0 @@ -package nl.sander.beejava.api; - -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; - - public BeeMethod(BeeSource beeSource, String name, Set accessFlags, - Set formalParameters, - Class returnType, List code) { - this.name = name; - this.accessFlags.addAll(accessFlags); - this.formalParameters.addAll(formalParameters); - this.returnType = returnType; - super.code.addAll(code); - setOwner(beeSource); - } - - 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 , then the descriptor must denote a void method. - * -If the name of the method is , 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 - */ - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BeeMethod beeMethod = (BeeMethod) o; - return name.equals(beeMethod.name) && - returnType.equals(beeMethod.returnType); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), name, returnType); - } -} diff --git a/src/main/java/nl/sander/beejava/operands/Operand.java b/src/main/java/nl/sander/beejava/operands/Operand.java deleted file mode 100644 index 28fa969..0000000 --- a/src/main/java/nl/sander/beejava/operands/Operand.java +++ /dev/null @@ -1,4 +0,0 @@ -package nl.sander.beejava.operands; - -public abstract class Operand { -} diff --git a/src/main/java/nl/sander/beejava/operands/VoidOperand.java b/src/main/java/nl/sander/beejava/operands/VoidOperand.java deleted file mode 100644 index d0fd866..0000000 --- a/src/main/java/nl/sander/beejava/operands/VoidOperand.java +++ /dev/null @@ -1,9 +0,0 @@ -package nl.sander.beejava.operands; - -public class VoidOperand extends Operand{ - public final static VoidOperand INSTANCE = new VoidOperand(); - - private VoidOperand() { - // - } -} diff --git a/src/main/java/nl/sander/beejava/BytecodeGenerator.java b/src/main/java/nl/sander/bejava/BytecodeGenerator.java similarity index 82% rename from src/main/java/nl/sander/beejava/BytecodeGenerator.java rename to src/main/java/nl/sander/bejava/BytecodeGenerator.java index 10ff698..1cab29e 100644 --- a/src/main/java/nl/sander/beejava/BytecodeGenerator.java +++ b/src/main/java/nl/sander/bejava/BytecodeGenerator.java @@ -1,8 +1,7 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.flags.AccessFlags; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.flags.AccessFlags; +import nl.sander.bejava.util.ByteBuf; public class BytecodeGenerator { @@ -13,12 +12,12 @@ public class BytecodeGenerator { } public static byte[] generate(CompiledClass compiledClass) { - BytecodeGenerator bytecodeGenerator = new BytecodeGenerator(compiledClass); + var bytecodeGenerator = new BytecodeGenerator(compiledClass); return bytecodeGenerator.generate(); } private byte[] generate() { - ByteBuf buf = new ByteBuf(); + var buf = new ByteBuf(); buf.addU8(0xCA, 0xFE, 0xBA, 0xBE); buf.addU16(compiledClass.getSource().getClassFileVersion().getMinor()); buf.addU16(compiledClass.getSource().getClassFileVersion().getMajor()); diff --git a/src/main/java/nl/sander/beejava/CompiledClass.java b/src/main/java/nl/sander/bejava/CompiledClass.java similarity index 74% rename from src/main/java/nl/sander/beejava/CompiledClass.java rename to src/main/java/nl/sander/bejava/CompiledClass.java index 18cbfc5..474e632 100644 --- a/src/main/java/nl/sander/beejava/CompiledClass.java +++ b/src/main/java/nl/sander/bejava/CompiledClass.java @@ -1,29 +1,32 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.BeeSource; -import nl.sander.beejava.classinfo.FieldInfo; -import nl.sander.beejava.classinfo.MethodInfo; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.constantpool.entry.ClassEntry; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; +import nl.sander.bejava.api.BeSource; +import nl.sander.bejava.classinfo.FieldInfo; +import nl.sander.bejava.classinfo.MethodInfo; +import nl.sander.bejava.constantpool.ConstantPool; +import nl.sander.bejava.constantpool.entry.ClassEntry; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; -import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; +/** + * Eventually contains all information for generation of the actual bytecode. + * Output of the {@link Compiler} class. + */ public class CompiledClass { private final Set constantTree = new LinkedHashSet<>(); private final Set interfaces = new HashSet<>(); private final Set fields = new HashSet<>(); private final Set methods = new HashSet<>(); - private final BeeSource beeSource; + private final BeSource beSource; private ClassEntry thisClass; private ClassEntry superClass; private ConstantPool constantPool; - CompiledClass(BeeSource beeSource) { - this.beeSource = beeSource; + CompiledClass(BeSource beSource) { + this.beSource = beSource; } int getSuperIndex() { @@ -56,8 +59,8 @@ public class CompiledClass { interfaces.add(interfaceEntry); } - BeeSource getSource() { - return beeSource; + BeSource getSource() { + return beSource; } public void setThisClass(ClassEntry newThisClass) { diff --git a/src/main/java/nl/sander/beejava/Compiler.java b/src/main/java/nl/sander/bejava/Compiler.java similarity index 76% rename from src/main/java/nl/sander/beejava/Compiler.java rename to src/main/java/nl/sander/bejava/Compiler.java index c34ad5f..7758c6b 100644 --- a/src/main/java/nl/sander/beejava/Compiler.java +++ b/src/main/java/nl/sander/bejava/Compiler.java @@ -1,22 +1,15 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.*; -import nl.sander.beejava.classinfo.FieldInfo; -import nl.sander.beejava.classinfo.MethodInfo; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.constantpool.entry.ClassEntry; -import nl.sander.beejava.constantpool.entry.FieldRefEntry; -import nl.sander.beejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.api.*; +import nl.sander.bejava.classinfo.FieldInfo; +import nl.sander.bejava.classinfo.MethodInfo; +import nl.sander.bejava.constantpool.entry.Utf8Entry; /** - * Builds a set of a tree of constant pool entries that refer to each other. - *

- * A client must supply a {@link BeeSource} containing a set of {@link CodeLine}s that is assumed to be correct. + * Transforms BeeSource to CompiledClass + * A client must supply a {@link BeSource} containing a set of {@link CodeLine}s that is assumed to be correct. * It doesn't check if a valid state is reached. */ -/* So the name isn't entirely correct. Waiting for inspiration. - * also TODO make sure entries aren't duplicates - */ public class Compiler { private final CompiledClass compiledClass; private final ConstantPoolCreator constantPoolCreator = new ConstantPoolCreator(); @@ -35,11 +28,11 @@ public class Compiler { /** * compile a BeeSource object into a CompiledClass object. * - * @param beeSource the Class object for which the constant pool needs to be created + * @param beSource the Class object for which the constant pool needs to be created * @return a CompiledClass object (that can be turned into bytecode) */ - public static CompiledClass compile(BeeSource beeSource) { - return new Compiler(new CompiledClass(beeSource)).compile(); + public static CompiledClass compile(BeSource beSource) { + return new Compiler(new CompiledClass(beSource)).compile(); } /** @@ -52,13 +45,13 @@ public class Compiler { addClassAndSuperClassEntriesToCompiledClass(); - ConstantPool constantPool = constantPoolCreator.createConstantPool(compiledClass.getConstantTree()); + var constantPool = constantPoolCreator.createConstantPool(compiledClass.getConstantTree()); compiledClass.setConstantPool(constantPool); // add refs to super interfaces to class descriptor and constantpool compiledClass.getSource().getInterfaces().forEach(interfase -> { - ClassEntry interfaceEntry = ConstantPoolEntryCreator.getOrCreateClassEntry(interfase); + var interfaceEntry = ConstantPoolEntryCreator.getOrCreateClassEntry(interfase); compiledClass.addInterface(interfaceEntry); compiledClass.addConstantPoolEntry(interfaceEntry); }); @@ -86,11 +79,11 @@ public class Compiler { private void addClassAndSuperClassEntriesToCompiledClass() { - ClassEntry classEntry = ConstantPoolEntryCreator.getOrCreateClassEntry(compiledClass.getSource().getName()); + var classEntry = ConstantPoolEntryCreator.getOrCreateClassEntry(compiledClass.getSource().getName()); compiledClass.setThisClass(classEntry); compiledClass.addConstantPoolEntry(classEntry); - ClassEntry superClass = ConstantPoolEntryCreator.getOrCreateClassEntry(compiledClass.getSource().getSuperClass()); + var superClass = ConstantPoolEntryCreator.getOrCreateClassEntry(compiledClass.getSource().getSuperClass()); compiledClass.addConstantPoolEntry(superClass); compiledClass.setSuperClass(superClass); @@ -110,7 +103,7 @@ public class Compiler { */ public void addMethods() { compiledClass.addConstantPoolEntry(codeAttributeNameEntry); - for (BeeMethod method : compiledClass.getSource().getMethods()) { + for (var method : compiledClass.getSource().getMethods()) { compiledClass.addMethod(createMethod(method)); } } @@ -126,8 +119,8 @@ public class Compiler { .addAttribute(MethodCodeAttributeCreator.createCodeAttribute(codeAttributeNameEntry, method)); } - private void addToConstantPool(BeeField field) { - FieldRefEntry fieldRefEntry = ConstantPoolEntryCreator.getOrCreateFieldRefEntry(compiledClass.getSource().getName(), field.getName(), field.getType()); + private void addToConstantPool(BeField field) { + var fieldRefEntry = ConstantPoolEntryCreator.getOrCreateFieldRefEntry(compiledClass.getSource().getName(), field.getName(), field.getType()); compiledClass.addConstantPoolEntry(fieldRefEntry); } diff --git a/src/main/java/nl/sander/beejava/ConstantPoolCreator.java b/src/main/java/nl/sander/bejava/ConstantPoolCreator.java similarity index 89% rename from src/main/java/nl/sander/beejava/ConstantPoolCreator.java rename to src/main/java/nl/sander/bejava/ConstantPoolCreator.java index 24d6e15..0cdce5e 100644 --- a/src/main/java/nl/sander/beejava/ConstantPoolCreator.java +++ b/src/main/java/nl/sander/bejava/ConstantPoolCreator.java @@ -1,7 +1,7 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; +import nl.sander.bejava.constantpool.ConstantPool; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; import java.util.Set; @@ -44,7 +44,7 @@ public class ConstantPoolCreator { * - then add grandchildren (I don't think there's more levels) */ private void updateToplevelElements(Set children) { - for (ConstantPoolEntry topElement : children) { + for (var topElement : children) { addToPool(topElement); // grandparents updateChildElements(topElement.getChildren()); } @@ -52,11 +52,11 @@ public class ConstantPoolCreator { private void updateChildElements(Set children) { // parents - for (ConstantPoolEntry child : children) { + for (var child : children) { addToPool(child); } // then grandchildren - for (ConstantPoolEntry child : children) { + for (var child : children) { updateChildElements(child.getChildren()); // no problem if there are great grand children } } diff --git a/src/main/java/nl/sander/beejava/ConstantPoolEntryCreator.java b/src/main/java/nl/sander/bejava/ConstantPoolEntryCreator.java similarity index 96% rename from src/main/java/nl/sander/beejava/ConstantPoolEntryCreator.java rename to src/main/java/nl/sander/bejava/ConstantPoolEntryCreator.java index 2edafd7..c620813 100644 --- a/src/main/java/nl/sander/beejava/ConstantPoolEntryCreator.java +++ b/src/main/java/nl/sander/bejava/ConstantPoolEntryCreator.java @@ -1,7 +1,7 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.constantpool.entry.*; -import nl.sander.beejava.operands.ConstantOperand; +import nl.sander.bejava.constantpool.entry.*; +import nl.sander.bejava.operands.ConstantOperand; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/nl/sander/beejava/FieldWrapper.java b/src/main/java/nl/sander/bejava/FieldWrapper.java similarity index 67% rename from src/main/java/nl/sander/beejava/FieldWrapper.java rename to src/main/java/nl/sander/bejava/FieldWrapper.java index d79ce43..5c055a6 100644 --- a/src/main/java/nl/sander/beejava/FieldWrapper.java +++ b/src/main/java/nl/sander/bejava/FieldWrapper.java @@ -1,7 +1,7 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.BeeField; -import nl.sander.beejava.flags.AccessFlags; +import nl.sander.bejava.api.BeField; +import nl.sander.bejava.flags.AccessFlags; import java.lang.reflect.Field; @@ -10,9 +10,9 @@ import java.lang.reflect.Field; */ public class FieldWrapper { private final Field reflectField; - private final BeeField beefield; + private final BeField beefield; - public FieldWrapper(Field reflectField, BeeField beefield) { + public FieldWrapper(Field reflectField, BeField beefield) { this.reflectField = reflectField; this.beefield = beefield; } @@ -40,12 +40,4 @@ public class FieldWrapper { return AccessFlags.combine(beefield.getAccessFlags()); } } - - public String getOwner() { - if (reflectField != null) { - return reflectField.getDeclaringClass().getName(); - } else { - return beefield.getDeclaringClass(); - } - } } diff --git a/src/main/java/nl/sander/beejava/JavaInstruction.java b/src/main/java/nl/sander/bejava/JavaInstruction.java similarity index 86% rename from src/main/java/nl/sander/beejava/JavaInstruction.java rename to src/main/java/nl/sander/bejava/JavaInstruction.java index f7ac201..13ec98d 100644 --- a/src/main/java/nl/sander/beejava/JavaInstruction.java +++ b/src/main/java/nl/sander/bejava/JavaInstruction.java @@ -1,15 +1,18 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; -import nl.sander.beejava.constantpool.entry.FieldRefEntry; -import nl.sander.beejava.constantpool.entry.MethodRefEntry; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; +import nl.sander.bejava.constantpool.entry.FieldRefEntry; +import nl.sander.bejava.constantpool.entry.MethodRefEntry; +/** + * bejava opcodes translate to real java opcodes. A JavaInstruct + */ public class JavaInstruction { private final JavaOpcode opcode; private final MethodRefEntry methodRefEntry; private final FieldRefEntry fieldRefEntry; private final ConstantPoolEntry constantEntry; - private Integer localVariableIndex; + private Integer localVariableIndex; // TODO not used yet public JavaInstruction(JavaOpcode opcode) { this(opcode, null, null, null, null); diff --git a/src/main/java/nl/sander/beejava/JavaOpcode.java b/src/main/java/nl/sander/bejava/JavaOpcode.java similarity index 97% rename from src/main/java/nl/sander/beejava/JavaOpcode.java rename to src/main/java/nl/sander/bejava/JavaOpcode.java index 4519907..d68c916 100644 --- a/src/main/java/nl/sander/beejava/JavaOpcode.java +++ b/src/main/java/nl/sander/bejava/JavaOpcode.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.bejava; public enum JavaOpcode { LDC(0x12, false, +1), diff --git a/src/main/java/nl/sander/beejava/MethodCodeAttributeCreator.java b/src/main/java/nl/sander/bejava/MethodCodeAttributeCreator.java similarity index 64% rename from src/main/java/nl/sander/beejava/MethodCodeAttributeCreator.java rename to src/main/java/nl/sander/bejava/MethodCodeAttributeCreator.java index 91714a2..94c0540 100644 --- a/src/main/java/nl/sander/beejava/MethodCodeAttributeCreator.java +++ b/src/main/java/nl/sander/bejava/MethodCodeAttributeCreator.java @@ -1,25 +1,24 @@ -package nl.sander.beejava; +package nl.sander.bejava; -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; -import nl.sander.beejava.constantpool.entry.MethodRefEntry; -import nl.sander.beejava.constantpool.entry.Utf8Entry; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.api.CodeContainer; +import nl.sander.bejava.classinfo.attributes.CodeAttribute; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; +import nl.sander.bejava.constantpool.entry.MethodRefEntry; +import nl.sander.bejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.util.ByteBuf; public class MethodCodeAttributeCreator { public static CodeAttribute createCodeAttribute(Utf8Entry codeAttributeNameEntry, CodeContainer codeContainer) { - CodeAttribute codeAttribute = new CodeAttribute(codeAttributeNameEntry); + var codeAttribute = new CodeAttribute(codeAttributeNameEntry); codeAttribute.setMaxStack(calculateMaxStack(codeContainer)); codeAttribute.setMaxLocals(codeContainer.getFormalParameters().size() + 1); - ByteBuf byteBuf = new ByteBuf(); + var byteBuf = new ByteBuf(); codeContainer.getExpandedCode().forEach(instruction -> { - JavaOpcode javaOpcode = instruction.getOpcode(); + var javaOpcode = instruction.getOpcode(); byteBuf.addU8(javaOpcode.getByteCode()); - ConstantPoolEntry constantPoolEntry = instruction.getEntry(); + var constantPoolEntry = instruction.getEntry(); if (constantPoolEntry != null) { if (javaOpcode.isWide()) { byteBuf.addU16(constantPoolEntry.getIndex()); @@ -37,12 +36,12 @@ public class MethodCodeAttributeCreator { private static int calculateMaxStack(CodeContainer codeContainer) { int stackSize = 0; int maxStackSize = 0; - for (JavaInstruction instruction : codeContainer.getExpandedCode()) { + for (var instruction : codeContainer.getExpandedCode()) { stackSize += instruction.getOpcode().getStackDif(); - ConstantPoolEntry assignedEntry = instruction.getEntry(); + var assignedEntry = instruction.getEntry(); if (assignedEntry instanceof MethodRefEntry) { - MethodRefEntry methodRefEntry = (MethodRefEntry) assignedEntry; - String argumentTypes = methodRefEntry.getNameAndType().getType(); + var methodRefEntry = (MethodRefEntry) assignedEntry; + var argumentTypes = methodRefEntry.getNameAndType().getType(); stackSize -= getNrArguments(argumentTypes); } if (stackSize > maxStackSize) { diff --git a/src/main/java/nl/sander/beejava/OpcodeTranslator.java b/src/main/java/nl/sander/bejava/OpcodeTranslator.java similarity index 79% rename from src/main/java/nl/sander/beejava/OpcodeTranslator.java rename to src/main/java/nl/sander/bejava/OpcodeTranslator.java index c565622..ee2f41b 100644 --- a/src/main/java/nl/sander/beejava/OpcodeTranslator.java +++ b/src/main/java/nl/sander/bejava/OpcodeTranslator.java @@ -1,47 +1,41 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.*; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; -import nl.sander.beejava.operands.*; +import nl.sander.bejava.api.*; +import nl.sander.bejava.operands.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; import java.util.stream.Collectors; -enum Primitives { - INT, SHORT, BYTE, LONG, FLOAT, DOUBLE, CHAR, BOOLEAN; - - public static Primitives from(String value) { - return Arrays.stream(values()).filter(e -> e.toString().equals(value)).findFirst().orElse(null); - } -} - /** * Translates from BeeJava opcodes to actual java opcodes. */ public class OpcodeTranslator { private final static OpcodeTranslator instance = new OpcodeTranslator(); private final Parser parser = new Parser(); - private BeeSource beeSource; + private BeSource beSource; /* * trying to make SourceExpander reusable. * @not_multithreaded. * //TODO should not mutate beesource */ - public static void translate(BeeSource beeSource) { - instance.init(beeSource); + public static void translate(BeSource beSource) { + instance.init(beSource); instance.doExpand(); } - private void init(BeeSource beeSource) { - this.beeSource = beeSource; + private void init(BeSource beSource) { + this.beSource = beSource; } private void doExpand() { - beeSource.getConstructors().forEach(this::translate); - beeSource.getMethods().forEach(this::translate); + beSource.getConstructors().forEach(this::translate); + beSource.getMethods().forEach(this::translate); } private void translate(CodeContainer codeContainer) { @@ -53,11 +47,11 @@ public class OpcodeTranslator { private List translate(CodeContainer codeContainer, CodeLine codeLine) { var operand = parser.parse(codeLine); - return eval(codeContainer, codeLine.getOpcode(), operand); + return translate(codeContainer, codeLine.getOpcode(), operand); } - private List eval(CodeContainer codeContainer, Opcode opcode, Operand operand) { - final List instructions = new ArrayList<>(); + private List translate(CodeContainer codeContainer, Opcode opcode, Operand operand) { + List instructions = new ArrayList<>(); if (operand instanceof MethodOperand) { var mo = (MethodOperand) operand; if ("this".equals(mo.className)) { @@ -66,7 +60,7 @@ public class OpcodeTranslator { } if (opcode == Opcode.LOAD) { if (operand instanceof ConstantOperand) { - ConstantPoolEntry constantEntry = ConstantPoolEntryCreator.getOrCreatePrimitiveConstantEntry((ConstantOperand) operand); + var constantEntry = ConstantPoolEntryCreator.getOrCreatePrimitiveConstantEntry((ConstantOperand) operand); instructions.add(new JavaInstruction(JavaOpcode.LDC, constantEntry)); } } else if (opcode == Opcode.RETURN && operand instanceof VoidOperand) { @@ -75,7 +69,7 @@ public class OpcodeTranslator { assert operand instanceof FieldOperand; var fieldOperand = (FieldOperand) operand; - FieldWrapper field = getField(codeContainer, fieldOperand); + var field = getField(codeContainer, fieldOperand); instructions.add(new JavaInstruction(getJavaOpcodeForGet(field), ConstantPoolEntryCreator.getOrCreateFieldRefEntry(getType(codeContainer, fieldOperand), field.getName(), field.getType()))); } else if (opcode == Opcode.INVOKE) { @@ -83,11 +77,10 @@ public class OpcodeTranslator { var mo = (MethodOperand) operand; if ("super".equals(mo.methodName)) { instructions.add(new JavaInstruction(JavaOpcode.INVOKESPECIAL, - ConstantPoolEntryCreator.getOrCreateMethodRefEntry(beeSource.getSuperClass().getName(), "", "()V"))); + ConstantPoolEntryCreator.getOrCreateMethodRefEntry(beSource.getSuperClass().getName(), "", "()V"))); } else { instructions.add(new JavaInstruction(JavaOpcode.INVOKEVIRTUAL, ConstantPoolEntryCreator.getOrCreateMethodRefEntry(mo.className, mo.methodName, mo.signature))); } - System.out.println(operand); } else if (operand instanceof FieldOperand) { var fieldOperand = (FieldOperand) operand; if (fieldOperand.className.equals("this")) { @@ -99,7 +92,9 @@ public class OpcodeTranslator { } } else if (operand instanceof LocalVariableOperand) { var localVariable = (LocalVariableOperand) operand; - instructions.add(codeContainer.getParameter(localVariable.name).map(this::getJavaLoadInstruction).orElse(null)); //else case + instructions.add(codeContainer.getParameter(localVariable.name) + .map(this::getJavaLoadInstruction) + .orElse(null)); //else case } // TODO continue here. finish simpleBean @@ -117,9 +112,9 @@ public class OpcodeTranslator { } private JavaInstruction getReturnInstruction(CodeContainer codeContainer, FieldOperand fo) { - FieldWrapper field = getField(codeContainer, fo); + var field = getField(codeContainer, fo); - JavaOpcode javaOpcode = switch (field.getName()) { + var javaOpcode = switch (field.getName()) { case "int", "byte", "boolean", "short" -> JavaOpcode.IRETURN; case "long" -> JavaOpcode.LRETURN; case "float" -> JavaOpcode.FRETURN; @@ -142,20 +137,20 @@ public class OpcodeTranslator { private FieldWrapper getField(CodeContainer codeContainer, FieldOperand fo) { try { Field javaField = null; - BeeField beeField = null; + BeField beField = null; if (fo.className.equals("this")) { - beeField = codeContainer.getOwner().getField(fo.fieldName); + beField = codeContainer.getOwner().getField(fo.fieldName); } else { - Class type = Class.forName(fo.className); + var type = Class.forName(fo.className); javaField = type.getDeclaredField(fo.fieldName); } - return new FieldWrapper(javaField, beeField); + return new FieldWrapper(javaField, beField); } catch (ClassNotFoundException | NoSuchFieldException e) { throw new IllegalStateException(e); } } - private JavaInstruction getJavaLoadInstruction(BeeParameter parameter) { + private JavaInstruction getJavaLoadInstruction(BeParameter parameter) { return switch (parameter.getIndex()) { case 0 -> new JavaInstruction(JavaOpcode.ALOAD_0); case 1 -> new JavaInstruction(JavaOpcode.ALOAD_1); diff --git a/src/main/java/nl/sander/bejava/OverallCompiler.java b/src/main/java/nl/sander/bejava/OverallCompiler.java new file mode 100644 index 0000000..c5d1be8 --- /dev/null +++ b/src/main/java/nl/sander/bejava/OverallCompiler.java @@ -0,0 +1,20 @@ +package nl.sander.bejava; + +import nl.sander.bejava.api.BeSource; + +/** + * Contains all four passes necessary to go from source as text to bytecode. + */ +public final class OverallCompiler { + + private OverallCompiler() { + // + } + + public static byte[] compile(String sourcecode) { + BeSource beSource = SourceCompiler.compile(sourcecode); + OpcodeTranslator.translate(beSource); + CompiledClass compiledClass = Compiler.compile(beSource); + return BytecodeGenerator.generate(compiledClass); + } +} diff --git a/src/main/java/nl/sander/beejava/Primitive.java b/src/main/java/nl/sander/bejava/Primitive.java similarity index 92% rename from src/main/java/nl/sander/beejava/Primitive.java rename to src/main/java/nl/sander/bejava/Primitive.java index 31a2cbf..4d840fa 100644 --- a/src/main/java/nl/sander/beejava/Primitive.java +++ b/src/main/java/nl/sander/bejava/Primitive.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.bejava; import java.util.Arrays; diff --git a/src/main/java/nl/sander/beejava/SourceCompiler.java b/src/main/java/nl/sander/bejava/SourceCompiler.java similarity index 81% rename from src/main/java/nl/sander/beejava/SourceCompiler.java rename to src/main/java/nl/sander/bejava/SourceCompiler.java index 683e1c8..5e2f2fc 100644 --- a/src/main/java/nl/sander/beejava/SourceCompiler.java +++ b/src/main/java/nl/sander/bejava/SourceCompiler.java @@ -1,9 +1,9 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.*; -import nl.sander.beejava.flags.ClassAccessFlags; -import nl.sander.beejava.flags.FieldAccessFlag; -import nl.sander.beejava.flags.MethodAccessFlag; +import nl.sander.bejava.api.*; +import nl.sander.bejava.flags.ClassAccessFlags; +import nl.sander.bejava.flags.FieldAccessFlag; +import nl.sander.bejava.flags.MethodAccessFlag; import java.util.*; import java.util.function.Supplier; @@ -25,43 +25,43 @@ public class SourceCompiler { this.sourcecode = sourcecode; } - public static BeeSource compile(String sourcecode) { + public static BeSource compile(String sourcecode) { return new SourceCompiler(sourcecode).doCompile(); } - public BeeSource doCompile() { + public BeSource doCompile() { Arrays.stream(sourcecode.split("\n")) .map(this::compileLine) .forEach(instructions::add); - BeeSource beeSource = new BeeSource(); + BeSource beSource = new BeSource(); for (currentLine = 0; currentLine < instructions.size(); ) { Instruction ins = instructions.get(currentLine); if (currentLine == 0) { - parseClassDeclaration(ins, beeSource); + parseClassDeclaration(ins, beSource); } else { - parseInstruction(ins, beeSource); + parseInstruction(ins, beSource); } } - return beeSource; + return beSource; } - private void parseInstruction(Instruction instruction, BeeSource beeSource) { + private void parseInstruction(Instruction instruction, BeSource beSource) { if (instruction instanceof ClassInstruction) { ClassInstruction classInstruction = (ClassInstruction) instruction; String operand = classInstruction.getOperand(); switch (classInstruction.getOperation()) { - case FIELD -> beeSource.addFields(parseField(beeSource, operand)); - case CONSTRUCTOR -> beeSource.addConstructors(parseConstructor(beeSource, operand)); - case METHOD -> beeSource.addMethods(parseMethod(beeSource, operand)); + case FIELD -> beSource.addFields(parseField(beSource, operand)); + case CONSTRUCTOR -> beSource.addConstructors(parseConstructor(beSource, operand)); + case METHOD -> beSource.addMethods(parseMethod(beSource, operand)); default -> throw new IllegalArgumentException("Not allowed here"); } } } - private nl.sander.beejava.api.BeeMethod parseMethod(BeeSource beeSource, String text) { + private BeMethod parseMethod(BeSource beSource, String text) { String[] tokens = returntypesplitter.split(text); final String first; final Class returnType; @@ -85,7 +85,7 @@ public class SourceCompiler { } String[] nameParams = split(flagsNameParameters[i], parensplitter); - Set parameters = new HashSet<>(); + Set parameters = new HashSet<>(); String methodName = null; if (nameParams.length > 0) { methodName = nameParams[0]; @@ -97,7 +97,7 @@ public class SourceCompiler { String[] declaration = paramToken.trim().split(" "); String type = declaration[0]; String name = declaration[1]; - parameters.add(new nl.sander.beejava.api.BeeParameter(getType(type), name, index++)); + parameters.add(new BeParameter(getType(type), name, index++)); } } } @@ -105,7 +105,7 @@ public class SourceCompiler { throw new IllegalArgumentException("method name not found"); } currentLine += 1; - List lines = new ArrayList<>(); + List lines = new ArrayList<>(); Instruction nextInstruction = instructions.get(currentLine); while (currentLine < instructions.size() && nextInstruction instanceof CodeLine) { nextInstruction = instructions.get(currentLine); @@ -116,16 +116,16 @@ public class SourceCompiler { } - return new BeeMethod(beeSource, methodName, flags, parameters, returnType, lines); + return new BeMethod(beSource, methodName, flags, parameters, returnType, lines); } - private nl.sander.beejava.api.BeeConstructor parseConstructor(BeeSource beeSource, String text) { + private BeConstructor parseConstructor(BeSource beSource, String text) { String[] tokens = split(text, parensplitter); String flag = tokens[0]; MethodAccessFlag methodAccessFlag = MethodAccessFlag.get(flag.toUpperCase()).orElseThrow(illegalArgument("Not a valid flag " + flag)); String params = tokens[1]; - Set parameters = new HashSet<>(); + Set parameters = new HashSet<>(); if (params.length() > 0) { String[] paramTokens = params.split(","); int index = 0; @@ -133,7 +133,7 @@ public class SourceCompiler { String[] declaration = paramToken.trim().split(" "); String type = declaration[0]; String name = declaration[1]; - parameters.add(new BeeParameter(getType(type), name, index++)); + parameters.add(new BeParameter(getType(type), name, index++)); } } currentLine += 1; @@ -147,10 +147,10 @@ public class SourceCompiler { } } - return new BeeConstructor(beeSource, Set.of(methodAccessFlag), parameters, lines); + return new BeConstructor(beSource, Set.of(methodAccessFlag), parameters, lines); } - private nl.sander.beejava.api.BeeField parseField(BeeSource beeSource, String operand) { + private BeField parseField(BeSource beSource, String operand) { String[] tokens = operand.split(" "); Set flags = new HashSet<>(); String type = null; @@ -168,17 +168,17 @@ public class SourceCompiler { } } currentLine += 1; - return new BeeField(beeSource.getName(), flags, getType(type), name); + return new BeField(beSource.getName(), flags, getType(type), name); } - private void parseClassDeclaration(Instruction instruction, BeeSource beeSource) { + private void parseClassDeclaration(Instruction instruction, BeSource beSource) { if (instruction instanceof ClassInstruction) { ClassInstruction classDeclaration = (ClassInstruction) instruction; ClassOperation operation = classDeclaration.getOperation(); switch (operation) { case CLASS -> { - beeSource.addAccessFlags(ClassAccessFlags.SUPER); - beeSource.setClassFileVersion(getVersion(classDeclaration)); + beSource.addAccessFlags(ClassAccessFlags.SUPER); + beSource.setClassFileVersion(getVersion(classDeclaration)); String[] tokens = split(classDeclaration.getOperand(), parensplitter); String rightHand = classDeclaration.getOperand(); @@ -188,9 +188,9 @@ public class SourceCompiler { tokens = rightHand.split(" "); if (tokens.length == 2) { // has access flag - beeSource.addAccessFlags(ClassAccessFlags.valueOf(tokens[0].toUpperCase())); + beSource.addAccessFlags(ClassAccessFlags.valueOf(tokens[0].toUpperCase())); } - beeSource.setName(getClassName(tokens)); + beSource.setName(getClassName(tokens)); } case INTERFACE -> { }//TODO diff --git a/src/main/java/nl/sander/beejava/TypeMapper.java b/src/main/java/nl/sander/bejava/TypeMapper.java similarity index 97% rename from src/main/java/nl/sander/beejava/TypeMapper.java rename to src/main/java/nl/sander/bejava/TypeMapper.java index aed69a8..4daca0e 100644 --- a/src/main/java/nl/sander/beejava/TypeMapper.java +++ b/src/main/java/nl/sander/bejava/TypeMapper.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.bejava; import java.util.Map; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/api/BeeConstructor.java b/src/main/java/nl/sander/bejava/api/BeConstructor.java similarity index 62% rename from src/main/java/nl/sander/beejava/api/BeeConstructor.java rename to src/main/java/nl/sander/bejava/api/BeConstructor.java index feda15f..6870128 100644 --- a/src/main/java/nl/sander/beejava/api/BeeConstructor.java +++ b/src/main/java/nl/sander/bejava/api/BeConstructor.java @@ -1,21 +1,21 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; -import nl.sander.beejava.flags.MethodAccessFlag; +import nl.sander.bejava.flags.MethodAccessFlag; import java.util.*; /** * Models a constructor */ -public final class BeeConstructor extends CodeContainer { +public final class BeConstructor extends CodeContainer { - public BeeConstructor(BeeSource beeSource, Set accessFlags, - Set formalParameters, - List code) { + public BeConstructor(BeSource beSource, Set accessFlags, + Set formalParameters, + List code) { this.formalParameters.addAll(formalParameters); this.accessFlags.addAll(accessFlags); super.code.addAll(code); - setOwner(beeSource); + setOwner(beSource); } public String getName() { @@ -33,16 +33,11 @@ public final class BeeConstructor extends CodeContainer { 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; + var that = (BeConstructor) o; return formalParameters.equals(that.formalParameters); } diff --git a/src/main/java/nl/sander/beejava/api/BeeField.java b/src/main/java/nl/sander/bejava/api/BeField.java similarity index 83% rename from src/main/java/nl/sander/beejava/api/BeeField.java rename to src/main/java/nl/sander/bejava/api/BeField.java index 09eea60..90b6360 100644 --- a/src/main/java/nl/sander/beejava/api/BeeField.java +++ b/src/main/java/nl/sander/bejava/api/BeField.java @@ -1,6 +1,6 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; -import nl.sander.beejava.flags.FieldAccessFlag; +import nl.sander.bejava.flags.FieldAccessFlag; import java.util.HashSet; import java.util.Objects; @@ -9,7 +9,7 @@ import java.util.Set; /** * Models a field in a BeeClass */ -public final class BeeField { +public final class BeField { private final String declaringClass; private final Set accessFlags = new HashSet<>(); @@ -23,7 +23,7 @@ public final class BeeField { * @param type field type. Must be existing type. * @param name */ - public BeeField(String declaringClass, Set accessFlags, Class type, String name) { + public BeField(String declaringClass, Set accessFlags, Class type, String name) { this.declaringClass = declaringClass; this.accessFlags.addAll(accessFlags); this.type = type; @@ -50,7 +50,7 @@ public final class BeeField { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - BeeField beeField = (BeeField) o; + var beeField = (BeField) o; return name.equals(beeField.name); } diff --git a/src/main/java/nl/sander/bejava/api/BeMethod.java b/src/main/java/nl/sander/bejava/api/BeMethod.java new file mode 100644 index 0000000..35c4e50 --- /dev/null +++ b/src/main/java/nl/sander/bejava/api/BeMethod.java @@ -0,0 +1,57 @@ +package nl.sander.bejava.api; + +import nl.sander.bejava.flags.MethodAccessFlag; + +import java.util.*; + +/** + * Models a method in a BeeClass + */ +public final class BeMethod extends CodeContainer { + private final String name; + + private final Class returnType; + + public BeMethod(BeSource beSource, String name, Set accessFlags, + Set formalParameters, + Class returnType, List code) { + this.name = name; + this.accessFlags.addAll(accessFlags); + this.formalParameters.addAll(formalParameters); + this.returnType = returnType; + super.code.addAll(code); + setOwner(beSource); + } + + public String getName() { + return name; + } + + public Class getReturnType() { + return returnType; + } + +// 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 , then the descriptor must denote a void method. +// * -If the name of the method is , 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 +// */ +// } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BeMethod beMethod = (BeMethod) o; + return name.equals(beMethod.name) && + returnType.equals(beMethod.returnType); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), name, returnType); + } +} diff --git a/src/main/java/nl/sander/beejava/api/BeeParameter.java b/src/main/java/nl/sander/bejava/api/BeParameter.java similarity index 78% rename from src/main/java/nl/sander/beejava/api/BeeParameter.java rename to src/main/java/nl/sander/bejava/api/BeParameter.java index 1533c8e..00a6c4f 100644 --- a/src/main/java/nl/sander/beejava/api/BeeParameter.java +++ b/src/main/java/nl/sander/bejava/api/BeParameter.java @@ -1,22 +1,22 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; import java.util.Objects; /** * Models a formal parameter in a method declaration. */ -public final class BeeParameter { +public final class BeParameter { private final Class type; private final String name; private final int index; - public BeeParameter(Class type, String name) { + public BeParameter(Class type, String name) { this.type = type; this.name = name; this.index = -1; } - public BeeParameter(Class type, String name, int index) { + public BeParameter(Class type, String name, int index) { this.type = type; this.name = name; this.index = index; @@ -34,7 +34,7 @@ public final class BeeParameter { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - BeeParameter that = (BeeParameter) o; + var that = (BeParameter) o; return name.equals(that.name); } diff --git a/src/main/java/nl/sander/beejava/api/BeeSource.java b/src/main/java/nl/sander/bejava/api/BeSource.java similarity index 72% rename from src/main/java/nl/sander/beejava/api/BeeSource.java rename to src/main/java/nl/sander/bejava/api/BeSource.java index 83df8cc..1fd46fe 100644 --- a/src/main/java/nl/sander/beejava/api/BeeSource.java +++ b/src/main/java/nl/sander/bejava/api/BeSource.java @@ -1,6 +1,6 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; -import nl.sander.beejava.flags.ClassAccessFlags; +import nl.sander.bejava.flags.ClassAccessFlags; import java.util.Collections; import java.util.HashSet; @@ -9,12 +9,12 @@ 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 { +public final class BeSource { private final Set accessFlags = new HashSet<>(); private final Set> interfaces = new HashSet<>(); - private final Set fields = new HashSet<>(); - private final Set constructors = new HashSet<>(); - private final Set methods = new HashSet<>(); + private final Set fields = new HashSet<>(); + private final Set constructors = new HashSet<>(); + private final Set methods = new HashSet<>(); private Version classFileVersion; private String name; private Class superClass = Object.class; @@ -33,22 +33,22 @@ public final class BeeSource { /** * @return all constructors that are provided with the class */ - public Set getConstructors() { + public Set getConstructors() { return Collections.unmodifiableSet(constructors); } - public void addConstructors(BeeConstructor... constructors) { + public void addConstructors(BeConstructor... constructors) { this.constructors.addAll(Set.of(constructors)); } /** * @return all methods that are provided with the class */ - public Set getMethods() { + public Set getMethods() { return methods; } - public void addMethods(BeeMethod... methods) { + public void addMethods(BeMethod... methods) { this.methods.addAll(Set.of(methods)); } @@ -59,6 +59,11 @@ public final class BeeSource { return Collections.unmodifiableSet(accessFlags); } + /** + * Add access flag eg public static etc + * + * @param classAccessFlags varargs of access flag + */ public void addAccessFlags(ClassAccessFlags... classAccessFlags) { this.accessFlags.addAll(Set.of(classAccessFlags)); } @@ -81,6 +86,10 @@ public final class BeeSource { return superClass; } + /** + * Sets the super class. Default superclass is Object + * @param superClass The class to extend from. + */ public void setSuperClass(Class superClass) { this.superClass = superClass; } @@ -92,6 +101,10 @@ public final class BeeSource { return Collections.unmodifiableSet(interfaces); } + /** + * Adds an interface to implement + * @param interfaces varargs array of interface class + */ public void addInterfaces(Class... interfaces) { this.interfaces.addAll(Set.of(interfaces)); } @@ -99,15 +112,15 @@ public final class BeeSource { /** * @return a list of unique fields that the class will contain */ - public Set getFields() { + public Set getFields() { return Collections.unmodifiableSet(fields); } - public void addFields(BeeField... fields) { + public void addFields(BeField... fields) { this.fields.addAll(Set.of(fields)); } - public BeeField getField(String fieldName) { + public BeField getField(String fieldName) { return fields.stream() .filter(f -> f.getName().equals(fieldName)) .findAny() diff --git a/src/main/java/nl/sander/beejava/api/ClassInstruction.java b/src/main/java/nl/sander/bejava/api/ClassInstruction.java similarity index 92% rename from src/main/java/nl/sander/beejava/api/ClassInstruction.java rename to src/main/java/nl/sander/bejava/api/ClassInstruction.java index ce1f574..edcc35a 100644 --- a/src/main/java/nl/sander/beejava/api/ClassInstruction.java +++ b/src/main/java/nl/sander/bejava/api/ClassInstruction.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; public class ClassInstruction extends Instruction { private final ClassOperation classOperation; diff --git a/src/main/java/nl/sander/beejava/api/ClassOperation.java b/src/main/java/nl/sander/bejava/api/ClassOperation.java similarity index 93% rename from src/main/java/nl/sander/beejava/api/ClassOperation.java rename to src/main/java/nl/sander/bejava/api/ClassOperation.java index 35f5168..d05b8ce 100644 --- a/src/main/java/nl/sander/beejava/api/ClassOperation.java +++ b/src/main/java/nl/sander/bejava/api/ClassOperation.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/api/CodeContainer.java b/src/main/java/nl/sander/bejava/api/CodeContainer.java similarity index 75% rename from src/main/java/nl/sander/beejava/api/CodeContainer.java rename to src/main/java/nl/sander/bejava/api/CodeContainer.java index 8110d5b..afafc4b 100644 --- a/src/main/java/nl/sander/beejava/api/CodeContainer.java +++ b/src/main/java/nl/sander/bejava/api/CodeContainer.java @@ -1,8 +1,8 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; -import nl.sander.beejava.JavaInstruction; -import nl.sander.beejava.TypeMapper; -import nl.sander.beejava.flags.MethodAccessFlag; +import nl.sander.bejava.JavaInstruction; +import nl.sander.bejava.TypeMapper; +import nl.sander.bejava.flags.MethodAccessFlag; import java.util.*; import java.util.stream.Collectors; @@ -13,10 +13,10 @@ import java.util.stream.Collectors; public abstract class CodeContainer { protected final List code = new LinkedList<>(); - protected final Set formalParameters = new HashSet<>(); + protected final Set formalParameters = new HashSet<>(); protected final Set accessFlags = new HashSet<>(); private final List expandedCode = new ArrayList<>(); - private BeeSource owner; + private BeSource owner; public List getCode() { return code; @@ -32,7 +32,7 @@ public abstract class CodeContainer { private String getParametersSignature() { return formalParameters.stream() - .map(BeeParameter::getType) + .map(BeParameter::getType) .map(TypeMapper::map) .collect(Collectors.joining(",", "(", ")")); } @@ -41,15 +41,15 @@ public abstract class CodeContainer { return accessFlags; } - public BeeSource getOwner() { + public BeSource getOwner() { return owner; } - public void setOwner(BeeSource beeSource) { + public void setOwner(BeSource beSource) { if (owner != null) { throw new IllegalStateException("Owner set twice. Sue the developer!"); } - this.owner = beeSource; + this.owner = beSource; } public List getExpandedCode() { @@ -61,13 +61,11 @@ public abstract class CodeContainer { expandedCode.addAll(instructions); } - public abstract boolean isConstructor(); - - public Set getFormalParameters() { + public Set getFormalParameters() { return formalParameters; } - public Optional getParameter(String parameterName) { + public Optional getParameter(String parameterName) { return formalParameters.stream().filter(p -> parameterName.equals(p.getName())).findAny(); } diff --git a/src/main/java/nl/sander/beejava/api/CodeLine.java b/src/main/java/nl/sander/bejava/api/CodeLine.java similarity index 66% rename from src/main/java/nl/sander/beejava/api/CodeLine.java rename to src/main/java/nl/sander/bejava/api/CodeLine.java index 4d53588..4e0d7d6 100644 --- a/src/main/java/nl/sander/beejava/api/CodeLine.java +++ b/src/main/java/nl/sander/bejava/api/CodeLine.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; public class CodeLine extends Instruction { @@ -17,12 +17,4 @@ public class CodeLine extends Instruction { public Opcode getOpcode() { return opcode; } - - public void setOwner(CodeContainer owner) { - this.owner = owner; - } - - public CodeContainer getOwner() { - return owner; - } } diff --git a/src/main/java/nl/sander/beejava/api/Instruction.java b/src/main/java/nl/sander/bejava/api/Instruction.java similarity index 82% rename from src/main/java/nl/sander/beejava/api/Instruction.java rename to src/main/java/nl/sander/bejava/api/Instruction.java index ec3eb88..3de5b99 100644 --- a/src/main/java/nl/sander/beejava/api/Instruction.java +++ b/src/main/java/nl/sander/bejava/api/Instruction.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; public class Instruction { protected final String operand; diff --git a/src/main/java/nl/sander/beejava/api/Opcode.java b/src/main/java/nl/sander/bejava/api/Opcode.java similarity index 97% rename from src/main/java/nl/sander/beejava/api/Opcode.java rename to src/main/java/nl/sander/bejava/api/Opcode.java index df3af2d..1543d66 100644 --- a/src/main/java/nl/sander/beejava/api/Opcode.java +++ b/src/main/java/nl/sander/bejava/api/Opcode.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.api; +package nl.sander.bejava.api; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/api/Version.java b/src/main/java/nl/sander/bejava/api/Version.java similarity index 91% rename from src/main/java/nl/sander/beejava/api/Version.java rename to src/main/java/nl/sander/bejava/api/Version.java index 292f416..7927819 100644 --- a/src/main/java/nl/sander/beejava/api/Version.java +++ b/src/main/java/nl/sander/bejava/api/Version.java @@ -1,6 +1,4 @@ -package nl.sander.beejava.api; - -import nl.sander.beejava.api.Opcode; +package nl.sander.bejava.api; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/classinfo/FieldInfo.java b/src/main/java/nl/sander/bejava/classinfo/FieldInfo.java similarity index 69% rename from src/main/java/nl/sander/beejava/classinfo/FieldInfo.java rename to src/main/java/nl/sander/bejava/classinfo/FieldInfo.java index 8e68e4e..c69c573 100644 --- a/src/main/java/nl/sander/beejava/classinfo/FieldInfo.java +++ b/src/main/java/nl/sander/bejava/classinfo/FieldInfo.java @@ -1,13 +1,17 @@ -package nl.sander.beejava.classinfo; +package nl.sander.bejava.classinfo; -import nl.sander.beejava.constantpool.entry.Utf8Entry; -import nl.sander.beejava.flags.AccessFlags; -import nl.sander.beejava.flags.FieldAccessFlag; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.flags.AccessFlags; +import nl.sander.bejava.flags.FieldAccessFlag; +import nl.sander.bejava.util.ByteBuf; import java.util.HashSet; import java.util.Set; +/** + * Conforms to field_info struct in JVM specification + * See 4.1 The ClassFile Structure + */ public class FieldInfo extends Info { private final Set accessFlags = new HashSet<>(); @@ -20,10 +24,6 @@ public class FieldInfo extends Info { return this; } - public Set getAccessFlags() { - return accessFlags; - } - public void addBytes(ByteBuf buf) { buf.addU16(AccessFlags.combine(accessFlags)); buf.addU16(nameEntry.getIndex()); diff --git a/src/main/java/nl/sander/beejava/classinfo/Info.java b/src/main/java/nl/sander/bejava/classinfo/Info.java similarity index 66% rename from src/main/java/nl/sander/beejava/classinfo/Info.java rename to src/main/java/nl/sander/bejava/classinfo/Info.java index e114ce2..ae75a31 100644 --- a/src/main/java/nl/sander/beejava/classinfo/Info.java +++ b/src/main/java/nl/sander/bejava/classinfo/Info.java @@ -1,7 +1,7 @@ -package nl.sander.beejava.classinfo; +package nl.sander.bejava.classinfo; -import nl.sander.beejava.classinfo.attributes.Attribute; -import nl.sander.beejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.classinfo.attributes.Attribute; +import nl.sander.bejava.constantpool.entry.Utf8Entry; import java.util.HashSet; import java.util.Set; @@ -17,14 +17,6 @@ public abstract class Info> { this.descriptorEntry = descriptorEntry; } - public Utf8Entry getNameEntry() { - return nameEntry; - } - - public Utf8Entry getDescriptorEntry() { - return descriptorEntry; - } - public Set getAttributes() { return attributes; } diff --git a/src/main/java/nl/sander/beejava/classinfo/MethodInfo.java b/src/main/java/nl/sander/bejava/classinfo/MethodInfo.java similarity index 69% rename from src/main/java/nl/sander/beejava/classinfo/MethodInfo.java rename to src/main/java/nl/sander/bejava/classinfo/MethodInfo.java index cb51f22..7fd4c55 100644 --- a/src/main/java/nl/sander/beejava/classinfo/MethodInfo.java +++ b/src/main/java/nl/sander/bejava/classinfo/MethodInfo.java @@ -1,13 +1,17 @@ -package nl.sander.beejava.classinfo; +package nl.sander.bejava.classinfo; -import nl.sander.beejava.constantpool.entry.Utf8Entry; -import nl.sander.beejava.flags.AccessFlags; -import nl.sander.beejava.flags.MethodAccessFlag; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.flags.AccessFlags; +import nl.sander.bejava.flags.MethodAccessFlag; +import nl.sander.bejava.util.ByteBuf; import java.util.HashSet; import java.util.Set; +/** + * Conforms to method_info struct in JVM specification + * See 4.1 The ClassFile Structure + */ public class MethodInfo extends Info { private final Set accessFlags = new HashSet<>(); diff --git a/src/main/java/nl/sander/beejava/classinfo/attributes/Attribute.java b/src/main/java/nl/sander/bejava/classinfo/attributes/Attribute.java similarity index 51% rename from src/main/java/nl/sander/beejava/classinfo/attributes/Attribute.java rename to src/main/java/nl/sander/bejava/classinfo/attributes/Attribute.java index 7be52b7..32dca58 100644 --- a/src/main/java/nl/sander/beejava/classinfo/attributes/Attribute.java +++ b/src/main/java/nl/sander/bejava/classinfo/attributes/Attribute.java @@ -1,8 +1,12 @@ -package nl.sander.beejava.classinfo.attributes; +package nl.sander.bejava.classinfo.attributes; -import nl.sander.beejava.constantpool.entry.Utf8Entry; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.util.ByteBuf; +/** + * attribute_info struct as in the JVM spec. + * See 4.1 The ClassFile Structure. + */ public abstract class Attribute { protected final Utf8Entry nameEntry; protected int length; diff --git a/src/main/java/nl/sander/beejava/classinfo/attributes/CodeAttribute.java b/src/main/java/nl/sander/bejava/classinfo/attributes/CodeAttribute.java similarity index 90% rename from src/main/java/nl/sander/beejava/classinfo/attributes/CodeAttribute.java rename to src/main/java/nl/sander/bejava/classinfo/attributes/CodeAttribute.java index 1ae13ed..91f4502 100644 --- a/src/main/java/nl/sander/beejava/classinfo/attributes/CodeAttribute.java +++ b/src/main/java/nl/sander/bejava/classinfo/attributes/CodeAttribute.java @@ -1,7 +1,7 @@ -package nl.sander.beejava.classinfo.attributes; +package nl.sander.bejava.classinfo.attributes; -import nl.sander.beejava.constantpool.entry.Utf8Entry; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.constantpool.entry.Utf8Entry; +import nl.sander.bejava.util.ByteBuf; import java.util.HashSet; import java.util.Set; @@ -19,7 +19,7 @@ public class CodeAttribute extends Attribute { private static final int EXCEPTION_HANDLER_SIZE = 8; // nr of bytes per exception_hander private final Set attributes = new HashSet<>(); - private final Set exceptionHandlers = new HashSet<>(); + private final Set exceptionHandlers = new HashSet<>(); //TODO exception handlers are yet to be implemented private int maxStack; // u2 private int maxLocals; // u2 private byte[] code; diff --git a/src/main/java/nl/sander/beejava/classinfo/attributes/ExceptionHandler.java b/src/main/java/nl/sander/bejava/classinfo/attributes/ExceptionHandler.java similarity index 70% rename from src/main/java/nl/sander/beejava/classinfo/attributes/ExceptionHandler.java rename to src/main/java/nl/sander/bejava/classinfo/attributes/ExceptionHandler.java index 494ec0d..269fd89 100644 --- a/src/main/java/nl/sander/beejava/classinfo/attributes/ExceptionHandler.java +++ b/src/main/java/nl/sander/bejava/classinfo/attributes/ExceptionHandler.java @@ -1,7 +1,8 @@ -package nl.sander.beejava.classinfo.attributes; +package nl.sander.bejava.classinfo.attributes; /** * see §4.7.3 The code attribute + * TODO implement exception handlers */ public class ExceptionHandler { private int startPc; //u2 diff --git a/src/main/java/nl/sander/beejava/constantpool/ConstantPool.java b/src/main/java/nl/sander/bejava/constantpool/ConstantPool.java similarity index 82% rename from src/main/java/nl/sander/beejava/constantpool/ConstantPool.java rename to src/main/java/nl/sander/bejava/constantpool/ConstantPool.java index 39aa3bb..9c6af6f 100644 --- a/src/main/java/nl/sander/beejava/constantpool/ConstantPool.java +++ b/src/main/java/nl/sander/bejava/constantpool/ConstantPool.java @@ -1,7 +1,7 @@ -package nl.sander.beejava.constantpool; +package nl.sander.bejava.constantpool; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; -import nl.sander.beejava.util.ByteBuf; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; +import nl.sander.bejava.util.ByteBuf; import java.util.ArrayList; diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/ClassEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/ClassEntry.java similarity index 91% rename from src/main/java/nl/sander/beejava/constantpool/entry/ClassEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/ClassEntry.java index dcf8264..40311da 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/ClassEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/ClassEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -29,7 +29,7 @@ public class ClassEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ClassEntry that = (ClassEntry) o; + var that = (ClassEntry) o; return name.equals(that.name); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntry.java similarity index 98% rename from src/main/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntry.java index c399b72..6565d22 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Arrays; import java.util.LinkedHashSet; diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/DoubleEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/DoubleEntry.java similarity index 91% rename from src/main/java/nl/sander/beejava/constantpool/entry/DoubleEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/DoubleEntry.java index cf10f67..a0ffd37 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/DoubleEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/DoubleEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -22,7 +22,7 @@ public class DoubleEntry extends LeafEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - DoubleEntry that = (DoubleEntry) o; + var that = (DoubleEntry) o; return Double.compare(that.doubleVal, doubleVal) == 0; } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/DynamicEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/DynamicEntry.java similarity index 94% rename from src/main/java/nl/sander/beejava/constantpool/entry/DynamicEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/DynamicEntry.java index 4c37a95..f97b171 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/DynamicEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/DynamicEntry.java @@ -1,6 +1,4 @@ -package nl.sander.beejava.constantpool.entry; - -import java.util.Objects; +package nl.sander.bejava.constantpool.entry; public class DynamicEntry extends ConstantPoolEntry { private static final byte TAG = 17; diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/FieldRefEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/FieldRefEntry.java similarity index 93% rename from src/main/java/nl/sander/beejava/constantpool/entry/FieldRefEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/FieldRefEntry.java index b668892..1c530b6 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/FieldRefEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/FieldRefEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -38,7 +38,7 @@ public class FieldRefEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - FieldRefEntry that = (FieldRefEntry) o; + var that = (FieldRefEntry) o; return classEntry.equals(that.classEntry) && nameAndTypeEntry.equals(that.nameAndTypeEntry); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/FloatEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/FloatEntry.java similarity index 91% rename from src/main/java/nl/sander/beejava/constantpool/entry/FloatEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/FloatEntry.java index a88e16c..f136eaf 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/FloatEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/FloatEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -24,7 +24,7 @@ public class FloatEntry extends LeafEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - FloatEntry that = (FloatEntry) o; + var that = (FloatEntry) o; return Float.compare(that.floatVal, floatVal) == 0; } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/IntegerEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/IntegerEntry.java similarity index 90% rename from src/main/java/nl/sander/beejava/constantpool/entry/IntegerEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/IntegerEntry.java index af195ee..fa3ce9f 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/IntegerEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/IntegerEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -29,7 +29,7 @@ public class IntegerEntry extends LeafEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - IntegerEntry that = (IntegerEntry) o; + var that = (IntegerEntry) o; return intVal == that.intVal; } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/InterfaceMethodRefEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/InterfaceMethodRefEntry.java similarity index 92% rename from src/main/java/nl/sander/beejava/constantpool/entry/InterfaceMethodRefEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/InterfaceMethodRefEntry.java index 98c4519..398accd 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/InterfaceMethodRefEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/InterfaceMethodRefEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -32,7 +32,7 @@ public class InterfaceMethodRefEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - InterfaceMethodRefEntry that = (InterfaceMethodRefEntry) o; + var that = (InterfaceMethodRefEntry) o; return classEntry.equals(that.classEntry) && nameAndTypeEntry.equals(that.nameAndTypeEntry); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/InvokeDynamicEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/InvokeDynamicEntry.java similarity index 94% rename from src/main/java/nl/sander/beejava/constantpool/entry/InvokeDynamicEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/InvokeDynamicEntry.java index 9d380b7..6ceba8c 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/InvokeDynamicEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/InvokeDynamicEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; public class InvokeDynamicEntry extends ConstantPoolEntry { private static final byte TAG = 18; diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/LeafEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/LeafEntry.java similarity index 85% rename from src/main/java/nl/sander/beejava/constantpool/entry/LeafEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/LeafEntry.java index c783be6..77627f5 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/LeafEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/LeafEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Collections; import java.util.Set; diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/LongEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/LongEntry.java similarity index 90% rename from src/main/java/nl/sander/beejava/constantpool/entry/LongEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/LongEntry.java index af9d867..bcdd65c 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/LongEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/LongEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -27,7 +27,7 @@ public class LongEntry extends LeafEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - LongEntry longEntry = (LongEntry) o; + var longEntry = (LongEntry) o; return longVal == longEntry.longVal; } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/MethodHandleEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/MethodHandleEntry.java similarity index 94% rename from src/main/java/nl/sander/beejava/constantpool/entry/MethodHandleEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/MethodHandleEntry.java index 0fa6ab8..70a2880 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/MethodHandleEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/MethodHandleEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; //TODO implement later public class MethodHandleEntry extends ConstantPoolEntry { diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/MethodRefEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/MethodRefEntry.java similarity index 93% rename from src/main/java/nl/sander/beejava/constantpool/entry/MethodRefEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/MethodRefEntry.java index d2263b5..37782a2 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/MethodRefEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/MethodRefEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -35,7 +35,7 @@ public class MethodRefEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MethodRefEntry that = (MethodRefEntry) o; + var that = (MethodRefEntry) o; return classRef.equals(that.classRef) && nameAndType.equals(that.nameAndType); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/MethodTypeEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/MethodTypeEntry.java similarity index 90% rename from src/main/java/nl/sander/beejava/constantpool/entry/MethodTypeEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/MethodTypeEntry.java index 0ab9ba0..5f46ed8 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/MethodTypeEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/MethodTypeEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -24,7 +24,7 @@ public class MethodTypeEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MethodTypeEntry that = (MethodTypeEntry) o; + var that = (MethodTypeEntry) o; return methodDescriptor.equals(that.methodDescriptor); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/ModuleEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/ModuleEntry.java similarity index 91% rename from src/main/java/nl/sander/beejava/constantpool/entry/ModuleEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/ModuleEntry.java index 7b4f149..62ef7a3 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/ModuleEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/ModuleEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -25,7 +25,7 @@ public class ModuleEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ModuleEntry that = (ModuleEntry) o; + var that = (ModuleEntry) o; return nameEntry.equals(that.nameEntry); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/NameAndTypeEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/NameAndTypeEntry.java similarity index 93% rename from src/main/java/nl/sander/beejava/constantpool/entry/NameAndTypeEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/NameAndTypeEntry.java index 8d3d544..3c72091 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/NameAndTypeEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/NameAndTypeEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -37,7 +37,7 @@ public final class NameAndTypeEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - NameAndTypeEntry that = (NameAndTypeEntry) o; + var that = (NameAndTypeEntry) o; return name.equals(that.name) && descriptor.equals(that.descriptor); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/PackageEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/PackageEntry.java similarity index 90% rename from src/main/java/nl/sander/beejava/constantpool/entry/PackageEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/PackageEntry.java index 533580d..da78621 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/PackageEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/PackageEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -23,7 +23,7 @@ public final class PackageEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - PackageEntry that = (PackageEntry) o; + var that = (PackageEntry) o; return nameEntry.equals(that.nameEntry); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/StringEntry.java b/src/main/java/nl/sander/bejava/constantpool/entry/StringEntry.java similarity index 91% rename from src/main/java/nl/sander/beejava/constantpool/entry/StringEntry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/StringEntry.java index 0d9af7d..160a483 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/StringEntry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/StringEntry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.util.Objects; @@ -23,7 +23,7 @@ public final class StringEntry extends ConstantPoolEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - StringEntry that = (StringEntry) o; + var that = (StringEntry) o; return utf8Entry.equals(that.utf8Entry); } diff --git a/src/main/java/nl/sander/beejava/constantpool/entry/Utf8Entry.java b/src/main/java/nl/sander/bejava/constantpool/entry/Utf8Entry.java similarity index 81% rename from src/main/java/nl/sander/beejava/constantpool/entry/Utf8Entry.java rename to src/main/java/nl/sander/bejava/constantpool/entry/Utf8Entry.java index 403b60e..d3c3fcf 100644 --- a/src/main/java/nl/sander/beejava/constantpool/entry/Utf8Entry.java +++ b/src/main/java/nl/sander/bejava/constantpool/entry/Utf8Entry.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import java.nio.charset.StandardCharsets; import java.util.Objects; @@ -16,8 +16,8 @@ public final class Utf8Entry extends LeafEntry { } public byte[] getBytes() { - byte[] utf8Bytes = value.getBytes(StandardCharsets.UTF_8); - byte[] bytes = new byte[utf8Bytes.length + 3]; + var utf8Bytes = value.getBytes(StandardCharsets.UTF_8); + var bytes = new byte[utf8Bytes.length + 3]; bytes[0] = TAG; bytes[1] = upperByte(utf8Bytes.length); bytes[2] = lowerByte(utf8Bytes.length); @@ -29,7 +29,7 @@ public final class Utf8Entry extends LeafEntry { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Utf8Entry utf8Entry = (Utf8Entry) o; + var utf8Entry = (Utf8Entry) o; return value.equals(utf8Entry.value); } diff --git a/src/main/java/nl/sander/beejava/flags/AccessFlags.java b/src/main/java/nl/sander/bejava/flags/AccessFlags.java similarity index 89% rename from src/main/java/nl/sander/beejava/flags/AccessFlags.java rename to src/main/java/nl/sander/bejava/flags/AccessFlags.java index fdbc935..d6dab84 100644 --- a/src/main/java/nl/sander/beejava/flags/AccessFlags.java +++ b/src/main/java/nl/sander/bejava/flags/AccessFlags.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.flags; +package nl.sander.bejava.flags; import java.util.Collection; diff --git a/src/main/java/nl/sander/beejava/flags/ClassAccessFlags.java b/src/main/java/nl/sander/bejava/flags/ClassAccessFlags.java similarity index 96% rename from src/main/java/nl/sander/beejava/flags/ClassAccessFlags.java rename to src/main/java/nl/sander/bejava/flags/ClassAccessFlags.java index 656f459..c25cc26 100644 --- a/src/main/java/nl/sander/beejava/flags/ClassAccessFlags.java +++ b/src/main/java/nl/sander/bejava/flags/ClassAccessFlags.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.flags; +package nl.sander.bejava.flags; public enum ClassAccessFlags implements AccessFlags { PUBLIC(0x0001), // Declared public; may be accessed from outside its package. diff --git a/src/main/java/nl/sander/beejava/flags/FieldAccessFlag.java b/src/main/java/nl/sander/bejava/flags/FieldAccessFlag.java similarity index 97% rename from src/main/java/nl/sander/beejava/flags/FieldAccessFlag.java rename to src/main/java/nl/sander/bejava/flags/FieldAccessFlag.java index 2ab3c1a..d3cacb1 100644 --- a/src/main/java/nl/sander/beejava/flags/FieldAccessFlag.java +++ b/src/main/java/nl/sander/bejava/flags/FieldAccessFlag.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.flags; +package nl.sander.bejava.flags; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/flags/MethodAccessFlag.java b/src/main/java/nl/sander/bejava/flags/MethodAccessFlag.java similarity index 97% rename from src/main/java/nl/sander/beejava/flags/MethodAccessFlag.java rename to src/main/java/nl/sander/bejava/flags/MethodAccessFlag.java index 77b77c5..ffac8b7 100644 --- a/src/main/java/nl/sander/beejava/flags/MethodAccessFlag.java +++ b/src/main/java/nl/sander/bejava/flags/MethodAccessFlag.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.flags; +package nl.sander.bejava.flags; import java.util.Optional; diff --git a/src/main/java/nl/sander/beejava/operands/ConstantOperand.java b/src/main/java/nl/sander/bejava/operands/ConstantOperand.java similarity index 77% rename from src/main/java/nl/sander/beejava/operands/ConstantOperand.java rename to src/main/java/nl/sander/bejava/operands/ConstantOperand.java index 599a63b..a844915 100644 --- a/src/main/java/nl/sander/beejava/operands/ConstantOperand.java +++ b/src/main/java/nl/sander/bejava/operands/ConstantOperand.java @@ -1,7 +1,10 @@ -package nl.sander.beejava.operands; +package nl.sander.bejava.operands; -import nl.sander.beejava.Primitive; +import nl.sander.bejava.Primitive; +/** + * The operand is a constant + */ public class ConstantOperand extends Operand { private final Primitive type; private final String value; diff --git a/src/main/java/nl/sander/beejava/operands/FieldOperand.java b/src/main/java/nl/sander/bejava/operands/FieldOperand.java similarity index 74% rename from src/main/java/nl/sander/beejava/operands/FieldOperand.java rename to src/main/java/nl/sander/bejava/operands/FieldOperand.java index ca183e0..cb70600 100644 --- a/src/main/java/nl/sander/beejava/operands/FieldOperand.java +++ b/src/main/java/nl/sander/bejava/operands/FieldOperand.java @@ -1,5 +1,8 @@ -package nl.sander.beejava.operands; +package nl.sander.bejava.operands; +/** + * The operand is a field member of the class + */ public class FieldOperand extends Operand{ public final String className; public final String fieldName; diff --git a/src/main/java/nl/sander/beejava/operands/LocalVariableOperand.java b/src/main/java/nl/sander/bejava/operands/LocalVariableOperand.java similarity index 67% rename from src/main/java/nl/sander/beejava/operands/LocalVariableOperand.java rename to src/main/java/nl/sander/bejava/operands/LocalVariableOperand.java index a82bc0d..3791eaf 100644 --- a/src/main/java/nl/sander/beejava/operands/LocalVariableOperand.java +++ b/src/main/java/nl/sander/bejava/operands/LocalVariableOperand.java @@ -1,5 +1,8 @@ -package nl.sander.beejava.operands; +package nl.sander.bejava.operands; +/** + * The operand is a local variable + */ public class LocalVariableOperand extends Operand{ public final String name; diff --git a/src/main/java/nl/sander/beejava/operands/MethodOperand.java b/src/main/java/nl/sander/bejava/operands/MethodOperand.java similarity index 89% rename from src/main/java/nl/sander/beejava/operands/MethodOperand.java rename to src/main/java/nl/sander/bejava/operands/MethodOperand.java index 48151df..5213035 100644 --- a/src/main/java/nl/sander/beejava/operands/MethodOperand.java +++ b/src/main/java/nl/sander/bejava/operands/MethodOperand.java @@ -1,5 +1,8 @@ -package nl.sander.beejava.operands; +package nl.sander.bejava.operands; +/** + * The operand is a method call. + */ public class MethodOperand extends Operand{ public final String className; public final String methodName; diff --git a/src/main/java/nl/sander/bejava/operands/Operand.java b/src/main/java/nl/sander/bejava/operands/Operand.java new file mode 100644 index 0000000..479cbb3 --- /dev/null +++ b/src/main/java/nl/sander/bejava/operands/Operand.java @@ -0,0 +1,4 @@ +package nl.sander.bejava.operands; + +public abstract class Operand { +} diff --git a/src/main/java/nl/sander/bejava/operands/VoidOperand.java b/src/main/java/nl/sander/bejava/operands/VoidOperand.java new file mode 100644 index 0000000..24250d2 --- /dev/null +++ b/src/main/java/nl/sander/bejava/operands/VoidOperand.java @@ -0,0 +1,13 @@ +package nl.sander.bejava.operands; + +/** + * The operand is void. An operand is compulsory in a {@link nl.sander.bejava.JavaInstruction}. + * Used when the opcode is RETURN and the return type is void. + */ +public class VoidOperand extends Operand{ + public final static VoidOperand INSTANCE = new VoidOperand(); + + private VoidOperand() { + // + } +} diff --git a/src/main/java/nl/sander/beejava/util/ByteBuf.java b/src/main/java/nl/sander/bejava/util/ByteBuf.java similarity index 58% rename from src/main/java/nl/sander/beejava/util/ByteBuf.java rename to src/main/java/nl/sander/bejava/util/ByteBuf.java index 41136cb..37d9f04 100644 --- a/src/main/java/nl/sander/beejava/util/ByteBuf.java +++ b/src/main/java/nl/sander/bejava/util/ByteBuf.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.util; +package nl.sander.bejava.util; import java.nio.ByteBuffer; import java.nio.charset.*; @@ -29,7 +29,7 @@ public class ByteBuf { if (data.remaining() < ints.length) { enlarge(ints.length); } - byte[] bytes = new byte[ints.length]; + var bytes = new byte[ints.length]; for (int i = 0; i < ints.length; i++) { bytes[i] = (byte) (ints[i] & 0xFF); } @@ -45,9 +45,9 @@ public class ByteBuf { } private void enlarge(final int size) { - final int length1 = 2 * data.limit(); - final int length2 = data.limit() + size; - ByteBuffer newData = ByteBuffer.allocate(Math.max(length1, length2)); + final var length1 = 2 * data.limit(); + final var length2 = data.limit() + size; + var newData = ByteBuffer.allocate(Math.max(length1, length2)); data.flip(); newData.put(data); data = newData; @@ -61,25 +61,25 @@ public class ByteBuf { return arr; } - public String toString() { - return toString(StandardCharsets.UTF_8); - } - - public String toString(Charset charset) { - data.flip(); - - CharsetDecoder decoder = charset.newDecoder(); // decode is not threadsafe, might put it in threadlocal - // but I don't think this (newDecoder()+config) is expensive - - decoder.onMalformedInput(CodingErrorAction.REPLACE) - .onUnmappableCharacter(CodingErrorAction.REPLACE); - - try { - return decoder.decode(data).toString(); - } catch (CharacterCodingException e) { - throw new RuntimeException(e); - } - } - +// public String toString() { +// return toString(StandardCharsets.UTF_8); +// } +// +// public String toString(Charset charset) { +// data.flip(); +// +// CharsetDecoder decoder = charset.newDecoder(); // decode is not threadsafe, might put it in threadlocal +// // but I don't think this (newDecoder()+config) is expensive +// +// decoder.onMalformedInput(CodingErrorAction.REPLACE) +// .onUnmappableCharacter(CodingErrorAction.REPLACE); +// +// try { +// return decoder.decode(data).toString(); +// } catch (CharacterCodingException e) { +// throw new RuntimeException(e); +// } +// } +// } diff --git a/src/test/java/nl/sander/beejava/BytecodeGeneratorTests.java b/src/test/java/nl/sander/beejava/BytecodeGeneratorTests.java deleted file mode 100644 index 1745856..0000000 --- a/src/test/java/nl/sander/beejava/BytecodeGeneratorTests.java +++ /dev/null @@ -1,29 +0,0 @@ -package nl.sander.beejava; - -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - -public class BytecodeGeneratorTests { - @Test - public void testEmpty() throws IOException, ClassNotFoundException { - byte[] bytecode = BytecodeGenerator.generate(Compiler.compile(TestData.createEmptyClass())); - File dir = new File("target/nl/sander/beejava/test"); - dir.mkdirs(); - try (FileOutputStream outputStream = new FileOutputStream(new File(dir, "EmptyBean.class"))) { - outputStream.write(bytecode); - } - } - - @Test - public void testInterface() throws ClassNotFoundException { - BytecodeGenerator.generate(Compiler.compile(TestData.emptyClassWithInterface())); - } - - @Test - public void testFields() throws ClassNotFoundException { - BytecodeGenerator.generate(Compiler.compile(TestData.createClassWithField(Integer.class))); - } -} diff --git a/src/test/java/nl/sander/beejava/ConstantPoolUniquenessTests.java b/src/test/java/nl/sander/beejava/ConstantPoolUniquenessTests.java deleted file mode 100644 index f995170..0000000 --- a/src/test/java/nl/sander/beejava/ConstantPoolUniquenessTests.java +++ /dev/null @@ -1,77 +0,0 @@ -package nl.sander.beejava; - -import nl.sander.beejava.api.BeeSource; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.constantpool.entry.ClassEntry; -import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.io.FileOutputStream; -import java.util.List; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ConstantPoolUniquenessTests { - @Test - public void test() throws Exception { - // Arrange - BeeSource someClass = TestData.createEmptyClass(); - - // Act - CompiledClass compiledClass = Compiler.compile(someClass); - ConstantPool constantPool = new ConstantPoolCreator().createConstantPool(compiledClass.getConstantTree()); - - // Assert - List refsToSystem = constantPool.stream() - .filter(cpe -> cpe instanceof ClassEntry) - .map(cpe -> (ClassEntry) cpe) - .filter(ce -> ce.getName().equals("java/lang/System")) - .collect(Collectors.toList()); - - assertEquals(0, refsToSystem.size()); - - - byte[] bytecode = BytecodeGenerator.generate(compiledClass); - - int x = 1; - for (ConstantPoolEntry e : constantPool) { - System.out.println((x++) + ":" + e); - } - - x = 1; - for (ConstantPoolEntry e : constantPool) { - System.out.print((x++) + ":"); - printBytes(e.getBytes()); - } - - - File dir = new File("target/nl/sander/beejava/test"); - dir.mkdirs(); - try (FileOutputStream outputStream = new FileOutputStream(new File(dir, "EmptyBean.class"))) { - outputStream.write(bytecode); - } - printBytes2(bytecode); - } - - //TODO remove - private void printBytes(byte[] bytes) { - for (byte b : bytes) { - System.out.print(String.format("%2s", Integer.toHexString(b & 0xFF)).replace(' ', '0') + " "); - } - System.out.println(); - } - - private void printBytes2(byte[] bytes) { - int count = 0; - for (byte b : bytes) { - System.out.print(String.format("%2s", Integer.toHexString(b & 0xFF)).replace(' ', '0') + (count % 2 == 0 ? "" : " ")); - count += 1; - if (count > 15) { - count = 0; - System.out.println(); - } - } - } -} diff --git a/src/test/java/nl/sander/beejava/SourceCompilerTest.java b/src/test/java/nl/sander/beejava/SourceCompilerTest.java deleted file mode 100644 index 4912e42..0000000 --- a/src/test/java/nl/sander/beejava/SourceCompilerTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package nl.sander.beejava; - -import nl.sander.beejava.api.BeeField; -import nl.sander.beejava.api.BeeMethod; -import nl.sander.beejava.api.BeeParameter; -import nl.sander.beejava.api.BeeSource; -import nl.sander.beejava.flags.AccessFlags; -import nl.sander.beejava.flags.ClassAccessFlags; -import nl.sander.beejava.flags.FieldAccessFlag; -import nl.sander.beejava.flags.MethodAccessFlag; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Set; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class SourceCompilerTest { - - @Test - public void test() { - BeeSource beeSource = new SourceCompiler(TestData2.simpleBean).doCompile(); - assertEquals("com.acme.SimpleBean", beeSource.getName()); - assertEquals(ClassAccessFlags.SUPER.getBytecode() | ClassAccessFlags.PUBLIC.getBytecode(), AccessFlags.combine(beeSource.getAccessFlags())); - assertTrue(beeSource.getFields().contains(new BeeField(beeSource.getName(), Set.of(FieldAccessFlag.PRIVATE), int.class, "value"))); - assertEquals(1, beeSource.getConstructors().size()); - Set methods = beeSource.getMethods(); - assertEquals(2, methods.size()); - assertTrue(methods.contains(new BeeMethod(beeSource, "getValue", Set.of(MethodAccessFlag.PUBLIC), Set.of(), int.class, List.of()))); - assertTrue(methods.contains(new BeeMethod(beeSource, "setValue", Set.of(MethodAccessFlag.PUBLIC), Set.of(new BeeParameter(int.class, "newValue")), Void.TYPE, List.of()))); - - OpcodeTranslator.translate(beeSource); - - Compiler.compile(beeSource); - - } -} diff --git a/src/test/java/nl/sander/beejava/TestData.java b/src/test/java/nl/sander/beejava/TestData.java deleted file mode 100644 index ff2c7b4..0000000 --- a/src/test/java/nl/sander/beejava/TestData.java +++ /dev/null @@ -1,38 +0,0 @@ -package nl.sander.beejava; - -import nl.sander.beejava.api.BeeSource; - -public class TestData { - public static BeeSource createEmptyClass() { - return SourceCompiler.compile(""" - class public nl.sander.beejava.test.EmptyBean - constructor public() - INVOKE this.super() - RETURN - """); - } - - public static BeeSource emptyClassWithInterface() { - return SourceCompiler.compile(""" - class public nl.sander.beejava.test.EmptyBean implements java.io.Serializable - constructor public() - INVOKE this.super()V - RETURN - """); - } - - public static BeeSource createClassWithField(Class fieldType) { - String template = """ - class com.acme.SimpleBean(V15) - field private %s field - constructor public(%s arg) - INVOKE this.super()V - LOAD arg - PUT this.field - RETURN - """; - - return SourceCompiler.compile(String.format(template, fieldType.getName(), fieldType.getName())); - } - -} diff --git a/src/test/java/nl/sander/beejava/TestData2.java b/src/test/java/nl/sander/beejava/TestData2.java deleted file mode 100644 index 82c5dd7..0000000 --- a/src/test/java/nl/sander/beejava/TestData2.java +++ /dev/null @@ -1,106 +0,0 @@ -package nl.sander.beejava; - -public class TestData2 { - - public final static String simpleBean= """ - class public com.acme.SimpleBean(V15) - field private int value - constructor public() - INVOKE this.super() - RETURN - method public getValue() -> int - RETURN this.value - method public setValue(int newValue) - LOAD newValue - PUT this.value - RETURN - """; - - String constructor_original = """ - 0: aload_0 - 1: invokespecial #1 // Method java/lang/Object."":()V - - 4: aload_0 - 5: new #7 // class nl/sander/beejava/ConstantPoolCreator - 8: dup - 9: invokespecial #9 // Method nl/sander/beejava/ConstantPoolCreator."":()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."":(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 this.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 - """; - -} diff --git a/src/test/java/nl/sander/beejava/testclasses/EmptyBean.java b/src/test/java/nl/sander/beejava/testclasses/EmptyBean.java deleted file mode 100644 index 42ed855..0000000 --- a/src/test/java/nl/sander/beejava/testclasses/EmptyBean.java +++ /dev/null @@ -1,5 +0,0 @@ -package nl.sander.beejava.testclasses; - -public class EmptyBean { - -} diff --git a/src/test/java/nl/sander/bejava/BytecodeGeneratorTests.java b/src/test/java/nl/sander/bejava/BytecodeGeneratorTests.java new file mode 100644 index 0000000..ffa6e34 --- /dev/null +++ b/src/test/java/nl/sander/bejava/BytecodeGeneratorTests.java @@ -0,0 +1,80 @@ +package nl.sander.bejava; + +import nl.sander.bejava.testutils.ByteWriter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * meant as regression tests + */ +public class BytecodeGeneratorTests { + @Test + public void testSuperConstructorCall() { + byte[] bytecode = BytecodeGenerator.generate(Compiler.compile(SourceCompiler.compile(""" + class public nl.sander.beejava.test.EmptyBean + constructor public() + INVOKE this.super() + RETURN + """))); + assertEquals(""" + cafe babe 0000 0034 0008 0100 063c 696e\s + 6974 3e01 0003 2829 5607 0004 0100 206e\s + 6c2f 7361 6e64 6572 2f62 6565 6a61 7661\s + 2f74 6573 742f 456d 7074 7942 6561 6e07\s + 0006 0100 106a 6176 612f 6c61 6e67 2f4f\s + 626a 6563 7401 0004 436f 6465 0021 0003\s + 0005 0000 0000 0001 0001 0001 0002 0001\s + 0007 0000 000c 0000 0001 0000 0000 0000\s + 0000 0000\s""", + ByteWriter.printBytes(bytecode)); + + } + + @Test + public void testInterfaceImplementor() { + byte[] bytecode = BytecodeGenerator.generate(Compiler.compile(SourceCompiler.compile(""" + class public nl.sander.beejava.test.EmptyBean implements java.io.Serializable + constructor public() + INVOKE this.super()V + RETURN + """))); + assertEquals(""" + cafe babe 0000 0034 0008 0100 063c 696e\s + 6974 3e01 0003 2829 5607 0004 0100 0670\s + 7562 6c69 6307 0006 0100 106a 6176 612f\s + 6c61 6e67 2f4f 626a 6563 7401 0004 436f\s + 6465 0020 0003 0005 0000 0000 0001 0001\s + 0001 0002 0001 0007 0000 000c 0000 0001\s + 0000 0000 0000 0000 0000\s""", + ByteWriter.printBytes(bytecode)); + } + + @Test + public void testPutArgumentInField() { + byte[] bytecode = BytecodeGenerator.generate(Compiler.compile(SourceCompiler.compile(""" + class com.acme.SimpleBean(V15) + field private int field + constructor public(int arg) + INVOKE this.super()V + LOAD arg + PUT this.field + RETURN + """))); + assertEquals(""" + cafe babe 0000 003b 000e 0900 0900 0307\s + 000a 0c00 0500 0601 0013 636f 6d2f 6163\s + 6d65 2f53 696d 706c 6542 6561 6e01 0005\s + 6669 656c 6401 0001 4901 0006 3c69 6e69\s + 743e 0100 0428 4929 5607 000a 0100 1363\s + 6f6d 2f61 636d 652f 5369 6d70 6c65 4265\s + 616e 0700 0c01 0010 6a61 7661 2f6c 616e\s + 672f 4f62 6a65 6374 0100 0443 6f64 6500\s + 2000 0900 0b00 0000 0100 0200 0500 0000\s + 0000 0100 0100 0700 0800 0100 0d00 0000\s + 0c00 0000 0200 0000 0000 0000 0000 00""", + ByteWriter.printBytes(bytecode)); + } + + +} diff --git a/src/test/java/nl/sander/bejava/ConstantPoolUniquenessTests.java b/src/test/java/nl/sander/bejava/ConstantPoolUniquenessTests.java new file mode 100644 index 0000000..e5bc4ea --- /dev/null +++ b/src/test/java/nl/sander/bejava/ConstantPoolUniquenessTests.java @@ -0,0 +1,37 @@ +package nl.sander.bejava; + +import nl.sander.bejava.api.BeSource; +import nl.sander.bejava.constantpool.ConstantPool; +import nl.sander.bejava.constantpool.entry.ClassEntry; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ConstantPoolUniquenessTests { + @Test + public void test() throws Exception { + // Arrange + BeSource someClass = SourceCompiler.compile(""" + class public nl.sander.beejava.test.EmptyBean + constructor public() + INVOKE this.super() + RETURN + """); + + // Act + CompiledClass compiledClass = Compiler.compile(someClass); + ConstantPool constantPool = new ConstantPoolCreator().createConstantPool(compiledClass.getConstantTree()); + + // Assert + List refsToSystem = constantPool.stream() + .filter(cpe -> cpe instanceof ClassEntry) + .map(cpe -> (ClassEntry) cpe) + .filter(ce -> ce.getName().equals("java/lang/System")) + .collect(Collectors.toList()); + + assertEquals(0, refsToSystem.size()); + } +} diff --git a/src/test/java/nl/sander/bejava/SourceCompilerTest.java b/src/test/java/nl/sander/bejava/SourceCompilerTest.java new file mode 100644 index 0000000..6d3bad7 --- /dev/null +++ b/src/test/java/nl/sander/bejava/SourceCompilerTest.java @@ -0,0 +1,50 @@ +package nl.sander.bejava; + +import nl.sander.bejava.api.BeField; +import nl.sander.bejava.api.BeMethod; +import nl.sander.bejava.api.BeParameter; +import nl.sander.bejava.api.BeSource; +import nl.sander.bejava.flags.AccessFlags; +import nl.sander.bejava.flags.ClassAccessFlags; +import nl.sander.bejava.flags.FieldAccessFlag; +import nl.sander.bejava.flags.MethodAccessFlag; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Compilation from sourcefile to BeeSource is the first pass in the total compilation. + * A BeeSource object can also be created programmatically. + */ +public class SourceCompilerTest { + + @Test + public void testCompileSourceFileToSourceObject() { + BeSource beSource = new SourceCompiler(""" + class public com.acme.SimpleBean(V15) + field private int value + constructor public() + INVOKE this.super() + RETURN + method public getValue() -> int + RETURN this.value + method public setValue(int newValue) + LOAD newValue + PUT this.value + RETURN + """).doCompile(); + + assertEquals("com.acme.SimpleBean", beSource.getName()); + assertEquals(ClassAccessFlags.SUPER.getBytecode() | ClassAccessFlags.PUBLIC.getBytecode(), AccessFlags.combine(beSource.getAccessFlags())); + assertTrue(beSource.getFields().contains(new BeField(beSource.getName(), Set.of(FieldAccessFlag.PRIVATE), int.class, "value"))); + assertEquals(1, beSource.getConstructors().size()); + Set methods = beSource.getMethods(); + assertEquals(2, methods.size()); + assertTrue(methods.contains(new BeMethod(beSource, "getValue", Set.of(MethodAccessFlag.PUBLIC), Set.of(), int.class, List.of()))); + assertTrue(methods.contains(new BeMethod(beSource, "setValue", Set.of(MethodAccessFlag.PUBLIC), Set.of(new BeParameter(int.class, "newValue")), Void.TYPE, List.of()))); + } +} diff --git a/src/test/java/nl/sander/beejava/TypeMapperTest.java b/src/test/java/nl/sander/bejava/TypeMapperTest.java similarity index 58% rename from src/test/java/nl/sander/beejava/TypeMapperTest.java rename to src/test/java/nl/sander/bejava/TypeMapperTest.java index c877047..6dfc5c5 100644 --- a/src/test/java/nl/sander/beejava/TypeMapperTest.java +++ b/src/test/java/nl/sander/bejava/TypeMapperTest.java @@ -1,8 +1,8 @@ -package nl.sander.beejava; +package nl.sander.bejava; -import nl.sander.beejava.api.BeeSource; -import nl.sander.beejava.constantpool.ConstantPool; -import nl.sander.beejava.constantpool.entry.NameAndTypeEntry; +import nl.sander.bejava.api.BeSource; +import nl.sander.bejava.constantpool.ConstantPool; +import nl.sander.bejava.constantpool.entry.NameAndTypeEntry; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -13,10 +13,10 @@ public class TypeMapperTest { @Test public void test_int() { // Arrange - BeeSource beeSource = TestData.createClassWithField(int.class); + BeSource beSource = createClassWithField(int.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -26,10 +26,10 @@ public class TypeMapperTest { @Test public void test_double() { // Arrange - BeeSource beeSource = TestData.createClassWithField(double.class); + BeSource beSource = createClassWithField(double.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -39,10 +39,10 @@ public class TypeMapperTest { @Test public void test_float() { // Arrange - BeeSource beeSource = TestData.createClassWithField(float.class); + BeSource beSource = createClassWithField(float.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -52,10 +52,10 @@ public class TypeMapperTest { @Test public void test_byte() { // Arrange - BeeSource beeSource = TestData.createClassWithField(byte.class); + BeSource beSource = createClassWithField(byte.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -65,10 +65,10 @@ public class TypeMapperTest { @Test public void test_short() { // Arrange - BeeSource beeSource = TestData.createClassWithField(short.class); + BeSource beSource = createClassWithField(short.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -78,10 +78,10 @@ public class TypeMapperTest { @Test public void test_long() { // Arrange - BeeSource beeSource = TestData.createClassWithField(long.class); + BeSource beSource = createClassWithField(long.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -91,10 +91,10 @@ public class TypeMapperTest { @Test public void test_char() { // Arrange - BeeSource beeSource = TestData.createClassWithField(char.class); + BeSource beSource = createClassWithField(char.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -104,10 +104,10 @@ public class TypeMapperTest { @Test public void test_boolean() { // Arrange - BeeSource beeSource = TestData.createClassWithField(boolean.class); + BeSource beSource = createClassWithField(boolean.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -117,10 +117,10 @@ public class TypeMapperTest { @Test public void test_Object() { // Arrange - BeeSource beeSource = TestData.createClassWithField(Object.class); + BeSource beSource = createClassWithField(Object.class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -130,10 +130,10 @@ public class TypeMapperTest { @Test public void test_int_array() { // Arrange - BeeSource beeSource = TestData.createClassWithField(int[].class); + BeSource beSource = createClassWithField(int[].class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); @@ -143,18 +143,18 @@ public class TypeMapperTest { @Test public void test_Object_array() { // Arrange - BeeSource beeSource = TestData.createClassWithField(String[].class); + BeSource beSource = createClassWithField(String[].class); // Act - ConstantPool constantPool = createConstantPool(beeSource); + ConstantPool constantPool = createConstantPool(beSource); // Assert NameAndTypeEntry fieldEntry = getFieldNameAndType(constantPool); assertEquals("[Ljava/lang/String;", fieldEntry.getType()); } - private ConstantPool createConstantPool(BeeSource beeSource) { - CompiledClass compiledClass = Compiler.compile(beeSource); + private ConstantPool createConstantPool(BeSource beSource) { + CompiledClass compiledClass = Compiler.compile(beSource); return ConstantPoolCreator.create(compiledClass.getConstantTree()); } @@ -165,4 +165,18 @@ public class TypeMapperTest { .filter(nate -> nate.getName().equals("field")) .findAny().orElseGet(() -> fail("'field' not found")); } + + private BeSource createClassWithField(Class fieldType) { + String template = """ + class com.acme.SimpleBean(V15) + field private %s field + constructor public(%s arg) + INVOKE this.super()V + LOAD arg + PUT this.field + RETURN + """; + + return SourceCompiler.compile(String.format(template, fieldType.getName(), fieldType.getName())); + } } diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/ClassEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/ClassEntryTest.java similarity index 86% rename from src/test/java/nl/sander/beejava/constantpool/entry/ClassEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/ClassEntryTest.java index 586822a..23d28f8 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/ClassEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/ClassEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntryTest.java similarity index 93% rename from src/test/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntryTest.java index 997d52d..f2836e7 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/ConstantPoolEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/ConstantPoolEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/DoubleEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/DoubleEntryTest.java similarity index 86% rename from src/test/java/nl/sander/beejava/constantpool/entry/DoubleEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/DoubleEntryTest.java index ee8447a..04ddbee 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/DoubleEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/DoubleEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/FloatEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/FloatEntryTest.java similarity index 85% rename from src/test/java/nl/sander/beejava/constantpool/entry/FloatEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/FloatEntryTest.java index 4cf5f37..f5e94f5 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/FloatEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/FloatEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/IntegerEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/IntegerEntryTest.java similarity index 86% rename from src/test/java/nl/sander/beejava/constantpool/entry/IntegerEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/IntegerEntryTest.java index acb67aa..e8215d2 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/IntegerEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/IntegerEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/LongEntryTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/LongEntryTest.java similarity index 87% rename from src/test/java/nl/sander/beejava/constantpool/entry/LongEntryTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/LongEntryTest.java index 4053f99..dddf5f6 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/LongEntryTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/LongEntryTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/constantpool/entry/TagCorrectnessTest.java b/src/test/java/nl/sander/bejava/constantpool/entry/TagCorrectnessTest.java similarity index 97% rename from src/test/java/nl/sander/beejava/constantpool/entry/TagCorrectnessTest.java rename to src/test/java/nl/sander/bejava/constantpool/entry/TagCorrectnessTest.java index 90f3e1d..5095c96 100644 --- a/src/test/java/nl/sander/beejava/constantpool/entry/TagCorrectnessTest.java +++ b/src/test/java/nl/sander/bejava/constantpool/entry/TagCorrectnessTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.constantpool.entry; +package nl.sander.bejava.constantpool.entry; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/e2e/BeanWithMethodsTest.java b/src/test/java/nl/sander/bejava/e2e/BeanWithMethodsTest.java similarity index 65% rename from src/test/java/nl/sander/beejava/e2e/BeanWithMethodsTest.java rename to src/test/java/nl/sander/bejava/e2e/BeanWithMethodsTest.java index ba6a6a2..ee5d84b 100644 --- a/src/test/java/nl/sander/beejava/e2e/BeanWithMethodsTest.java +++ b/src/test/java/nl/sander/bejava/e2e/BeanWithMethodsTest.java @@ -1,12 +1,13 @@ -package nl.sander.beejava.e2e; +package nl.sander.bejava.e2e; -import nl.sander.beejava.Compiler; -import nl.sander.beejava.*; -import nl.sander.beejava.api.BeeSource; +import nl.sander.bejava.Compiler; +import nl.sander.bejava.*; +import nl.sander.bejava.api.BeSource; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.*; import static org.junit.jupiter.api.Assertions.*; @@ -18,7 +19,7 @@ public class BeanWithMethodsTest { @Test public void testEmptyBean() throws Exception { // Arrange - BeeSource printer = SourceCompiler.compile(""" + BeSource printer = SourceCompiler.compile(""" class nl.sander.beejava.test.ClassWithReferences constructor public() INVOKE this.super()V @@ -48,15 +49,16 @@ public class BeanWithMethodsTest { Class classWithReferences = classLoader.loadClass(className); assertNotNull(classWithReferences); - Method[] methods = classWithReferences.getDeclaredMethods(); - assertEquals(2, methods.length); - assertEquals("print1", methods[0].getName()); - assertTrue(Modifier.isPublic(methods[0].getModifiers())); - assertEquals(0, methods[0].getParameterCount()); + List methods = Arrays.asList(classWithReferences.getDeclaredMethods()); + methods.sort(Comparator.comparing(Method::getName)); + assertEquals(2, methods.size()); + assertEquals("print1", methods.get(0).getName()); + assertTrue(Modifier.isPublic(methods.get(0).getModifiers())); + assertEquals(0, methods.get(0).getParameterCount()); - assertEquals("print2", methods[1].getName()); // ordering may cause failures - assertTrue(Modifier.isPublic(methods[1].getModifiers())); - assertEquals(0, methods[1].getParameterCount()); + assertEquals("print2", methods.get(1).getName()); // ordering may cause failures + assertTrue(Modifier.isPublic(methods.get(1).getModifiers())); + assertEquals(0, methods.get(1).getParameterCount()); } } diff --git a/src/test/java/nl/sander/beejava/e2e/ByteClassLoader.java b/src/test/java/nl/sander/bejava/e2e/ByteClassLoader.java similarity index 95% rename from src/test/java/nl/sander/beejava/e2e/ByteClassLoader.java rename to src/test/java/nl/sander/bejava/e2e/ByteClassLoader.java index ec07c65..6165aeb 100644 --- a/src/test/java/nl/sander/beejava/e2e/ByteClassLoader.java +++ b/src/test/java/nl/sander/bejava/e2e/ByteClassLoader.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.e2e; +package nl.sander.bejava.e2e; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/test/java/nl/sander/beejava/e2e/EmptyBeanTest.java b/src/test/java/nl/sander/bejava/e2e/EmptyBeanTest.java similarity index 75% rename from src/test/java/nl/sander/beejava/e2e/EmptyBeanTest.java rename to src/test/java/nl/sander/bejava/e2e/EmptyBeanTest.java index a26658e..65ce03e 100644 --- a/src/test/java/nl/sander/beejava/e2e/EmptyBeanTest.java +++ b/src/test/java/nl/sander/bejava/e2e/EmptyBeanTest.java @@ -1,6 +1,6 @@ -package nl.sander.beejava.e2e; +package nl.sander.bejava.e2e; -import nl.sander.beejava.OverallCompiler; +import nl.sander.bejava.OverallCompiler; import org.junit.jupiter.api.Test; import java.lang.reflect.Constructor; @@ -15,7 +15,7 @@ public class EmptyBeanTest { public void testEmptyBean() throws Exception { // Act byte[] bytecode = OverallCompiler.compile(""" - class public nl.sander.beejava.test.EmptyBean + class public nl.sander.bejava.test.EmptyBean constructor public() INVOKE this.super()V RETURN @@ -23,10 +23,10 @@ public class EmptyBeanTest { ByteClassLoader classLoader = new ByteClassLoader(); - classLoader.setByteCode("nl.sander.beejava.test.EmptyBean", bytecode); + classLoader.setByteCode("nl.sander.bejava.test.EmptyBean", bytecode); // Assert - Constructor constructor = classLoader.loadClass("nl.sander.beejava.test.EmptyBean").getConstructor(); + Constructor constructor = classLoader.loadClass("nl.sander.bejava.test.EmptyBean").getConstructor(); assertNotNull(constructor); Object instance = constructor.newInstance(); diff --git a/src/test/java/nl/sander/beejava/flags/ClassAccessFlagsTest.java b/src/test/java/nl/sander/bejava/flags/ClassAccessFlagsTest.java similarity index 93% rename from src/test/java/nl/sander/beejava/flags/ClassAccessFlagsTest.java rename to src/test/java/nl/sander/bejava/flags/ClassAccessFlagsTest.java index 0db09cb..bba7449 100644 --- a/src/test/java/nl/sander/beejava/flags/ClassAccessFlagsTest.java +++ b/src/test/java/nl/sander/bejava/flags/ClassAccessFlagsTest.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.flags; +package nl.sander.bejava.flags; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nl/sander/beejava/testclasses/BeanWithClassReferences.java b/src/test/java/nl/sander/bejava/testclasses/BeanWithClassReferences.java similarity index 86% rename from src/test/java/nl/sander/beejava/testclasses/BeanWithClassReferences.java rename to src/test/java/nl/sander/bejava/testclasses/BeanWithClassReferences.java index 9122074..3300c1c 100644 --- a/src/test/java/nl/sander/beejava/testclasses/BeanWithClassReferences.java +++ b/src/test/java/nl/sander/bejava/testclasses/BeanWithClassReferences.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.testclasses; +package nl.sander.bejava.testclasses; // two references to System. System should not be in the constant pool twice. public class BeanWithClassReferences { diff --git a/src/test/java/nl/sander/beejava/testclasses/Dummy.java b/src/test/java/nl/sander/bejava/testclasses/Dummy.java similarity index 70% rename from src/test/java/nl/sander/beejava/testclasses/Dummy.java rename to src/test/java/nl/sander/bejava/testclasses/Dummy.java index 53f052b..6b39891 100644 --- a/src/test/java/nl/sander/beejava/testclasses/Dummy.java +++ b/src/test/java/nl/sander/bejava/testclasses/Dummy.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.testclasses; +package nl.sander.bejava.testclasses; public class Dummy { public String hello(String goodbye){ diff --git a/src/test/java/nl/sander/bejava/testclasses/EmptyBean.java b/src/test/java/nl/sander/bejava/testclasses/EmptyBean.java new file mode 100644 index 0000000..432f669 --- /dev/null +++ b/src/test/java/nl/sander/bejava/testclasses/EmptyBean.java @@ -0,0 +1,5 @@ +package nl.sander.bejava.testclasses; + +public class EmptyBean { + +} diff --git a/src/test/java/nl/sander/beejava/testclasses/EmptyBeanWithInterface.java b/src/test/java/nl/sander/bejava/testclasses/EmptyBeanWithInterface.java similarity index 71% rename from src/test/java/nl/sander/beejava/testclasses/EmptyBeanWithInterface.java rename to src/test/java/nl/sander/bejava/testclasses/EmptyBeanWithInterface.java index 005f537..430c40b 100644 --- a/src/test/java/nl/sander/beejava/testclasses/EmptyBeanWithInterface.java +++ b/src/test/java/nl/sander/bejava/testclasses/EmptyBeanWithInterface.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.testclasses; +package nl.sander.bejava.testclasses; import java.io.Serializable; diff --git a/src/test/java/nl/sander/beejava/testclasses/IntBean.java b/src/test/java/nl/sander/bejava/testclasses/IntBean.java similarity index 76% rename from src/test/java/nl/sander/beejava/testclasses/IntBean.java rename to src/test/java/nl/sander/bejava/testclasses/IntBean.java index 86d50a0..e8ee2b1 100644 --- a/src/test/java/nl/sander/beejava/testclasses/IntBean.java +++ b/src/test/java/nl/sander/bejava/testclasses/IntBean.java @@ -1,4 +1,4 @@ -package nl.sander.beejava.testclasses; +package nl.sander.bejava.testclasses; public class IntBean { private int intField; diff --git a/src/test/java/nl/sander/bejava/testutils/ByteWriter.java b/src/test/java/nl/sander/bejava/testutils/ByteWriter.java new file mode 100644 index 0000000..0aa6f7c --- /dev/null +++ b/src/test/java/nl/sander/bejava/testutils/ByteWriter.java @@ -0,0 +1,48 @@ +package nl.sander.bejava.testutils; + +import nl.sander.bejava.constantpool.ConstantPool; +import nl.sander.bejava.constantpool.entry.ConstantPoolEntry; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class ByteWriter { + + public static void printBytes(ConstantPool constantPool) { + int cpIndex = 1; + for (ConstantPoolEntry e : constantPool) { + cpIndex += 1; + System.out.print(cpIndex + ":"); + for (byte b : e.getBytes()) { + System.out.print(String.format("%2s", Integer.toHexString(b & 0xFF)).replace(' ', '0') + " "); + } + System.out.println(); + } + } + + public static String printBytes(byte[] bytes) { + StringBuilder s = new StringBuilder(); + int count = 0; + for (byte b : bytes) { + s.append(String.format("%2s", Integer.toHexString(b & 0xFF)).replace(' ', '0')); + s.append(count % 2 == 0 ? "" : " "); + count += 1; + if (count > 15) { + count = 0; + s.append(String.format("%n")); + } + } + return s.toString(); + } + + public static void writeToFile(byte[] bytecode, String dirName, String className) { + File dir = new File(dirName); + dir.mkdirs(); + try (FileOutputStream outputStream = new FileOutputStream(new File(dir, className))) { + outputStream.write(bytecode); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +}