| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.jetbrains.java.decompiler.code; |
| |
| import org.jetbrains.java.decompiler.code.optinstructions.*; |
| |
| public class ConstantsUtil { |
| |
| public static String getName(int opcode) { |
| return opcodeNames[opcode]; |
| } |
| |
| public static Instruction getInstructionInstance(int opcode, boolean wide, int group, int bytecode_version, int[] operands) { |
| |
| Instruction instr = getInstructionInstance(opcode, bytecode_version); |
| instr.wide = wide; |
| instr.group = group; |
| instr.bytecode_version = bytecode_version; |
| instr.setOperands(operands); |
| |
| return instr; |
| } |
| |
| private static Instruction getInstructionInstance(int opcode, int bytecode_version) { |
| try { |
| Instruction instr; |
| |
| if ((opcode >= CodeConstants.opc_ifeq && |
| opcode <= CodeConstants.opc_if_acmpne) || |
| opcode == CodeConstants.opc_ifnull || |
| opcode == CodeConstants.opc_ifnonnull) { |
| instr = new IfInstruction(); |
| } |
| else { |
| |
| Class cl = opcodeClasses[opcode]; |
| |
| if (opcode == CodeConstants.opc_invokedynamic && bytecode_version < CodeConstants.BYTECODE_JAVA_7) { |
| cl = null; // instruction unused in Java 6 and before |
| } |
| |
| if (cl == null) { |
| instr = new Instruction(); |
| } |
| else { |
| instr = (Instruction)cl.newInstance(); |
| } |
| } |
| |
| instr.opcode = opcode; |
| return instr; |
| } |
| catch (Exception ex) { |
| return null; |
| } |
| } |
| |
| |
| private static String[] opcodeNames = { |
| "nop", // "nop", |
| "aconst_null", // "aconst_null", |
| "iconst_m1", // "iconst_m1", |
| "iconst_0", // "iconst_0", |
| "iconst_1", // "iconst_1", |
| "iconst_2", // "iconst_2", |
| "iconst_3", // "iconst_3", |
| "iconst_4", // "iconst_4", |
| "iconst_5", // "iconst_5", |
| "lconst_0", // "lconst_0", |
| "lconst_1", // "lconst_1", |
| "fconst_0", // "fconst_0", |
| "fconst_1", // "fconst_1", |
| "fconst_2", // "fconst_2", |
| "dconst_0", // "dconst_0", |
| "dconst_1", // "dconst_1", |
| "bipush", // "bipush", |
| "sipush", // "sipush", |
| "ldc", // "ldc", |
| "ldc_w", // "ldc_w", |
| "ldc2_w", // "ldc2_w", |
| "iload", // "iload", |
| "lload", // "lload", |
| "fload", // "fload", |
| "dload", // "dload", |
| "aload", // "aload", |
| "iload_0", // "iload_0", |
| "iload_1", // "iload_1", |
| "iload_2", // "iload_2", |
| "iload_3", // "iload_3", |
| "lload_0", // "lload_0", |
| "lload_1", // "lload_1", |
| "lload_2", // "lload_2", |
| "lload_3", // "lload_3", |
| "fload_0", // "fload_0", |
| "fload_1", // "fload_1", |
| "fload_2", // "fload_2", |
| "fload_3", // "fload_3", |
| "dload_0", // "dload_0", |
| "dload_1", // "dload_1", |
| "dload_2", // "dload_2", |
| "dload_3", // "dload_3", |
| "aload_0", // "aload_0", |
| "aload_1", // "aload_1", |
| "aload_2", // "aload_2", |
| "aload_3", // "aload_3", |
| "iaload", // "iaload", |
| "laload", // "laload", |
| "faload", // "faload", |
| "daload", // "daload", |
| "aaload", // "aaload", |
| "baload", // "baload", |
| "caload", // "caload", |
| "saload", // "saload", |
| "istore", // "istore", |
| "lstore", // "lstore", |
| "fstore", // "fstore", |
| "dstore", // "dstore", |
| "astore", // "astore", |
| "istore_0", // "istore_0", |
| "istore_1", // "istore_1", |
| "istore_2", // "istore_2", |
| "istore_3", // "istore_3", |
| "lstore_0", // "lstore_0", |
| "lstore_1", // "lstore_1", |
| "lstore_2", // "lstore_2", |
| "lstore_3", // "lstore_3", |
| "fstore_0", // "fstore_0", |
| "fstore_1", // "fstore_1", |
| "fstore_2", // "fstore_2", |
| "fstore_3", // "fstore_3", |
| "dstore_0", // "dstore_0", |
| "dstore_1", // "dstore_1", |
| "dstore_2", // "dstore_2", |
| "dstore_3", // "dstore_3", |
| "astore_0", // "astore_0", |
| "astore_1", // "astore_1", |
| "astore_2", // "astore_2", |
| "astore_3", // "astore_3", |
| "iastore", // "iastore", |
| "lastore", // "lastore", |
| "fastore", // "fastore", |
| "dastore", // "dastore", |
| "aastore", // "aastore", |
| "bastore", // "bastore", |
| "castore", // "castore", |
| "sastore", // "sastore", |
| "pop", // "pop", |
| "pop2", // "pop2", |
| "dup", // "dup", |
| "dup_x1", // "dup_x1", |
| "dup_x2", // "dup_x2", |
| "dup2", // "dup2", |
| "dup2_x1", // "dup2_x1", |
| "dup2_x2", // "dup2_x2", |
| "swap", // "swap", |
| "iadd", // "iadd", |
| "ladd", // "ladd", |
| "fadd", // "fadd", |
| "dadd", // "dadd", |
| "isub", // "isub", |
| "lsub", // "lsub", |
| "fsub", // "fsub", |
| "dsub", // "dsub", |
| "imul", // "imul", |
| "lmul", // "lmul", |
| "fmul", // "fmul", |
| "dmul", // "dmul", |
| "idiv", // "idiv", |
| "ldiv", // "ldiv", |
| "fdiv", // "fdiv", |
| "ddiv", // "ddiv", |
| "irem", // "irem", |
| "lrem", // "lrem", |
| "frem", // "frem", |
| "drem", // "drem", |
| "ineg", // "ineg", |
| "lneg", // "lneg", |
| "fneg", // "fneg", |
| "dneg", // "dneg", |
| "ishl", // "ishl", |
| "lshl", // "lshl", |
| "ishr", // "ishr", |
| "lshr", // "lshr", |
| "iushr", // "iushr", |
| "lushr", // "lushr", |
| "iand", // "iand", |
| "land", // "land", |
| "ior", // "ior", |
| "lor", // "lor", |
| "ixor", // "ixor", |
| "lxor", // "lxor", |
| "iinc", // "iinc", |
| "i2l", // "i2l", |
| "i2f", // "i2f", |
| "i2d", // "i2d", |
| "l2i", // "l2i", |
| "l2f", // "l2f", |
| "l2d", // "l2d", |
| "f2i", // "f2i", |
| "f2l", // "f2l", |
| "f2d", // "f2d", |
| "d2i", // "d2i", |
| "d2l", // "d2l", |
| "d2f", // "d2f", |
| "i2b", // "i2b", |
| "i2c", // "i2c", |
| "i2s", // "i2s", |
| "lcmp", // "lcmp", |
| "fcmpl", // "fcmpl", |
| "fcmpg", // "fcmpg", |
| "dcmpl", // "dcmpl", |
| "dcmpg", // "dcmpg", |
| "ifeq", // "ifeq", |
| "ifne", // "ifne", |
| "iflt", // "iflt", |
| "ifge", // "ifge", |
| "ifgt", // "ifgt", |
| "ifle", // "ifle", |
| "if_icmpeq", // "if_icmpeq", |
| "if_icmpne", // "if_icmpne", |
| "if_icmplt", // "if_icmplt", |
| "if_icmpge", // "if_icmpge", |
| "if_icmpgt", // "if_icmpgt", |
| "if_icmple", // "if_icmple", |
| "if_acmpeq", // "if_acmpeq", |
| "if_acmpne", // "if_acmpne", |
| "goto", // "goto", |
| "jsr", // "jsr", |
| "ret", // "ret", |
| "tableswitch", // "tableswitch", |
| "lookupswitch", // "lookupswitch", |
| "ireturn", // "ireturn", |
| "lreturn", // "lreturn", |
| "freturn", // "freturn", |
| "dreturn", // "dreturn", |
| "areturn", // "areturn", |
| "return", // "return", |
| "getstatic", // "getstatic", |
| "putstatic", // "putstatic", |
| "getfield", // "getfield", |
| "putfield", // "putfield", |
| "invokevirtual", // "invokevirtual", |
| "invokespecial", // "invokespecial", |
| "invokestatic", // "invokestatic", |
| "invokeinterface", // "invokeinterface", |
| //"xxxunusedxxx", // "xxxunusedxxx", Java 6 and before |
| "invokedynamic", // "invokedynamic", Java 7 and later |
| "new", // "new", |
| "newarray", // "newarray", |
| "anewarray", // "anewarray", |
| "arraylength", // "arraylength", |
| "athrow", // "athrow", |
| "checkcast", // "checkcast", |
| "instanceof", // "instanceof", |
| "monitorenter", // "monitorenter", |
| "monitorexit", // "monitorexit", |
| "wide", // "wide", |
| "multianewarray", // "multianewarray", |
| "ifnull", // "ifnull", |
| "ifnonnull", // "ifnonnull", |
| "goto_w", // "goto_w", |
| "jsr_w" // "jsr_w" |
| }; |
| |
| private static Class[] opcodeClasses = { |
| null, // "nop", |
| null, // "aconst_null", |
| null, // "iconst_m1", |
| null, // "iconst_0", |
| null, // "iconst_1", |
| null, // "iconst_2", |
| null, // "iconst_3", |
| null, // "iconst_4", |
| null, // "iconst_5", |
| null, // "lconst_0", |
| null, // "lconst_1", |
| null, // "fconst_0", |
| null, // "fconst_1", |
| null, // "fconst_2", |
| null, // "dconst_0", |
| null, // "dconst_1", |
| BIPUSH.class, // "bipush", |
| SIPUSH.class, // "sipush", |
| LDC.class, // "ldc", |
| LDC_W.class, // "ldc_w", |
| LDC2_W.class, // "ldc2_w", |
| ILOAD.class, // "iload", |
| LLOAD.class, // "lload", |
| FLOAD.class, // "fload", |
| DLOAD.class, // "dload", |
| ALOAD.class, // "aload", |
| null, // "iload_0", |
| null, // "iload_1", |
| null, // "iload_2", |
| null, // "iload_3", |
| null, // "lload_0", |
| null, // "lload_1", |
| null, // "lload_2", |
| null, // "lload_3", |
| null, // "fload_0", |
| null, // "fload_1", |
| null, // "fload_2", |
| null, // "fload_3", |
| null, // "dload_0", |
| null, // "dload_1", |
| null, // "dload_2", |
| null, // "dload_3", |
| null, // "aload_0", |
| null, // "aload_1", |
| null, // "aload_2", |
| null, // "aload_3", |
| null, // "iaload", |
| null, // "laload", |
| null, // "faload", |
| null, // "daload", |
| null, // "aaload", |
| null, // "baload", |
| null, // "caload", |
| null, // "saload", |
| ISTORE.class, // "istore", |
| LSTORE.class, // "lstore", |
| FSTORE.class, // "fstore", |
| DSTORE.class, // "dstore", |
| ASTORE.class, // "astore", |
| null, // "istore_0", |
| null, // "istore_1", |
| null, // "istore_2", |
| null, // "istore_3", |
| null, // "lstore_0", |
| null, // "lstore_1", |
| null, // "lstore_2", |
| null, // "lstore_3", |
| null, // "fstore_0", |
| null, // "fstore_1", |
| null, // "fstore_2", |
| null, // "fstore_3", |
| null, // "dstore_0", |
| null, // "dstore_1", |
| null, // "dstore_2", |
| null, // "dstore_3", |
| null, // "astore_0", |
| null, // "astore_1", |
| null, // "astore_2", |
| null, // "astore_3", |
| null, // "iastore", |
| null, // "lastore", |
| null, // "fastore", |
| null, // "dastore", |
| null, // "aastore", |
| null, // "bastore", |
| null, // "castore", |
| null, // "sastore", |
| null, // "pop", |
| null, // "pop2", |
| null, // "dup", |
| null, // "dup_x1", |
| null, // "dup_x2", |
| null, // "dup2", |
| null, // "dup2_x1", |
| null, // "dup2_x2", |
| null, // "swap", |
| null, // "iadd", |
| null, // "ladd", |
| null, // "fadd", |
| null, // "dadd", |
| null, // "isub", |
| null, // "lsub", |
| null, // "fsub", |
| null, // "dsub", |
| null, // "imul", |
| null, // "lmul", |
| null, // "fmul", |
| null, // "dmul", |
| null, // "idiv", |
| null, // "ldiv", |
| null, // "fdiv", |
| null, // "ddiv", |
| null, // "irem", |
| null, // "lrem", |
| null, // "frem", |
| null, // "drem", |
| null, // "ineg", |
| null, // "lneg", |
| null, // "fneg", |
| null, // "dneg", |
| null, // "ishl", |
| null, // "lshl", |
| null, // "ishr", |
| null, // "lshr", |
| null, // "iushr", |
| null, // "lushr", |
| null, // "iand", |
| null, // "land", |
| null, // "ior", |
| null, // "lor", |
| null, // "ixor", |
| null, // "lxor", |
| IINC.class, // "iinc", |
| null, // "i2l", |
| null, // "i2f", |
| null, // "i2d", |
| null, // "l2i", |
| null, // "l2f", |
| null, // "l2d", |
| null, // "f2i", |
| null, // "f2l", |
| null, // "f2d", |
| null, // "d2i", |
| null, // "d2l", |
| null, // "d2f", |
| null, // "i2b", |
| null, // "i2c", |
| null, // "i2s", |
| null, // "lcmp", |
| null, // "fcmpl", |
| null, // "fcmpg", |
| null, // "dcmpl", |
| null, // "dcmpg", |
| null, // "ifeq", |
| null, // "ifne", |
| null, // "iflt", |
| null, // "ifge", |
| null, // "ifgt", |
| null, // "ifle", |
| null, // "if_icmpeq", |
| null, // "if_icmpne", |
| null, // "if_icmplt", |
| null, // "if_icmpge", |
| null, // "if_icmpgt", |
| null, // "if_icmple", |
| null, // "if_acmpeq", |
| null, // "if_acmpne", |
| GOTO.class, // "goto", |
| JSR.class, // "jsr", |
| RET.class, // "ret", |
| TABLESWITCH.class, // "tableswitch", |
| LOOKUPSWITCH.class, // "lookupswitch", |
| null, // "ireturn", |
| null, // "lreturn", |
| null, // "freturn", |
| null, // "dreturn", |
| null, // "areturn", |
| null, // "return", |
| GETSTATIC.class, // "getstatic", |
| PUTSTATIC.class, // "putstatic", |
| GETFIELD.class, // "getfield", |
| PUTFIELD.class, // "putfield", |
| INVOKEVIRTUAL.class, // "invokevirtual", |
| INVOKESPECIAL.class, // "invokespecial", |
| INVOKESTATIC.class, // "invokestatic", |
| INVOKEINTERFACE.class, // "invokeinterface", |
| INVOKEDYNAMIC.class, // "xxxunusedxxx" Java 6 and before, "invokedynamic" Java 7 and later |
| NEW.class, // "new", |
| NEWARRAY.class, // "newarray", |
| ANEWARRAY.class, // "anewarray", |
| null, // "arraylength", |
| null, // "athrow", |
| CHECKCAST.class, // "checkcast", |
| INSTANCEOF.class, // "instanceof", |
| null, // "monitorenter", |
| null, // "monitorexit", |
| null, // "wide", |
| MULTIANEWARRAY.class, // "multianewarray", |
| null, // "ifnull", |
| null, // "ifnonnull", |
| GOTO_W.class, // "goto_w", |
| JSR_W.class // "jsr_w" |
| }; |
| } |