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