Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ru.progrm_jarvis.asminj.tools.instruction;
- import lombok.NonNull;
- import lombok.experimental.UtilityClass;
- import lombok.val;
- import lombok.var;
- import org.objectweb.asm.MethodVisitor;
- import ru.progrm_jarvis.asminj.tools.instruction.serialization.InstructionDecoderException;
- import ru.progrm_jarvis.asminj.tools.instruction.serialization.SimpleOperandReader;
- import java.util.Locale;
- import java.util.regex.Pattern;
- import static org.objectweb.asm.Opcodes.*;
- @UtilityClass
- public class InstructionParser {
- private final Pattern ARGUMENTS_SPLIT_PATTERN = Pattern.compile("\\s+");
- @SuppressWarnings("SpellCheckingInspection") // instruction names
- public void insertRawBytecode(@NonNull final MethodVisitor method, @NonNull String instruction) {
- instruction = instruction.trim(); // both side spaces
- var delimiter = instruction.indexOf(' ');
- // without operands
- if (delimiter == -1) switch (instruction.toUpperCase(Locale.US)) {
- // <editor-fold desc="No-operand opcode names" defaultstate="collapsed">
- case "AALOAD": {
- method.visitInsn(AALOAD);
- return;
- }
- case "AASTORE": {
- method.visitInsn(AASTORE);
- return;
- }
- case "ACONST_NULL": {
- method.visitInsn(ACONST_NULL);
- return;
- }
- case "ALOAD_0": {
- method.visitVarInsn(ALOAD, 0);
- return;
- }
- case "ALOAD_1": {
- method.visitVarInsn(ALOAD, 1);
- return;
- }
- case "ALOAD_2": {
- method.visitVarInsn(ALOAD, 2);
- return;
- }
- case "ALOAD_3": {
- method.visitVarInsn(ALOAD, 3);
- return;
- }
- case "ARETURN": {
- method.visitInsn(ARETURN);
- return;
- }
- case "ARRAYLENGTH": {
- method.visitInsn(ARRAYLENGTH);
- return;
- }
- case "ASTORE_0": {
- method.visitVarInsn(ASTORE, 0);
- return;
- }
- case "ASTORE_1": {
- method.visitVarInsn(ASTORE, 1);
- return;
- }
- case "ASTORE_2": {
- method.visitVarInsn(ASTORE, 2);
- return;
- }
- case "ASTORE_3": {
- method.visitVarInsn(ASTORE, 3);
- return;
- }
- case "ATHROW": {
- method.visitInsn(ATHROW);
- return;
- }
- case "BALOAD": {
- method.visitInsn(BALOAD);
- return;
- }
- case "BASTORE": {
- method.visitInsn(BASTORE);
- return;
- }
- case "BREAKPOINT": {
- method.visitInsn(0xCA);
- return;
- }
- case "CALOAD": {
- method.visitInsn(CALOAD);
- return;
- }
- case "CASTORE": {
- method.visitInsn(CASTORE);
- return;
- }
- case "D2F": {
- method.visitInsn(D2F);
- return;
- }
- case "D2I": {
- method.visitInsn(D2I);
- return;
- }
- case "D2L": {
- method.visitInsn(D2L);
- return;
- }
- case "DADD": {
- method.visitInsn(DADD);
- return;
- }
- case "DALOAD": {
- method.visitInsn(DALOAD);
- return;
- }
- case "DASTORE": {
- method.visitInsn(DASTORE);
- return;
- }
- case "DCMPG": {
- method.visitInsn(DCMPG);
- return;
- }
- case "DCMPL": {
- method.visitInsn(DCMPG);
- return;
- }
- case "DCONST_0": {
- method.visitInsn(DCONST_0);
- return;
- }
- case "DCONST_1": {
- method.visitInsn(DCONST_1);
- return;
- }
- case "DDIV": {
- method.visitInsn(DDIV);
- return;
- }
- case "DLOAD_0": {
- method.visitVarInsn(DLOAD, 0);
- return;
- }
- case "DLOAD_1": {
- method.visitVarInsn(DLOAD, 1);
- return;
- }
- case "DLOAD_2": {
- method.visitVarInsn(DLOAD, 2);
- return;
- }
- case "DLOAD_3": {
- method.visitVarInsn(DLOAD, 3);
- return;
- }
- case "DMUL": {
- method.visitInsn(DMUL);
- return;
- }
- case "DNEG": {
- method.visitInsn(DNEG);
- return;
- }
- case "DREM": {
- method.visitInsn(DREM);
- return;
- }
- case "DRETURN": {
- method.visitInsn(DRETURN);
- return;
- }
- case "DSTORE_0": {
- method.visitVarInsn(DSTORE, 0);
- return;
- }
- case "DSTORE_1": {
- method.visitVarInsn(DSTORE, 1);
- return;
- }
- case "DSTORE_2": {
- method.visitVarInsn(DSTORE, 2);
- return;
- }
- case "DSTORE_3": {
- method.visitVarInsn(DSTORE, 3);
- return;
- }
- case "DSUB": {
- method.visitInsn(DREM);
- return;
- }
- case "DUP": {
- method.visitInsn(DUP);
- return;
- }
- case "DUP_X1": {
- method.visitInsn(DUP_X1);
- return;
- }
- case "DUP2": {
- method.visitInsn(DUP2);
- return;
- }
- case "DUP2_X1": {
- method.visitInsn(DUP2_X1);
- return;
- }
- case "DUP2_X2": {
- method.visitInsn(DUP2_X2);
- return;
- }
- case "F2D": {
- method.visitInsn(F2D);
- return;
- }
- case "F2I": {
- method.visitInsn(F2I);
- return;
- }
- case "F2L": {
- method.visitInsn(F2L);
- return;
- }
- case "FADD": {
- method.visitInsn(FADD);
- return;
- }
- case "FALOAD": {
- method.visitInsn(FALOAD);
- return;
- }
- case "FASTORE": {
- method.visitInsn(FASTORE);
- return;
- }
- case "FLOAD_0": {
- method.visitVarInsn(FLOAD, 0);
- return;
- }
- case "FLOAD_1": {
- method.visitVarInsn(FLOAD, 1);
- return;
- }
- case "FLOAD_2": {
- method.visitVarInsn(FLOAD, 2);
- return;
- }
- case "FLOAD_3": {
- method.visitVarInsn(FLOAD, 2);
- return;
- }
- case "FMUL": {
- method.visitInsn(FMUL);
- return;
- }
- case "FNEG": {
- method.visitInsn(FNEG);
- return;
- }
- case "FREM": {
- method.visitInsn(FREM);
- return;
- }
- case "FRETURN": {
- method.visitInsn(FRETURN);
- return;
- }
- case "FSTORE_0": {
- method.visitVarInsn(FSTORE, 0);
- return;
- }
- case "FSTORE_1": {
- method.visitVarInsn(FSTORE, 1);
- return;
- }
- case "FSTORE_2": {
- method.visitVarInsn(FSTORE, 2);
- return;
- }
- case "FSTORE_3": {
- method.visitVarInsn(FSTORE, 3);
- return;
- }
- case "FSUB": {
- method.visitInsn(FSUB);
- return;
- }
- case "I2B": {
- method.visitInsn(I2B);
- return;
- }
- case "I2C": {
- method.visitInsn(I2C);
- return;
- }
- case "I2D": {
- method.visitInsn(I2D);
- return;
- }
- case "I2F": {
- method.visitInsn(I2F);
- return;
- }
- case "I2L": {
- method.visitInsn(I2L);
- return;
- }
- case "I2S": {
- method.visitInsn(I2S);
- return;
- }
- case "IADD": {
- method.visitInsn(IADD);
- return;
- }
- case "IALOAD": {
- method.visitInsn(IALOAD);
- return;
- }
- case "IAND": {
- method.visitInsn(IAND);
- return;
- }
- case "IASTORE": {
- method.visitInsn(IASTORE);
- return;
- }
- case "ICONST_M1": {
- method.visitInsn(ICONST_M1);
- return;
- }
- case "ICONST_0": {
- method.visitInsn(ICONST_0);
- return;
- }
- case "ICONST_1": {
- method.visitInsn(ICONST_1);
- return;
- }
- case "ICONST_2": {
- method.visitInsn(ICONST_2);
- return;
- }
- case "ICONST_3": {
- method.visitInsn(ICONST_3);
- return;
- }
- case "ICONST_4": {
- method.visitInsn(ICONST_4);
- return;
- }
- case "ICONST_5": {
- method.visitInsn(ICONST_5);
- return;
- }
- case "IDIV": {
- method.visitInsn(IDIV);
- return;
- }
- case "ILOAD_0": {
- method.visitVarInsn(ILOAD, 0);
- return;
- }
- case "ILOAD_1": {
- method.visitVarInsn(ILOAD, 1);
- return;
- }
- case "ILOAD_2": {
- method.visitVarInsn(ILOAD, 2);
- return;
- }
- case "ILOAD_3": {
- method.visitVarInsn(ILOAD, 3);
- return;
- }
- case "IMPDEP1": {
- method.visitInsn(0xFE);
- return;
- }
- case "IMPDEP2": {
- method.visitInsn(0xFF);
- return;
- }
- case "IMUL": {
- method.visitInsn(IMUL);
- return;
- }
- case "INEG": {
- method.visitInsn(INEG);
- return;
- }
- case "IOR": {
- method.visitInsn(IOR);
- return;
- }
- case "IREM": {
- method.visitInsn(IREM);
- return;
- }
- case "IRETURN": {
- method.visitInsn(IRETURN);
- return;
- }
- case "ISHL": {
- method.visitInsn(ISHL);
- return;
- }
- case "ISHR": {
- method.visitInsn(ISHR);
- return;
- }
- case "ISTORE_0": {
- method.visitVarInsn(ISTORE, 0);
- return;
- }
- case "ISTORE_1": {
- method.visitVarInsn(ISTORE, 1);
- return;
- }
- case "ISTORE_2": {
- method.visitVarInsn(ISTORE, 2);
- return;
- }
- case "ISTORE_3": {
- method.visitVarInsn(ISTORE, 3);
- return;
- }
- case "ISUB": {
- method.visitInsn(ISUB);
- return;
- }
- case "IUSHR": {
- method.visitInsn(IUSHR);
- return;
- }
- case "IXOR": {
- method.visitInsn(IXOR);
- return;
- }
- case "L2D": {
- method.visitInsn(L2D);
- return;
- }
- case "L2F": {
- method.visitInsn(L2F);
- return;
- }
- case "L2I": {
- method.visitInsn(L2I);
- return;
- }
- case "LADD": {
- method.visitInsn(LADD);
- return;
- }
- case "LALOAD": {
- method.visitInsn(LALOAD);
- return;
- }
- case "LAND": {
- method.visitInsn(LAND);
- return;
- }
- case "LASTORE": {
- method.visitInsn(LASTORE);
- return;
- }
- case "LCMP": {
- method.visitInsn(LCMP);
- return;
- }
- case "LCONST_0": {
- method.visitInsn(LCONST_0);
- return;
- }
- case "LCONST_1": {
- method.visitInsn(LCONST_1);
- return;
- }
- case "LDIV": {
- method.visitInsn(LDIV);
- return;
- }
- case "LLOAD_0": {
- method.visitVarInsn(LLOAD, 0);
- return;
- }
- case "LLOAD_1": {
- method.visitVarInsn(LLOAD, 1);
- return;
- }
- case "LLOAD_2": {
- method.visitVarInsn(LLOAD, 2);
- return;
- }
- case "LLOAD_3": {
- method.visitVarInsn(LLOAD, 3);
- return;
- }
- case "LMUL": {
- method.visitInsn(LMUL);
- return;
- }
- case "LNEG": {
- method.visitInsn(LNEG);
- return;
- }
- case "LOR": {
- method.visitInsn(LOR);
- return;
- }
- case "LREM": {
- method.visitInsn(LREM);
- return;
- }
- case "LRETURN": {
- method.visitInsn(LRETURN);
- return;
- }
- case "LSHL": {
- method.visitInsn(LSHL);
- return;
- }
- case "LSHR": {
- method.visitInsn(LSHR);
- return;
- }
- case "LSTORE_0": {
- method.visitVarInsn(LSTORE, 0);
- return;
- }
- case "LSTORE_1": {
- method.visitVarInsn(LSTORE, 1);
- return;
- }
- case "LSTORE_2": {
- method.visitVarInsn(LSTORE, 2);
- return;
- }
- case "LSTORE_3": {
- method.visitVarInsn(LSTORE, 3);
- return;
- }
- case "LSUB": {
- method.visitInsn(LSUB);
- return;
- }
- case "LUSHR": {
- method.visitInsn(LUSHR);
- return;
- }
- case "LXOR": {
- method.visitInsn(LXOR);
- return;
- }
- case "MONITORENTER": {
- method.visitInsn(MONITORENTER);
- return;
- }
- case "MONITOREXIT": {
- method.visitInsn(MONITOREXIT);
- return;
- }
- case "NOP": {
- method.visitInsn(NOP);
- return;
- }
- case "POP": {
- method.visitInsn(POP);
- return;
- }
- case "POP2": {
- method.visitInsn(POP2);
- return;
- }
- case "RETURN": {
- method.visitInsn(RETURN);
- return;
- }
- case "SALOAD": {
- method.visitInsn(SALOAD);
- return;
- }
- case "SASTORE": {
- method.visitInsn(SASTORE);
- return;
- }
- case "SWAP": {
- method.visitInsn(SWAP);
- return;
- }
- default: throw new InstructionDecoderException(
- "Unable to find no-operand OPCODE <" + instruction + '>'
- );
- // </editor-fold>
- }
- // with oppperands
- else { // there are arguments
- val operators = SimpleOperandReader.from(instruction.substring(delimiter));
- switch (instruction.substring(0, delimiter).toUpperCase(Locale.US)) {
- case "ALOAD": {
- method.visitVarInsn(ALOAD, operators.readInt());
- return;
- }
- case "ANEWARRAY": {
- method.visitTypeInsn(ANEWARRAY, operators.readInternalClassName());
- return;
- }
- // TODO: 15.10.2019 Implement all other
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement