InstructionMethodItemFactory.java revision 0c65e0f4f54ead8fd2832c954d516367b3556ae3
1package org.jf.baksmali.Adaptors.Format;
2
3import org.antlr.stringtemplate.StringTemplateGroup;
4import org.jf.baksmali.Adaptors.MethodDefinition;
5import org.jf.dexlib.Code.Analysis.AnalyzedInstruction;
6import org.jf.dexlib.Code.Format.*;
7import org.jf.dexlib.Code.Instruction;
8import org.jf.dexlib.Code.OffsetInstruction;
9import org.jf.dexlib.CodeItem;
10
11public class InstructionMethodItemFactory {
12    private InstructionMethodItemFactory() {
13    }
14
15    public static InstructionMethodItem makeInstructionFormatMethodItem(MethodDefinition methodDefinition,
16                                                                              CodeItem codeItem,
17                                                                              int codeAddress,
18                                                                              StringTemplateGroup stg,
19                                                                              Instruction instruction,
20                                                                              boolean isLastInstruction) {
21        if (instruction instanceof OffsetInstruction) {
22            return new OffsetInstructionFormatMethodItem(methodDefinition.getLabelCache(), codeItem, codeAddress, stg,
23                    instruction);
24        }
25
26        switch (instruction.getFormat()) {
27            case ArrayData:
28                return new ArrayDataMethodItem(codeItem, codeAddress, stg,
29                        (ArrayDataPseudoInstruction)instruction);
30            case PackedSwitchData:
31                return new PackedSwitchMethodItem(methodDefinition, codeItem, codeAddress, stg,
32                        (PackedSwitchDataPseudoInstruction)instruction);
33            case SparseSwitchData:
34                return new SparseSwitchMethodItem(methodDefinition, codeItem, codeAddress, stg,
35                        (SparseSwitchDataPseudoInstruction)instruction);
36            case UnresolvedNullReference:
37                return new UnresolvedNullReferenceMethodItem(codeItem, codeAddress, stg,
38                        (UnresolvedNullReference)instruction, isLastInstruction);
39            default:
40                return new InstructionMethodItem(codeItem, codeAddress, stg, instruction);
41        }
42    }
43}
44