From eab644016a29d2f59f7d3bd9bb1b9e97f8d2ebf0 Mon Sep 17 00:00:00 2001 From: Wdestroier Date: Sat, 10 Jul 2021 16:50:12 -0300 Subject: [PATCH] 1.0.0 release --- pom.xml | 26 + .../chamomile/LinearSweepDisassembler.java | 46 ++ .../chamomile/SinglePassAssembler.java | 24 + .../chamomile/classfile/ClassFile.java | 152 +++++ .../chamomile/classfile/FieldInfo.java | 52 ++ .../chamomile/classfile/MethodInfo.java | 52 ++ .../AnnotationDefaultAttribute.java | 38 ++ .../attributeinfo/AttributeInfo.java | 37 ++ .../attributeinfo/AttributeInfoFactory.java | 84 +++ .../BootstrapMethodsAttribute.java | 81 +++ .../attributeinfo/CodeAttribute.java | 119 ++++ .../attributeinfo/ConstantValueAttribute.java | 49 ++ .../attributeinfo/DeprecatedAttribute.java | 34 ++ .../EnclosingMethodAttribute.java | 45 ++ .../attributeinfo/ExceptionsAttribute.java | 47 ++ .../attributeinfo/InnerClassesAttribute.java | 77 +++ .../LineNumberTableAttribute.java | 71 +++ .../LocalVariableTableAttribute.java | 80 +++ .../LocalVariableTypeTableAttribute.java | 80 +++ .../MethodParametersAttribute.java | 71 +++ .../attributeinfo/ModuleAttribute.java | 130 +++++ .../ModuleMainClassAttribute.java | 37 ++ .../ModulePackagesAttribute.java | 47 ++ .../attributeinfo/NestHostAttribute.java | 37 ++ .../attributeinfo/NestMembersAttribute.java | 47 ++ .../RuntimeInvisibleAnnotationsAttribute.java | 48 ++ ...nvisibleParameterAnnotationsAttribute.java | 49 ++ ...timeInvisibleTypeAnnotationsAttribute.java | 49 ++ .../RuntimeVisibleAnnotationsAttribute.java | 49 ++ ...eVisibleParameterAnnotationsAttribute.java | 49 ++ ...untimeVisibleTypeAnnotationsAttribute.java | 49 ++ .../attributeinfo/SignatureAttribute.java | 41 ++ .../SourceDebugExtensionAttribute.java | 46 ++ .../attributeinfo/SourceFileAttribute.java | 37 ++ .../attributeinfo/StackMapTableAttribute.java | 48 ++ .../attributeinfo/SyntheticAttribute.java | 38 ++ .../attributeinfo/annotation/Annotation.java | 44 ++ .../attributeinfo/annotation/ArrayValue.java | 41 ++ .../annotation/ElementValue.java | 35 ++ .../annotation/ElementValuePair.java | 34 ++ .../annotation/EnumConstValue.java | 34 ++ .../annotation/ParameterAnnotation.java | 41 ++ .../attributeinfo/annotation/Path.java | 34 ++ .../attributeinfo/annotation/TargetInfo.java | 208 +++++++ .../annotation/TargetInfoFactory.java | 85 +++ .../annotation/TypeAnnotation.java | 54 ++ .../attributeinfo/annotation/TypePath.java | 41 ++ .../attributeinfo/annotation/Value.java | 98 ++++ .../annotation/ValueFactory.java | 60 ++ .../annotation/target/CatchTarget.java | 31 ++ .../annotation/target/EmptyTarget.java | 21 + .../target/FormalParameterTarget.java | 31 ++ .../annotation/target/LocalvarTarget.java | 68 +++ .../annotation/target/OffsetTarget.java | 30 + .../annotation/target/SupertypeTarget.java | 31 ++ .../annotation/target/ThrowsTarget.java | 31 ++ .../annotation/target/TypeArgumentTarget.java | 34 ++ .../target/TypeParameterBoundTarget.java | 34 ++ .../target/TypeParameterTarget.java | 31 ++ .../attributeinfo/module/Exports.java | 47 ++ .../classfile/attributeinfo/module/Opens.java | 47 ++ .../attributeinfo/module/Provides.java | 44 ++ .../attributeinfo/module/Requires.java | 37 ++ .../attributeinfo/stackmap/StackMapFrame.java | 130 +++++ .../stackmap/StackMapFrameFactory.java | 56 ++ .../stackmap/frametype/AppendFrame.java | 46 ++ .../stackmap/frametype/ChopFrame.java | 34 ++ .../stackmap/frametype/FullFrame.java | 63 +++ .../stackmap/frametype/SameFrame.java | 31 ++ .../stackmap/frametype/SameFrameExtended.java | 34 ++ .../frametype/SameLocals1StackItemFrame.java | 39 ++ .../SameLocals1StackItemFrameExtended.java | 43 ++ .../verificationtype/DoubleVariableInfo.java | 31 ++ .../verificationtype/FloatVariableInfo.java | 31 ++ .../verificationtype/IntegerVariableInfo.java | 31 ++ .../verificationtype/LongVariableInfo.java | 31 ++ .../verificationtype/NullVariableInfo.java | 31 ++ .../verificationtype/ObjectVariableInfo.java | 34 ++ .../verificationtype/TopVariableInfo.java | 31 ++ .../UninitializedThisVariableInfo.java | 31 ++ .../UninitializedVariableInfo.java | 34 ++ .../verificationtype/VariableInfoFactory.java | 58 ++ .../verificationtype/VerificationType.java | 15 + .../VerificationTypeInfo.java | 177 ++++++ .../VerificationTypeInfoFactory.java | 49 ++ .../classfile/constantkind/ConstantClass.java | 37 ++ .../constantkind/ConstantDouble.java | 36 ++ .../constantkind/ConstantDynamic.java | 36 ++ .../constantkind/ConstantFieldref.java | 36 ++ .../classfile/constantkind/ConstantFloat.java | 34 ++ .../constantkind/ConstantInteger.java | 33 ++ .../ConstantInterfaceMethodref.java | 36 ++ .../constantkind/ConstantInvokeDynamic.java | 36 ++ .../classfile/constantkind/ConstantKind.java | 9 + .../constantkind/ConstantKindFactory.java | 115 ++++ .../classfile/constantkind/ConstantLong.java | 36 ++ .../constantkind/ConstantMethodHandle.java | 50 ++ .../constantkind/ConstantMethodType.java | 33 ++ .../constantkind/ConstantMethodref.java | 36 ++ .../constantkind/ConstantModule.java | 33 ++ .../constantkind/ConstantNameAndType.java | 36 ++ .../constantkind/ConstantPackage.java | 33 ++ .../constantkind/ConstantString.java | 33 ++ .../classfile/constantkind/ConstantUtf8.java | 44 ++ .../chamomile/classfile/flag/ClassFlag.java | 15 + .../chamomile/classfile/flag/FieldFlag.java | 19 + .../chamomile/classfile/flag/MethodFlag.java | 18 + .../classfile/flag/NestedClassFlag.java | 16 + .../classfile/flag/ParameterFlag.java | 9 + .../classfile/flag/module/ExportsFlag.java | 8 + .../classfile/flag/module/ModuleFlag.java | 9 + .../classfile/flag/module/OpensFlag.java | 8 + .../classfile/flag/module/RequiresFlag.java | 10 + .../pseudostructure/PseudoStructure.java | 46 ++ .../PseudoStructureFactory.java | 49 ++ .../chamomile/instruction/Instruction.java | 46 ++ .../instruction/InstructionFactory.java | 519 ++++++++++++++++++ .../comparision/ComparisionInstruction.java | 5 + .../acmp/AbstractAcmpInstruction.java | 5 + .../comparision/acmp/IfAcmpeqInstruction.java | 33 ++ .../comparision/acmp/IfAcmpneInstruction.java | 33 ++ .../cmp0/AbstractCmp0Instruction.java | 5 + .../comparision/cmp0/IfeqInstruction.java | 33 ++ .../comparision/cmp0/IfgeInstruction.java | 33 ++ .../comparision/cmp0/IfgtInstruction.java | 33 ++ .../comparision/cmp0/IfleInstruction.java | 33 ++ .../comparision/cmp0/IfltInstruction.java | 33 ++ .../comparision/cmp0/IfneInstruction.java | 33 ++ .../dcmp/AbstractDcmpInstruction.java | 5 + .../comparision/dcmp/DcmpgInstruction.java | 30 + .../comparision/dcmp/DcmplInstruction.java | 30 + .../fcmp/AbstractFcmpInstruction.java | 5 + .../comparision/fcmp/FcmpgInstruction.java | 30 + .../comparision/fcmp/FcmplInstruction.java | 30 + .../icmp/AbstractIcmpInstruction.java | 5 + .../comparision/icmp/IfIcmpeqInstruction.java | 33 ++ .../comparision/icmp/IfIcmpgeInstruction.java | 33 ++ .../comparision/icmp/IfIcmpgtInstruction.java | 33 ++ .../comparision/icmp/IfIcmpleInstruction.java | 33 ++ .../comparision/icmp/IfIcmpltInstruction.java | 33 ++ .../comparision/icmp/IfIcmpneInstruction.java | 33 ++ .../comparision/lcmp/LcmpInstruction.java | 31 ++ .../constant/AbstractConstantInstruction.java | 5 + .../constant/AconstNullInstruction.java | 30 + .../constant/BipushInstruction.java | 36 ++ .../constant/Ldc2WInstruction.java | 33 ++ .../instruction/constant/LdcInstruction.java | 33 ++ .../instruction/constant/LdcWInstruction.java | 33 ++ .../instruction/constant/NopInstruction.java | 30 + .../constant/SipushInstruction.java | 36 ++ .../dconst/AbstractDconstInstruction.java | 9 + .../constant/dconst/Dconst0Instruction.java | 35 ++ .../constant/dconst/Dconst1Instruction.java | 35 ++ .../fconst/AbstractFconstInstruction.java | 9 + .../constant/fconst/Fconst0Instruction.java | 35 ++ .../constant/fconst/Fconst1Instruction.java | 35 ++ .../constant/fconst/Fconst2Instruction.java | 35 ++ .../iconst/AbstractIconstInstruction.java | 9 + .../constant/iconst/Iconst0Instruction.java | 35 ++ .../constant/iconst/Iconst1Instruction.java | 35 ++ .../constant/iconst/Iconst2Instruction.java | 35 ++ .../constant/iconst/Iconst3Instruction.java | 35 ++ .../constant/iconst/Iconst4Instruction.java | 35 ++ .../constant/iconst/Iconst5Instruction.java | 35 ++ .../constant/iconst/IconstM1Instruction.java | 35 ++ .../lconst/AbstractLconstInstruction.java | 9 + .../constant/lconst/Lconst0Instruction.java | 35 ++ .../constant/lconst/Lconst1Instruction.java | 35 ++ .../control/AbstractControlInstruction.java | 5 + .../control/AreturnInstruction.java | 30 + .../control/DreturnInstruction.java | 30 + .../control/FreturnInstruction.java | 30 + .../instruction/control/GotoInstruction.java | 33 ++ .../control/IreturnInstruction.java | 30 + .../instruction/control/JsrInstruction.java | 33 ++ .../control/LookupswitchInstruction.java | 74 +++ .../control/LreturnInstruction.java | 30 + .../instruction/control/RetInstruction.java | 33 ++ .../control/ReturnInstruction.java | 30 + .../control/TableswitchInstruction.java | 44 ++ .../AbstractConversionInstruction.java | 5 + .../AbstractDoubleConversionInstruction.java | 5 + .../conversion/doubles/D2fInstruction.java | 30 + .../conversion/doubles/D2iInstruction.java | 30 + .../conversion/doubles/D2lInstruction.java | 30 + .../AbstractFloatConversionInstruction.java | 5 + .../conversion/floats/F2dInstruction.java | 30 + .../conversion/floats/F2iInstruction.java | 30 + .../conversion/floats/F2lInstruction.java | 30 + .../AbstractIntConversionInstruction.java | 5 + .../conversion/ints/I2bInstruction.java | 30 + .../conversion/ints/I2cInstruction.java | 30 + .../conversion/ints/I2dInstruction.java | 30 + .../conversion/ints/I2fInstruction.java | 30 + .../conversion/ints/I2lInstruction.java | 30 + .../conversion/ints/I2sInstruction.java | 30 + .../AbstractLongConversionInstruction.java | 5 + .../conversion/longs/L2dInstruction.java | 30 + .../conversion/longs/L2fInstruction.java | 30 + .../conversion/longs/L2iInstruction.java | 30 + .../extended/AbstractExtendedInstruction.java | 5 + .../extended/GotoWInstruction.java | 33 ++ .../extended/IfnonnullInstruction.java | 33 ++ .../extended/IfnullInstruction.java | 33 ++ .../instruction/extended/JsrWInstruction.java | 33 ++ .../extended/MultianewarrayInstruction.java | 36 ++ .../instruction/extended/WideInstruction.java | 50 ++ .../instruction/load/AaloadInstruction.java | 30 + .../load/AbstractLoadInstruction.java | 5 + .../instruction/load/BaloadInstruction.java | 30 + .../instruction/load/CaloadInstruction.java | 30 + .../instruction/load/DaloadInstruction.java | 30 + .../instruction/load/FaloadInstruction.java | 30 + .../instruction/load/IaloadInstruction.java | 30 + .../instruction/load/LaloadInstruction.java | 30 + .../instruction/load/SaloadInstruction.java | 30 + .../load/aload/AbstractAloadInstruction.java | 9 + .../load/aload/Aload0Instruction.java | 35 ++ .../load/aload/Aload1Instruction.java | 35 ++ .../load/aload/Aload2Instruction.java | 35 ++ .../load/aload/Aload3Instruction.java | 35 ++ .../load/aload/AloadInstruction.java | 33 ++ .../load/dload/AbstractDloadInstruction.java | 9 + .../load/dload/Dload0Instruction.java | 35 ++ .../load/dload/Dload1Instruction.java | 35 ++ .../load/dload/Dload2Instruction.java | 35 ++ .../load/dload/Dload3Instruction.java | 35 ++ .../load/dload/DloadInstruction.java | 33 ++ .../load/fload/AbstractFloadInstruction.java | 9 + .../load/fload/Fload0Instruction.java | 35 ++ .../load/fload/Fload1Instruction.java | 35 ++ .../load/fload/Fload2Instruction.java | 35 ++ .../load/fload/Fload3Instruction.java | 35 ++ .../load/fload/FloadInstruction.java | 33 ++ .../load/iload/AbstractIloadInstruction.java | 9 + .../load/iload/Iload0Instruction.java | 35 ++ .../load/iload/Iload1Instruction.java | 35 ++ .../load/iload/Iload2Instruction.java | 35 ++ .../load/iload/Iload3Instruction.java | 35 ++ .../load/iload/IloadInstruction.java | 33 ++ .../load/lload/AbstractLloadInstruction.java | 9 + .../load/lload/Lload0Instruction.java | 35 ++ .../load/lload/Lload1Instruction.java | 35 ++ .../load/lload/Lload2Instruction.java | 35 ++ .../load/lload/Lload3Instruction.java | 35 ++ .../load/lload/LloadInstruction.java | 33 ++ .../math/AbstractMathInstruction.java | 5 + .../instruction/math/IincInstruction.java | 39 ++ .../math/add/AbstractAddInstruction.java | 5 + .../instruction/math/add/DaddInstruction.java | 30 + .../instruction/math/add/FaddInstruction.java | 30 + .../instruction/math/add/IaddInstruction.java | 30 + .../instruction/math/add/LaddInstruction.java | 30 + .../math/and/AbstractAndInstruction.java | 5 + .../instruction/math/and/IandInstruction.java | 30 + .../instruction/math/and/LandInstruction.java | 30 + .../math/div/AbstractDivInstruction.java | 5 + .../instruction/math/div/DdivInstruction.java | 30 + .../instruction/math/div/FdivInstruction.java | 30 + .../instruction/math/div/IdivInstruction.java | 30 + .../instruction/math/div/LdivInstruction.java | 30 + .../math/mul/AbstractMulInstruction.java | 5 + .../instruction/math/mul/DmulInstruction.java | 30 + .../instruction/math/mul/FmulInstruction.java | 30 + .../instruction/math/mul/ImulInstruction.java | 30 + .../instruction/math/mul/LmulInstruction.java | 30 + .../math/neg/AbstractNegInstruction.java | 5 + .../instruction/math/neg/DnegInstruction.java | 30 + .../instruction/math/neg/FnegInstruction.java | 31 ++ .../instruction/math/neg/InegInstruction.java | 30 + .../instruction/math/neg/LnegInstruction.java | 30 + .../math/or/AbstractOrInstruction.java | 5 + .../instruction/math/or/IorInstruction.java | 30 + .../instruction/math/or/LorInstruction.java | 30 + .../math/rem/AbstractRemInstruction.java | 5 + .../instruction/math/rem/DremInstruction.java | 30 + .../instruction/math/rem/FremInstruction.java | 30 + .../instruction/math/rem/IremInstruction.java | 30 + .../instruction/math/rem/LremInstruction.java | 30 + .../AbstractArithmeticShiftInstruction.java | 5 + .../shift/arithmetic/IshlInstruction.java | 33 ++ .../shift/arithmetic/IshrInstruction.java | 33 ++ .../shift/arithmetic/LshlInstruction.java | 33 ++ .../shift/arithmetic/LshrInstruction.java | 33 ++ .../AbstractLogicalShiftInstruction.java | 5 + .../math/shift/logical/IushrInstruction.java | 33 ++ .../math/shift/logical/LushrInstruction.java | 33 ++ .../math/sub/AbstractSubInstruction.java | 5 + .../instruction/math/sub/DsubInstruction.java | 30 + .../instruction/math/sub/FsubInstruction.java | 30 + .../instruction/math/sub/IsubInstruction.java | 30 + .../instruction/math/sub/LsubInstruction.java | 30 + .../math/xor/AbstractXorInstruction.java | 5 + .../instruction/math/xor/IxorInstruction.java | 30 + .../instruction/math/xor/LxorInstruction.java | 30 + .../AbstractReferenceInstruction.java | 5 + .../reference/AnewarrayInstruction.java | 33 ++ .../reference/ArraylengthInstruction.java | 30 + .../reference/AthrowInstruction.java | 30 + .../reference/CheckcastInstruction.java | 33 ++ .../reference/GetfieldInstruction.java | 33 ++ .../reference/GetstaticInstruction.java | 33 ++ .../reference/InstanceofInstruction.java | 33 ++ .../reference/InvokedynamicInstruction.java | 42 ++ .../reference/InvokeinterfaceInstruction.java | 42 ++ .../reference/InvokespecialInstruction.java | 33 ++ .../reference/InvokestaticInstruction.java | 33 ++ .../reference/InvokevirtualInstruction.java | 33 ++ .../reference/MonitorenterInstruction.java | 30 + .../reference/MonitorexitInstruction.java | 30 + .../instruction/reference/NewInstruction.java | 33 ++ .../reference/NewarrayInstruction.java | 46 ++ .../reference/PutfieldInstruction.java | 33 ++ .../reference/PutstaticInstruction.java | 33 ++ .../reserved/AbstractReservedInstruction.java | 5 + .../reserved/BreakpointInstruction.java | 30 + .../reserved/Impdep1Instruction.java | 30 + .../reserved/Impdep2Instruction.java | 30 + .../stack/AbstractStackInstruction.java | 5 + .../instruction/stack/Dup2Instruction.java | 30 + .../instruction/stack/Dup2X1Instruction.java | 30 + .../instruction/stack/Dup2X2Instruction.java | 30 + .../instruction/stack/DupInstruction.java | 30 + .../instruction/stack/DupX1Instruction.java | 30 + .../instruction/stack/DupX2Instruction.java | 30 + .../instruction/stack/Pop2Instruction.java | 30 + .../instruction/stack/PopInstruction.java | 30 + .../instruction/stack/SwapInstruction.java | 30 + .../store/AbstractStoreInstruction.java | 5 + .../store/arraystore/AastoreInstruction.java | 30 + .../AbstractArrayStoreInstruction.java | 5 + .../store/arraystore/BastoreInstruction.java | 30 + .../store/arraystore/CastoreInstruction.java | 30 + .../store/arraystore/DastoreInstruction.java | 30 + .../store/arraystore/FastoreInstruction.java | 30 + .../store/arraystore/IastoreInstruction.java | 30 + .../store/arraystore/LastoreInstruction.java | 30 + .../store/arraystore/SastoreInstruction.java | 30 + .../astore/AbstractAstoreInstruction.java | 9 + .../store/astore/Astore0Instruction.java | 35 ++ .../store/astore/Astore1Instruction.java | 35 ++ .../store/astore/Astore2Instruction.java | 35 ++ .../store/astore/Astore3Instruction.java | 35 ++ .../store/astore/AstoreInstruction.java | 33 ++ .../dstore/AbstractDstoreInstruction.java | 9 + .../store/dstore/Dstore0Instruction.java | 35 ++ .../store/dstore/Dstore1Instruction.java | 35 ++ .../store/dstore/Dstore2Instruction.java | 35 ++ .../store/dstore/Dstore3Instruction.java | 35 ++ .../store/dstore/DstoreInstruction.java | 33 ++ .../fstore/AbstractFstoreInstruction.java | 9 + .../store/fstore/Fstore0Instruction.java | 35 ++ .../store/fstore/Fstore1Instruction.java | 35 ++ .../store/fstore/Fstore2Instruction.java | 35 ++ .../store/fstore/Fstore3Instruction.java | 35 ++ .../store/fstore/FstoreInstruction.java | 33 ++ .../istore/AbstractIstoreInstruction.java | 9 + .../store/istore/Istore0Instruction.java | 35 ++ .../store/istore/Istore1Instruction.java | 35 ++ .../store/istore/Istore2Instruction.java | 35 ++ .../store/istore/Istore3Instruction.java | 35 ++ .../store/istore/IstoreInstruction.java | 33 ++ .../lstore/AbstractLstoreInstruction.java | 9 + .../store/lstore/Lstore0Instruction.java | 35 ++ .../store/lstore/Lstore1Instruction.java | 35 ++ .../store/lstore/Lstore2Instruction.java | 35 ++ .../store/lstore/Lstore3Instruction.java | 35 ++ .../store/lstore/LstoreInstruction.java | 33 ++ .../wdestroier/chamomile/io/Endianness.java | 12 + .../chamomile/io/MultiEndianInputStream.java | 238 ++++++++ .../chamomile/io/MultiEndianOutputStream.java | 118 ++++ .../chamomile/io/ShortArrayInputStream.java | 188 +++++++ .../chamomile/io/ShortArrayOutputStream.java | 117 ++++ .../io/converter/AbstractTypeConverter.java | 18 + .../io/converter/ByteTypeConverter.java | 47 ++ .../io/converter/IntTypeConverter.java | 78 +++ .../io/converter/LongTypeConverter.java | 114 ++++ .../io/converter/PrimitiveTypesConverter.java | 42 ++ .../io/converter/ShortTypeConverter.java | 61 ++ .../UnsupportedEndiannessException.java | 7 + 380 files changed, 14012 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/com/github/wdestroier/chamomile/LinearSweepDisassembler.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/SinglePassAssembler.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/ClassFile.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/FieldInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/MethodInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AnnotationDefaultAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfoFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/BootstrapMethodsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/CodeAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ConstantValueAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/DeprecatedAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/EnclosingMethodAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ExceptionsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/InnerClassesAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LineNumberTableAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTableAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTypeTableAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/MethodParametersAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleMainClassAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModulePackagesAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestHostAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestMembersAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleParameterAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleTypeAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleParameterAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleTypeAnnotationsAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SignatureAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceDebugExtensionAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceFileAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/StackMapTableAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SyntheticAttribute.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Annotation.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ArrayValue.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValue.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValuePair.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/EnumConstValue.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ParameterAnnotation.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Path.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfoFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypeAnnotation.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypePath.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Value.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ValueFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/CatchTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/EmptyTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/FormalParameterTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/LocalvarTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/OffsetTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/SupertypeTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/ThrowsTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeArgumentTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterBoundTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterTarget.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Exports.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Opens.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Provides.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Requires.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrameFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/AppendFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/ChopFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/FullFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrameExtended.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrame.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrameExtended.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/DoubleVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/FloatVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/IntegerVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/LongVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/NullVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/ObjectVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/TopVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedThisVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedVariableInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VariableInfoFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationType.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfo.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfoFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantClass.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDouble.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDynamic.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFieldref.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFloat.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInteger.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInterfaceMethodref.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInvokeDynamic.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKind.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKindFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantLong.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodHandle.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodType.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodref.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantModule.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantNameAndType.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantPackage.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantString.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantUtf8.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/ClassFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/FieldFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/MethodFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/NestedClassFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/ParameterFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ExportsFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ModuleFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/OpensFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/RequiresFlag.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructure.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructureFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/InstructionFactory.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/ComparisionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/AbstractAcmpInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpeqInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpneInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/AbstractCmp0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfeqInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgeInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgtInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfleInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfltInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfneInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/AbstractDcmpInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmpgInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmplInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/AbstractFcmpInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmpgInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmplInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/AbstractIcmpInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpeqInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgeInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgtInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpleInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpltInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpneInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/comparision/lcmp/LcmpInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/AbstractConstantInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/AconstNullInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/BipushInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/Ldc2WInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcWInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/NopInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/SipushInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/AbstractDconstInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/AbstractFconstInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/AbstractIconstInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst4Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst5Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/IconstM1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/AbstractLconstInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/AbstractControlInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/AreturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/DreturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/FreturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/GotoInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/IreturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/JsrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/LookupswitchInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/LreturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/RetInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/ReturnInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/control/TableswitchInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/AbstractConversionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/AbstractDoubleConversionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2fInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2iInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2lInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/AbstractFloatConversionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2dInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2iInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2lInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/AbstractIntConversionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2bInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2cInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2dInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2fInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2lInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2sInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/AbstractLongConversionInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2dInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2fInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2iInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/AbstractExtendedInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/GotoWInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnonnullInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnullInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/JsrWInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/MultianewarrayInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/extended/WideInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/AaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/AbstractLoadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/BaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/CaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/DaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/FaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/IaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/LaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/SaloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AbstractAloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/AbstractDloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/DloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/AbstractFloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/FloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/AbstractIloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/IloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/AbstractLloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/LloadInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/AbstractMathInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/IincInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/add/AbstractAddInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/add/DaddInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/add/FaddInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/add/IaddInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/add/LaddInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/and/AbstractAndInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/and/IandInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/and/LandInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/div/AbstractDivInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/div/DdivInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/div/FdivInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/div/IdivInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/div/LdivInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/AbstractMulInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/DmulInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/FmulInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/ImulInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/LmulInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/AbstractNegInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/DnegInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/FnegInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/InegInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/LnegInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/or/AbstractOrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/or/IorInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/or/LorInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/AbstractRemInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/DremInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/FremInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/IremInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/LremInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/AbstractArithmeticShiftInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshlInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshlInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/AbstractLogicalShiftInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/IushrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/LushrInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/AbstractSubInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/DsubInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/FsubInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/IsubInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/LsubInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/AbstractXorInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/IxorInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/LxorInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/AbstractReferenceInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/AnewarrayInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/ArraylengthInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/AthrowInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/CheckcastInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetfieldInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetstaticInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InstanceofInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokedynamicInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokeinterfaceInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokespecialInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokestaticInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokevirtualInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorenterInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorexitInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewarrayInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutfieldInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutstaticInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reserved/AbstractReservedInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reserved/BreakpointInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/AbstractStackInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/Pop2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/PopInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/stack/SwapInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/AbstractStoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AbstractArrayStoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/BastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/CastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/DastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/FastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/IastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/LastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/SastoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AbstractAstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/AbstractDstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/DstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/AbstractFstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/FstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/AbstractIstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/IstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/AbstractLstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore0Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore1Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore2Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore3Instruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/LstoreInstruction.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/Endianness.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/MultiEndianInputStream.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/MultiEndianOutputStream.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/ShortArrayInputStream.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/ShortArrayOutputStream.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/AbstractTypeConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/ByteTypeConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/IntTypeConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/LongTypeConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/PrimitiveTypesConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/ShortTypeConverter.java create mode 100644 src/main/java/com/github/wdestroier/chamomile/io/converter/UnsupportedEndiannessException.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1583755 --- /dev/null +++ b/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + + com.github.wdestroier + chamomile + 1.0.0 + Chamomile assembler/disassembler + A Java Virtual Machine class file assembler and disassembler + + + 11 + 11 + + + + + org.projectlombok + lombok + 1.18.16 + provided + + + + \ No newline at end of file diff --git a/src/main/java/com/github/wdestroier/chamomile/LinearSweepDisassembler.java b/src/main/java/com/github/wdestroier/chamomile/LinearSweepDisassembler.java new file mode 100644 index 0000000..a621f20 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/LinearSweepDisassembler.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile; + +import java.io.BufferedInputStream; +import java.util.ArrayList; +import java.util.List; + +import com.github.wdestroier.chamomile.instruction.Instruction; +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.Endianness; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.ShortArrayInputStream; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class LinearSweepDisassembler { + + private InstructionFactory instructionFactory; + + public LinearSweepDisassembler() { + this(new InstructionFactory()); + } + + public List> disassemble(MultiEndianInputStream input) { + var bytesRead = input.getBytesRead(); + + // Needs to be aligned to read the Tableswitch and Tablelookup instructions + input.setBytesRead(0); + + var instructions = new ArrayList>(); + + while (input.available() > 0) { + instructions.add(instructionFactory.getInstruction(input)); + } + + input.setBytesRead(input.getBytesRead() + bytesRead); + + return instructions; + } + + public List> disassemble(short... code) { + return disassemble(new MultiEndianInputStream(new BufferedInputStream( + new ShortArrayInputStream(code)), Endianness.BIG_ENDIAN)); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/SinglePassAssembler.java b/src/main/java/com/github/wdestroier/chamomile/SinglePassAssembler.java new file mode 100644 index 0000000..d9a9573 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/SinglePassAssembler.java @@ -0,0 +1,24 @@ +package com.github.wdestroier.chamomile; + +import java.util.List; + +import com.github.wdestroier.chamomile.instruction.Instruction; +import com.github.wdestroier.chamomile.io.Endianness; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; +import com.github.wdestroier.chamomile.io.ShortArrayOutputStream; + +public class SinglePassAssembler { + + public void assemble(List> instructions, MultiEndianOutputStream output) { + instructions.forEach(instruction -> instruction.write(output)); + } + + public short[] assemble(List> instructions) { + var output = new ShortArrayOutputStream(); + + assemble(instructions, new MultiEndianOutputStream(output, Endianness.BIG_ENDIAN)); + + return output.toUnsignedByteArray(); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/ClassFile.java b/src/main/java/com/github/wdestroier/chamomile/classfile/ClassFile.java new file mode 100644 index 0000000..cf71648 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/ClassFile.java @@ -0,0 +1,152 @@ +package com.github.wdestroier.chamomile.classfile; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.AttributeInfoFactory; +import com.github.wdestroier.chamomile.classfile.constantkind.ConstantDouble; +import com.github.wdestroier.chamomile.classfile.constantkind.ConstantLong; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ClassFile implements PseudoStructure { + + private long magic; + private int minorVersion; + private int majorVersion; + private int constantPoolCount; + private PseudoStructure[] constantPool; + private int accessFlags; + private int thisClass; + private int superClass; + private int interfacesCount; + private int[] interfaces; + private int fieldsCount; + private FieldInfo[] fields; + private int methodsCount; + private MethodInfo[] methods; + private int attributesCount; + private PseudoStructure[] attributes; + + @Override + public ClassFile read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + //TODO ClassFileVerifier, MethodInfoVerifier ... + + magic = input.readUnsignedInt(); + minorVersion = input.readUnsignedShort(); + majorVersion = input.readUnsignedShort(); + constantPoolCount = input.readUnsignedShort(); + + constantPool = new PseudoStructure[constantPoolCount]; + + /* + * cpInfo[0] is reserved + * + * https://stackoverflow.com/questions/56808432/why-is-the-constant-pool-in-java-classfile-indexed-from-1-and-not-0-what-is#:~:text=%22%5BI%5Dndexed%20from%201,index%20into%20the%20constant%20pool. + * https://stackoverflow.com/questions/56808432/why-is-the-constant-pool-in-java-classfile-indexed-from-1-and-not-0-what-is#:~:text=2%20Answers&text=They%20skipped%20index%200%20so,%22catch%20all%22%20exception%20handlers. + */ + for (var i = 1; i < constantPoolCount; i++) { + var constantKind = constantPool[i] = pseudoStructureFactory.getConstantKind(input); + + // All 8-byte constants take up two entries in the constant_pool + if (constantKind instanceof ConstantLong || constantKind instanceof ConstantDouble) { + constantPool[++i] = null; + } + } + + accessFlags = input.readUnsignedShort(); + + /* + * Must be a valid index in the constant pool table to a ConstantClass structure, + * representing the class or interface defined by the class file + */ + thisClass = input.readUnsignedShort(); + superClass = input.readUnsignedShort(); + interfacesCount = input.readUnsignedShort(); + + interfaces = new int[interfacesCount]; + + for (var i = 0; i < interfacesCount; i++) { + interfaces[i] = input.readUnsignedShort(); + } + + fieldsCount = input.readUnsignedShort(); + + pseudoStructureFactory.setAttributeInfoFactory( + new AttributeInfoFactory(pseudoStructureFactory, this)); + + fields = new FieldInfo[fieldsCount]; + + for (var i = 0; i < fieldsCount; i++) { + fields[i] = new FieldInfo().read(input, pseudoStructureFactory); + } + + methodsCount = input.readUnsignedShort(); + + methods = new MethodInfo[methodsCount]; + + for (var i = 0; i < methodsCount; i++) { + methods[i] = new MethodInfo().read(input, pseudoStructureFactory); + } + + attributesCount = input.readUnsignedShort(); + + attributes = new PseudoStructure[attributesCount]; + + for (var i = 0; i < attributesCount; i++) { + attributes[i] = pseudoStructureFactory.getAttributeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedInt(magic); + output.writeUnsignedShort(minorVersion); + output.writeUnsignedShort(majorVersion); + output.writeUnsignedShort(constantPoolCount); + + for (var constant : constantPool) { + if (constant != null) { + constant.write(output); + } + } + + output.writeUnsignedShort(accessFlags); + output.writeUnsignedShort(thisClass); + output.writeUnsignedShort(superClass); + output.writeUnsignedShort(interfacesCount); + + for (var i : interfaces) { + output.writeUnsignedShort(i); + } + + output.writeUnsignedShort(fieldsCount); + + for (var field : fields) { + field.write(output); + } + + output.writeUnsignedShort(methodsCount); + + for (var method : methods) { + method.write(output); + } + + output.writeUnsignedShort(attributesCount); + + for (var attribute : attributes) { + if (attribute != null) { + attribute.write(output); + } + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/FieldInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/FieldInfo.java new file mode 100644 index 0000000..906bc7e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/FieldInfo.java @@ -0,0 +1,52 @@ +package com.github.wdestroier.chamomile.classfile; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FieldInfo implements PseudoStructure { + + private int accessFlags; + private int nameIndex; + private int descriptorIndex; + private int attributesCount; + private PseudoStructure[] attributes; + + @Override + public FieldInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + accessFlags = input.readUnsignedShort(); + nameIndex = input.readUnsignedShort(); + descriptorIndex = input.readUnsignedShort(); + attributesCount = input.readUnsignedShort(); + attributes = new PseudoStructure[attributesCount]; + + for (var i = 0; i < attributesCount; i++) { + attributes[i] = pseudoStructureFactory.getAttributeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(accessFlags); + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(descriptorIndex); + output.writeUnsignedShort(attributesCount); + + for (var attribute : attributes) { + if (attribute != null) { + attribute.write(output); + } + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/MethodInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/MethodInfo.java new file mode 100644 index 0000000..8ae6301 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/MethodInfo.java @@ -0,0 +1,52 @@ +package com.github.wdestroier.chamomile.classfile; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MethodInfo implements PseudoStructure { + + private int accessFlags; + private int nameIndex; + private int descriptorIndex; + private int attributesCount; + private PseudoStructure[] attributes; + + @Override + public MethodInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + accessFlags = input.readUnsignedShort(); + nameIndex = input.readUnsignedShort(); + descriptorIndex = input.readUnsignedShort(); + attributesCount = input.readUnsignedShort(); + attributes = new PseudoStructure[attributesCount]; + + for (var i = 0; i < attributesCount; i++) { + attributes[i] = pseudoStructureFactory.getAttributeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(accessFlags); + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(descriptorIndex); + output.writeUnsignedShort(attributesCount); + + for (var attribute : attributes) { + if (attribute != null) { + attribute.write(output); + } + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AnnotationDefaultAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AnnotationDefaultAttribute.java new file mode 100644 index 0000000..ff2e17e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AnnotationDefaultAttribute.java @@ -0,0 +1,38 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.ElementValue; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AnnotationDefaultAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private ElementValue defaultValue; + + @Override + public AnnotationDefaultAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + defaultValue = new ElementValue().read(input, pseudoStructureFactory); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + defaultValue.write(output); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfo.java new file mode 100644 index 0000000..3588d7e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfo.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AttributeInfo implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private short[] info; + + @Override + public AttributeInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + info = input.readUnsignedBytes((int) attributeLength); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedBytes(info); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfoFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfoFactory.java new file mode 100644 index 0000000..1c9ec97 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/AttributeInfoFactory.java @@ -0,0 +1,84 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import static java.util.Map.entry; + +import java.util.Map; +import java.util.function.BiFunction; + +import com.github.wdestroier.chamomile.classfile.ClassFile; +import com.github.wdestroier.chamomile.classfile.constantkind.ConstantUtf8; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; + +@AllArgsConstructor +public class AttributeInfoFactory { + + private PseudoStructureFactory pseudoStructureFactory; + private ClassFile classFile; + + private final Map>> attributeInfoByName = Map.ofEntries( + entry("ConstantValue", (t, u) -> new ConstantValueAttribute().read(t, u)), + entry("Code", (t, u) -> new CodeAttribute().read(t, u)), + entry("StackMapTable", (t, u) -> new StackMapTableAttribute().read(t, u)), + entry("Exceptions", (t, u) -> new ExceptionsAttribute().read(t, u)), + entry("InnerClasses", (t, u) -> new InnerClassesAttribute().read(t, u)), + entry("EnclosingMethod", (t, u) -> new EnclosingMethodAttribute().read(t, u)), + entry("Synthetic", (t, u) -> new SyntheticAttribute().read(t, u)), + entry("Signature", (t, u) -> new SignatureAttribute().read(t, u)), + entry("SourceFile", (t, u) -> new SourceFileAttribute().read(t, u)), + entry("SourceDebugExtension", (t, u) -> new SourceDebugExtensionAttribute().read(t, u)), + entry("LineNumberTable", (t, u) -> new LineNumberTableAttribute().read(t, u)), + entry("LocalVariableTable", (t, u) -> new LocalVariableTableAttribute().read(t, u)), + entry("LocalVariableTypeTable", (t, u) -> new LocalVariableTypeTableAttribute().read(t, u)), + entry("Deprecated", (t, u) -> new DeprecatedAttribute().read(t, u)), + entry("RuntimeVisibleAnnotations", (t, u) -> new RuntimeVisibleAnnotationsAttribute().read(t, u)), + entry("RuntimeInvisibleAnnotations", (t, u) -> new RuntimeInvisibleAnnotationsAttribute().read(t, u)), + entry("RuntimeVisibleParameterAnnotations", (t, u) -> new RuntimeVisibleParameterAnnotationsAttribute().read(t, u)), + entry("RuntimeInvisibleParameterAnnotations", (t, u) -> new RuntimeInvisibleParameterAnnotationsAttribute().read(t, u)), + entry("RuntimeVisibleTypeAnnotations", (t, u) -> new RuntimeVisibleTypeAnnotationsAttribute().read(t, u)), + entry("RuntimeInvisibleTypeAnnotations", (t, u) -> new RuntimeInvisibleTypeAnnotationsAttribute().read(t, u)), + entry("AnnotationDefault", (t, u) -> new AnnotationDefaultAttribute().read(t, u)), + entry("BootstrapMethods", (t, u) -> new BootstrapMethodsAttribute().read(t, u)), + entry("MethodParameters", (t, u) -> new MethodParametersAttribute().read(t, u)), + entry("Module", (t, u) -> new ModuleAttribute().read(t, u)), + entry("ModulePackages", (t, u) -> new ModulePackagesAttribute().read(t, u)), + entry("ModuleMainClass", (t, u) -> new ModuleMainClassAttribute().read(t, u)), + entry("NestHost", (t, u) -> new NestHostAttribute().read(t, u)), + entry("NestMembers", (t, u) -> new NestMembersAttribute().read(t, u))); + + @SneakyThrows + public PseudoStructure getAttributeInfo(MultiEndianInputStream input) { + return attributeInfoByName.getOrDefault(getAttributeName(input), + (t, u) -> new AttributeInfo().read(t, u)).apply(input, pseudoStructureFactory); + } + + @SneakyThrows + private String getAttributeName(MultiEndianInputStream input) { + // TODO The attributes need to be read in a better way to guarantee + // that the class will be read successfully. The problem lives in + // how to read an attribute and assign it to a class safely. + + //if (Boolean.TRUE) { return ""; } + + var attributeNameIndex = input.readUnsignedShort(); + input.unreadUnsignedShort(attributeNameIndex); + + String attributeName = ""; + + var constantPoolLength = classFile.getConstantPool().length; + if (attributeNameIndex >= 0 && attributeNameIndex <= constantPoolLength) { + var attributeNameConstant = classFile.getConstantPool()[attributeNameIndex]; + if (attributeNameConstant instanceof ConstantUtf8) { + var attributeNameUtf8 = (ConstantUtf8) attributeNameConstant; + attributeName = attributeNameUtf8.getBytesString(); + } + } + + return attributeName; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/BootstrapMethodsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/BootstrapMethodsAttribute.java new file mode 100644 index 0000000..2083190 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/BootstrapMethodsAttribute.java @@ -0,0 +1,81 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BootstrapMethodsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numBootstrapMethods; + private BootstrapMethod[] bootstrapMethods; + + @Override + public BootstrapMethodsAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numBootstrapMethods = input.readUnsignedShort(); + bootstrapMethods = new BootstrapMethod[numBootstrapMethods]; + + for (var i = 0; i < numBootstrapMethods; i++) { + bootstrapMethods[i] = new BootstrapMethod().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numBootstrapMethods); + + for (var bootstrapMethod : bootstrapMethods) { + bootstrapMethod.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class BootstrapMethod implements PseudoStructure { + + private int bootstrapMethodRef; + private int numBootstrapArguments; + private int[] bootstrapArguments; + + @Override + public BootstrapMethod read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + bootstrapMethodRef = input.readUnsignedShort(); + numBootstrapArguments = input.readUnsignedShort(); + bootstrapArguments = new int[numBootstrapArguments]; + + for (var i = 0; i < numBootstrapArguments; i++) { + bootstrapArguments[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(bootstrapMethodRef); + output.writeUnsignedShort(numBootstrapArguments); + + for (var bootstrapArgument : bootstrapArguments) { + output.writeUnsignedShort(bootstrapArgument); + } + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/CodeAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/CodeAttribute.java new file mode 100644 index 0000000..d727315 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/CodeAttribute.java @@ -0,0 +1,119 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CodeAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int maxStack; + private int maxLocals; + private long codeLength; + private short[] code; + private int exceptionTableLength; + private ExceptionHandler[] exceptionTable; + private int attributesCount; + private Object[] attributes; + + @Override + public CodeAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + maxStack = input.readUnsignedShort(); + maxLocals = input.readUnsignedShort(); + codeLength = input.readUnsignedInt(); + code = input.readUnsignedBytes((int) codeLength); + exceptionTableLength = input.readUnsignedShort(); + exceptionTable = new ExceptionHandler[exceptionTableLength]; + + for (var i = 0; i < exceptionTableLength; i++) { + exceptionTable[i] = new ExceptionHandler().read(input, pseudoStructureFactory); + } + + attributesCount = input.readUnsignedShort(); + attributes = new Object[attributesCount]; + + for (var i = 0; i < attributesCount; i++) { + attributes[i] = pseudoStructureFactory.getAttributeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(maxStack); + output.writeUnsignedShort(maxLocals); + output.writeUnsignedInt(codeLength); + output.writeUnsignedBytes(code); + + output.writeUnsignedShort(exceptionTableLength); + + for (var exceptionHandler : exceptionTable) { + exceptionHandler.write(output); + } + + output.writeUnsignedShort(attributesCount); + + for (var attribute : attributes) { + ((PseudoStructure) attribute).write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ExceptionHandler implements PseudoStructure { + + /** + * Must be a valid index into the code array of the opcode of an instruction. + * The value of startPc must be less than the value of endPc. + */ + private int startPc; + + /** + * Must also be a valid index into the code array of the opcode of an instruction + * or must be equal to the code array length. + */ + private int endPc; + + /** + * Must be a valid index into the code array and must be the index of the opcode + * of an instruction. Indicates the start of the exception handler. + */ + private int handlerPc; + private int catchType; + + @Override + public ExceptionHandler read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + startPc = input.readUnsignedShort(); + endPc = input.readUnsignedShort(); + handlerPc = input.readUnsignedShort(); + catchType = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(startPc); + output.writeUnsignedShort(endPc); + output.writeUnsignedShort(handlerPc); + output.writeUnsignedShort(catchType); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ConstantValueAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ConstantValueAttribute.java new file mode 100644 index 0000000..3e2d58c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ConstantValueAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantValueAttribute implements PseudoStructure { + + /** + * Must be a valid index into the constant pool to a ConstantUtf8 structure + * representing the String "ConstantValue" + */ + private int attributeNameIndex; + + /** + * This value must be 2. + */ + private long attributeLength; + + /** + * Must be a valid index into the constant pool table to the appropriated type + */ + private int constantValueIndex; + + @Override + public ConstantValueAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + constantValueIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(constantValueIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/DeprecatedAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/DeprecatedAttribute.java new file mode 100644 index 0000000..5717017 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/DeprecatedAttribute.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeprecatedAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + + @Override + public DeprecatedAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/EnclosingMethodAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/EnclosingMethodAttribute.java new file mode 100644 index 0000000..1689b8c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/EnclosingMethodAttribute.java @@ -0,0 +1,45 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EnclosingMethodAttribute implements PseudoStructure { + + private int attributeNameIndex; + + /** + * The value of the attribute length must be four. + */ + private long attributeLength; + + private int classIndex; + private int methodIndex; + + @Override + public EnclosingMethodAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + classIndex = input.readUnsignedShort(); + methodIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(classIndex); + output.writeUnsignedShort(methodIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ExceptionsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ExceptionsAttribute.java new file mode 100644 index 0000000..687114b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ExceptionsAttribute.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ExceptionsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numberOfExceptions; + private int[] exceptionIndexTable; + + @Override + public ExceptionsAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numberOfExceptions = input.readUnsignedShort(); + exceptionIndexTable = new int[numberOfExceptions]; + + for (var i = 0; i < numberOfExceptions; i++) { + exceptionIndexTable[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numberOfExceptions); + + for (var exceptionIndex : exceptionIndexTable) { + output.writeUnsignedShort(exceptionIndex); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/InnerClassesAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/InnerClassesAttribute.java new file mode 100644 index 0000000..6c08349 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/InnerClassesAttribute.java @@ -0,0 +1,77 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InnerClassesAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numberOfClasses; + private InnerClass[] classes; + + @Override + public InnerClassesAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numberOfClasses = input.readUnsignedShort(); + classes = new InnerClass[numberOfClasses]; + + for (var i = 0; i < numberOfClasses; i++) { + classes[i] = new InnerClass().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numberOfClasses); + + for (var innerClass : classes) { + innerClass.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class InnerClass implements PseudoStructure { + + private long innerClassInfoIndex; + private int outerClassInfoIndex; + private int innerNameIndex; + private int innerClassAccessFlags; + + @Override + public InnerClass read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + innerClassInfoIndex = input.readUnsignedInt(); + outerClassInfoIndex = input.readUnsignedShort(); + innerNameIndex = input.readUnsignedShort(); + innerClassAccessFlags = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedInt(innerClassInfoIndex); + output.writeUnsignedShort(outerClassInfoIndex); + output.writeUnsignedShort(innerNameIndex); + output.writeUnsignedShort(innerClassAccessFlags); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LineNumberTableAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LineNumberTableAttribute.java new file mode 100644 index 0000000..1be2170 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LineNumberTableAttribute.java @@ -0,0 +1,71 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LineNumberTableAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int lineNumberTableLength; + private LineNumber[] lineNumberTable; + + @Override + public LineNumberTableAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + lineNumberTableLength = input.readUnsignedShort(); + lineNumberTable = new LineNumber[lineNumberTableLength]; + + for (var i = 0; i < lineNumberTableLength; i++) { + lineNumberTable[i] = new LineNumber().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(lineNumberTableLength); + + for (var lineNumber : lineNumberTable) { + lineNumber.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class LineNumber implements PseudoStructure { + + private int startPc; + private int lineNumber; + + @Override + public LineNumber read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + startPc = input.readUnsignedShort(); + lineNumber = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(startPc); + output.writeUnsignedShort(lineNumber); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTableAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTableAttribute.java new file mode 100644 index 0000000..d38748e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTableAttribute.java @@ -0,0 +1,80 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LocalVariableTableAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int localVariableTableLength; + private LocalVariable[] localVariableTable; + + @Override + public LocalVariableTableAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + localVariableTableLength = input.readUnsignedShort(); + localVariableTable = new LocalVariable[localVariableTableLength]; + + for (var i = 0; i < localVariableTableLength; i++) { + localVariableTable[i] = new LocalVariable().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(localVariableTableLength); + + for (var localVariable : localVariableTable) { + localVariable.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class LocalVariable implements PseudoStructure { + + private int startPc; + private int length; + private int nameIndex; + private int descriptorIndex; + private int index; + + @Override + public LocalVariable read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + startPc = input.readUnsignedShort(); + length = input.readUnsignedShort(); + nameIndex = input.readUnsignedShort(); + descriptorIndex = input.readUnsignedShort(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(startPc); + output.writeUnsignedShort(length); + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(descriptorIndex); + output.writeUnsignedShort(index); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTypeTableAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTypeTableAttribute.java new file mode 100644 index 0000000..25722ca --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/LocalVariableTypeTableAttribute.java @@ -0,0 +1,80 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LocalVariableTypeTableAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int localVariableTypeTableLength; + private LocalVariableType[] localVariableTypeTable; + + @Override + public LocalVariableTypeTableAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + localVariableTypeTableLength = input.readUnsignedShort(); + localVariableTypeTable = new LocalVariableType[localVariableTypeTableLength]; + + for (var i = 0; i < attributeLength; i++) { + localVariableTypeTable[i] = new LocalVariableType().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(localVariableTypeTableLength); + + for (var localVariableType : localVariableTypeTable) { + localVariableType.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class LocalVariableType implements PseudoStructure { + + private int startPc; + private int length; + private int nameIndex; + private int signatureIndex; + private int index; + + @Override + public LocalVariableType read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + startPc = input.readUnsignedShort(); + length = input.readUnsignedShort(); + nameIndex = input.readUnsignedShort(); + signatureIndex = input.readUnsignedShort(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(startPc); + output.writeUnsignedShort(length); + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(signatureIndex); + output.writeUnsignedShort(index); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/MethodParametersAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/MethodParametersAttribute.java new file mode 100644 index 0000000..67d4d28 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/MethodParametersAttribute.java @@ -0,0 +1,71 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MethodParametersAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private short parametersCount; + private Parameter[] parameters; + + @Override + public MethodParametersAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + parametersCount = input.readUnsignedByte(); + parameters = new Parameter[parametersCount]; + + for (var i = 0; i < parametersCount; i++) { + parameters[i] = new Parameter().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(attributeNameIndex); + + for (var parameter : parameters) { + parameter.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Parameter implements PseudoStructure { + + private int nameIndex; + private int accessFlags; + + @Override + public Parameter read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + nameIndex = input.readUnsignedShort(); + accessFlags = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(accessFlags); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleAttribute.java new file mode 100644 index 0000000..07563c8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleAttribute.java @@ -0,0 +1,130 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.module.Exports; +import com.github.wdestroier.chamomile.classfile.attributeinfo.module.Opens; +import com.github.wdestroier.chamomile.classfile.attributeinfo.module.Provides; +import com.github.wdestroier.chamomile.classfile.attributeinfo.module.Requires; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ModuleAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + + private int moduleNameIndex; + private int moduleFlags; + private int moduleVersionIndex; + + private int requiresCount; + private Requires[] requires; + + private int exportsCount; + private Exports[] exports; + + private int opensCount; + private Opens[] opens; + + private int usesCount; + private int[] usesIndex; + + private int providesCount; + private Provides[] provides; + + @Override + public ModuleAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + + moduleNameIndex = input.readUnsignedShort(); + moduleFlags = input.readUnsignedShort(); + moduleVersionIndex = input.readUnsignedShort(); + + requiresCount = input.readUnsignedShort(); + requires = new Requires[requiresCount]; + + for (var i = 0; i < requiresCount; i++) { + requires[i] = new Requires().read(input, pseudoStructureFactory); + } + + exportsCount = input.readUnsignedShort(); + exports = new Exports[exportsCount]; + + for (var i = 0; i < exportsCount; i++) { + exports[i] = new Exports().read(input, pseudoStructureFactory); + } + + opensCount = input.readUnsignedShort(); + opens = new Opens[opensCount]; + + for (var i = 0; i < opensCount; i++) { + opens[i] = new Opens().read(input, pseudoStructureFactory); + } + + usesCount = input.readUnsignedShort(); + usesIndex = new int[usesCount]; + + for (var i = 0; i < usesCount; i++) { + usesIndex[i] = input.readUnsignedShort(); + } + + providesCount = input.readUnsignedShort(); + provides = new Provides[providesCount]; + + for (var i = 0; i < providesCount; i++) { + provides[i] = new Provides().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + + output.writeUnsignedShort(moduleNameIndex); + output.writeUnsignedShort(moduleFlags); + output.writeUnsignedShort(moduleVersionIndex); + + output.writeUnsignedShort(requiresCount); + + for (var r : requires) { + r.write(output); + } + + output.writeUnsignedShort(exportsCount); + + for (var e : exports) { + e.write(output); + } + + output.writeUnsignedShort(opensCount); + + for (var o : opens) { + o.write(output); + } + + output.writeUnsignedShort(usesCount); + + for (var i : usesIndex) { + output.writeUnsignedShort(i); + } + + output.writeUnsignedShort(providesCount); + + for (var p : provides) { + p.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleMainClassAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleMainClassAttribute.java new file mode 100644 index 0000000..26cd2a3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModuleMainClassAttribute.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ModuleMainClassAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int mainClassIndex; + + @Override + public ModuleMainClassAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + mainClassIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(mainClassIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModulePackagesAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModulePackagesAttribute.java new file mode 100644 index 0000000..b520bf7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/ModulePackagesAttribute.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ModulePackagesAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int packageCount; + private int[] packageIndex; + + @Override + public ModulePackagesAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + packageCount = input.readUnsignedShort(); + packageIndex = new int[packageCount]; + + for (var i = 0; i < packageCount; i++) { + packageIndex[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(packageCount); + + for (var i : packageIndex) { + output.writeUnsignedShort(i); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestHostAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestHostAttribute.java new file mode 100644 index 0000000..d53a289 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestHostAttribute.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NestHostAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int hostClassIndex; + + @Override + public NestHostAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + hostClassIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(hostClassIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestMembersAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestMembersAttribute.java new file mode 100644 index 0000000..b9c6d01 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/NestMembersAttribute.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NestMembersAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numberOfClasses; + private int[] classes; + + @Override + public NestMembersAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numberOfClasses = input.readUnsignedShort(); + classes = new int[numberOfClasses]; + + for (var i = 0; i < numberOfClasses; i++) { + classes[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numberOfClasses); + + for (var c : classes) { + output.writeUnsignedShort(c); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleAnnotationsAttribute.java new file mode 100644 index 0000000..976789f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleAnnotationsAttribute.java @@ -0,0 +1,48 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.Annotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeInvisibleAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numAnnotations; + private Annotation[] annotations; + + @Override + public RuntimeInvisibleAnnotationsAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numAnnotations = input.readUnsignedShort(); + annotations = new Annotation[numAnnotations]; + + for (var i = 0; i < numAnnotations; i++) { + annotations[i] = new Annotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numAnnotations); + + for (var annotation : annotations) { + annotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleParameterAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleParameterAnnotationsAttribute.java new file mode 100644 index 0000000..71432c1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleParameterAnnotationsAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.ParameterAnnotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeInvisibleParameterAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private short numParameters; + private ParameterAnnotation[] parameterAnnotations; + + @Override + public RuntimeInvisibleParameterAnnotationsAttribute read(MultiEndianInputStream input, + PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numParameters = input.readUnsignedByte(); + parameterAnnotations = new ParameterAnnotation[numParameters]; + + for (var i = 0; i < numParameters; i++) { + parameterAnnotations[i] = new ParameterAnnotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedByte(numParameters); + + for (var parameterAnnotation : parameterAnnotations) { + parameterAnnotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleTypeAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleTypeAnnotationsAttribute.java new file mode 100644 index 0000000..28660b2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeInvisibleTypeAnnotationsAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.TypeAnnotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeInvisibleTypeAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numAnnotations; + private TypeAnnotation[] annotations; + + @Override + public RuntimeInvisibleTypeAnnotationsAttribute read(MultiEndianInputStream input, + PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numAnnotations = input.readUnsignedShort(); + annotations = new TypeAnnotation[numAnnotations]; + + for (var i = 0; i < numAnnotations; i++) { + annotations[i] = new TypeAnnotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numAnnotations); + + for (var annotation : annotations) { + annotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleAnnotationsAttribute.java new file mode 100644 index 0000000..7f60482 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleAnnotationsAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.Annotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeVisibleAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numAnnotations; + private Annotation[] annotations; + + @Override + public RuntimeVisibleAnnotationsAttribute read(MultiEndianInputStream input, + PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numAnnotations = input.readUnsignedShort(); + annotations = new Annotation[numAnnotations]; + + for (var i = 0; i < numAnnotations; i++) { + annotations[i] = new Annotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numAnnotations); + + for (var annotation : annotations) { + annotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleParameterAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleParameterAnnotationsAttribute.java new file mode 100644 index 0000000..65b5b3e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleParameterAnnotationsAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.ParameterAnnotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeVisibleParameterAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private short numParameters; + private ParameterAnnotation[] parameterAnnotations; + + @Override + public RuntimeVisibleParameterAnnotationsAttribute read(MultiEndianInputStream input, + PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numParameters = input.readUnsignedByte(); + parameterAnnotations = new ParameterAnnotation[numParameters]; + + for (var i = 0; i < numParameters; i++) { + parameterAnnotations[i] = new ParameterAnnotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedByte(numParameters); + + for (var parameterAnnotation : parameterAnnotations) { + parameterAnnotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleTypeAnnotationsAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleTypeAnnotationsAttribute.java new file mode 100644 index 0000000..2b477da --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/RuntimeVisibleTypeAnnotationsAttribute.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.TypeAnnotation; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RuntimeVisibleTypeAnnotationsAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numAnnotations; + private TypeAnnotation[] annotations; + + @Override + public RuntimeVisibleTypeAnnotationsAttribute read(MultiEndianInputStream input, + PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numAnnotations = input.readUnsignedShort(); + annotations = new TypeAnnotation[numAnnotations]; + + for (var i = 0; i < numAnnotations; i++) { + annotations[i] = new TypeAnnotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numAnnotations); + + for (var annotation : annotations) { + annotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SignatureAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SignatureAttribute.java new file mode 100644 index 0000000..a4a79b7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SignatureAttribute.java @@ -0,0 +1,41 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SignatureAttribute implements PseudoStructure { + + private int attributeNameIndex; + + /** + * The value of the attribute length must be 2. + */ + private long attributeLength; + private int signatureIndex; + + @Override + public SignatureAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + signatureIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(signatureIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceDebugExtensionAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceDebugExtensionAttribute.java new file mode 100644 index 0000000..22549e1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceDebugExtensionAttribute.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SourceDebugExtensionAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + + /** + * Holds extended debugging information which has no semantic effect on the JVM. + * The information is represented using a modified UTF-8 string with no + * terminating zero byte. It may denote a string longer than that which can be + * represented with an instance of the String class. + * + * https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method/42289203#:~:text=String%20is%20considered%20as%20char,String%20in%20java%20is%202147483647. + */ + private short[] debugExtension; + + @Override + public SourceDebugExtensionAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + debugExtension = input.readUnsignedBytes((int) attributeLength); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedBytes(debugExtension); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceFileAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceFileAttribute.java new file mode 100644 index 0000000..6de2e52 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SourceFileAttribute.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SourceFileAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int sourceFileIndex; + + @Override + public SourceFileAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + sourceFileIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(sourceFileIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/StackMapTableAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/StackMapTableAttribute.java new file mode 100644 index 0000000..4bdc537 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/StackMapTableAttribute.java @@ -0,0 +1,48 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.StackMapFrame; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class StackMapTableAttribute implements PseudoStructure { + + private int attributeNameIndex; + private long attributeLength; + private int numberOfEntries; + private StackMapFrame[] entries; + + @Override + public StackMapTableAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + numberOfEntries = input.readUnsignedShort(); + entries = new StackMapFrame[numberOfEntries]; + + for (var i = 0; i < numberOfEntries; i++) { + entries[i] = pseudoStructureFactory.getStackMapFrame(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + output.writeUnsignedShort(numberOfEntries); + + for (var entry : entries) { + entry.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SyntheticAttribute.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SyntheticAttribute.java new file mode 100644 index 0000000..db3fa7c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/SyntheticAttribute.java @@ -0,0 +1,38 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SyntheticAttribute implements PseudoStructure { + + private int attributeNameIndex; + + /** + * The value of the attribute length must be 0. + */ + private long attributeLength; + + @Override + public SyntheticAttribute read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + attributeNameIndex = input.readUnsignedShort(); + attributeLength = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(attributeNameIndex); + output.writeUnsignedInt(attributeLength); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Annotation.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Annotation.java new file mode 100644 index 0000000..303633b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Annotation.java @@ -0,0 +1,44 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Annotation implements PseudoStructure { + + private int typeIndex; + private int numElementValuePairs; + private ElementValuePair[] elementValuePairs; + + @Override + public Annotation read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + typeIndex = input.readUnsignedShort(); + numElementValuePairs = input.readUnsignedShort(); + elementValuePairs = new ElementValuePair[numElementValuePairs]; + + for (var i = 0; i < numElementValuePairs; i++) { + elementValuePairs[i] = new ElementValuePair().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(typeIndex); + output.writeUnsignedShort(numElementValuePairs); + + for (var elementValuePair : elementValuePairs) { + elementValuePair.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ArrayValue.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ArrayValue.java new file mode 100644 index 0000000..ef22097 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ArrayValue.java @@ -0,0 +1,41 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ArrayValue implements PseudoStructure { + + private int numValues; + private ElementValue[] values; + + @Override + public ArrayValue read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + numValues = input.readUnsignedShort(); + values = new ElementValue[numValues]; + + for (var i = 0; i < numValues; i++) { + values[i] = new ElementValue().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(numValues); + + for (var value : values) { + value.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValue.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValue.java new file mode 100644 index 0000000..60f8e8a --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValue.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ElementValue implements PseudoStructure { + + private short tag; + private Value value; + + @Override + public ElementValue read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + input.unreadUnsignedByte(tag); + value = pseudoStructureFactory.getValue(input); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + value.write(output); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValuePair.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValuePair.java new file mode 100644 index 0000000..551200d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ElementValuePair.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ElementValuePair implements PseudoStructure { + + private int elementNameIndex; + private ElementValue value; + + @Override + public ElementValuePair read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + elementNameIndex = input.readUnsignedShort(); + value = new ElementValue().read(input, pseudoStructureFactory); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(elementNameIndex); + value.write(output); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/EnumConstValue.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/EnumConstValue.java new file mode 100644 index 0000000..e6f9df3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/EnumConstValue.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EnumConstValue implements PseudoStructure { + + private int typeNameIndex; + private int constNameIndex; + + @Override + public EnumConstValue read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + typeNameIndex = input.readUnsignedShort(); + constNameIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedInt(typeNameIndex); + output.writeUnsignedInt(constNameIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ParameterAnnotation.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ParameterAnnotation.java new file mode 100644 index 0000000..bcff17c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ParameterAnnotation.java @@ -0,0 +1,41 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ParameterAnnotation implements PseudoStructure { + + private int numAnnotations; + private Annotation[] annotations; + + @Override + public ParameterAnnotation read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + numAnnotations = input.readUnsignedShort(); + annotations = new Annotation[numAnnotations]; + + for (var i = 0; i < numAnnotations; i++) { + annotations[i] = new Annotation().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedInt(numAnnotations); + + for (var annotation : annotations) { + annotation.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Path.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Path.java new file mode 100644 index 0000000..81fb288 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Path.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Path implements PseudoStructure { + + private short typePathKind; + private short typeArgumentIndex; + + @Override + public Path read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + typePathKind = input.readUnsignedByte(); + typeArgumentIndex = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(typePathKind); + output.writeUnsignedByte(typeArgumentIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfo.java new file mode 100644 index 0000000..f58ae16 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfo.java @@ -0,0 +1,208 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target.*; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.Data; + +/** + * This class is an union type. Only 1 field is used at the time. + */ +@Data +public class TargetInfo implements PseudoStructure { + + private TypeParameterTarget typeParameterTarget; + private SupertypeTarget supertypeTarget; + private TypeParameterBoundTarget typeParameterBoundTarget; + private EmptyTarget emptyTarget; + private FormalParameterTarget formalParameterTarget; + private ThrowsTarget throwsTarget; + private LocalvarTarget localvarTarget; + private CatchTarget catchTarget; + private OffsetTarget offsetTarget; + private TypeArgumentTarget typeArgumentTarget; + + @Override + public TargetInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + return pseudoStructureFactory.getTargetInfo(input); + } + + @Override + public void write(MultiEndianOutputStream output) { + if (typeParameterTarget != null) { + typeParameterTarget.write(output); + } else if (supertypeTarget != null) { + supertypeTarget.write(output); + } else if (typeParameterBoundTarget != null) { + typeParameterBoundTarget.write(output); + } else if (emptyTarget != null) { + emptyTarget.write(output); + } else if (formalParameterTarget != null) { + formalParameterTarget.write(output); + } else if (throwsTarget != null) { + throwsTarget.write(output); + } else if (localvarTarget != null) { + localvarTarget.write(output); + } else if (catchTarget != null) { + catchTarget.write(output); + } else if (offsetTarget != null) { + offsetTarget.write(output); + } else if (typeArgumentTarget != null) { + typeArgumentTarget.write(output); + } + } + + public TargetInfo setTypeParameterTarget(TypeParameterTarget typeParameterTarget) { + this.typeParameterTarget = typeParameterTarget; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setSupertypeTarget(SupertypeTarget supertypeTarget) { + typeParameterTarget = null; + this.supertypeTarget = supertypeTarget; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setTypeParameterBoundTarget(TypeParameterBoundTarget typeParameterBoundTarget) { + typeParameterTarget = null; + supertypeTarget = null; + this.typeParameterBoundTarget = typeParameterBoundTarget; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setEmptyTarget(EmptyTarget emptyTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + this.emptyTarget = emptyTarget; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setFormalParameterTarget(FormalParameterTarget formalParameterTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + this.formalParameterTarget = formalParameterTarget; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setThrowsTarget(ThrowsTarget throwsTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + this.throwsTarget = throwsTarget; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setLocalvarTarget(LocalvarTarget localvarTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + this.localvarTarget = localvarTarget; + catchTarget = null; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setCatchTarget(CatchTarget catchTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + this.catchTarget = catchTarget; + offsetTarget = null; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setOffsetTarget(OffsetTarget offsetTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + this.offsetTarget = offsetTarget; + typeArgumentTarget = null; + + return this; + } + + public TargetInfo setTypeArgumentTarget(TypeArgumentTarget typeArgumentTarget) { + typeParameterTarget = null; + supertypeTarget = null; + typeParameterBoundTarget = null; + emptyTarget = null; + formalParameterTarget = null; + throwsTarget = null; + localvarTarget = null; + catchTarget = null; + offsetTarget = null; + this.typeArgumentTarget = typeArgumentTarget; + + return this; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfoFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfoFactory.java new file mode 100644 index 0000000..d7595c3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TargetInfoFactory.java @@ -0,0 +1,85 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target.*; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@NoArgsConstructor +@AllArgsConstructor +public class TargetInfoFactory { + + private PseudoStructureFactory pseudoStructureFactory; + + //TODO Should this factory be removed and put in the TargetInfo#read() method? + @SneakyThrows + public TargetInfo getTargetInfo(MultiEndianInputStream data) { + var targetInfo = new TargetInfo(); + var targetType = data.readUnsignedByte(); + + switch (targetType) { + case 0x00: + case 0x01: + var typeParameterTarget = new TypeParameterTarget().read(data, pseudoStructureFactory); + targetInfo.setTypeParameterTarget(typeParameterTarget); + break; + case 0x10: + var supertypeTarget = new SupertypeTarget().read(data, pseudoStructureFactory); + targetInfo.setSupertypeTarget(supertypeTarget); + break; + case 0x11: + case 0x12: + var typeParameterBoundTarget = new TypeParameterBoundTarget().read(data, pseudoStructureFactory); + targetInfo.setTypeParameterBoundTarget(typeParameterBoundTarget); + break; + case 0x13: + case 0x14: + case 0x15: + var emptyTarget = new EmptyTarget().read(data, pseudoStructureFactory); + targetInfo.setEmptyTarget(emptyTarget); + break; + case 0x16: + var formalParameterTarget = new FormalParameterTarget().read(data, pseudoStructureFactory); + targetInfo.setFormalParameterTarget(formalParameterTarget); + break; + case 0x17: + var throwsTarget = new ThrowsTarget().read(data, pseudoStructureFactory); + targetInfo.setThrowsTarget(throwsTarget); + break; + case 0x40: + case 0x41: + var localvarTarget = new LocalvarTarget().read(data, pseudoStructureFactory); + targetInfo.setLocalvarTarget(localvarTarget); + break; + case 0x42: + var catchTarget = new CatchTarget().read(data, pseudoStructureFactory); + targetInfo.setCatchTarget(catchTarget); + break; + case 0x43: + case 0x44: + case 0x45: + case 0x46: + var offsetTarget = new OffsetTarget().read(data, pseudoStructureFactory); + targetInfo.setOffsetTarget(offsetTarget); + break; + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + var typeArgumentTarget = new TypeArgumentTarget().read(data, pseudoStructureFactory); + targetInfo.setTypeArgumentTarget(typeArgumentTarget); + break; + default: + // Should it return a TargetInfo without fields set? + targetInfo = null; + break; + } + + return targetInfo; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypeAnnotation.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypeAnnotation.java new file mode 100644 index 0000000..b6c813e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypeAnnotation.java @@ -0,0 +1,54 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TypeAnnotation implements PseudoStructure { + + private short targetType; + private TargetInfo targetInfo; + private TypePath targetPath; + private int typeIndex; + private int numElementValuePairs; + private ElementValuePair[] elementValuePairs; + + @Override + public TypeAnnotation read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + targetType = input.readUnsignedByte(); + input.unreadUnsignedByte(targetType); + targetInfo = pseudoStructureFactory.getTargetInfo(input); + targetPath = new TypePath().read(input, pseudoStructureFactory); + typeIndex = input.readUnsignedShort(); + numElementValuePairs = input.readUnsignedShort(); + elementValuePairs = new ElementValuePair[numElementValuePairs]; + + for (var i = 0; i < numElementValuePairs; i++) { + elementValuePairs[i] = new ElementValuePair().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(targetType); + targetInfo.write(output); + targetPath.write(output); + output.writeUnsignedShort(typeIndex); + output.writeUnsignedShort(numElementValuePairs); + + for (var elementValuePair : elementValuePairs) { + elementValuePair.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypePath.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypePath.java new file mode 100644 index 0000000..b666ad6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/TypePath.java @@ -0,0 +1,41 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TypePath implements PseudoStructure { + + private short pathLength; + private Path[] path; + + @Override + public TypePath read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + pathLength = input.readUnsignedByte(); + path = new Path[pathLength]; + + for (var i = 0; i < pathLength; i++) { + path[i] = new Path().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(pathLength); + + for (var p : path) { + p.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Value.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Value.java new file mode 100644 index 0000000..0101004 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/Value.java @@ -0,0 +1,98 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.Data; + +/** + * This class is an union type. Only 1 field is used at the time. + */ +@Data +public class Value implements PseudoStructure { + + /** + * Must be a valid index in the constant pool table. The entry at this index + * must be of a type appropriate to the tag. (String = ConstantUtf8, Integer = + * ConstantInteger ...) + */ + private Integer constValueIndex; + + private EnumConstValue enumConstValue; + private Integer classInfoIndex; + private Annotation annotationValue; + private ArrayValue arrayValue; + + @Override + public Value read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + return pseudoStructureFactory.getValue(input); + } + + @Override + public void write(MultiEndianOutputStream output) { + if (constValueIndex != null) { + output.writeUnsignedShort(constValueIndex); + } else if (enumConstValue != null) { + enumConstValue.write(output); + } else if (enumConstValue != null) { + output.writeUnsignedShort(classInfoIndex); + } else if (enumConstValue != null) { + annotationValue.write(output); + } else if (enumConstValue != null) { + arrayValue.write(output); + } + } + + public Value setConstValueIndex(int constValueIndex) { + this.constValueIndex = constValueIndex; + enumConstValue = null; + classInfoIndex = null; + annotationValue = null; + arrayValue = null; + + return this; + } + + public Value setEnumConstValue(EnumConstValue enumConstValue) { + constValueIndex = null; + this.enumConstValue = enumConstValue; + classInfoIndex = null; + annotationValue = null; + arrayValue = null; + + return this; + } + + public Value setClassInfoIndex(int classInfoIndex) { + constValueIndex = null; + enumConstValue = null; + this.classInfoIndex = classInfoIndex; + annotationValue = null; + arrayValue = null; + + return this; + } + + public Value setAnnotationValue(Annotation annotationValue) { + constValueIndex = null; + enumConstValue = null; + classInfoIndex = null; + this.annotationValue = annotationValue; + arrayValue = null; + + return this; + } + + public Value setArrayValue(ArrayValue arrayValue) { + constValueIndex = null; + enumConstValue = null; + classInfoIndex = null; + annotationValue = null; + this.arrayValue = arrayValue; + + return this; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ValueFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ValueFactory.java new file mode 100644 index 0000000..eae5f5a --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/ValueFactory.java @@ -0,0 +1,60 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@NoArgsConstructor +@AllArgsConstructor +public class ValueFactory { + + private PseudoStructureFactory pseudoStructureFactory; + + //TODO Should this factory be removed and put in the Value#read() method? + @SneakyThrows + public Value getValue(MultiEndianInputStream input) { + var value = new Value(); + var tag = input.readUnsignedByte(); + + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 's': + var constValueIndex = input.readUnsignedShort(); + value.setConstValueIndex(constValueIndex); + break; + case 'e': + var enumConstValue = new EnumConstValue().read(input, pseudoStructureFactory); + value.setEnumConstValue(enumConstValue); + break; + case 'c': + var classInfoIndex = input.readUnsignedShort(); + value.setClassInfoIndex(classInfoIndex); + break; + case '@': + var annotationValue = new Annotation().read(input, pseudoStructureFactory); // I guess the factory can't be null + value.setAnnotationValue(annotationValue); + break; + case '[': + var arrayValue = new ArrayValue().read(input, pseudoStructureFactory); + value.setArrayValue(arrayValue); + break; + default: + // Should it return a Value with no field set? + value = null; + break; + } + + return value; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/CatchTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/CatchTarget.java new file mode 100644 index 0000000..9093691 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/CatchTarget.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CatchTarget implements PseudoStructure { + + private int exceptionTableIndex; + + @Override + public CatchTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + exceptionTableIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(exceptionTableIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/EmptyTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/EmptyTarget.java new file mode 100644 index 0000000..e27e5e2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/EmptyTarget.java @@ -0,0 +1,21 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class EmptyTarget implements PseudoStructure { + + @Override + public EmptyTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + return this; + } + + @Override + public void write(MultiEndianOutputStream output) {} + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/FormalParameterTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/FormalParameterTarget.java new file mode 100644 index 0000000..f083859 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/FormalParameterTarget.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FormalParameterTarget implements PseudoStructure { + + private short formalParameterIndex; + + @Override + public FormalParameterTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + formalParameterIndex = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(formalParameterIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/LocalvarTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/LocalvarTarget.java new file mode 100644 index 0000000..0b55bdd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/LocalvarTarget.java @@ -0,0 +1,68 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LocalvarTarget implements PseudoStructure { + + private int tableLength; + private Table[] table; + + @Override + public LocalvarTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tableLength = input.readUnsignedShort(); + table = new Table[tableLength]; + + for (var i = 0; i < tableLength; i++) { + table[i] = new Table().read(input, pseudoStructureFactory); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(tableLength); + + for (var t : table) { + t.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Table implements PseudoStructure { + + private int startPc; + private int length; + private int index; + + @Override + public Table read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + startPc = input.readUnsignedShort(); + length = input.readUnsignedShort(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(startPc); + output.writeUnsignedShort(length); + output.writeUnsignedShort(index); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/OffsetTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/OffsetTarget.java new file mode 100644 index 0000000..e727422 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/OffsetTarget.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.*; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OffsetTarget implements PseudoStructure { + + private int offset; + + @Override + public OffsetTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + offset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(offset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/SupertypeTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/SupertypeTarget.java new file mode 100644 index 0000000..7de2545 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/SupertypeTarget.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SupertypeTarget implements PseudoStructure { + + private int supertypeIndex; + + @Override + public SupertypeTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + supertypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(supertypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/ThrowsTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/ThrowsTarget.java new file mode 100644 index 0000000..3e59cdd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/ThrowsTarget.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ThrowsTarget implements PseudoStructure { + + private int throwsTypeIndex; + + @Override + public ThrowsTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + throwsTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(throwsTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeArgumentTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeArgumentTarget.java new file mode 100644 index 0000000..d9db6a6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeArgumentTarget.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TypeArgumentTarget implements PseudoStructure { + + private int offset; + private short typeArgumentIndex; + + @Override + public TypeArgumentTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + offset = input.readUnsignedShort(); + typeArgumentIndex = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(offset); + output.writeUnsignedByte(typeArgumentIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterBoundTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterBoundTarget.java new file mode 100644 index 0000000..dfd0263 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterBoundTarget.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TypeParameterBoundTarget implements PseudoStructure { + + private short typeParameterIndex; + private short boundIndex; + + @Override + public TypeParameterBoundTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + typeParameterIndex = input.readUnsignedByte(); + boundIndex = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(typeParameterIndex); + output.writeUnsignedByte(boundIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterTarget.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterTarget.java new file mode 100644 index 0000000..c5c2c0a --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/annotation/target/TypeParameterTarget.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.target; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TypeParameterTarget implements PseudoStructure { + + private short typeParameterIndex; + + @Override + public TypeParameterTarget read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + typeParameterIndex = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(typeParameterIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Exports.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Exports.java new file mode 100644 index 0000000..a54ffd1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Exports.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.module; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Exports implements PseudoStructure { + + private int exportsIndex; + private int exportsFlags; + private int exportsToCount; + private int[] exportsToIndex; + + @Override + public Exports read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + exportsIndex = input.readUnsignedShort(); + exportsFlags = input.readUnsignedShort(); + exportsToCount = input.readUnsignedShort(); + exportsToIndex = new int[exportsToCount]; + + for (var i = 0; i < exportsToCount; i++) { + exportsToIndex[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(exportsIndex); + output.writeUnsignedShort(exportsFlags); + output.writeUnsignedShort(exportsToCount); + + for (var eti : exportsToIndex) { + output.writeUnsignedShort(eti); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Opens.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Opens.java new file mode 100644 index 0000000..256bd70 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Opens.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.module; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Opens implements PseudoStructure { + + private int opensIndex; + private int opensFlags; + private int opensToCount; + private int[] opensToIndex; + + @Override + public Opens read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + opensIndex = input.readUnsignedShort(); + opensFlags = input.readUnsignedShort(); + opensToCount = input.readUnsignedShort(); + opensToIndex = new int[opensToCount]; + + for (var i = 0; i < opensToCount; i++) { + opensToIndex[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(opensIndex); + output.writeUnsignedShort(opensFlags); + output.writeUnsignedShort(opensToCount); + + for (var oti : opensToIndex) { + output.writeUnsignedShort(oti); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Provides.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Provides.java new file mode 100644 index 0000000..30edb4f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Provides.java @@ -0,0 +1,44 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.module; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Provides implements PseudoStructure { + + private int providesIndex; + private int providesWithCount; + private int[] providesWithIndex; + + @Override + public Provides read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + providesIndex = input.readUnsignedShort(); + providesWithCount = input.readUnsignedShort(); + providesWithIndex = new int[providesWithCount]; + + for (var i = 0; i < providesWithCount; i++) { + providesWithIndex[i] = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(providesIndex); + output.writeUnsignedShort(providesWithCount); + + for (var pwi : providesWithIndex) { + output.writeUnsignedShort(pwi); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Requires.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Requires.java new file mode 100644 index 0000000..9d76514 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/module/Requires.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.module; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Requires implements PseudoStructure { + + private int requiresIndex; + private int requiresFlags; + private int requiresVersionIndex; + + @Override + public Requires read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + requiresIndex = input.readUnsignedShort(); + requiresFlags = input.readUnsignedShort(); + requiresVersionIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(requiresIndex); + output.writeUnsignedShort(requiresFlags); + output.writeUnsignedShort(requiresVersionIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrame.java new file mode 100644 index 0000000..cd55831 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrame.java @@ -0,0 +1,130 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.*; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.Data; + +@Data +public class StackMapFrame implements PseudoStructure { + + private SameFrame sameFrame; + private SameLocals1StackItemFrame sameLocals1StackItemFrame; + private SameLocals1StackItemFrameExtended sameLocals1StackItemFrameExtended; + private ChopFrame chopFrame; + private SameFrameExtended sameFrameExtended; + private AppendFrame appendFrame; + private FullFrame fullFrame; + + @Override + public StackMapFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + return pseudoStructureFactory.getStackMapFrame(input); + } + + @Override + public void write(MultiEndianOutputStream output) { + if (sameFrame != null) { + sameFrame.write(output); + } else if (sameLocals1StackItemFrame != null) { + sameLocals1StackItemFrame.write(output); + } else if (sameLocals1StackItemFrameExtended != null) { + sameLocals1StackItemFrameExtended.write(output); + } else if (chopFrame != null) { + chopFrame.write(output); + } else if (sameFrameExtended != null) { + sameFrameExtended.write(output); + } else if (appendFrame != null) { + appendFrame.write(output); + } else if (fullFrame != null) { + fullFrame.write(output); + } + } + + public StackMapFrame setSameFrame(SameFrame sameFrame) { + this.sameFrame = sameFrame; + sameLocals1StackItemFrame = null; + sameLocals1StackItemFrameExtended = null; + chopFrame = null; + sameFrameExtended = null; + appendFrame = null; + fullFrame = null; + + return this; + } + + public StackMapFrame setSameLocals1StackItemFrame(SameLocals1StackItemFrame sameLocals1StackItemFrame) { + sameFrame = null; + this.sameLocals1StackItemFrame = sameLocals1StackItemFrame; + sameLocals1StackItemFrameExtended = null; + chopFrame = null; + sameFrameExtended = null; + appendFrame = null; + fullFrame = null; + + return this; + } + + public StackMapFrame setSameLocals1StackItemFrameExtended(SameLocals1StackItemFrameExtended sameLocals1StackItemFrameExtended) { + sameFrame = null; + sameLocals1StackItemFrame = null; + this.sameLocals1StackItemFrameExtended = sameLocals1StackItemFrameExtended; + chopFrame = null; + sameFrameExtended = null; + appendFrame = null; + fullFrame = null; + + return this; + } + + public StackMapFrame setChopFrame(ChopFrame chopFrame) { + sameFrame = null; + sameLocals1StackItemFrame = null; + sameLocals1StackItemFrameExtended = null; + this.chopFrame = chopFrame; + sameFrameExtended = null; + appendFrame = null; + fullFrame = null; + + return this; + } + + public StackMapFrame setSameFrameExtended(SameFrameExtended sameFrameExtended) { + sameFrame = null; + sameLocals1StackItemFrame = null; + sameLocals1StackItemFrameExtended = null; + chopFrame = null; + this.sameFrameExtended = sameFrameExtended; + appendFrame = null; + fullFrame = null; + + return this; + } + + public StackMapFrame setAppendFrame(AppendFrame appendFrame) { + sameFrame = null; + sameLocals1StackItemFrame = null; + sameLocals1StackItemFrameExtended = null; + chopFrame = null; + sameFrameExtended = null; + this.appendFrame = appendFrame; + fullFrame = null; + + return this; + } + + public StackMapFrame setFullFrame(FullFrame fullFrame) { + sameFrame = null; + sameLocals1StackItemFrame = null; + sameLocals1StackItemFrameExtended = null; + chopFrame = null; + sameFrameExtended = null; + appendFrame = null; + this.fullFrame = fullFrame; + + return this; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrameFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrameFactory.java new file mode 100644 index 0000000..34cb9b9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/StackMapFrameFactory.java @@ -0,0 +1,56 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.AppendFrame; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.ChopFrame; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.FullFrame; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.SameFrame; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.SameFrameExtended; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.SameLocals1StackItemFrame; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype.SameLocals1StackItemFrameExtended; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@NoArgsConstructor +@AllArgsConstructor +public class StackMapFrameFactory { + + private PseudoStructureFactory pseudoStructureFactory; + + @SneakyThrows + public StackMapFrame getStackMapFrame(MultiEndianInputStream input) { + var frameType = input.readUnsignedByte(); + input.unreadUnsignedByte(frameType); + + var stackMapFrame = new StackMapFrame(); + + if (frameType >= 0 && frameType <= 63) { + stackMapFrame.setSameFrame(new SameFrame().read(input, pseudoStructureFactory)); + } else if (frameType >= 64 && frameType <= 127) { + stackMapFrame.setSameLocals1StackItemFrame( + new SameLocals1StackItemFrame().read(input, pseudoStructureFactory)); + } else if (frameType >= 128 && frameType <= 246) { + // Reserved for future use + stackMapFrame = null; + } else if (frameType == 247) { + stackMapFrame.setSameLocals1StackItemFrameExtended( + new SameLocals1StackItemFrameExtended().read(input, pseudoStructureFactory)); + } else if (frameType >= 248 && frameType <= 250) { + stackMapFrame.setChopFrame(new ChopFrame().read(input, pseudoStructureFactory)); + } else if (frameType == 251) { + stackMapFrame.setSameFrameExtended(new SameFrameExtended().read(input, pseudoStructureFactory)); + } else if (frameType >= 252 && frameType <= 254) { + stackMapFrame.setAppendFrame(new AppendFrame().read(input, pseudoStructureFactory)); + } else if (frameType == 255) { + stackMapFrame.setFullFrame(new FullFrame().read(input, pseudoStructureFactory)); + } else { + stackMapFrame = null; + } + + return stackMapFrame; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/AppendFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/AppendFrame.java new file mode 100644 index 0000000..dbcaf8d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/AppendFrame.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VerificationTypeInfo; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AppendFrame implements PseudoStructure { + + private short frameType; + private int offsetDelta; + private VerificationTypeInfo[] locals; + + @Override + public AppendFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + offsetDelta = input.readUnsignedShort(); + var localsSize = frameType - 251; + locals = new VerificationTypeInfo[localsSize]; + + for (var i = 0; i < localsSize; i++) { + locals[i] = pseudoStructureFactory.getVerificationTypeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + output.writeUnsignedShort(offsetDelta); + + for (var local : locals) { + local.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/ChopFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/ChopFrame.java new file mode 100644 index 0000000..e396474 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/ChopFrame.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ChopFrame implements PseudoStructure { + + private short frameType; + private int offsetDelta; + + @Override + public ChopFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + offsetDelta = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + output.writeUnsignedShort(offsetDelta); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/FullFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/FullFrame.java new file mode 100644 index 0000000..b1cecd7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/FullFrame.java @@ -0,0 +1,63 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VerificationTypeInfo; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FullFrame implements PseudoStructure { + + private short frameType; + private int offsetDelta; + private int numberOfLocals; + private VerificationTypeInfo[] locals; + private int numberOfStackItems; + private VerificationTypeInfo[] stack; + + @Override + public FullFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + offsetDelta = input.readUnsignedShort(); + numberOfLocals = input.readUnsignedShort(); + locals = new VerificationTypeInfo[numberOfLocals]; + + for (var i = 0; i < numberOfLocals; i++) { + locals[i] = pseudoStructureFactory.getVerificationTypeInfo(input); + } + + numberOfStackItems = input.readUnsignedShort(); + stack = new VerificationTypeInfo[numberOfStackItems]; + + for (var i = 0; i < numberOfStackItems; i++) { + stack[i] = pseudoStructureFactory.getVerificationTypeInfo(input); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + output.writeUnsignedShort(offsetDelta); + output.writeUnsignedShort(numberOfLocals); + + for (var local : locals) { + local.write(output); + } + + output.writeUnsignedShort(numberOfStackItems); + + for (var verificationTypeInfo : stack) { + verificationTypeInfo.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrame.java new file mode 100644 index 0000000..efad564 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrame.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SameFrame implements PseudoStructure { + + private short frameType; + + @Override + public SameFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrameExtended.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrameExtended.java new file mode 100644 index 0000000..b644618 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameFrameExtended.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SameFrameExtended implements PseudoStructure { + + private short frameType; + private int offsetDelta; + + @Override + public SameFrameExtended read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + offsetDelta = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + output.writeUnsignedShort(offsetDelta); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrame.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrame.java new file mode 100644 index 0000000..038a403 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrame.java @@ -0,0 +1,39 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VerificationTypeInfo; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SameLocals1StackItemFrame implements PseudoStructure { + + private short frameType; + private VerificationTypeInfo[] stack; + + @Override + public SameLocals1StackItemFrame read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + stack = new VerificationTypeInfo[1]; + stack[0] = pseudoStructureFactory.getVerificationTypeInfo(input); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(frameType); + + for (var verificationTypeInfo : stack) { + verificationTypeInfo.write(output); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrameExtended.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrameExtended.java new file mode 100644 index 0000000..d27e809 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/frametype/SameLocals1StackItemFrameExtended.java @@ -0,0 +1,43 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.frametype; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VerificationTypeInfo; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SameLocals1StackItemFrameExtended implements PseudoStructure { + + private short frameType; + private int offsetDelta; + private VerificationTypeInfo[] stack; + + @Override + public SameLocals1StackItemFrameExtended read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + frameType = input.readUnsignedByte(); + offsetDelta = input.readUnsignedShort(); + stack = new VerificationTypeInfo[1]; + stack[0] = pseudoStructureFactory.getVerificationTypeInfo(input); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedShort(frameType); + output.writeUnsignedShort(offsetDelta); + + for (var verificationTypeInfo : stack) { + verificationTypeInfo.write(output); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/DoubleVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/DoubleVariableInfo.java new file mode 100644 index 0000000..7a1bbfd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/DoubleVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DoubleVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public DoubleVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/FloatVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/FloatVariableInfo.java new file mode 100644 index 0000000..eccee00 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/FloatVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FloatVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public FloatVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/IntegerVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/IntegerVariableInfo.java new file mode 100644 index 0000000..771d3fc --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/IntegerVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IntegerVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public IntegerVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/LongVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/LongVariableInfo.java new file mode 100644 index 0000000..a2f7386 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/LongVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LongVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public LongVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/NullVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/NullVariableInfo.java new file mode 100644 index 0000000..fa70837 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/NullVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NullVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public NullVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/ObjectVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/ObjectVariableInfo.java new file mode 100644 index 0000000..c4575d6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/ObjectVariableInfo.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ObjectVariableInfo implements PseudoStructure { + + private short tag; + private int cpoolIndex; + + @Override + public ObjectVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + cpoolIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(cpoolIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/TopVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/TopVariableInfo.java new file mode 100644 index 0000000..3f50d60 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/TopVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TopVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public TopVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedThisVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedThisVariableInfo.java new file mode 100644 index 0000000..8fb6157 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedThisVariableInfo.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UninitializedThisVariableInfo implements PseudoStructure { + + private short tag; + + @Override + public UninitializedThisVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedVariableInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedVariableInfo.java new file mode 100644 index 0000000..96f960d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/UninitializedVariableInfo.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UninitializedVariableInfo implements PseudoStructure { + + private short tag; + private int offset; + + @Override + public UninitializedVariableInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + offset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(offset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VariableInfoFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VariableInfoFactory.java new file mode 100644 index 0000000..f2e6c52 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VariableInfoFactory.java @@ -0,0 +1,58 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@NoArgsConstructor +@AllArgsConstructor +public class VariableInfoFactory { + + private PseudoStructureFactory pseudoStructureFactory; + + @SneakyThrows + public Object getVariableInfo(MultiEndianInputStream data) { + Object variableInfo; + var tag = data.readUnsignedByte(); + data.unreadUnsignedByte(tag); + + switch (tag) { + case VerificationType.ITEM_TOP: + variableInfo = new TopVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_INTEGER: + variableInfo = new IntegerVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_FLOAT: + variableInfo = new FloatVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_NULL: + variableInfo = new NullVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_UNINITIALIZEDTHIS: + variableInfo = new UninitializedThisVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_OBJECT: + variableInfo = new ObjectVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_UNINITIALIZED: + variableInfo = new UninitializedVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_LONG: + variableInfo = new LongVariableInfo().read(data, pseudoStructureFactory); + break; + case VerificationType.ITEM_DOUBLE: + variableInfo = new DoubleVariableInfo().read(data, pseudoStructureFactory); + break; + default: + variableInfo = null; + break; + } + + return variableInfo; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationType.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationType.java new file mode 100644 index 0000000..f61b1be --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationType.java @@ -0,0 +1,15 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +public class VerificationType { + + public static final short ITEM_TOP = 0; + public static final short ITEM_INTEGER = 1; + public static final short ITEM_FLOAT = 2; + public static final short ITEM_DOUBLE = 3; + public static final short ITEM_LONG = 4; + public static final short ITEM_NULL = 5; + public static final short ITEM_UNINITIALIZEDTHIS = 6; + public static final short ITEM_OBJECT = 7; + public static final short ITEM_UNINITIALIZED = 8; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfo.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfo.java new file mode 100644 index 0000000..353dd8f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfo.java @@ -0,0 +1,177 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.Data; + +@Data +public class VerificationTypeInfo implements PseudoStructure { + + private TopVariableInfo topVariableInfo; + private IntegerVariableInfo integerVariableInfo; + private FloatVariableInfo floatVariableInfo; + private LongVariableInfo longVariableInfo; + private DoubleVariableInfo doubleVariableInfo; + private NullVariableInfo nullVariableInfo; + private UninitializedThisVariableInfo uninitializedThisVariableInfo; + private ObjectVariableInfo objectVariableInfo; + private UninitializedVariableInfo uninitializedVariableInfo; + + @Override + public VerificationTypeInfo read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + return pseudoStructureFactory.getVerificationTypeInfo(input); + } + + @Override + public void write(MultiEndianOutputStream output) { + if (topVariableInfo != null) { + topVariableInfo.write(output); + } else if (integerVariableInfo != null) { + integerVariableInfo.write(output); + } else if (floatVariableInfo != null) { + floatVariableInfo.write(output); + } else if (longVariableInfo != null) { + longVariableInfo.write(output); + } else if (doubleVariableInfo != null) { + doubleVariableInfo.write(output); + } else if (nullVariableInfo != null) { + nullVariableInfo.write(output); + } else if (uninitializedThisVariableInfo != null) { + uninitializedThisVariableInfo.write(output); + } else if (objectVariableInfo != null) { + objectVariableInfo.write(output); + } else if (uninitializedVariableInfo != null) { + uninitializedVariableInfo.write(output); + } + } + + public VerificationTypeInfo setTopVariableInfo(TopVariableInfo topVariableInfo) { + this.topVariableInfo = topVariableInfo; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setIntegerVariableInfo(IntegerVariableInfo integerVariableInfo) { + topVariableInfo = null; + this.integerVariableInfo = integerVariableInfo; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setFloatVariableInfo(FloatVariableInfo floatVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + this.floatVariableInfo = floatVariableInfo; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setLongVariableInfo(LongVariableInfo longVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + this.longVariableInfo = longVariableInfo; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setDoubleVariableInfo(DoubleVariableInfo doubleVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + this.doubleVariableInfo = doubleVariableInfo; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setNullVariableInfo(NullVariableInfo nullVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + this.nullVariableInfo = nullVariableInfo; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setUninitializedThisVariableInfo(UninitializedThisVariableInfo uninitializedThisVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + this.uninitializedThisVariableInfo = uninitializedThisVariableInfo; + objectVariableInfo = null; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setObjectVariableInfo(ObjectVariableInfo objectVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + this.objectVariableInfo = objectVariableInfo; + uninitializedVariableInfo = null; + + return this; + } + + public VerificationTypeInfo setUninitializedVariableInfo(UninitializedVariableInfo uninitializedVariableInfo) { + topVariableInfo = null; + integerVariableInfo = null; + floatVariableInfo = null; + longVariableInfo = null; + doubleVariableInfo = null; + nullVariableInfo = null; + uninitializedThisVariableInfo = null; + objectVariableInfo = null; + this.uninitializedVariableInfo = uninitializedVariableInfo; + + return this; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfoFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfoFactory.java new file mode 100644 index 0000000..3728fe4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/attributeinfo/stackmap/verificationtype/VerificationTypeInfoFactory.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype; + +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class VerificationTypeInfoFactory { + + private VariableInfoFactory variableInfoFactory; + + public VerificationTypeInfoFactory() { + this(new VariableInfoFactory()); + } + + public VerificationTypeInfo getVerificationTypeInfo(MultiEndianInputStream data) { + return getVerificationTypeInfo(variableInfoFactory.getVariableInfo(data)); + } + + public VerificationTypeInfo getVerificationTypeInfo(Object variableInfo) { + VerificationTypeInfo verificationTypeInfo = new VerificationTypeInfo(); + + if (variableInfo instanceof TopVariableInfo) { + verificationTypeInfo.setTopVariableInfo((TopVariableInfo) variableInfo); + } else if (variableInfo instanceof IntegerVariableInfo) { + verificationTypeInfo.setIntegerVariableInfo((IntegerVariableInfo) variableInfo); + } else if (variableInfo instanceof FloatVariableInfo) { + verificationTypeInfo.setFloatVariableInfo((FloatVariableInfo) variableInfo); + } else if (variableInfo instanceof LongVariableInfo) { + verificationTypeInfo.setLongVariableInfo((LongVariableInfo) variableInfo); + } else if (variableInfo instanceof DoubleVariableInfo) { + verificationTypeInfo.setDoubleVariableInfo((DoubleVariableInfo) variableInfo); + } else if (variableInfo instanceof NullVariableInfo) { + verificationTypeInfo.setNullVariableInfo((NullVariableInfo) variableInfo); + } else if (variableInfo instanceof UninitializedThisVariableInfo) { + verificationTypeInfo.setUninitializedThisVariableInfo((UninitializedThisVariableInfo) variableInfo); + } else if (variableInfo instanceof ObjectVariableInfo) { + verificationTypeInfo.setObjectVariableInfo((ObjectVariableInfo) variableInfo); + } else if (variableInfo instanceof UninitializedVariableInfo) { + verificationTypeInfo.setUninitializedVariableInfo((UninitializedVariableInfo) variableInfo); + } else { + // Should it return a VerificationTypeInfo without values set? + verificationTypeInfo = null; + } + + return verificationTypeInfo; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantClass.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantClass.java new file mode 100644 index 0000000..7ff0ad8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantClass.java @@ -0,0 +1,37 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantClass implements ConstantKind { + + private short tag; + + /** + * Must be a valid index in the constant pool table to a ConstantUtf8 structure + */ + private int nameIndex; + + @Override + public ConstantClass read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + nameIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(nameIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDouble.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDouble.java new file mode 100644 index 0000000..721635e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDouble.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantDouble implements ConstantKind { + + private short tag; + private long highBytes; + private long lowBytes; + + @Override + public ConstantDouble read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + highBytes = input.readUnsignedInt(); + lowBytes = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedInt(highBytes); + output.writeUnsignedInt(lowBytes); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDynamic.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDynamic.java new file mode 100644 index 0000000..961aef9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantDynamic.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantDynamic implements ConstantKind { + + private short tag; + private int bootstrapMethodAttrIndex; + private int nameAndTypeIndex; + + @Override + public ConstantDynamic read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + bootstrapMethodAttrIndex = input.readUnsignedShort(); + nameAndTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(bootstrapMethodAttrIndex); + output.writeUnsignedShort(nameAndTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFieldref.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFieldref.java new file mode 100644 index 0000000..bce2f17 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFieldref.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantFieldref implements ConstantKind { + + private short tag; + private int classIndex; + private int nameAndTypeIndex; + + @Override + public ConstantFieldref read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + classIndex = input.readUnsignedShort(); + nameAndTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(classIndex); + output.writeUnsignedShort(nameAndTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFloat.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFloat.java new file mode 100644 index 0000000..b903da8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantFloat.java @@ -0,0 +1,34 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantFloat implements ConstantKind { + + private short tag; + private short[] bytes; + + @Override + public ConstantFloat read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + // This is a proof that it's not possible to make a generic method to read all pseudo structures + bytes = input.readUnsignedBytes(4); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedBytes(bytes); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInteger.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInteger.java new file mode 100644 index 0000000..009e10f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInteger.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantInteger implements ConstantKind { + + private short tag; + private short[] bytes; + + @Override + public ConstantInteger read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + bytes = input.readUnsignedBytes(4); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedBytes(bytes); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInterfaceMethodref.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInterfaceMethodref.java new file mode 100644 index 0000000..2510c77 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInterfaceMethodref.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantInterfaceMethodref implements ConstantKind { + + private short tag; + private int classIndex; + private int nameAndTypeIndex; + + @Override + public ConstantInterfaceMethodref read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + classIndex = input.readUnsignedShort(); + nameAndTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(classIndex); + output.writeUnsignedShort(nameAndTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInvokeDynamic.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInvokeDynamic.java new file mode 100644 index 0000000..7dbe174 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantInvokeDynamic.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantInvokeDynamic implements ConstantKind { + + private short tag; + private int bootstrapMethodAttrIndex; + private int nameAndTypeIndex; + + @Override + public ConstantInvokeDynamic read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + bootstrapMethodAttrIndex = input.readUnsignedShort(); + nameAndTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(bootstrapMethodAttrIndex); + output.writeUnsignedShort(nameAndTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKind.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKind.java new file mode 100644 index 0000000..a2fd62d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKind.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; + +public interface ConstantKind> extends PseudoStructure { + + short getTag(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKindFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKindFactory.java new file mode 100644 index 0000000..ed42031 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantKindFactory.java @@ -0,0 +1,115 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import static java.util.Map.entry; + +import java.util.Map; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@NoArgsConstructor +@AllArgsConstructor +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class ConstantKindFactory { + + private PseudoStructureFactory pseudoStructureFactory; + + private final Map, Integer> tagByConstantKind = Map.ofEntries( + entry(ConstantUtf8.class, 1), + entry(ConstantClass.class, 7), + entry(ConstantFieldref.class, 9), + entry(ConstantMethodref.class, 10), + entry(ConstantInterfaceMethodref.class, 11), + entry(ConstantNameAndType.class, 12), + entry(ConstantString.class, 8), + entry(ConstantInteger.class, 3), + entry(ConstantFloat.class, 4), + entry(ConstantLong.class, 5), + entry(ConstantDouble.class, 6), + entry(ConstantMethodHandle.class, 15), + entry(ConstantMethodType.class, 16), + entry(ConstantDynamic.class, 17), + entry(ConstantInvokeDynamic.class, 18), + entry(ConstantModule.class, 19), + entry(ConstantPackage.class, 20)); + + @SneakyThrows + public T getConstantKind(MultiEndianInputStream data) { + var tag = data.readUnsignedByte(); + data.unreadUnsignedByte(tag); + + ConstantKind> constantKind; + + switch (tag) { + case 1: + constantKind = new ConstantUtf8(); + break; + case 7: + constantKind = new ConstantClass(); + break; + case 9: + constantKind = new ConstantFieldref(); + break; + case 10: + constantKind = new ConstantMethodref(); + break; + case 11: + constantKind = new ConstantInterfaceMethodref(); + break; + case 12: + constantKind = new ConstantNameAndType(); + break; + case 8: + constantKind = new ConstantString(); + break; + case 3: + constantKind = new ConstantInteger(); + break; + case 4: + constantKind = new ConstantFloat(); + break; + case 5: + constantKind = new ConstantLong(); + break; + case 6: + constantKind = new ConstantDouble(); + break; + case 15: + constantKind = new ConstantMethodHandle(); + break; + case 16: + constantKind = new ConstantMethodType(); + break; + case 17: + constantKind = new ConstantDynamic(); + break; + case 18: + constantKind = new ConstantInvokeDynamic(); + break; + case 19: + constantKind = new ConstantModule(); + break; + case 20: + constantKind = new ConstantPackage(); + break; + default: + constantKind = null; + break; + } + + return (T) constantKind.read(data, pseudoStructureFactory); + } + + public short getTag(ConstantKind constantKind) { + return getTag(constantKind.getClass()); + } + + public short getTag(Class constantKind) { + return (short) (int) tagByConstantKind.get(constantKind); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantLong.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantLong.java new file mode 100644 index 0000000..77cd448 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantLong.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantLong implements ConstantKind { + + private short tag; + private long highBytes; + private long lowBytes; + + @Override + public ConstantLong read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + highBytes = input.readUnsignedInt(); + lowBytes = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedInt(highBytes); + output.writeUnsignedInt(lowBytes); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodHandle.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodHandle.java new file mode 100644 index 0000000..f276a44 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodHandle.java @@ -0,0 +1,50 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantMethodHandle implements ConstantKind { + + private short tag; + private short referenceKind; + private int referenceIndex; + + @Override + public ConstantMethodHandle read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + referenceKind = input.readUnsignedByte(); + referenceIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedByte(referenceKind); + output.writeUnsignedShort(referenceIndex); + } + + public static class ReferenceKind { + + public static final short getField = 1; + public static final short getStatic = 2; + public static final short putField = 3; + public static final short putStatic = 4; + public static final short invokeVirtual = 5; + public static final short invokeStatic = 6; + public static final short invokeSpecial = 7; + public static final short newInvokeSpecial = 8; + public static final short invokeInterface = 9; + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodType.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodType.java new file mode 100644 index 0000000..03d1269 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodType.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantMethodType implements ConstantKind { + + private short tag; + private int descriptorIndex; + + @Override + public ConstantMethodType read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + descriptorIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(descriptorIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodref.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodref.java new file mode 100644 index 0000000..e7f32bf --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantMethodref.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantMethodref implements ConstantKind { + + private short tag; + private int classIndex; + private int nameAndTypeIndex; + + @Override + public ConstantMethodref read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + classIndex = input.readUnsignedShort(); + nameAndTypeIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(classIndex); + output.writeUnsignedShort(nameAndTypeIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantModule.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantModule.java new file mode 100644 index 0000000..7628b2c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantModule.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantModule implements ConstantKind { + + private short tag; + private int nameIndex; + + @Override + public ConstantModule read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + nameIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(nameIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantNameAndType.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantNameAndType.java new file mode 100644 index 0000000..2c03459 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantNameAndType.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantNameAndType implements ConstantKind { + + private short tag; + private int nameIndex; + private int descriptorIndex; + + @Override + public ConstantNameAndType read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + nameIndex = input.readUnsignedShort(); + descriptorIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(nameIndex); + output.writeUnsignedShort(descriptorIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantPackage.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantPackage.java new file mode 100644 index 0000000..1459f8d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantPackage.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantPackage implements ConstantKind { + + private short tag; + private int nameIndex; + + @Override + public ConstantPackage read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + nameIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(nameIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantString.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantString.java new file mode 100644 index 0000000..a3256d8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantString.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantString implements ConstantKind { + + private short tag; + private int stringIndex; + + @Override + public ConstantString read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + stringIndex = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(stringIndex); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantUtf8.java b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantUtf8.java new file mode 100644 index 0000000..764017f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/constantkind/ConstantUtf8.java @@ -0,0 +1,44 @@ +package com.github.wdestroier.chamomile.classfile.constantkind; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.io.Endianness; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; +import com.github.wdestroier.chamomile.io.converter.ByteTypeConverter; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ConstantUtf8 implements ConstantKind { + + private static final ByteTypeConverter BYTE_TYPE_CONVERTER = new ByteTypeConverter(Endianness.BIG_ENDIAN); + + private short tag; + private int length; + private short[] bytes; + + @Override + public ConstantUtf8 read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + tag = input.readUnsignedByte(); + length = input.readUnsignedShort(); + bytes = input.readUnsignedBytes(length); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(tag); + output.writeUnsignedShort(length); + output.writeUnsignedBytes(bytes); + } + + public String getBytesString() { + return new String(BYTE_TYPE_CONVERTER.unsignedBytesToSignedBytes(bytes)); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ClassFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ClassFlag.java new file mode 100644 index 0000000..47b089e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ClassFlag.java @@ -0,0 +1,15 @@ +package com.github.wdestroier.chamomile.classfile.flag; + +public class ClassFlag { + + public static final int ACC_PUBLIC = 0x0001; + public static final int ACC_FINAL = 0x0010; + public static final int ACC_SUPER = 0x0020; + public static final int ACC_INTERFACE = 0x0200; + public static final int ACC_ABSTRACT = 0x0400; + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_ANNOTATION = 0x2000; + public static final int ACC_ENUM = 0x4000; + public static final int ACC_MODULE = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/FieldFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/FieldFlag.java new file mode 100644 index 0000000..2b8d040 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/FieldFlag.java @@ -0,0 +1,19 @@ +package com.github.wdestroier.chamomile.classfile.flag; + +public class FieldFlag { + + public static final int ACC_PUBLIC = 0x0001; + public static final int ACC_PRIVATE = 0x0002; + public static final int ACC_PROTECTED = 0x0004; + public static final int ACC_STATIC = 0x0008; + public static final int ACC_FINAL = 0x0010; + public static final int ACC_VOLATILE = 0x0040; + public static final int ACC_TRANSIENT = 0x0080; + public static final int ACC_SYNTHETIC = 0x1000; + + /** + * Declared as an element of an enum + */ + public static final int ACC_ENUM = 0x4000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/MethodFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/MethodFlag.java new file mode 100644 index 0000000..a9ac094 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/MethodFlag.java @@ -0,0 +1,18 @@ +package com.github.wdestroier.chamomile.classfile.flag; + +public class MethodFlag { + + public static final int ACC_PUBLIC = 0x0001; + public static final int ACC_PRIVATE = 0x0002; + public static final int ACC_PROTECTED = 0x0004; + public static final int ACC_STATIC = 0x0008; + public static final int ACC_FINAL = 0x0010; + public static final int ACC_SYNCHRONIZED = 0x0020; + public static final int ACC_BRIDGE = 0x0040; + public static final int ACC_VARARGS = 0x0080; + public static final int ACC_NATIVE = 0x0100; + public static final int ACC_ABSTRACT = 0x0400; + public static final int ACC_STRICT = 0x0800; + public static final int ACC_SYNTHETIC = 0x1000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/NestedClassFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/NestedClassFlag.java new file mode 100644 index 0000000..3eb3140 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/NestedClassFlag.java @@ -0,0 +1,16 @@ +package com.github.wdestroier.chamomile.classfile.flag; + +public class NestedClassFlag { + + public static final int ACC_PUBLIC = 0x0001; + public static final int ACC_PRIVATE = 0x0002; + public static final int ACC_PROTECTED = 0x0004; + public static final int ACC_STATIC = 0x0008; + public static final int ACC_FINAL = 0x0010; + public static final int ACC_INTERFACE = 0x0200; + public static final int ACC_ABSTRACT = 0x0400; + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_ANNOTATION = 0x2000; + public static final int ACC_ENUM = 0x4000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ParameterFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ParameterFlag.java new file mode 100644 index 0000000..184d77c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/ParameterFlag.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.classfile.flag; + +public class ParameterFlag { + + public static final int ACC_FINAL = 0x0010; + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_MANDATED = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ExportsFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ExportsFlag.java new file mode 100644 index 0000000..1170acc --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ExportsFlag.java @@ -0,0 +1,8 @@ +package com.github.wdestroier.chamomile.classfile.flag.module; + +public class ExportsFlag { + + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_MANDATED = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ModuleFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ModuleFlag.java new file mode 100644 index 0000000..46de14e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/ModuleFlag.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.classfile.flag.module; + +public class ModuleFlag { + + public static final int ACC_OPEN = 0x0020; + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_MANDATED = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/OpensFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/OpensFlag.java new file mode 100644 index 0000000..50bbb17 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/OpensFlag.java @@ -0,0 +1,8 @@ +package com.github.wdestroier.chamomile.classfile.flag.module; + +public class OpensFlag { + + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_MANDATED = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/RequiresFlag.java b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/RequiresFlag.java new file mode 100644 index 0000000..62d37d4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/flag/module/RequiresFlag.java @@ -0,0 +1,10 @@ +package com.github.wdestroier.chamomile.classfile.flag.module; + +public class RequiresFlag { + + public static final int ACC_TRANSITIVE = 0x0020; + public static final int ACC_STATIC_PHASE = 0x0040; + public static final int ACC_SYNTHETIC = 0x1000; + public static final int ACC_MANDATED = 0x8000; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructure.java b/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructure.java new file mode 100644 index 0000000..09d9a13 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructure.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile.classfile.pseudostructure; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import com.github.wdestroier.chamomile.io.Endianness; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.SneakyThrows; + +public interface PseudoStructure> { + + T read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory); + + default T read(MultiEndianInputStream input) { + return read(input, new PseudoStructureFactory()); + } + + @SneakyThrows + default T read(File file) { + return read(new MultiEndianInputStream(new FileInputStream(file), Endianness.BIG_ENDIAN)); + } + + default T read(byte... input) { + return read(new MultiEndianInputStream(new ByteArrayInputStream(input), Endianness.BIG_ENDIAN)); + } + + void write(MultiEndianOutputStream output); + + @SneakyThrows + default void write(File file) { + write(new MultiEndianOutputStream(new FileOutputStream(file), Endianness.BIG_ENDIAN)); + } + + @SneakyThrows + default byte[] write() { + var output = new ByteArrayOutputStream(); + write(new MultiEndianOutputStream(output, Endianness.BIG_ENDIAN)); + return output.toByteArray(); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructureFactory.java b/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructureFactory.java new file mode 100644 index 0000000..acd3d16 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/classfile/pseudostructure/PseudoStructureFactory.java @@ -0,0 +1,49 @@ +package com.github.wdestroier.chamomile.classfile.pseudostructure; + +import com.github.wdestroier.chamomile.classfile.attributeinfo.AttributeInfoFactory; +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.TargetInfoFactory; +import com.github.wdestroier.chamomile.classfile.attributeinfo.annotation.ValueFactory; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.StackMapFrameFactory; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VariableInfoFactory; +import com.github.wdestroier.chamomile.classfile.attributeinfo.stackmap.verificationtype.VerificationTypeInfoFactory; +import com.github.wdestroier.chamomile.classfile.constantkind.ConstantKindFactory; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Delegate; + +@Getter +@Setter +public class PseudoStructureFactory { + + @Delegate + private ConstantKindFactory constantKindFactory; + @Delegate + private AttributeInfoFactory attributeInfoFactory; + @Delegate + private StackMapFrameFactory stackMapFrameFactory; + @Delegate + private VariableInfoFactory variableInfoFactory; + @Delegate + private VerificationTypeInfoFactory verificationTypeInfoFactory; + @Delegate + private ValueFactory valueFactory; + @Delegate + private TargetInfoFactory targetInfoFactory; + + public PseudoStructureFactory() { + constantKindFactory = new ConstantKindFactory(this); + attributeInfoFactory = null; + stackMapFrameFactory = new StackMapFrameFactory(this); + variableInfoFactory = new VariableInfoFactory(this); + verificationTypeInfoFactory = new VerificationTypeInfoFactory(variableInfoFactory); + valueFactory = new ValueFactory(this); + targetInfoFactory = new TargetInfoFactory(this); + } + + public PseudoStructureFactory(AttributeInfoFactory attributeInfoFactory) { + this(); + this.attributeInfoFactory = attributeInfoFactory; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/Instruction.java new file mode 100644 index 0000000..71ad108 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/Instruction.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile.instruction; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import com.github.wdestroier.chamomile.io.Endianness; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; +import com.github.wdestroier.chamomile.io.ShortArrayInputStream; +import com.github.wdestroier.chamomile.io.ShortArrayOutputStream; + +import lombok.SneakyThrows; + +public interface Instruction> { + + short getOpcode(); + + void setOpcode(short opcode); + + T read(MultiEndianInputStream input); + + @SneakyThrows + default T read(File file) { + return read(new MultiEndianInputStream(new FileInputStream(file), 2, Endianness.BIG_ENDIAN)); + } + + default T read(short... input) { + return read(new MultiEndianInputStream(new ShortArrayInputStream(input), 2, Endianness.BIG_ENDIAN)); + } + + void write(MultiEndianOutputStream output); + + @SneakyThrows + default void write(File file) { + write(new MultiEndianOutputStream(new FileOutputStream(file), Endianness.BIG_ENDIAN)); + } + + @SneakyThrows + default short[] write() { + var output = new ShortArrayOutputStream(); + write(new MultiEndianOutputStream(output, Endianness.BIG_ENDIAN)); + return output.toUnsignedByteArray(); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/InstructionFactory.java b/src/main/java/com/github/wdestroier/chamomile/instruction/InstructionFactory.java new file mode 100644 index 0000000..de20287 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/InstructionFactory.java @@ -0,0 +1,519 @@ +package com.github.wdestroier.chamomile.instruction; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import com.github.wdestroier.chamomile.instruction.comparision.acmp.IfAcmpeqInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.acmp.IfAcmpneInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfeqInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfgeInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfgtInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfleInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfltInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.cmp0.IfneInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.dcmp.DcmpgInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.dcmp.DcmplInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.fcmp.FcmpgInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.fcmp.FcmplInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpeqInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpgeInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpgtInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpleInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpltInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.icmp.IfIcmpneInstruction; +import com.github.wdestroier.chamomile.instruction.comparision.lcmp.LcmpInstruction; +import com.github.wdestroier.chamomile.instruction.constant.AconstNullInstruction; +import com.github.wdestroier.chamomile.instruction.constant.BipushInstruction; +import com.github.wdestroier.chamomile.instruction.constant.Ldc2WInstruction; +import com.github.wdestroier.chamomile.instruction.constant.LdcInstruction; +import com.github.wdestroier.chamomile.instruction.constant.LdcWInstruction; +import com.github.wdestroier.chamomile.instruction.constant.NopInstruction; +import com.github.wdestroier.chamomile.instruction.constant.SipushInstruction; +import com.github.wdestroier.chamomile.instruction.constant.dconst.Dconst0Instruction; +import com.github.wdestroier.chamomile.instruction.constant.dconst.Dconst1Instruction; +import com.github.wdestroier.chamomile.instruction.constant.fconst.Fconst0Instruction; +import com.github.wdestroier.chamomile.instruction.constant.fconst.Fconst1Instruction; +import com.github.wdestroier.chamomile.instruction.constant.fconst.Fconst2Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst0Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst1Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst2Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst3Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst4Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.Iconst5Instruction; +import com.github.wdestroier.chamomile.instruction.constant.iconst.IconstM1Instruction; +import com.github.wdestroier.chamomile.instruction.constant.lconst.Lconst0Instruction; +import com.github.wdestroier.chamomile.instruction.constant.lconst.Lconst1Instruction; +import com.github.wdestroier.chamomile.instruction.control.AreturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.DreturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.FreturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.GotoInstruction; +import com.github.wdestroier.chamomile.instruction.control.IreturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.JsrInstruction; +import com.github.wdestroier.chamomile.instruction.control.LookupswitchInstruction; +import com.github.wdestroier.chamomile.instruction.control.LreturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.RetInstruction; +import com.github.wdestroier.chamomile.instruction.control.ReturnInstruction; +import com.github.wdestroier.chamomile.instruction.control.TableswitchInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.doubles.D2fInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.doubles.D2iInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.doubles.D2lInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.floats.F2dInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.floats.F2iInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.floats.F2lInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2bInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2cInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2dInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2fInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2lInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.ints.I2sInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.longs.L2dInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.longs.L2fInstruction; +import com.github.wdestroier.chamomile.instruction.conversion.longs.L2iInstruction; +import com.github.wdestroier.chamomile.instruction.extended.GotoWInstruction; +import com.github.wdestroier.chamomile.instruction.extended.IfnonnullInstruction; +import com.github.wdestroier.chamomile.instruction.extended.IfnullInstruction; +import com.github.wdestroier.chamomile.instruction.extended.JsrWInstruction; +import com.github.wdestroier.chamomile.instruction.extended.MultianewarrayInstruction; +import com.github.wdestroier.chamomile.instruction.extended.WideInstruction; +import com.github.wdestroier.chamomile.instruction.load.AaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.BaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.CaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.DaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.FaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.IaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.LaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.SaloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.aload.Aload0Instruction; +import com.github.wdestroier.chamomile.instruction.load.aload.Aload1Instruction; +import com.github.wdestroier.chamomile.instruction.load.aload.Aload2Instruction; +import com.github.wdestroier.chamomile.instruction.load.aload.Aload3Instruction; +import com.github.wdestroier.chamomile.instruction.load.aload.AloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.dload.Dload0Instruction; +import com.github.wdestroier.chamomile.instruction.load.dload.Dload1Instruction; +import com.github.wdestroier.chamomile.instruction.load.dload.Dload2Instruction; +import com.github.wdestroier.chamomile.instruction.load.dload.Dload3Instruction; +import com.github.wdestroier.chamomile.instruction.load.dload.DloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.fload.Fload0Instruction; +import com.github.wdestroier.chamomile.instruction.load.fload.Fload1Instruction; +import com.github.wdestroier.chamomile.instruction.load.fload.Fload2Instruction; +import com.github.wdestroier.chamomile.instruction.load.fload.Fload3Instruction; +import com.github.wdestroier.chamomile.instruction.load.fload.FloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.iload.Iload0Instruction; +import com.github.wdestroier.chamomile.instruction.load.iload.Iload1Instruction; +import com.github.wdestroier.chamomile.instruction.load.iload.Iload2Instruction; +import com.github.wdestroier.chamomile.instruction.load.iload.Iload3Instruction; +import com.github.wdestroier.chamomile.instruction.load.iload.IloadInstruction; +import com.github.wdestroier.chamomile.instruction.load.lload.Lload0Instruction; +import com.github.wdestroier.chamomile.instruction.load.lload.Lload1Instruction; +import com.github.wdestroier.chamomile.instruction.load.lload.Lload2Instruction; +import com.github.wdestroier.chamomile.instruction.load.lload.Lload3Instruction; +import com.github.wdestroier.chamomile.instruction.load.lload.LloadInstruction; +import com.github.wdestroier.chamomile.instruction.math.IincInstruction; +import com.github.wdestroier.chamomile.instruction.math.add.DaddInstruction; +import com.github.wdestroier.chamomile.instruction.math.add.FaddInstruction; +import com.github.wdestroier.chamomile.instruction.math.add.IaddInstruction; +import com.github.wdestroier.chamomile.instruction.math.add.LaddInstruction; +import com.github.wdestroier.chamomile.instruction.math.and.IandInstruction; +import com.github.wdestroier.chamomile.instruction.math.and.LandInstruction; +import com.github.wdestroier.chamomile.instruction.math.div.DdivInstruction; +import com.github.wdestroier.chamomile.instruction.math.div.FdivInstruction; +import com.github.wdestroier.chamomile.instruction.math.div.IdivInstruction; +import com.github.wdestroier.chamomile.instruction.math.div.LdivInstruction; +import com.github.wdestroier.chamomile.instruction.math.mul.DmulInstruction; +import com.github.wdestroier.chamomile.instruction.math.mul.FmulInstruction; +import com.github.wdestroier.chamomile.instruction.math.mul.ImulInstruction; +import com.github.wdestroier.chamomile.instruction.math.mul.LmulInstruction; +import com.github.wdestroier.chamomile.instruction.math.neg.DnegInstruction; +import com.github.wdestroier.chamomile.instruction.math.neg.FnegInstruction; +import com.github.wdestroier.chamomile.instruction.math.neg.InegInstruction; +import com.github.wdestroier.chamomile.instruction.math.neg.LnegInstruction; +import com.github.wdestroier.chamomile.instruction.math.or.IorInstruction; +import com.github.wdestroier.chamomile.instruction.math.or.LorInstruction; +import com.github.wdestroier.chamomile.instruction.math.rem.DremInstruction; +import com.github.wdestroier.chamomile.instruction.math.rem.FremInstruction; +import com.github.wdestroier.chamomile.instruction.math.rem.IremInstruction; +import com.github.wdestroier.chamomile.instruction.math.rem.LremInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.arithmetic.IshlInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.arithmetic.IshrInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.arithmetic.LshlInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.arithmetic.LshrInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.logical.IushrInstruction; +import com.github.wdestroier.chamomile.instruction.math.shift.logical.LushrInstruction; +import com.github.wdestroier.chamomile.instruction.math.sub.DsubInstruction; +import com.github.wdestroier.chamomile.instruction.math.sub.FsubInstruction; +import com.github.wdestroier.chamomile.instruction.math.sub.IsubInstruction; +import com.github.wdestroier.chamomile.instruction.math.sub.LsubInstruction; +import com.github.wdestroier.chamomile.instruction.math.xor.IxorInstruction; +import com.github.wdestroier.chamomile.instruction.math.xor.LxorInstruction; +import com.github.wdestroier.chamomile.instruction.reference.AnewarrayInstruction; +import com.github.wdestroier.chamomile.instruction.reference.ArraylengthInstruction; +import com.github.wdestroier.chamomile.instruction.reference.AthrowInstruction; +import com.github.wdestroier.chamomile.instruction.reference.CheckcastInstruction; +import com.github.wdestroier.chamomile.instruction.reference.GetfieldInstruction; +import com.github.wdestroier.chamomile.instruction.reference.GetstaticInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InstanceofInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InvokedynamicInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InvokeinterfaceInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InvokespecialInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InvokestaticInstruction; +import com.github.wdestroier.chamomile.instruction.reference.InvokevirtualInstruction; +import com.github.wdestroier.chamomile.instruction.reference.MonitorenterInstruction; +import com.github.wdestroier.chamomile.instruction.reference.MonitorexitInstruction; +import com.github.wdestroier.chamomile.instruction.reference.NewInstruction; +import com.github.wdestroier.chamomile.instruction.reference.NewarrayInstruction; +import com.github.wdestroier.chamomile.instruction.reference.PutfieldInstruction; +import com.github.wdestroier.chamomile.instruction.reference.PutstaticInstruction; +import com.github.wdestroier.chamomile.instruction.reserved.BreakpointInstruction; +import com.github.wdestroier.chamomile.instruction.reserved.Impdep1Instruction; +import com.github.wdestroier.chamomile.instruction.reserved.Impdep2Instruction; +import com.github.wdestroier.chamomile.instruction.stack.Dup2Instruction; +import com.github.wdestroier.chamomile.instruction.stack.Dup2X1Instruction; +import com.github.wdestroier.chamomile.instruction.stack.Dup2X2Instruction; +import com.github.wdestroier.chamomile.instruction.stack.DupInstruction; +import com.github.wdestroier.chamomile.instruction.stack.DupX1Instruction; +import com.github.wdestroier.chamomile.instruction.stack.DupX2Instruction; +import com.github.wdestroier.chamomile.instruction.stack.Pop2Instruction; +import com.github.wdestroier.chamomile.instruction.stack.PopInstruction; +import com.github.wdestroier.chamomile.instruction.stack.SwapInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.AastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.BastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.CastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.DastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.FastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.IastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.LastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.arraystore.SastoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.astore.Astore0Instruction; +import com.github.wdestroier.chamomile.instruction.store.astore.Astore1Instruction; +import com.github.wdestroier.chamomile.instruction.store.astore.Astore2Instruction; +import com.github.wdestroier.chamomile.instruction.store.astore.Astore3Instruction; +import com.github.wdestroier.chamomile.instruction.store.astore.AstoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.dstore.Dstore0Instruction; +import com.github.wdestroier.chamomile.instruction.store.dstore.Dstore1Instruction; +import com.github.wdestroier.chamomile.instruction.store.dstore.Dstore2Instruction; +import com.github.wdestroier.chamomile.instruction.store.dstore.Dstore3Instruction; +import com.github.wdestroier.chamomile.instruction.store.dstore.DstoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.fstore.Fstore0Instruction; +import com.github.wdestroier.chamomile.instruction.store.fstore.Fstore1Instruction; +import com.github.wdestroier.chamomile.instruction.store.fstore.Fstore2Instruction; +import com.github.wdestroier.chamomile.instruction.store.fstore.Fstore3Instruction; +import com.github.wdestroier.chamomile.instruction.store.fstore.FstoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.istore.Istore0Instruction; +import com.github.wdestroier.chamomile.instruction.store.istore.Istore1Instruction; +import com.github.wdestroier.chamomile.instruction.store.istore.Istore2Instruction; +import com.github.wdestroier.chamomile.instruction.store.istore.Istore3Instruction; +import com.github.wdestroier.chamomile.instruction.store.istore.IstoreInstruction; +import com.github.wdestroier.chamomile.instruction.store.lstore.Lstore0Instruction; +import com.github.wdestroier.chamomile.instruction.store.lstore.Lstore1Instruction; +import com.github.wdestroier.chamomile.instruction.store.lstore.Lstore2Instruction; +import com.github.wdestroier.chamomile.instruction.store.lstore.Lstore3Instruction; +import com.github.wdestroier.chamomile.instruction.store.lstore.LstoreInstruction; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.SneakyThrows; + +@SuppressWarnings("unchecked") +public class InstructionFactory { + + public static InstructionFactory instance = new InstructionFactory(); + + private Map opcodeFromMnemonic; + private Map mnemonicFromOpcode; + private Map>> supplierFromOpcode; + private Map>> classFromOpcode; + private Map>, Short> opcodeFromClass; + + public InstructionFactory() { + var list = new ArrayList() { + private static final long serialVersionUID = 1L; + + public void add(int opcode, String mnemonic, Class> instructionClass, Supplier> instructionInstanceGenerator) { + add(new InstructionMapping((short) opcode, mnemonic, instructionClass, instructionInstanceGenerator)); + } + }; + + // Constants + list.add(0x00, "nop", NopInstruction.class, () -> new NopInstruction()); + list.add(0x01, "aconst_null", AconstNullInstruction.class, () -> new AconstNullInstruction()); + list.add(0x02, "iconst_m1", IconstM1Instruction.class, () -> new IconstM1Instruction()); + list.add(0x03, "iconst_0", Iconst0Instruction.class, () -> new Iconst0Instruction()); + list.add(0x04, "iconst_1", Iconst1Instruction.class, () -> new Iconst1Instruction()); + list.add(0x05, "iconst_2", Iconst2Instruction.class, () -> new Iconst2Instruction()); + list.add(0x06, "iconst_3", Iconst3Instruction.class, () -> new Iconst3Instruction()); + list.add(0x07, "iconst_4", Iconst4Instruction.class, () -> new Iconst4Instruction()); + list.add(0x08, "iconst_5", Iconst5Instruction.class, () -> new Iconst5Instruction()); + list.add(0x09, "lconst_0", Lconst0Instruction.class, () -> new Lconst0Instruction()); + list.add(0x0A, "lconst_1", Lconst1Instruction.class, () -> new Lconst1Instruction()); + list.add(0x0B, "fconst_0", Fconst0Instruction.class, () -> new Fconst0Instruction()); + list.add(0x0C, "fconst_1", Fconst1Instruction.class, () -> new Fconst1Instruction()); + list.add(0x0D, "fconst_2", Fconst2Instruction.class, () -> new Fconst2Instruction()); + list.add(0x0E, "dconst_0", Dconst0Instruction.class, () -> new Dconst0Instruction()); + list.add(0x0F, "dconst_1", Dconst1Instruction.class, () -> new Dconst1Instruction()); + list.add(0x10, "bipush", BipushInstruction.class, () -> new BipushInstruction()); + list.add(0x11, "sipush", SipushInstruction.class, () -> new SipushInstruction()); + list.add(0x12, "ldc", LdcInstruction.class, () -> new LdcInstruction()); + list.add(0x13, "ldc_w", LdcWInstruction.class, () -> new LdcWInstruction()); + list.add(0x14, "ldc2_w", Ldc2WInstruction.class, () -> new Ldc2WInstruction()); + + // Loads + list.add(0x15, "iload", IloadInstruction.class, () -> new IloadInstruction()); + list.add(0x16, "lload", LloadInstruction.class, () -> new LloadInstruction()); + list.add(0x17, "fload", FloadInstruction.class, () -> new FloadInstruction()); + list.add(0x18, "dload", DloadInstruction.class, () -> new DloadInstruction()); + list.add(0x19, "aload", AloadInstruction.class, () -> new AloadInstruction()); + list.add(0x1A, "iload_0", Iload0Instruction.class, () -> new Iload0Instruction()); + list.add(0x1B, "iload_1", Iload1Instruction.class, () -> new Iload1Instruction()); + list.add(0x1C, "iload_2", Iload2Instruction.class, () -> new Iload2Instruction()); + list.add(0x1D, "iload_3", Iload3Instruction.class, () -> new Iload3Instruction()); + list.add(0x1E, "lload_0", Lload0Instruction.class, () -> new Lload0Instruction()); + list.add(0x1F, "lload_1", Lload1Instruction.class, () -> new Lload1Instruction()); + list.add(0x20, "lload_2", Lload2Instruction.class, () -> new Lload2Instruction()); + list.add(0x21, "lload_3", Lload3Instruction.class, () -> new Lload3Instruction()); + list.add(0x22, "fload_0", Fload0Instruction.class, () -> new Fload0Instruction()); + list.add(0x23, "fload_1", Fload1Instruction.class, () -> new Fload1Instruction()); + list.add(0x24, "fload_2", Fload2Instruction.class, () -> new Fload2Instruction()); + list.add(0x25, "fload_3", Fload3Instruction.class, () -> new Fload3Instruction()); + list.add(0x26, "dload_0", Dload0Instruction.class, () -> new Dload0Instruction()); + list.add(0x27, "dload_1", Dload1Instruction.class, () -> new Dload1Instruction()); + list.add(0x28, "dload_2", Dload2Instruction.class, () -> new Dload2Instruction()); + list.add(0x29, "dload_3", Dload3Instruction.class, () -> new Dload3Instruction()); + list.add(0x2A, "aload_0", Aload0Instruction.class, () -> new Aload0Instruction()); + list.add(0x2B, "aload_1", Aload1Instruction.class, () -> new Aload1Instruction()); + list.add(0x2C, "aload_2", Aload2Instruction.class, () -> new Aload2Instruction()); + list.add(0x2D, "aload_3", Aload3Instruction.class, () -> new Aload3Instruction()); + list.add(0x2E, "iaload", IaloadInstruction.class, () -> new IaloadInstruction()); + list.add(0x2F, "laload", LaloadInstruction.class, () -> new LaloadInstruction()); + list.add(0x30, "faload", FaloadInstruction.class, () -> new FaloadInstruction()); + list.add(0x31, "daload", DaloadInstruction.class, () -> new DaloadInstruction()); + list.add(0x32, "aaload", AaloadInstruction.class, () -> new AaloadInstruction()); + list.add(0x33, "baload", BaloadInstruction.class, () -> new BaloadInstruction()); + list.add(0x34, "caload", CaloadInstruction.class, () -> new CaloadInstruction()); + list.add(0x35, "saload", SaloadInstruction.class, () -> new SaloadInstruction()); + + // Stores + list.add(0x36, "istore", IstoreInstruction.class, () -> new IstoreInstruction()); + list.add(0x37, "lstore", LstoreInstruction.class, () -> new LstoreInstruction()); + list.add(0x38, "fstore", FstoreInstruction.class, () -> new FstoreInstruction()); + list.add(0x39, "dstore", DstoreInstruction.class, () -> new DstoreInstruction()); + list.add(0x3A, "dstore", AstoreInstruction.class, () -> new AstoreInstruction()); + list.add(0x3B, "istore_0", Istore0Instruction.class, () -> new Istore0Instruction()); + list.add(0x3C, "istore_1", Istore1Instruction.class, () -> new Istore1Instruction()); + list.add(0x3D, "istore_2", Istore2Instruction.class, () -> new Istore2Instruction()); + list.add(0x3E, "istore_3", Istore3Instruction.class, () -> new Istore3Instruction()); + list.add(0x3F, "lstore_0", Lstore0Instruction.class, () -> new Lstore0Instruction()); + list.add(0x40, "lstore_1", Lstore1Instruction.class, () -> new Lstore1Instruction()); + list.add(0x41, "lstore_2", Lstore2Instruction.class, () -> new Lstore2Instruction()); + list.add(0x42, "lstore_3", Lstore3Instruction.class, () -> new Lstore3Instruction()); + list.add(0x43, "fstore_0", Fstore0Instruction.class, () -> new Fstore0Instruction()); + list.add(0x44, "fstore_1", Fstore1Instruction.class, () -> new Fstore1Instruction()); + list.add(0x45, "fstore_2", Fstore2Instruction.class, () -> new Fstore2Instruction()); + list.add(0x46, "fstore_3", Fstore3Instruction.class, () -> new Fstore3Instruction()); + list.add(0x47, "dstore_0", Dstore0Instruction.class, () -> new Dstore0Instruction()); + list.add(0x48, "dstore_1", Dstore1Instruction.class, () -> new Dstore1Instruction()); + list.add(0x49, "dstore_2", Dstore2Instruction.class, () -> new Dstore2Instruction()); + list.add(0x4A, "dstore_3", Dstore3Instruction.class, () -> new Dstore3Instruction()); + list.add(0x4B, "astore_0", Astore0Instruction.class, () -> new Astore0Instruction()); + list.add(0x4C, "astore_1", Astore1Instruction.class, () -> new Astore1Instruction()); + list.add(0x4D, "astore_2", Astore2Instruction.class, () -> new Astore2Instruction()); + list.add(0x4E, "astore_3", Astore3Instruction.class, () -> new Astore3Instruction()); + list.add(0x4F, "iastore", IastoreInstruction.class, () -> new IastoreInstruction()); + list.add(0x50, "lastore", LastoreInstruction.class, () -> new LastoreInstruction()); + list.add(0x51, "fastore", FastoreInstruction.class, () -> new FastoreInstruction()); + list.add(0x52, "dastore", DastoreInstruction.class, () -> new DastoreInstruction()); + list.add(0x53, "aastore", AastoreInstruction.class, () -> new AastoreInstruction()); + list.add(0x54, "bastore", BastoreInstruction.class, () -> new BastoreInstruction()); + list.add(0x55, "castore", CastoreInstruction.class, () -> new CastoreInstruction()); + list.add(0x56, "sastore", SastoreInstruction.class, () -> new SastoreInstruction()); + + // Stack + list.add(0x57, "pop", PopInstruction.class, () -> new PopInstruction()); + list.add(0x58, "pop2", Pop2Instruction.class, () -> new Pop2Instruction()); + list.add(0x59, "dup", DupInstruction.class, () -> new DupInstruction()); + list.add(0x5A, "dup_x1", DupX1Instruction.class, () -> new DupX1Instruction()); + list.add(0x5B, "dup_x2", DupX2Instruction.class, () -> new DupX2Instruction()); + list.add(0x5C, "dup2", Dup2Instruction.class, () -> new Dup2Instruction()); + list.add(0x5D, "dup2_x1", Dup2X1Instruction.class, () -> new Dup2X1Instruction()); + list.add(0x5E, "dup2_x2", Dup2X2Instruction.class, () -> new Dup2X2Instruction()); + list.add(0x5F, "swap", SwapInstruction.class, () -> new SwapInstruction()); + + // Math + list.add(0x60, "iadd", IaddInstruction.class, () -> new IaddInstruction()); + list.add(0x61, "ladd", LaddInstruction.class, () -> new LaddInstruction()); + list.add(0x62, "fadd", FaddInstruction.class, () -> new FaddInstruction()); + list.add(0x63, "dadd", DaddInstruction.class, () -> new DaddInstruction()); + list.add(0x64, "isub", IsubInstruction.class, () -> new IsubInstruction()); + list.add(0x65, "lsub", LsubInstruction.class, () -> new LsubInstruction()); + list.add(0x66, "fsub", FsubInstruction.class, () -> new FsubInstruction()); + list.add(0x67, "dsub", DsubInstruction.class, () -> new DsubInstruction()); + list.add(0x68, "imul", ImulInstruction.class, () -> new ImulInstruction()); + list.add(0x69, "lmul", LmulInstruction.class, () -> new LmulInstruction()); + list.add(0x6A, "fmul", FmulInstruction.class, () -> new FmulInstruction()); + list.add(0x6B, "dmul", DmulInstruction.class, () -> new DmulInstruction()); + list.add(0x6C, "idiv", IdivInstruction.class, () -> new IdivInstruction()); + list.add(0x6D, "ldiv", LdivInstruction.class, () -> new LdivInstruction()); + list.add(0x6E, "fdiv", FdivInstruction.class, () -> new FdivInstruction()); + list.add(0x6F, "ddiv", DdivInstruction.class, () -> new DdivInstruction()); + list.add(0x70, "irem", IremInstruction.class, () -> new IremInstruction()); + list.add(0x71, "lrem", LremInstruction.class, () -> new LremInstruction()); + list.add(0x72, "frem", FremInstruction.class, () -> new FremInstruction()); + list.add(0x73, "drem", DremInstruction.class, () -> new DremInstruction()); + list.add(0x74, "ineg", InegInstruction.class, () -> new InegInstruction()); + list.add(0x75, "lneg", LnegInstruction.class, () -> new LnegInstruction()); + list.add(0x76, "fneg", FnegInstruction.class, () -> new FnegInstruction()); + list.add(0x77, "dneg", DnegInstruction.class, () -> new DnegInstruction()); + list.add(0x78, "ishl", IshlInstruction.class, () -> new IshlInstruction()); + list.add(0x79, "lshl", LshlInstruction.class, () -> new LshlInstruction()); + list.add(0x7A, "ishr", IshrInstruction.class, () -> new IshrInstruction()); + list.add(0x7B, "lshr", LshrInstruction.class, () -> new LshrInstruction()); + list.add(0x7C, "iushr", IushrInstruction.class, () -> new IushrInstruction()); + list.add(0x7D, "lushr", LushrInstruction.class, () -> new LushrInstruction()); + list.add(0x7E, "iand", IandInstruction.class, () -> new IandInstruction()); + list.add(0x7F, "land", LandInstruction.class, () -> new LandInstruction()); + list.add(0x80, "ior", IorInstruction.class, () -> new IorInstruction()); + list.add(0x81, "lor", LorInstruction.class, () -> new LorInstruction()); + list.add(0x82, "ixor", IxorInstruction.class, () -> new IxorInstruction()); + list.add(0x83, "lxor", LxorInstruction.class, () -> new LxorInstruction()); + list.add(0x84, "iinc", IincInstruction.class, () -> new IincInstruction()); + + // Conversions + list.add(0x85, "i2l", I2lInstruction.class, () -> new I2lInstruction()); + list.add(0x86, "i2f", I2fInstruction.class, () -> new I2fInstruction()); + list.add(0x87, "i2d", I2dInstruction.class, () -> new I2dInstruction()); + list.add(0x88, "l2i", L2fInstruction.class, () -> new L2iInstruction()); + list.add(0x89, "l2f", L2fInstruction.class, () -> new L2fInstruction()); + list.add(0x8A, "l2d", L2dInstruction.class, () -> new L2dInstruction()); + list.add(0x8B, "f2i", F2iInstruction.class, () -> new F2iInstruction()); + list.add(0x8C, "f2l", F2lInstruction.class, () -> new F2lInstruction()); + list.add(0x8D, "f2d", F2dInstruction.class, () -> new F2dInstruction()); + list.add(0x8E, "d2i", D2iInstruction.class, () -> new D2iInstruction()); + list.add(0x8F, "d2l", D2lInstruction.class, () -> new D2lInstruction()); + list.add(0x90, "d2f", D2fInstruction.class, () -> new D2fInstruction()); + list.add(0x91, "i2b", I2bInstruction.class, () -> new I2bInstruction()); + list.add(0x92, "i2c", I2cInstruction.class, () -> new I2cInstruction()); + list.add(0x93, "i2s", I2sInstruction.class, () -> new I2sInstruction()); + + // Comparisions + list.add(0x94, "lcmp", LcmpInstruction.class, () -> new LcmpInstruction()); + list.add(0x95, "fcmpl", FcmplInstruction.class, () -> new FcmplInstruction()); + list.add(0x96, "fcmpg", FcmpgInstruction.class, () -> new FcmpgInstruction()); + list.add(0x97, "dcmpl", DcmplInstruction.class, () -> new DcmplInstruction()); + list.add(0x98, "dcmpg", DcmpgInstruction.class, () -> new DcmpgInstruction()); + list.add(0x99, "ifeq", IfeqInstruction.class, () -> new IfeqInstruction()); + list.add(0x9A, "ifne", IfneInstruction.class, () -> new IfneInstruction()); + list.add(0x9B, "iflt", IfltInstruction.class, () -> new IfltInstruction()); + list.add(0x9C, "ifge", IfgeInstruction.class, () -> new IfgeInstruction()); + list.add(0x9D, "ifgt", IfgtInstruction.class, () -> new IfgtInstruction()); + list.add(0x9E, "ifle", IfleInstruction.class, () -> new IfleInstruction()); + list.add(0x9F, "if_icmpeq", IfIcmpeqInstruction.class, () -> new IfIcmpeqInstruction()); + list.add(0xA0, "if_icmpne", IfIcmpneInstruction.class, () -> new IfIcmpneInstruction()); + list.add(0xA1, "if_icmplt", IfIcmpltInstruction.class, () -> new IfIcmpltInstruction()); + list.add(0xA2, "if_icmpge", IfIcmpgeInstruction.class, () -> new IfIcmpgeInstruction()); + list.add(0xA3, "if_icmpgt", IfIcmpgtInstruction.class, () -> new IfIcmpgtInstruction()); + list.add(0xA4, "if_icmple", IfIcmpleInstruction.class, () -> new IfIcmpleInstruction()); + list.add(0xA5, "if_acmpeq", IfAcmpeqInstruction.class, () -> new IfAcmpeqInstruction()); + list.add(0xA6, "if_acmpne", IfAcmpneInstruction.class, () -> new IfAcmpneInstruction()); + + // Control + list.add(0xA7, "goto", GotoInstruction.class, () -> new GotoInstruction()); + list.add(0xA8, "jsr", JsrInstruction.class, () -> new JsrInstruction()); + list.add(0xA9, "ret", RetInstruction.class, () -> new RetInstruction()); + list.add(0xAA, "tableswitch", TableswitchInstruction.class, () -> new TableswitchInstruction()); + list.add(0xAB, "lookupswitch", LookupswitchInstruction.class, () -> new LookupswitchInstruction()); + list.add(0xAC, "ireturn", IreturnInstruction.class, () -> new IreturnInstruction()); + list.add(0xAD, "lreturn", LreturnInstruction.class, () -> new LreturnInstruction()); + list.add(0xAE, "freturn", FreturnInstruction.class, () -> new FreturnInstruction()); + list.add(0xAF, "dreturn", DreturnInstruction.class, () -> new DreturnInstruction()); + list.add(0xB0, "areturn", AreturnInstruction.class, () -> new AreturnInstruction()); + list.add(0xB1, "return", ReturnInstruction.class, () -> new ReturnInstruction()); + + // References + list.add(0xB2, "getstatic", GetstaticInstruction.class, () -> new GetstaticInstruction()); + list.add(0xB3, "putstatic", PutstaticInstruction.class, () -> new PutstaticInstruction()); + list.add(0xB4, "getfield", GetfieldInstruction.class, () -> new GetfieldInstruction()); + list.add(0xB5, "putfield", PutfieldInstruction.class, () -> new PutfieldInstruction()); + list.add(0xB6, "invokevirtual", InvokevirtualInstruction.class, () -> new InvokevirtualInstruction()); + list.add(0xB7, "invokespecial", InvokespecialInstruction.class, () -> new InvokespecialInstruction()); + list.add(0xB8, "invokestatic", InvokestaticInstruction.class, () -> new InvokestaticInstruction()); + list.add(0xB9, "invokeinterface", InvokeinterfaceInstruction.class, () -> new InvokeinterfaceInstruction()); + list.add(0xBA, "invokedynamic", InvokedynamicInstruction.class, () -> new InvokedynamicInstruction()); + list.add(0xBB, "new", NewInstruction.class, () -> new NewInstruction()); + list.add(0xBC, "newarray", NewarrayInstruction.class, () -> new NewarrayInstruction()); + list.add(0xBD, "anewarray", AnewarrayInstruction.class, () -> new AnewarrayInstruction()); + list.add(0xBE, "arraylength", ArraylengthInstruction.class, () -> new ArraylengthInstruction()); + list.add(0xBF, "athrow", AthrowInstruction.class, () -> new AthrowInstruction()); + list.add(0xC0, "checkcast", CheckcastInstruction.class, () -> new CheckcastInstruction()); + list.add(0xC1, "instanceof", InstanceofInstruction.class, () -> new InstanceofInstruction()); + list.add(0xC2, "monitorenter", MonitorenterInstruction.class, () -> new MonitorenterInstruction()); + list.add(0xC3, "monitorexit", MonitorexitInstruction.class, () -> new MonitorexitInstruction()); + + // Extended + list.add(0xC4, "wide", WideInstruction.class, () -> new WideInstruction()); + list.add(0xC5, "multianewarray", MultianewarrayInstruction.class, () -> new MultianewarrayInstruction()); + list.add(0xC6, "ifnull", IfnullInstruction.class, () -> new IfnullInstruction()); + list.add(0xC7, "ifnonnull", IfnonnullInstruction.class, () -> new IfnonnullInstruction()); + list.add(0xC8, "goto_w", GotoWInstruction.class, () -> new GotoWInstruction()); + list.add(0xC9, "jsr_w", JsrWInstruction.class, () -> new JsrWInstruction()); + + // Reserved + list.add(0xCA, "breakpoint", BreakpointInstruction.class, () -> new BreakpointInstruction()); + list.add(0xFE, "impdep1", Impdep1Instruction.class, () -> new Impdep1Instruction()); + list.add(0xFF, "impdep2", Impdep2Instruction.class, () -> new Impdep2Instruction()); + + opcodeFromMnemonic = new HashMap<>(list.size()); + mnemonicFromOpcode = new HashMap<>(list.size()); + supplierFromOpcode = new HashMap<>(list.size()); + classFromOpcode = new HashMap<>(list.size()); + opcodeFromClass = new HashMap<>(list.size()); + + list.forEach(element -> { + mnemonicFromOpcode.put(element.getOpcode(), element.getMnemonic()); + opcodeFromMnemonic.put(element.getMnemonic(), element.getOpcode()); + supplierFromOpcode.put(element.getOpcode(), element.getInstructionSupplier()); + classFromOpcode.put(element.getOpcode(), element.getInstructionClass()); + opcodeFromClass.put(element.getInstructionClass(), element.getOpcode()); + }); + } + + @SneakyThrows + public > T getInstruction(MultiEndianInputStream input) { + var opcode = input.readUnsignedByte(); + + var instruction = supplierFromOpcode.get(opcode).get(); + + input.unreadUnsignedByte(opcode); + + return instruction != null ? (T) instruction.read(input) : null; + } + + public > Class getInstructionClass(short opcode) { + return (Class) classFromOpcode.get(opcode); + } + + public String getMnemonic(short opcode) { + return mnemonicFromOpcode.get(opcode); + } + + public short getOpcode(String mnemonic) { + return opcodeFromMnemonic.get(mnemonic); + } + + public short getOpcode(Class> c) { + return opcodeFromClass.get(c); + } + + @Getter + @AllArgsConstructor + private class InstructionMapping { + + private short opcode; + private String mnemonic; + private Class> instructionClass; + private Supplier> instructionSupplier; + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/ComparisionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/ComparisionInstruction.java new file mode 100644 index 0000000..6a038bb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/ComparisionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface ComparisionInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/AbstractAcmpInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/AbstractAcmpInstruction.java new file mode 100644 index 0000000..8be82f6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/AbstractAcmpInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision.acmp; + +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; + +public interface AbstractAcmpInstruction> extends ComparisionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpeqInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpeqInstruction.java new file mode 100644 index 0000000..4685b1f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpeqInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.acmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfAcmpeqInstruction implements AbstractAcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfAcmpeqInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpneInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpneInstruction.java new file mode 100644 index 0000000..ee42b46 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/acmp/IfAcmpneInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.acmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfAcmpneInstruction implements AbstractAcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfAcmpneInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/AbstractCmp0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/AbstractCmp0Instruction.java new file mode 100644 index 0000000..470ee86 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/AbstractCmp0Instruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; + +public interface AbstractCmp0Instruction> extends ComparisionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfeqInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfeqInstruction.java new file mode 100644 index 0000000..bfd39d4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfeqInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfeqInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfeqInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgeInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgeInstruction.java new file mode 100644 index 0000000..e428893 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgeInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfgeInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfgeInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgtInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgtInstruction.java new file mode 100644 index 0000000..e1cdd40 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfgtInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfgtInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfgtInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfleInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfleInstruction.java new file mode 100644 index 0000000..255e5d9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfleInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfleInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfleInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfltInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfltInstruction.java new file mode 100644 index 0000000..ba50327 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfltInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfltInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfltInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfneInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfneInstruction.java new file mode 100644 index 0000000..6471dd2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/cmp0/IfneInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.cmp0; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfneInstruction implements AbstractCmp0Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfneInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/AbstractDcmpInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/AbstractDcmpInstruction.java new file mode 100644 index 0000000..d1a3f5e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/AbstractDcmpInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision.dcmp; + +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; + +public interface AbstractDcmpInstruction> extends ComparisionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmpgInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmpgInstruction.java new file mode 100644 index 0000000..633be1b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmpgInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.comparision.dcmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DcmpgInstruction implements AbstractDcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DcmpgInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmplInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmplInstruction.java new file mode 100644 index 0000000..8a3b815 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/dcmp/DcmplInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.comparision.dcmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DcmplInstruction implements AbstractDcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DcmplInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/AbstractFcmpInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/AbstractFcmpInstruction.java new file mode 100644 index 0000000..222d2fb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/AbstractFcmpInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision.fcmp; + +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; + +public interface AbstractFcmpInstruction> extends ComparisionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmpgInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmpgInstruction.java new file mode 100644 index 0000000..ed3090c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmpgInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.comparision.fcmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FcmpgInstruction implements AbstractFcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FcmpgInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmplInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmplInstruction.java new file mode 100644 index 0000000..cf2d1ba --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/fcmp/FcmplInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.comparision.fcmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FcmplInstruction implements AbstractFcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FcmplInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/AbstractIcmpInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/AbstractIcmpInstruction.java new file mode 100644 index 0000000..3407961 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/AbstractIcmpInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; + +public interface AbstractIcmpInstruction> extends ComparisionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpeqInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpeqInstruction.java new file mode 100644 index 0000000..fadadef --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpeqInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpeqInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpeqInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgeInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgeInstruction.java new file mode 100644 index 0000000..96ba7ce --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgeInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpgeInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpgeInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgtInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgtInstruction.java new file mode 100644 index 0000000..3ca60ac --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpgtInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpgtInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpgtInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpleInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpleInstruction.java new file mode 100644 index 0000000..d54f26a --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpleInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpleInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpleInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpltInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpltInstruction.java new file mode 100644 index 0000000..7ec54c4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpltInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpltInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpltInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpneInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpneInstruction.java new file mode 100644 index 0000000..bcef202 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/icmp/IfIcmpneInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.comparision.icmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfIcmpneInstruction implements AbstractIcmpInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfIcmpneInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/lcmp/LcmpInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/lcmp/LcmpInstruction.java new file mode 100644 index 0000000..8e0de2f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/comparision/lcmp/LcmpInstruction.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.instruction.comparision.lcmp; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.instruction.comparision.ComparisionInstruction; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LcmpInstruction implements ComparisionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LcmpInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AbstractConstantInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AbstractConstantInstruction.java new file mode 100644 index 0000000..9b23646 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AbstractConstantInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractConstantInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AconstNullInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AconstNullInstruction.java new file mode 100644 index 0000000..7b8a6ae --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/AconstNullInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AconstNullInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public AconstNullInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/BipushInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/BipushInstruction.java new file mode 100644 index 0000000..1cfd8c9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/BipushInstruction.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BipushInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private byte byteValue; + + @Override + @SneakyThrows + public BipushInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + byteValue = input.readSignedByte(); + + return this; + } + + @Override + @SneakyThrows + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeSignedByte(byteValue); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/Ldc2WInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/Ldc2WInstruction.java new file mode 100644 index 0000000..2a31463 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/Ldc2WInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Ldc2WInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public Ldc2WInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcInstruction.java new file mode 100644 index 0000000..958bf6b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LdcInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public LdcInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcWInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcWInstruction.java new file mode 100644 index 0000000..bf24364 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/LdcWInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LdcWInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public LdcWInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/NopInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/NopInstruction.java new file mode 100644 index 0000000..de42e9d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/NopInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NopInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public NopInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/SipushInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/SipushInstruction.java new file mode 100644 index 0000000..865133c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/SipushInstruction.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.instruction.constant; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SipushInstruction implements AbstractConstantInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short shortValue; + + @Override + @SneakyThrows + public SipushInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + shortValue = input.readSignedShort(); + + return this; + } + + @Override + @SneakyThrows + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeSignedShort(shortValue); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/AbstractDconstInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/AbstractDconstInstruction.java new file mode 100644 index 0000000..c9ee0a3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/AbstractDconstInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.constant.dconst; + +import com.github.wdestroier.chamomile.instruction.constant.AbstractConstantInstruction; + +public interface AbstractDconstInstruction> extends AbstractConstantInstruction { + + double getConstant(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst0Instruction.java new file mode 100644 index 0000000..316b467 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.dconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dconst0Instruction implements AbstractDconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dconst0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public double getConstant() { + return 0.0d; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst1Instruction.java new file mode 100644 index 0000000..5af78f8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/dconst/Dconst1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.dconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dconst1Instruction implements AbstractDconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dconst1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public double getConstant() { + return 1.0d; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/AbstractFconstInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/AbstractFconstInstruction.java new file mode 100644 index 0000000..0b7aa2e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/AbstractFconstInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.constant.fconst; + +import com.github.wdestroier.chamomile.instruction.constant.AbstractConstantInstruction; + +public interface AbstractFconstInstruction> extends AbstractConstantInstruction { + + float getConstant(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst0Instruction.java new file mode 100644 index 0000000..b9631a4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.fconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fconst0Instruction implements AbstractFconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fconst0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public float getConstant() { + return 0.0f; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst1Instruction.java new file mode 100644 index 0000000..cc21706 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.fconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fconst1Instruction implements AbstractFconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fconst1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public float getConstant() { + return 1.0f; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst2Instruction.java new file mode 100644 index 0000000..fca84cd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/fconst/Fconst2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.fconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fconst2Instruction implements AbstractFconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fconst2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public float getConstant() { + return 2.0f; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/AbstractIconstInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/AbstractIconstInstruction.java new file mode 100644 index 0000000..279df5d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/AbstractIconstInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.constant.AbstractConstantInstruction; + +public interface AbstractIconstInstruction> extends AbstractConstantInstruction { + + int getConstant(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst0Instruction.java new file mode 100644 index 0000000..0ff5923 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst0Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst1Instruction.java new file mode 100644 index 0000000..fe39439 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst1Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst2Instruction.java new file mode 100644 index 0000000..7b320c5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst2Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst3Instruction.java new file mode 100644 index 0000000..a332bbe --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst3Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst4Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst4Instruction.java new file mode 100644 index 0000000..0d15e61 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst4Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst4Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst4Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 4; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst5Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst5Instruction.java new file mode 100644 index 0000000..f921b0f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/Iconst5Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iconst5Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iconst5Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return 5; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/IconstM1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/IconstM1Instruction.java new file mode 100644 index 0000000..522a247 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/iconst/IconstM1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.iconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IconstM1Instruction implements AbstractIconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IconstM1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public int getConstant() { + return -1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/AbstractLconstInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/AbstractLconstInstruction.java new file mode 100644 index 0000000..e4665a5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/AbstractLconstInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.constant.lconst; + +import com.github.wdestroier.chamomile.instruction.constant.AbstractConstantInstruction; + +public interface AbstractLconstInstruction> extends AbstractConstantInstruction { + + long getConstant(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst0Instruction.java new file mode 100644 index 0000000..11ca1c2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.lconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lconst0Instruction implements AbstractLconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lconst0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public long getConstant() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst1Instruction.java new file mode 100644 index 0000000..54d9a93 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/constant/lconst/Lconst1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.constant.lconst; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lconst1Instruction implements AbstractLconstInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lconst1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public long getConstant() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/AbstractControlInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/AbstractControlInstruction.java new file mode 100644 index 0000000..387069e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/AbstractControlInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractControlInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/AreturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/AreturnInstruction.java new file mode 100644 index 0000000..a2f2ac9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/AreturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AreturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public AreturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/DreturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/DreturnInstruction.java new file mode 100644 index 0000000..aef8af9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/DreturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DreturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DreturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/FreturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/FreturnInstruction.java new file mode 100644 index 0000000..29582ef --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/FreturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FreturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FreturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/GotoInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/GotoInstruction.java new file mode 100644 index 0000000..627a909 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/GotoInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GotoInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public GotoInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/IreturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/IreturnInstruction.java new file mode 100644 index 0000000..3fe9b26 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/IreturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IreturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IreturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/JsrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/JsrInstruction.java new file mode 100644 index 0000000..82e5feb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/JsrInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class JsrInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public JsrInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/LookupswitchInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/LookupswitchInstruction.java new file mode 100644 index 0000000..5109ada --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/LookupswitchInstruction.java @@ -0,0 +1,74 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructure; +import com.github.wdestroier.chamomile.classfile.pseudostructure.PseudoStructureFactory; +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LookupswitchInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private byte[] padding; + private int defaultOffset; + private int npairs; + private MatchOffsetPair[] pairs; + + @Override + public LookupswitchInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + padding = input.readSignedBytes((int) (input.getBytesRead() % 4)); + defaultOffset = input.readSignedInt(); + npairs = input.readSignedInt(); + pairs = new MatchOffsetPair[npairs]; + + for (int i = 0; i < npairs; i++) { + pairs[i] = new MatchOffsetPair().read(input, null); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeSignedBytes(padding); + output.writeSignedInt(defaultOffset); + output.writeSignedInt(npairs); + + for (MatchOffsetPair pair : pairs) { + pair.write(output); + } + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class MatchOffsetPair implements PseudoStructure { + + private int match, offset; + + @Override + public MatchOffsetPair read(MultiEndianInputStream input, PseudoStructureFactory pseudoStructureFactory) { + match = input.readSignedInt(); + offset = input.readSignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeSignedInt(match); + output.writeSignedInt(offset); + } + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/LreturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/LreturnInstruction.java new file mode 100644 index 0000000..aa23972 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/LreturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LreturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LreturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/RetInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/RetInstruction.java new file mode 100644 index 0000000..8f1b95d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/RetInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RetInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public RetInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/ReturnInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/ReturnInstruction.java new file mode 100644 index 0000000..a073919 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/ReturnInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ReturnInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public ReturnInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/control/TableswitchInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/control/TableswitchInstruction.java new file mode 100644 index 0000000..2d436e1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/control/TableswitchInstruction.java @@ -0,0 +1,44 @@ +package com.github.wdestroier.chamomile.instruction.control; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TableswitchInstruction implements AbstractControlInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private byte[] padding; + private int defaultOffset; + private int low, high; + private int[] jumpOffsets; + + @Override + public TableswitchInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + padding = input.readSignedBytes((int) (input.getBytesRead() % 4)); + defaultOffset = input.readSignedInt(); + low = input.readSignedInt(); + high = input.readSignedInt(); + jumpOffsets = input.readSignedInts((int) (high - low + 1)); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeSignedBytes(padding); + output.writeSignedInt(defaultOffset); + output.writeSignedInt(low); + output.writeSignedInt(high); + output.writeSignedInts(jumpOffsets); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/AbstractConversionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/AbstractConversionInstruction.java new file mode 100644 index 0000000..e9f2494 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/AbstractConversionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.conversion; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractConversionInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/AbstractDoubleConversionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/AbstractDoubleConversionInstruction.java new file mode 100644 index 0000000..ba68cd0 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/AbstractDoubleConversionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.conversion.doubles; + +import com.github.wdestroier.chamomile.instruction.conversion.AbstractConversionInstruction; + +public interface AbstractDoubleConversionInstruction> extends AbstractConversionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2fInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2fInstruction.java new file mode 100644 index 0000000..c0f1d2c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2fInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.doubles; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class D2fInstruction implements AbstractDoubleConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public D2fInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2iInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2iInstruction.java new file mode 100644 index 0000000..16d11ae --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2iInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.doubles; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class D2iInstruction implements AbstractDoubleConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public D2iInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2lInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2lInstruction.java new file mode 100644 index 0000000..354ffde --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/doubles/D2lInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.doubles; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class D2lInstruction implements AbstractDoubleConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public D2lInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/AbstractFloatConversionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/AbstractFloatConversionInstruction.java new file mode 100644 index 0000000..bc5b76b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/AbstractFloatConversionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.conversion.floats; + +import com.github.wdestroier.chamomile.instruction.conversion.AbstractConversionInstruction; + +public interface AbstractFloatConversionInstruction> extends AbstractConversionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2dInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2dInstruction.java new file mode 100644 index 0000000..c8b207c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2dInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.floats; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class F2dInstruction implements AbstractFloatConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public F2dInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2iInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2iInstruction.java new file mode 100644 index 0000000..ff38648 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2iInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.floats; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class F2iInstruction implements AbstractFloatConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public F2iInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2lInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2lInstruction.java new file mode 100644 index 0000000..0ad92d5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/floats/F2lInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.floats; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class F2lInstruction implements AbstractFloatConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public F2lInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/AbstractIntConversionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/AbstractIntConversionInstruction.java new file mode 100644 index 0000000..0305f99 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/AbstractIntConversionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.conversion.AbstractConversionInstruction; + +public interface AbstractIntConversionInstruction> extends AbstractConversionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2bInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2bInstruction.java new file mode 100644 index 0000000..27108e0 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2bInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2bInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2bInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2cInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2cInstruction.java new file mode 100644 index 0000000..f85025c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2cInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2cInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2cInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2dInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2dInstruction.java new file mode 100644 index 0000000..7c08f6f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2dInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2dInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2dInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2fInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2fInstruction.java new file mode 100644 index 0000000..563aca7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2fInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2fInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2fInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2lInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2lInstruction.java new file mode 100644 index 0000000..704f3cd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2lInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2lInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2lInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2sInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2sInstruction.java new file mode 100644 index 0000000..10a0798 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/ints/I2sInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.ints; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class I2sInstruction implements AbstractIntConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public I2sInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/AbstractLongConversionInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/AbstractLongConversionInstruction.java new file mode 100644 index 0000000..f6c1379 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/AbstractLongConversionInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.conversion.longs; + +import com.github.wdestroier.chamomile.instruction.conversion.AbstractConversionInstruction; + +public interface AbstractLongConversionInstruction> extends AbstractConversionInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2dInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2dInstruction.java new file mode 100644 index 0000000..0e3431d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2dInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.longs; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class L2dInstruction implements AbstractLongConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public L2dInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2fInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2fInstruction.java new file mode 100644 index 0000000..403d9ff --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2fInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.longs; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class L2fInstruction implements AbstractLongConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public L2fInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2iInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2iInstruction.java new file mode 100644 index 0000000..d11331f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/conversion/longs/L2iInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.conversion.longs; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class L2iInstruction implements AbstractLongConversionInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public L2iInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/AbstractExtendedInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/AbstractExtendedInstruction.java new file mode 100644 index 0000000..0421c84 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/AbstractExtendedInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractExtendedInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/GotoWInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/GotoWInstruction.java new file mode 100644 index 0000000..1d885bf --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/GotoWInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GotoWInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private long branchOffset; + + @Override + public GotoWInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedInt(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnonnullInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnonnullInstruction.java new file mode 100644 index 0000000..17de4dd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnonnullInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfnonnullInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfnonnullInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnullInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnullInstruction.java new file mode 100644 index 0000000..86b63f9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/IfnullInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IfnullInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int branchOffset; + + @Override + public IfnullInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/JsrWInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/JsrWInstruction.java new file mode 100644 index 0000000..a2b4c49 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/JsrWInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class JsrWInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private long branchOffset; + + @Override + public JsrWInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + branchOffset = input.readUnsignedInt(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedInt(branchOffset); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/MultianewarrayInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/MultianewarrayInstruction.java new file mode 100644 index 0000000..1acb754 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/MultianewarrayInstruction.java @@ -0,0 +1,36 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MultianewarrayInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + private short dimensions; + + @Override + public MultianewarrayInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + dimensions = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + output.writeUnsignedByte(dimensions); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/extended/WideInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/WideInstruction.java new file mode 100644 index 0000000..996db9f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/extended/WideInstruction.java @@ -0,0 +1,50 @@ +package com.github.wdestroier.chamomile.instruction.extended; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.instruction.math.IincInstruction; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WideInstruction implements AbstractExtendedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short widenedOpcode; + private int index; + private int constant; + + @Override + public WideInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + widenedOpcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + if (isWidenedOpcodeIinc()) { + constant = input.readUnsignedShort(); + } + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(widenedOpcode); + output.writeUnsignedShort(index); + + if (isWidenedOpcodeIinc()) { + output.writeUnsignedShort(constant); + } + } + + private boolean isWidenedOpcodeIinc() { + return IincInstruction.class.equals(InstructionFactory.instance.getInstructionClass(widenedOpcode)); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/AaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/AaloadInstruction.java new file mode 100644 index 0000000..4fd7d60 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/AaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public AaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/AbstractLoadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/AbstractLoadInstruction.java new file mode 100644 index 0000000..0465e07 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/AbstractLoadInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractLoadInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/BaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/BaloadInstruction.java new file mode 100644 index 0000000..be292fa --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/BaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public BaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/CaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/CaloadInstruction.java new file mode 100644 index 0000000..5703f1b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/CaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public CaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/DaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/DaloadInstruction.java new file mode 100644 index 0000000..ddce18b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/DaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/FaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/FaloadInstruction.java new file mode 100644 index 0000000..81252b7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/FaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/IaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/IaloadInstruction.java new file mode 100644 index 0000000..3c52e9f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/IaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/LaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/LaloadInstruction.java new file mode 100644 index 0000000..fa8c053 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/LaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/SaloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/SaloadInstruction.java new file mode 100644 index 0000000..96dc5ef --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/SaloadInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.load; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SaloadInstruction implements AbstractLoadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public SaloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AbstractAloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AbstractAloadInstruction.java new file mode 100644 index 0000000..1f98de7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AbstractAloadInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.load.AbstractLoadInstruction; + +public interface AbstractAloadInstruction> extends AbstractLoadInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload0Instruction.java new file mode 100644 index 0000000..588a075 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Aload0Instruction implements AbstractAloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Aload0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload1Instruction.java new file mode 100644 index 0000000..3c57c9d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Aload1Instruction implements AbstractAloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Aload1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload2Instruction.java new file mode 100644 index 0000000..46f6e99 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Aload2Instruction implements AbstractAloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Aload2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload3Instruction.java new file mode 100644 index 0000000..1f75f67 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/Aload3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Aload3Instruction implements AbstractAloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Aload3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AloadInstruction.java new file mode 100644 index 0000000..37bb65f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/aload/AloadInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.load.aload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AloadInstruction implements AbstractAloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public AloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/AbstractDloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/AbstractDloadInstruction.java new file mode 100644 index 0000000..456b486 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/AbstractDloadInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.load.AbstractLoadInstruction; + +public interface AbstractDloadInstruction> extends AbstractLoadInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload0Instruction.java new file mode 100644 index 0000000..af0aad3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dload0Instruction implements AbstractDloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dload0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload1Instruction.java new file mode 100644 index 0000000..ad09065 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dload1Instruction implements AbstractDloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dload1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload2Instruction.java new file mode 100644 index 0000000..b2ac2db --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dload2Instruction implements AbstractDloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dload2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload3Instruction.java new file mode 100644 index 0000000..55196c9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/Dload3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dload3Instruction implements AbstractDloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dload3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/DloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/DloadInstruction.java new file mode 100644 index 0000000..d461f44 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/dload/DloadInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.load.dload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DloadInstruction implements AbstractDloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public DloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/AbstractFloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/AbstractFloadInstruction.java new file mode 100644 index 0000000..66a8c52 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/AbstractFloadInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.load.AbstractLoadInstruction; + +public interface AbstractFloadInstruction> extends AbstractLoadInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload0Instruction.java new file mode 100644 index 0000000..c919f74 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fload0Instruction implements AbstractFloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fload0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload1Instruction.java new file mode 100644 index 0000000..893a093 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fload1Instruction implements AbstractFloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fload1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload2Instruction.java new file mode 100644 index 0000000..f5ac760 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fload2Instruction implements AbstractFloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fload2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload3Instruction.java new file mode 100644 index 0000000..956d9cc --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/Fload3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fload3Instruction implements AbstractFloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fload3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/FloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/FloadInstruction.java new file mode 100644 index 0000000..c1228a5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/fload/FloadInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.load.fload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FloadInstruction implements AbstractFloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public FloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/AbstractIloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/AbstractIloadInstruction.java new file mode 100644 index 0000000..ed89fa8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/AbstractIloadInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.load.AbstractLoadInstruction; + +public interface AbstractIloadInstruction> extends AbstractLoadInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload0Instruction.java new file mode 100644 index 0000000..55cb206 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iload0Instruction implements AbstractIloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iload0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload1Instruction.java new file mode 100644 index 0000000..a67c0d4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iload1Instruction implements AbstractIloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iload1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload2Instruction.java new file mode 100644 index 0000000..207a5b9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iload2Instruction implements AbstractIloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iload2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload3Instruction.java new file mode 100644 index 0000000..234b021 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/Iload3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Iload3Instruction implements AbstractIloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Iload3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/IloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/IloadInstruction.java new file mode 100644 index 0000000..f4b26ef --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/iload/IloadInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.load.iload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IloadInstruction implements AbstractIloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public IloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/AbstractLloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/AbstractLloadInstruction.java new file mode 100644 index 0000000..4bf2ff8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/AbstractLloadInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.load.AbstractLoadInstruction; + +public interface AbstractLloadInstruction> extends AbstractLoadInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload0Instruction.java new file mode 100644 index 0000000..6939887 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lload0Instruction implements AbstractLloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lload0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload1Instruction.java new file mode 100644 index 0000000..5d0ede2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lload1Instruction implements AbstractLloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lload1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload2Instruction.java new file mode 100644 index 0000000..7ababf1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lload2Instruction implements AbstractLloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lload2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload3Instruction.java new file mode 100644 index 0000000..aa19cec --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/Lload3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lload3Instruction implements AbstractLloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lload3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/LloadInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/LloadInstruction.java new file mode 100644 index 0000000..e17b639 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/load/lload/LloadInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.load.lload; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LloadInstruction implements AbstractLloadInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public LloadInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/AbstractMathInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/AbstractMathInstruction.java new file mode 100644 index 0000000..7cf2289 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/AbstractMathInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractMathInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/IincInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/IincInstruction.java new file mode 100644 index 0000000..7c6dfad --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/IincInstruction.java @@ -0,0 +1,39 @@ +package com.github.wdestroier.chamomile.instruction.math; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IincInstruction implements AbstractMathInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + private byte constant; + + @Override + @SneakyThrows + public IincInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + constant = input.readSignedByte(); + + return this; + } + + @Override + @SneakyThrows + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + output.writeSignedByte(constant); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/AbstractAddInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/AbstractAddInstruction.java new file mode 100644 index 0000000..c306df6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/AbstractAddInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.add; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractAddInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/DaddInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/DaddInstruction.java new file mode 100644 index 0000000..2f13bcb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/DaddInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.add; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DaddInstruction implements AbstractAddInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DaddInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/FaddInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/FaddInstruction.java new file mode 100644 index 0000000..2bcc693 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/FaddInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.add; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FaddInstruction implements AbstractAddInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FaddInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/IaddInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/IaddInstruction.java new file mode 100644 index 0000000..cca0882 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/IaddInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.add; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IaddInstruction implements AbstractAddInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IaddInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/LaddInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/LaddInstruction.java new file mode 100644 index 0000000..3a75638 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/add/LaddInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.add; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LaddInstruction implements AbstractAddInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LaddInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/AbstractAndInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/AbstractAndInstruction.java new file mode 100644 index 0000000..514634d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/AbstractAndInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.and; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractAndInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/IandInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/IandInstruction.java new file mode 100644 index 0000000..ae7608d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/IandInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.and; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IandInstruction implements AbstractAndInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IandInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/LandInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/LandInstruction.java new file mode 100644 index 0000000..7cb6c76 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/and/LandInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.and; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LandInstruction implements AbstractAndInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LandInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/AbstractDivInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/AbstractDivInstruction.java new file mode 100644 index 0000000..6630d84 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/AbstractDivInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.div; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractDivInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/DdivInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/DdivInstruction.java new file mode 100644 index 0000000..9305958 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/DdivInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.div; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DdivInstruction implements AbstractDivInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DdivInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/FdivInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/FdivInstruction.java new file mode 100644 index 0000000..edd1b0f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/FdivInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.div; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FdivInstruction implements AbstractDivInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FdivInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/IdivInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/IdivInstruction.java new file mode 100644 index 0000000..fae182e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/IdivInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.div; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IdivInstruction implements AbstractDivInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IdivInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/LdivInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/LdivInstruction.java new file mode 100644 index 0000000..51a2b36 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/div/LdivInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.div; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LdivInstruction implements AbstractDivInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LdivInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/AbstractMulInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/AbstractMulInstruction.java new file mode 100644 index 0000000..18a7334 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/AbstractMulInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.mul; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractMulInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/DmulInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/DmulInstruction.java new file mode 100644 index 0000000..c5554a9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/DmulInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.mul; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DmulInstruction implements AbstractMulInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DmulInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/FmulInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/FmulInstruction.java new file mode 100644 index 0000000..98284b1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/FmulInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.mul; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FmulInstruction implements AbstractMulInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FmulInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/ImulInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/ImulInstruction.java new file mode 100644 index 0000000..3e5037e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/ImulInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.mul; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ImulInstruction implements AbstractMulInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public ImulInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/LmulInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/LmulInstruction.java new file mode 100644 index 0000000..4122270 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/mul/LmulInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.mul; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LmulInstruction implements AbstractMulInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LmulInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/AbstractNegInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/AbstractNegInstruction.java new file mode 100644 index 0000000..dc75e32 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/AbstractNegInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.neg; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractNegInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/DnegInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/DnegInstruction.java new file mode 100644 index 0000000..bbd4e83 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/DnegInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.neg; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DnegInstruction implements AbstractNegInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DnegInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/FnegInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/FnegInstruction.java new file mode 100644 index 0000000..79d2b16 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/FnegInstruction.java @@ -0,0 +1,31 @@ +package com.github.wdestroier.chamomile.instruction.math.neg; + +import com.github.wdestroier.chamomile.instruction.Instruction; +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FnegInstruction implements Instruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FnegInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/InegInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/InegInstruction.java new file mode 100644 index 0000000..2812548 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/InegInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.neg; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InegInstruction implements AbstractNegInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public InegInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/LnegInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/LnegInstruction.java new file mode 100644 index 0000000..6e97e00 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/neg/LnegInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.neg; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LnegInstruction implements AbstractNegInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LnegInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/AbstractOrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/AbstractOrInstruction.java new file mode 100644 index 0000000..446e897 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/AbstractOrInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.or; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractOrInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/IorInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/IorInstruction.java new file mode 100644 index 0000000..ff0bb42 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/IorInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.or; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IorInstruction implements AbstractOrInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IorInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/LorInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/LorInstruction.java new file mode 100644 index 0000000..897c4e9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/or/LorInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.or; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LorInstruction implements AbstractOrInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LorInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/AbstractRemInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/AbstractRemInstruction.java new file mode 100644 index 0000000..e311141 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/AbstractRemInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.rem; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractRemInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/DremInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/DremInstruction.java new file mode 100644 index 0000000..93df496 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/DremInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.rem; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DremInstruction implements AbstractRemInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DremInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/FremInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/FremInstruction.java new file mode 100644 index 0000000..5003092 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/FremInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.rem; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FremInstruction implements AbstractRemInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FremInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/IremInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/IremInstruction.java new file mode 100644 index 0000000..ac22a06 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/IremInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.rem; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IremInstruction implements AbstractRemInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IremInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/LremInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/LremInstruction.java new file mode 100644 index 0000000..7f7dd64 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/rem/LremInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.rem; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LremInstruction implements AbstractRemInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LremInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/AbstractArithmeticShiftInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/AbstractArithmeticShiftInstruction.java new file mode 100644 index 0000000..c22b5bb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/AbstractArithmeticShiftInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.arithmetic; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractArithmeticShiftInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshlInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshlInstruction.java new file mode 100644 index 0000000..a49c038 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshlInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.arithmetic; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Int shift left Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IshlInstruction implements AbstractArithmeticShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IshlInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshrInstruction.java new file mode 100644 index 0000000..42c2686 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/IshrInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.arithmetic; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Int shift right Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IshrInstruction implements AbstractArithmeticShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IshrInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshlInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshlInstruction.java new file mode 100644 index 0000000..902f33e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshlInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.arithmetic; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Long shift left Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LshlInstruction implements AbstractArithmeticShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LshlInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshrInstruction.java new file mode 100644 index 0000000..13b7b01 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/arithmetic/LshrInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.arithmetic; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Int shift right Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LshrInstruction implements AbstractArithmeticShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LshrInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/AbstractLogicalShiftInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/AbstractLogicalShiftInstruction.java new file mode 100644 index 0000000..66d9776 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/AbstractLogicalShiftInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.logical; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractLogicalShiftInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/IushrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/IushrInstruction.java new file mode 100644 index 0000000..1073948 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/IushrInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.logical; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Int unsigned shift right Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IushrInstruction implements AbstractLogicalShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IushrInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/LushrInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/LushrInstruction.java new file mode 100644 index 0000000..383fef7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/shift/logical/LushrInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.math.shift.logical; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Long unsigned shift right Instruction + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LushrInstruction implements AbstractLogicalShiftInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LushrInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/AbstractSubInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/AbstractSubInstruction.java new file mode 100644 index 0000000..f935b63 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/AbstractSubInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.sub; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractSubInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/DsubInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/DsubInstruction.java new file mode 100644 index 0000000..16546a3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/DsubInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.sub; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DsubInstruction implements AbstractSubInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DsubInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/FsubInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/FsubInstruction.java new file mode 100644 index 0000000..d3d5b42 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/FsubInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.sub; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FsubInstruction implements AbstractSubInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FsubInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/IsubInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/IsubInstruction.java new file mode 100644 index 0000000..66a3e47 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/IsubInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.sub; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IsubInstruction implements AbstractSubInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IsubInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/LsubInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/LsubInstruction.java new file mode 100644 index 0000000..1133501 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/sub/LsubInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.sub; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LsubInstruction implements AbstractSubInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LsubInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/AbstractXorInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/AbstractXorInstruction.java new file mode 100644 index 0000000..a1d5788 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/AbstractXorInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.math.xor; + +import com.github.wdestroier.chamomile.instruction.math.AbstractMathInstruction; + +public interface AbstractXorInstruction> extends AbstractMathInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/IxorInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/IxorInstruction.java new file mode 100644 index 0000000..34fcb37 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/IxorInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.xor; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IxorInstruction implements AbstractXorInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IxorInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/LxorInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/LxorInstruction.java new file mode 100644 index 0000000..8cc10fd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/math/xor/LxorInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.math.xor; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LxorInstruction implements AbstractXorInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LxorInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AbstractReferenceInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AbstractReferenceInstruction.java new file mode 100644 index 0000000..0729ddf --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AbstractReferenceInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractReferenceInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AnewarrayInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AnewarrayInstruction.java new file mode 100644 index 0000000..e456e9e --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AnewarrayInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AnewarrayInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public AnewarrayInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/ArraylengthInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/ArraylengthInstruction.java new file mode 100644 index 0000000..1fa7558 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/ArraylengthInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ArraylengthInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public ArraylengthInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AthrowInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AthrowInstruction.java new file mode 100644 index 0000000..742aa66 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/AthrowInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AthrowInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public AthrowInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/CheckcastInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/CheckcastInstruction.java new file mode 100644 index 0000000..6ed9e2f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/CheckcastInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CheckcastInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public CheckcastInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetfieldInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetfieldInstruction.java new file mode 100644 index 0000000..79f4020 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetfieldInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GetfieldInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public GetfieldInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetstaticInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetstaticInstruction.java new file mode 100644 index 0000000..b58e66b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/GetstaticInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GetstaticInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public GetstaticInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InstanceofInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InstanceofInstruction.java new file mode 100644 index 0000000..22bebbf --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InstanceofInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InstanceofInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public InstanceofInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokedynamicInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokedynamicInstruction.java new file mode 100644 index 0000000..2ef1d7b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokedynamicInstruction.java @@ -0,0 +1,42 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InvokedynamicInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + private byte thirdOperand; + private byte fourthOperand; + + @Override + @SneakyThrows + public InvokedynamicInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + thirdOperand = input.readSignedByte(); + fourthOperand = input.readSignedByte(); + + return this; + } + + @Override + @SneakyThrows + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + output.writeSignedByte(thirdOperand); + output.writeSignedByte(fourthOperand); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokeinterfaceInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokeinterfaceInstruction.java new file mode 100644 index 0000000..5a0de41 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokeinterfaceInstruction.java @@ -0,0 +1,42 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InvokeinterfaceInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + private short count; + private byte fourthOperand; //Must always be zero. + + @Override + @SneakyThrows + public InvokeinterfaceInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + count = input.readUnsignedByte(); + fourthOperand = input.readSignedByte(); + + return this; + } + + @Override + @SneakyThrows + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + output.writeUnsignedByte(count); + output.writeSignedByte(fourthOperand); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokespecialInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokespecialInstruction.java new file mode 100644 index 0000000..faae488 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokespecialInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InvokespecialInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public InvokespecialInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokestaticInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokestaticInstruction.java new file mode 100644 index 0000000..bba91a7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokestaticInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InvokestaticInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public InvokestaticInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokevirtualInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokevirtualInstruction.java new file mode 100644 index 0000000..b1d1db4 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/InvokevirtualInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class InvokevirtualInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public InvokevirtualInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorenterInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorenterInstruction.java new file mode 100644 index 0000000..263c927 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorenterInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorenterInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public MonitorenterInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorexitInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorexitInstruction.java new file mode 100644 index 0000000..eeca815 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/MonitorexitInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MonitorexitInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public MonitorexitInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewInstruction.java new file mode 100644 index 0000000..1515bd9 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NewInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public NewInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewarrayInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewarrayInstruction.java new file mode 100644 index 0000000..58ef861 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/NewarrayInstruction.java @@ -0,0 +1,46 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NewarrayInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short atype; + + @Override + public NewarrayInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + atype = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(atype); + } + + public static class ArrayType { + + public static final short T_BOOLEAN = 4; + public static final short T_CHAR = 5; + public static final short T_FLOAT = 6; + public static final short T_DOUBLE = 7; + public static final short T_BYTE = 8; + public static final short T_SHORT = 9; + public static final short T_INT = 10; + public static final short T_LONG = 11; + + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutfieldInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutfieldInstruction.java new file mode 100644 index 0000000..aa7718c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutfieldInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PutfieldInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public PutfieldInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutstaticInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutstaticInstruction.java new file mode 100644 index 0000000..2c15e17 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reference/PutstaticInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.reference; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PutstaticInstruction implements AbstractReferenceInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private int index; + + @Override + public PutstaticInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedShort(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedShort(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/AbstractReservedInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/AbstractReservedInstruction.java new file mode 100644 index 0000000..eb1e5d5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/AbstractReservedInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.reserved; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractReservedInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/BreakpointInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/BreakpointInstruction.java new file mode 100644 index 0000000..f8a532b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/BreakpointInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reserved; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BreakpointInstruction implements AbstractReservedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public BreakpointInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep1Instruction.java new file mode 100644 index 0000000..70d4556 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep1Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reserved; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Impdep1Instruction implements AbstractReservedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Impdep1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep2Instruction.java new file mode 100644 index 0000000..baadc80 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/reserved/Impdep2Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.reserved; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Impdep2Instruction implements AbstractReservedInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Impdep2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/AbstractStackInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/AbstractStackInstruction.java new file mode 100644 index 0000000..ed61d9b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/AbstractStackInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractStackInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2Instruction.java new file mode 100644 index 0000000..eb99422 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dup2Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dup2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X1Instruction.java new file mode 100644 index 0000000..a21dfb2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X1Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dup2X1Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dup2X1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X2Instruction.java new file mode 100644 index 0000000..7f9f170 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Dup2X2Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dup2X2Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dup2X2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupInstruction.java new file mode 100644 index 0000000..e3b5e59 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DupInstruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DupInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX1Instruction.java new file mode 100644 index 0000000..bbb6543 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX1Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DupX1Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DupX1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX2Instruction.java new file mode 100644 index 0000000..6c9428c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/DupX2Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DupX2Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DupX2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Pop2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Pop2Instruction.java new file mode 100644 index 0000000..4a466ed --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/Pop2Instruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Pop2Instruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Pop2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/PopInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/PopInstruction.java new file mode 100644 index 0000000..6c4ad7b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/PopInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PopInstruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public PopInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/stack/SwapInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/SwapInstruction.java new file mode 100644 index 0000000..47782d7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/stack/SwapInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.stack; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SwapInstruction implements AbstractStackInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public SwapInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/AbstractStoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/AbstractStoreInstruction.java new file mode 100644 index 0000000..bae4351 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/AbstractStoreInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.store; + +import com.github.wdestroier.chamomile.instruction.Instruction; + +public interface AbstractStoreInstruction> extends Instruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AastoreInstruction.java new file mode 100644 index 0000000..4eb2209 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public AastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AbstractArrayStoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AbstractArrayStoreInstruction.java new file mode 100644 index 0000000..1cf6349 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/AbstractArrayStoreInstruction.java @@ -0,0 +1,5 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractArrayStoreInstruction> extends AbstractStoreInstruction {} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/BastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/BastoreInstruction.java new file mode 100644 index 0000000..0256861 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/BastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public BastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/CastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/CastoreInstruction.java new file mode 100644 index 0000000..82b6a90 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/CastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public CastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/DastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/DastoreInstruction.java new file mode 100644 index 0000000..a33721f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/DastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public DastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/FastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/FastoreInstruction.java new file mode 100644 index 0000000..512bc46 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/FastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public FastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/IastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/IastoreInstruction.java new file mode 100644 index 0000000..6073b84 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/IastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public IastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/LastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/LastoreInstruction.java new file mode 100644 index 0000000..0e4b4d5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/LastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public LastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/SastoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/SastoreInstruction.java new file mode 100644 index 0000000..6b171bc --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/arraystore/SastoreInstruction.java @@ -0,0 +1,30 @@ +package com.github.wdestroier.chamomile.instruction.store.arraystore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SastoreInstruction implements AbstractArrayStoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public SastoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AbstractAstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AbstractAstoreInstruction.java new file mode 100644 index 0000000..9dac5fb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AbstractAstoreInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractAstoreInstruction> extends AbstractStoreInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore0Instruction.java new file mode 100644 index 0000000..6e52d00 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Astore0Instruction implements AbstractAstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Astore0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore1Instruction.java new file mode 100644 index 0000000..204221c --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Astore1Instruction implements AbstractAstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Astore1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore2Instruction.java new file mode 100644 index 0000000..c3ad238 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Astore2Instruction implements AbstractAstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Astore2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore3Instruction.java new file mode 100644 index 0000000..fbbd4f2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/Astore3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Astore3Instruction implements AbstractAstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Astore3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AstoreInstruction.java new file mode 100644 index 0000000..ef608df --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/astore/AstoreInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.store.astore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AstoreInstruction implements AbstractAstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public AstoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/AbstractDstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/AbstractDstoreInstruction.java new file mode 100644 index 0000000..152957d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/AbstractDstoreInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractDstoreInstruction> extends AbstractStoreInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore0Instruction.java new file mode 100644 index 0000000..92f0df7 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dstore0Instruction implements AbstractDstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dstore0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore1Instruction.java new file mode 100644 index 0000000..7db2eaa --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dstore1Instruction implements AbstractDstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dstore1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore2Instruction.java new file mode 100644 index 0000000..e7f647b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dstore2Instruction implements AbstractDstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dstore2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore3Instruction.java new file mode 100644 index 0000000..aaa5a85 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/Dstore3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Dstore3Instruction implements AbstractDstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Dstore3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/DstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/DstoreInstruction.java new file mode 100644 index 0000000..49bd7fc --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/dstore/DstoreInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.store.dstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DstoreInstruction implements AbstractDstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public DstoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/AbstractFstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/AbstractFstoreInstruction.java new file mode 100644 index 0000000..a61a2eb --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/AbstractFstoreInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractFstoreInstruction> extends AbstractStoreInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore0Instruction.java new file mode 100644 index 0000000..46091fd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fstore0Instruction implements AbstractFstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fstore0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore1Instruction.java new file mode 100644 index 0000000..47df0f2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fstore1Instruction implements AbstractFstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fstore1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore2Instruction.java new file mode 100644 index 0000000..8dcb7b3 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fstore2Instruction implements AbstractFstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fstore2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore3Instruction.java new file mode 100644 index 0000000..4f92731 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/Fstore3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Fstore3Instruction implements AbstractFstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Fstore3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/FstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/FstoreInstruction.java new file mode 100644 index 0000000..2ba7fe0 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/fstore/FstoreInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.store.fstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FstoreInstruction implements AbstractFstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public FstoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/AbstractIstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/AbstractIstoreInstruction.java new file mode 100644 index 0000000..01e7492 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/AbstractIstoreInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractIstoreInstruction> extends AbstractStoreInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore0Instruction.java new file mode 100644 index 0000000..40827ac --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Istore0Instruction implements AbstractIstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Istore0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore1Instruction.java new file mode 100644 index 0000000..59fd76f --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Istore1Instruction implements AbstractIstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Istore1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore2Instruction.java new file mode 100644 index 0000000..3fda644 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Istore2Instruction implements AbstractIstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Istore2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore3Instruction.java new file mode 100644 index 0000000..7c2aaf8 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/Istore3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Istore3Instruction implements AbstractIstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Istore3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/IstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/IstoreInstruction.java new file mode 100644 index 0000000..dbe0d78 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/istore/IstoreInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.store.istore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IstoreInstruction implements AbstractIstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public IstoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/AbstractLstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/AbstractLstoreInstruction.java new file mode 100644 index 0000000..8dfdecd --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/AbstractLstoreInstruction.java @@ -0,0 +1,9 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.store.AbstractStoreInstruction; + +public interface AbstractLstoreInstruction> extends AbstractStoreInstruction { + + short getIndex(); + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore0Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore0Instruction.java new file mode 100644 index 0000000..ee05554 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore0Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lstore0Instruction implements AbstractLstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lstore0Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 0; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore1Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore1Instruction.java new file mode 100644 index 0000000..cc18fd1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore1Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lstore1Instruction implements AbstractLstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lstore1Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 1; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore2Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore2Instruction.java new file mode 100644 index 0000000..57d7f2b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore2Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lstore2Instruction implements AbstractLstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lstore2Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 2; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore3Instruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore3Instruction.java new file mode 100644 index 0000000..b90d9c1 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/Lstore3Instruction.java @@ -0,0 +1,35 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Lstore3Instruction implements AbstractLstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + + @Override + public Lstore3Instruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + } + + @Override + public short getIndex() { + return 3; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/LstoreInstruction.java b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/LstoreInstruction.java new file mode 100644 index 0000000..335ba8d --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/instruction/store/lstore/LstoreInstruction.java @@ -0,0 +1,33 @@ +package com.github.wdestroier.chamomile.instruction.store.lstore; + +import com.github.wdestroier.chamomile.instruction.InstructionFactory; +import com.github.wdestroier.chamomile.io.MultiEndianInputStream; +import com.github.wdestroier.chamomile.io.MultiEndianOutputStream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LstoreInstruction implements AbstractLstoreInstruction { + + private short opcode = InstructionFactory.instance.getOpcode(this.getClass()); + private short index; + + @Override + public LstoreInstruction read(MultiEndianInputStream input) { + opcode = input.readUnsignedByte(); + index = input.readUnsignedByte(); + + return this; + } + + @Override + public void write(MultiEndianOutputStream output) { + output.writeUnsignedByte(opcode); + output.writeUnsignedByte(index); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/Endianness.java b/src/main/java/com/github/wdestroier/chamomile/io/Endianness.java new file mode 100644 index 0000000..14444d6 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/Endianness.java @@ -0,0 +1,12 @@ +package com.github.wdestroier.chamomile.io; + +public enum Endianness { + /** + * In { 00 11 22 33 } the first byte that is read is 00. + */ + LITTLE_ENDIAN, + /** + * In { 00 11 22 33 } the first byte that is read is 33. + */ + BIG_ENDIAN; +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianInputStream.java b/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianInputStream.java new file mode 100644 index 0000000..65de790 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianInputStream.java @@ -0,0 +1,238 @@ +package com.github.wdestroier.chamomile.io; + +import java.io.InputStream; +import java.io.PushbackInputStream; +import java.lang.reflect.Array; +import java.math.BigInteger; +import java.util.function.Supplier; + +import com.github.wdestroier.chamomile.io.converter.PrimitiveTypesConverter; + +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; + +public class MultiEndianInputStream extends InputStream { + + @Getter + private Endianness endianness; + + private PushbackInputStream pushback; + private PrimitiveTypesConverter converter; + + @Getter + @Setter + private long bytesRead; + + public MultiEndianInputStream(InputStream in, int bufferSize, Endianness endianness) { + this.pushback = new PushbackInputStream(in, bufferSize); + this.endianness = endianness; + this.converter = new PrimitiveTypesConverter(endianness); + } + + public MultiEndianInputStream(InputStream in, Endianness endianness) { + this(in, 2, endianness); + } + + @SneakyThrows + public int read() { + var read = pushback.read(); + bytesRead++; + return read; + } + + public short readUnsignedByte() { + return converter.signedByteToUnsignedByte(read()); //0 - 255 (0xFF) + } + + public byte readSignedByte() { + return converter.unsignedByteToSignedByte(read()); + } + + public int readUnsignedShort() { + return converter.unsignedShortFromBytes(read(), read()); //0 - 65535 (0xFFFF) + } + + public short readSignedShort() { + return converter.signedShortFromBytes(read(), read()); + } + + public long readUnsignedInt() { + return converter.unsignedIntFromBytes(read(), read(), read(), read()); //0 - 0xFFFFFFFF + } + + public int readSignedInt() { + return converter.signedIntFromBytes(read(), read(), read(), read()); + } + + public BigInteger readUnsignedLong() { + return converter.unsignedLongFromBytes(read(), read(), read(), read(), + read(), read(), read(), read()); + } + + public long readSignedLong() { + return converter.signedLongFromBytes(read(), read(), read(), read(), + read(), read(), read(), read()); + } + + public short[] readUnsignedBytes(int length) { + return createAndFillArray(short.class, length, () -> readUnsignedByte()); + } + + public byte[] readSignedBytes(int length) { + return createAndFillArray(byte.class, length, () -> readSignedByte()); + } + + public int[] readUnsignedShorts(int length) { + return createAndFillArray(int.class, length, () -> readUnsignedShort()); + } + + public short[] readSignedShorts(int length) { + return createAndFillArray(short.class, length, () -> readSignedShort()); + } + + public long[] readUnsignedInts(int length) { + return createAndFillArray(long.class, length, () -> readUnsignedInt()); + } + + public int[] readSignedInts(int length) { + return createAndFillArray(int.class, length, () -> readSignedInt()); + } + + public BigInteger[] readUnsignedLongs(int length) { + return createAndFillArray(BigInteger.class, length, () -> readUnsignedLong()); + } + + public long[] readSignedLongs(int length) { + return createAndFillArray(long.class, length, () -> readSignedLong()); + } + + @SneakyThrows + private void unread(int b) { + pushback.unread(b); + bytesRead--; + } + + public void unreadUnsignedByte(short unsignedByte) { + unread(unsignedByte); + } + + public void unreadSignedByte(byte signedByte) { + unread(signedByte); + } + + public void unreadUnsignedShort(int unsignedShort) { + for (var signedByte : reverseArray(converter.unsignedShortToBytes(unsignedShort))) unread(signedByte); + } + + public void unreadSignedShort(short signedShort) { + for (var signedByte : reverseArray(converter.signedShortToBytes(signedShort))) unread(signedByte); + } + + public void unreadUnsignedInt(long unsignedInt) { + for (var signedByte : reverseArray(converter.unsignedIntToBytes(unsignedInt))) unread(signedByte); + } + + public void unreadSignedInt(int signedInt) { + for (var signedByte : reverseArray(converter.signedIntToBytes(signedInt))) unread(signedByte); + } + + public void unreadUnsignedLong(BigInteger unsignedLong) { + for (var signedByte : reverseArray(converter.unsignedLongToBytes(unsignedLong))) unread(signedByte); + } + + public void unreadSignedLong(long signedLong) { + for (var signedByte : reverseArray(converter.signedLongToBytes(signedLong))) unread(signedByte); + } + + public void unreadUnsignedBytes(short... unsignedBytes) { + for (var unsignedByte : unsignedBytes) unreadUnsignedByte(unsignedByte); + } + + public void unreadSignedBytes(byte... signedBytes) { + for (var signedByte : signedBytes) unreadSignedByte(signedByte); + } + + public void unreadUnsignedShorts(int... unsignedShorts) { + for (var unsignedShort : unsignedShorts) unreadUnsignedShort(unsignedShort); + } + + public void unreadSignedShorts(short... signedShorts) { + for (var signedShort : signedShorts) unreadSignedShort(signedShort); + } + + public void unreadUnsignedInts(long... unsignedInts) { + for (var unsignedInt : unsignedInts) unreadUnsignedInt(unsignedInt); + } + + public void unreadSignedInts(int... signedInts) { + for (var signedInt : signedInts) unreadSignedInt(signedInt); + } + + public void unreadUnsignedLongs(BigInteger... unsignedLongs) { + for (var unsignedLong : unsignedLongs) unreadUnsignedLong(unsignedLong); + } + + public void unreadSignedLongs(long... signedLongs) { + for (var signedLong : signedLongs) unreadSignedLong(signedLong); + } + + @SuppressWarnings("unchecked") + private T createAndFillArray(Class type, int length, Supplier supplier) { + var array = Array.newInstance(type, length); + + for (var i = 0; i < length; i++) { + Array.set(array, i, supplier.get()); + } + + return (T) array; + } + + // 0x80000000 is [-128, 0, 0, 0] in little-endian + // If it is written in the right order, it will become [0, 0, 0, -128] in the buffer + // Because the first written is the last out + // See PushbackInputStream#unread and PushbackInputStream#read + // When the input stream reads the number again, it will read the wrong number + // That's why it's necessary to reverse the order before pushing back + private T reverseArray(T array) { + var arrayLength = Array.getLength(array); + + for (var i = 0; i < arrayLength / 2; i++) { + var temp = Array.get(array, i); + Array.set(array, i, Array.get(array, arrayLength - 1 - i)); + Array.set(array, arrayLength - 1 - i, temp); + } + + return array; + } + + @Override + @SneakyThrows + public int read(byte[] b, int off, int len) { + return pushback.read(b, off, len); + } + + @Override + @SneakyThrows + public int available() { + return pushback.available(); + } + + @Override + @SneakyThrows + public long skip(long n) { + return pushback.skip(n); + } + + @Override + @SneakyThrows + public void close() { + pushback.close(); + } + + public void setEndianness(Endianness endianness) { + this.endianness = endianness; + this.converter.setEndianness(endianness); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianOutputStream.java b/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianOutputStream.java new file mode 100644 index 0000000..fe26d42 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/MultiEndianOutputStream.java @@ -0,0 +1,118 @@ +package com.github.wdestroier.chamomile.io; + +import java.io.IOException; +import java.io.OutputStream; +import java.math.BigInteger; + +import com.github.wdestroier.chamomile.io.converter.PrimitiveTypesConverter; + +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; + +public class MultiEndianOutputStream extends OutputStream { + + @Getter + private Endianness endianness; + + private OutputStream output; + private PrimitiveTypesConverter converter; + + @Getter + @Setter + private long bytesWritten; + + public MultiEndianOutputStream(OutputStream output, Endianness endianness) { + this.output = output; + this.endianness = endianness; + this.converter = new PrimitiveTypesConverter(endianness); + } + + @SneakyThrows + public void write(int b) { + output.write(b); + bytesWritten++; + } + + public void writeUnsignedByte(short unsignedByte) { + write(unsignedByte); + } + + public void writeSignedByte(byte signedByte) { + write(signedByte); + } + + public void writeUnsignedShort(int unsignedShort) { + for (var signedByte : converter.unsignedShortToBytes(unsignedShort)) write(signedByte); + } + + public void writeSignedShort(short signedShort) { + for (var signedByte : converter.signedShortToBytes(signedShort)) write(signedByte); + } + + public void writeUnsignedInt(long unsignedInt) { + for (var signedByte : converter.unsignedIntToBytes(unsignedInt)) write(signedByte); + } + + public void writeSignedInt(int signedInt) { + for (var signedByte : converter.signedIntToBytes(signedInt)) write(signedByte); + } + + public void writeUnsignedLong(BigInteger unsignedLong) { + for (var signedByte : converter.unsignedLongToBytes(unsignedLong)) write(signedByte); + } + + public void writeSignedLong(long signedLong) { + for (var signedByte : converter.signedLongToBytes(signedLong)) write(signedByte); + } + + public void writeUnsignedBytes(short... unsignedBytes) { + for (var unsignedByte : unsignedBytes) writeUnsignedByte(unsignedByte); + } + + public void writeSignedBytes(byte... signedBytes) { + for (var signedByte : signedBytes) writeSignedByte(signedByte); + } + + public void writeUnsignedShorts(int... unsignedShorts) { + for (var unsignedShort : unsignedShorts) writeUnsignedShort(unsignedShort); + } + + public void writeSignedShorts(short... signedShorts) { + for (var signedShort : signedShorts) writeSignedShort(signedShort); + } + + public void writeUnsignedInts(long... unsignedInts) { + for (var unsignedInt : unsignedInts) writeUnsignedInt(unsignedInt); + } + + public void writeSignedInts(int... signedInts) { + for (var signedInt : signedInts) writeSignedInt(signedInt); + } + + public void writeUnsignedLongs(BigInteger... unsignedLongs) { + for (var unsignedLong : unsignedLongs) writeUnsignedLong(unsignedLong); + } + + public void writeSignedLongs(long... signedLongs) { + for (var signedLong : signedLongs) writeSignedLong(signedLong); + } + + @Override + @SneakyThrows + public void flush() { + output.flush(); + } + + @Override + @SneakyThrows + public void close() throws IOException { + output.close(); + } + + public void setEndianness(Endianness endianness) { + this.endianness = endianness; + this.converter.setEndianness(endianness); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayInputStream.java b/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayInputStream.java new file mode 100644 index 0000000..dd0b4a5 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayInputStream.java @@ -0,0 +1,188 @@ +package com.github.wdestroier.chamomile.io; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Objects; + +import lombok.experimental.Delegate; + +public class ShortArrayInputStream extends InputStream { + + protected SyntheticByteArrayInputStream input; + @Delegate(excludes = InputStreamExclusions.class) + protected ByteArrayInputStream delegated; + + protected short[] buf; + + public ShortArrayInputStream(short[] buf) { + this.input = new SyntheticByteArrayInputStream(new byte[0]); + this.delegated = input; + this.buf = buf; + this.input.setCount(buf.length); + } + + @Override + public synchronized int read() { + int read; + + if (input.getPos() < input.getCount()) { + var pos = input.getPos(); + read = buf[pos++] & 0xff; + input.setPos(pos); + } else { + read = -1; + } + + return read; + } + + public synchronized int read(short s[], int off, int len) { + Objects.checkFromIndexSize(off, len, s.length); + + var pos = input.getPos(); + var count = input.getCount(); + + if (pos >= count) { + return -1; + } + + var avail = count - pos; + if (len > avail) { + len = avail; + } + if (len <= 0) { + return 0; + } + System.arraycopy(buf, pos, s, off, len); + input.setPos(pos + len); + + return len; + } + + @Override + public synchronized int read(byte b[], int off, int len) { + Objects.checkFromIndexSize(off, len, b.length); + + var pos = input.getPos(); + var count = input.getCount(); + + if (pos >= count) { + return -1; + } + + var avail = count - pos; + if (len > avail) { + len = avail; + } + if (len <= 0) { + return 0; + } + arraycopy(buf, pos, b, off, len); + input.setPos(pos + len); + + return len; + } + + public synchronized short[] readAllUnsignedBytes() { + var count = input.getCount(); + var result = Arrays.copyOfRange(buf, input.getPos(), count); + input.setPos(count); + + return result; + } + + @Override + public synchronized byte[] readAllBytes() { + var count = input.getCount(); + var result = copyOfRange(buf, input.getPos(), count); + input.setPos(count); + + return result; + } + + @Override + public synchronized long transferTo(OutputStream out) throws IOException { + var pos = input.getPos(); + var count = input.getCount(); + var len = count - pos; + + Objects.checkFromIndexSize(pos, len, buf.length); + for (var i = 0; i < len; i++) { + out.write(buf[pos + i]); + } + + input.setPos(count); + return len; + } + + protected byte[] copyOfRange(short[] original, int from, int to) { + var newLength = to - from; + if (newLength < 0) + throw new IllegalArgumentException(from + " > " + to); + var copy = new byte[newLength]; + System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); + + return copy; + } + + protected void arraycopy(short[] src, int srcPos, byte[] dest, int destPos, int length) { + for (var i = 0; i < length; i++) { + // short[] is an array of unsigned bytes + dest[destPos + i] = (byte) src[srcPos + i]; + } + } + + protected class SyntheticByteArrayInputStream extends ByteArrayInputStream { + + public SyntheticByteArrayInputStream(byte[] buf) { + super(buf); + } + + public byte[] getBuf() { + return buf; + } + + public void setBuf(byte[] buf) { + this.buf = buf; + } + + public int getPos() { + return pos; + } + + public void setPos(int pos) { + this.pos = pos; + } + + public int getMark() { + return mark; + } + + public void setMark(int mark) { + this.mark = mark; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + } + + private interface InputStreamExclusions { + int read(); + int read(byte b[]); + int read(byte b[], int off, int len); + byte[] readAllBytes(); + byte[] readNBytes(int len); + int readNBytes(byte[] b, int off, int len); + long transferTo(OutputStream out); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayOutputStream.java b/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayOutputStream.java new file mode 100644 index 0000000..6bb84c2 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/ShortArrayOutputStream.java @@ -0,0 +1,117 @@ +package com.github.wdestroier.chamomile.io; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Objects; + +public class ShortArrayOutputStream extends OutputStream { + + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + protected short buf[]; + protected int count; + + public ShortArrayOutputStream() { + this(32); + } + + public ShortArrayOutputStream(int size) { + if (size < 0) { + throw new IllegalArgumentException("Negative initial size: " + size); + } + + buf = new short[size]; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity - buf.length > 0) { + grow(minCapacity); + } + } + + private void grow(int minCapacity) { + int oldCapacity = buf.length; + int newCapacity = oldCapacity << 1; + + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; + } + + if (newCapacity - MAX_ARRAY_SIZE > 0) { + newCapacity = hugeCapacity(minCapacity); + } + + buf = Arrays.copyOf(buf, newCapacity); + } + + private static int hugeCapacity(int minCapacity) { + if (minCapacity < 0) { + throw new OutOfMemoryError(); + } + + return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; + } + + @Override + public synchronized void write(int b) { + ensureCapacity(count + 1); + buf[count] = (short) b; + count += 1; + } + + @Override + public synchronized void write(byte b[], int off, int len) { + Objects.checkFromIndexSize(off, len, b.length); + ensureCapacity(count + len); + arraycopy(b, off, buf, count, len); + count += len; + } + + public synchronized void write(short s[], int off, int len) { + Objects.checkFromIndexSize(off, len, s.length); + ensureCapacity(count + len); + System.arraycopy(s, off, buf, count, len); + count += len; + } + + public void writeUnsignedBytes(short b[]) { + write(b, 0, b.length); + } + + public synchronized void writeTo(OutputStream out) throws IOException { + Objects.checkFromIndexSize(0, count, buf.length); + + for (int i = 0 ; i < count ; i++) { + write(buf[0 + i]); + } + } + + public synchronized void reset() { + count = 0; + } + + public synchronized short[] toUnsignedByteArray() { + return Arrays.copyOf(buf, count); + } + + public synchronized int size() { + return count; + } + + @Override + public synchronized String toString() { + return Arrays.toString(buf); + } + + @Override + public void close() throws IOException {} + + protected void arraycopy(byte[] src, int srcPos, short[] dest, int destPos, int length) { + for (int i = 0; i < length; i++) { + // short[] is an array of unsigned bytes + dest[destPos + i] = (short) (src[srcPos + i] & 0xFF); + } + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/AbstractTypeConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/AbstractTypeConverter.java new file mode 100644 index 0000000..ddfafde --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/AbstractTypeConverter.java @@ -0,0 +1,18 @@ +package com.github.wdestroier.chamomile.io.converter; + +import com.github.wdestroier.chamomile.io.Endianness; + +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@RequiredArgsConstructor +public abstract class AbstractTypeConverter { + + @NonNull + protected Endianness endianness; + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/ByteTypeConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/ByteTypeConverter.java new file mode 100644 index 0000000..8f927ef --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/ByteTypeConverter.java @@ -0,0 +1,47 @@ +package com.github.wdestroier.chamomile.io.converter; + +import com.github.wdestroier.chamomile.io.Endianness; + +import lombok.NonNull; + +public class ByteTypeConverter extends AbstractTypeConverter { + + public ByteTypeConverter(@NonNull Endianness endianness) { + super(endianness); + } + + public short signedByteToUnsignedByte(int signed) { + return (short) (signed & 0xFF); + } + + public byte unsignedByteToSignedByte(int unsigned) { + return (byte) unsigned; + } + + public byte[] unsignedBytesToSignedBytes(short... unsignedBytes) { + // It's only going to convert the type, doesn't need to convert the endianness. + + var length = unsignedBytes.length; + + var signedBytes = new byte[length]; + + for (var i = 0; i < length; i++) { + signedBytes[i] = (byte) unsignedBytes[i]; + } + + return signedBytes; + } + + public short[] signedBytesToUnsignedBytes(byte... signedBytes) { + var length = signedBytes.length; + + var unsignedBytes = new short[length]; + + for (var i = 0; i < length; i++) { + unsignedBytes[i] = (short) (signedBytes[i] & 0xFF); + } + + return unsignedBytes; + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/IntTypeConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/IntTypeConverter.java new file mode 100644 index 0000000..71d0812 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/IntTypeConverter.java @@ -0,0 +1,78 @@ +package com.github.wdestroier.chamomile.io.converter; + +import com.github.wdestroier.chamomile.io.Endianness; + +public class IntTypeConverter extends AbstractTypeConverter { + + public IntTypeConverter(Endianness endianness) { + super(endianness); + } + + public byte[] signedIntToBytes(int s4) { + return unsignedIntToBytes(s4); + } + + public byte[] unsignedIntToBytes(long u4) { + var bytes = new byte[4]; + + byte byte1 = (byte) (u4 >> 24), byte2 = (byte) (u4 >> 16), + byte3 = (byte) (u4 >> 8), byte4 = (byte) u4; + + switch (endianness) { + case BIG_ENDIAN: + bytes[0] = byte1; + bytes[1] = byte2; + bytes[2] = byte3; + bytes[3] = byte4; + + break; + case LITTLE_ENDIAN: + bytes[0] = byte4; + bytes[1] = byte3; + bytes[2] = byte2; + bytes[3] = byte1; + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return bytes; + } + + public int signedIntFromBytes(int byte1, int byte2, int byte3, int byte4) { + return (int) unsignedIntFromBytes(byte1, byte2, byte3, byte4); + } + + public long unsignedIntFromBytes(int byte1, int byte2, int byte3, int byte4) { + long u4; + + switch (endianness) { + case BIG_ENDIAN: + u4 = (long) byte1 << 24 + | ((long) byte2 & 0xFF) << 16 + | ((long) byte3 & 0xFF) << 8 + | ((long) byte4 & 0xFF); + break; + case LITTLE_ENDIAN: + u4 = (long) byte4 << 24 + | ((long) byte3 & 0xFF) << 16 + | ((long) byte2 & 0xFF) << 8 + | ((long) byte1 & 0xFF); + break; + default: + throw new UnsupportedEndiannessException(); + } + + return u4; + } + + public int signedIntFromUnsignedInt(long u4) { + return (int) u4; + } + + public long unsignedLongFromSignedInt(int s4) { + return Integer.toUnsignedLong(s4); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/LongTypeConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/LongTypeConverter.java new file mode 100644 index 0000000..c85363b --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/LongTypeConverter.java @@ -0,0 +1,114 @@ +package com.github.wdestroier.chamomile.io.converter; + +import java.math.BigInteger; + +import com.github.wdestroier.chamomile.io.Endianness; + +public class LongTypeConverter extends AbstractTypeConverter { + + public LongTypeConverter(Endianness endianness) { + super(endianness); + } + + public byte[] signedLongToBytes(long s8) { + var bytes = new byte[8]; + + byte byte1 = (byte) (s8 >>> 56), byte2 = (byte) (s8 >>> 48), byte3 = (byte) (s8 >>> 40), + byte4 = (byte) (s8 >>> 32), byte5 = (byte) (s8 >>> 24), byte6 = (byte) (s8 >>> 16), + byte7 = (byte) (s8 >>> 8), byte8 = (byte) (s8 >>> 0); + + switch (endianness) { + case BIG_ENDIAN: + bytes[0] = byte1; + bytes[1] = byte2; + bytes[2] = byte3; + bytes[3] = byte4; + bytes[4] = byte5; + bytes[5] = byte6; + bytes[6] = byte7; + bytes[7] = byte8; + + break; + case LITTLE_ENDIAN: + bytes[0] = byte8; + bytes[1] = byte7; + bytes[2] = byte6; + bytes[3] = byte5; + bytes[4] = byte4; + bytes[5] = byte3; + bytes[6] = byte2; + bytes[7] = byte1; + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return bytes; + } + + public byte[] unsignedLongToBytes(BigInteger u8) { + return signedLongToBytes(u8.longValue()); + } + + public long signedLongFromBytes(int byte1, int byte2, int byte3, int byte4, int byte5, + int byte6, int byte7, int byte8) { + long s8; + + switch (endianness) { + case BIG_ENDIAN: + s8 = (((long) byte1 << 56) + ((long) (byte2 & 0xFF) << 48) + + ((long) (byte3 & 0xFF) << 40) + ((long) (byte4 & 0xFF) << 32) + + ((long) (byte5 & 0xFF) << 24) + ((byte6 & 0xFF) << 16) + + ((byte7 & 0xFF) << 8) + ((byte8 & 0xFF) << 0)); + + break; + case LITTLE_ENDIAN: + s8 = (((long) byte8 << 56) + ((long) (byte7 & 0xFF) << 48) + + ((long) (byte6 & 0xFF) << 40) + ((long) (byte5 & 0xFF) << 32) + + ((long) (byte4 & 0xFF) << 24) + ((byte3 & 0xFF) << 16) + + ((byte2 & 0xFF) << 8) + ((byte1 & 0xFF) << 0)); + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return s8; + } + + public BigInteger unsignedLongFromBytes(int byte1, int byte2, int byte3, int byte4, + int byte5, int byte6, int byte7, int byte8) { + var bytes = new byte[8]; + + switch (endianness) { + case BIG_ENDIAN: + bytes[0] = (byte) byte1; + bytes[1] = (byte) byte2; + bytes[2] = (byte) byte3; + bytes[3] = (byte) byte4; + bytes[4] = (byte) byte5; + bytes[5] = (byte) byte6; + bytes[6] = (byte) byte7; + bytes[7] = (byte) byte8; + + break; + case LITTLE_ENDIAN: + bytes[0] = (byte) byte8; + bytes[1] = (byte) byte7; + bytes[2] = (byte) byte6; + bytes[3] = (byte) byte5; + bytes[4] = (byte) byte4; + bytes[5] = (byte) byte3; + bytes[6] = (byte) byte2; + bytes[7] = (byte) byte1; + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return new BigInteger(bytes); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/PrimitiveTypesConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/PrimitiveTypesConverter.java new file mode 100644 index 0000000..a653c64 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/PrimitiveTypesConverter.java @@ -0,0 +1,42 @@ +package com.github.wdestroier.chamomile.io.converter; + +import com.github.wdestroier.chamomile.io.Endianness; + +import lombok.experimental.Delegate; + +public class PrimitiveTypesConverter extends AbstractTypeConverter { + + @Delegate(excludes = AbstractTypeConverter.class) + private ByteTypeConverter byteTypeConverter; + @Delegate(excludes = AbstractTypeConverter.class) + private ShortTypeConverter shortTypeConverter; + @Delegate(excludes = AbstractTypeConverter.class) + private IntTypeConverter intTypeConverter; + @Delegate(excludes = AbstractTypeConverter.class) + private LongTypeConverter longTypeConverter; + + public PrimitiveTypesConverter(Endianness endianness) { + super(endianness); + + byteTypeConverter = new ByteTypeConverter(endianness); + shortTypeConverter = new ShortTypeConverter(endianness); + intTypeConverter = new IntTypeConverter(endianness); + longTypeConverter = new LongTypeConverter(endianness); + } + + @Override + public Endianness getEndianness() { + return super.getEndianness(); + } + + @Override + public void setEndianness(Endianness endianness) { + super.setEndianness(endianness); + + byteTypeConverter.setEndianness(endianness); + shortTypeConverter.setEndianness(endianness); + intTypeConverter.setEndianness(endianness); + longTypeConverter.setEndianness(endianness); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/ShortTypeConverter.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/ShortTypeConverter.java new file mode 100644 index 0000000..2a7f552 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/ShortTypeConverter.java @@ -0,0 +1,61 @@ +package com.github.wdestroier.chamomile.io.converter; + +import com.github.wdestroier.chamomile.io.Endianness; + +public class ShortTypeConverter extends AbstractTypeConverter { + + public ShortTypeConverter(Endianness endianness) { + super(endianness); + } + + public byte[] signedShortToBytes(short s2) { + return unsignedShortToBytes(s2); + } + + public byte[] unsignedShortToBytes(int u2) { + var bytes = new byte[2]; + + byte byte1 = (byte) (u2 >>> 8), byte2 = (byte) u2; + + switch (endianness) { + case BIG_ENDIAN: + bytes[0] = byte1; + bytes[1] = byte2; + + break; + case LITTLE_ENDIAN: + bytes[0] = byte2; + bytes[1] = byte1; + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return bytes; + } + + public int unsignedShortFromBytes(int byte1, int byte2) { + int u2; + + switch (endianness) { + case BIG_ENDIAN: + u2 = (byte1 << 8) + (byte2 << 0); + + break; + case LITTLE_ENDIAN: + u2 = (byte2 << 8) + (byte1 << 0); + + break; + default: + throw new UnsupportedEndiannessException(); + } + + return u2; + } + + public short signedShortFromBytes(int byte1, int byte2) { + return (short) unsignedShortFromBytes(byte1, byte2); + } + +} diff --git a/src/main/java/com/github/wdestroier/chamomile/io/converter/UnsupportedEndiannessException.java b/src/main/java/com/github/wdestroier/chamomile/io/converter/UnsupportedEndiannessException.java new file mode 100644 index 0000000..2d5be61 --- /dev/null +++ b/src/main/java/com/github/wdestroier/chamomile/io/converter/UnsupportedEndiannessException.java @@ -0,0 +1,7 @@ +package com.github.wdestroier.chamomile.io.converter; + +public class UnsupportedEndiannessException extends RuntimeException { + + private static final long serialVersionUID = 1L; + +}