MethodDefinition.java revision c65a8d8b5f2091a6bd835617262840a3f52c5c00
14d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek/*
2f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * [The "BSD licence"]
3f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * Copyright (c) 2009 Ben Gruver
4f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * All rights reserved.
5f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *
6f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * Redistribution and use in source and binary forms, with or without
7f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * modification, are permitted provided that the following conditions
8f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * are met:
9f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * 1. Redistributions of source code must retain the above copyright
10f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *    notice, this list of conditions and the following disclaimer.
118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek * 2. Redistributions in binary form must reproduce the above copyright
12f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *    notice, this list of conditions and the following disclaimer in the
13f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *    documentation and/or other materials provided with the distribution.
14f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * 3. The name of the author may not be used to endorse or promote products
15f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *    derived from this software without specific prior written permission.
16f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek *
17f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
218e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek */
287d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek
29754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenekpackage org.jf.baksmali.Adaptors;
30daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
3111062b118476368fa5b294954713e5df97d8599fTed Kremenekimport org.jf.baksmali.Adaptors.Format.*;
32f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenekimport org.jf.baksmali.baksmali;
3324f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenekimport org.jf.dexlib.*;
3424f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenekimport org.jf.dexlib.Debug.DebugInstructionIterator;
35922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.jf.dexlib.Code.Format.*;
36922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.jf.dexlib.Code.Instruction;
37922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.jf.dexlib.Code.Opcode;
38922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.jf.dexlib.Code.InstructionIterator;
39922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.jf.dexlib.Util.AccessFlags;
40922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.antlr.stringtemplate.StringTemplateGroup;
41922059dec59c7bed235da01aff75ae522a369811Ted Kremenekimport org.antlr.stringtemplate.StringTemplate;
42922059dec59c7bed235da01aff75ae522a369811Ted Kremenek
434d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenekimport java.util.*;
44f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
45f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenekpublic class MethodDefinition {
467d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek    public static StringTemplate makeTemplate(StringTemplateGroup stg, ClassDataItem.EncodedMethod encodedMethod,
47754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                                              AnnotationSetItem annotationSet,
48daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                                              AnnotationSetRefList parameterAnnotations) {
4911062b118476368fa5b294954713e5df97d8599fTed Kremenek
50f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        CodeItem codeItem = encodedMethod.codeItem;
51f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
52f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        StringTemplate template = stg.getInstanceOf("method");
53f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
54f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("AccessFlags", getAccessFlags(encodedMethod));
55f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("MethodName", encodedMethod.method.getMethodName().getStringValue());
56f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("Prototype", encodedMethod.method.getPrototype().getPrototypeString());
57f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("HasCode", codeItem != null);
58f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("RegisterCount", codeItem==null?"0":Integer.toString(codeItem.getRegisterCount()));
59f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("Parameters", getParameters(stg, codeItem, parameterAnnotations));
60f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("Annotations", getAnnotations(stg, annotationSet));
61f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        template.setAttribute("MethodItems", getMethodItems(encodedMethod.method.getDexFile(), stg, codeItem));
62f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
63f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        return template;
64f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    }
65f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
66f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    private static List<String> getAccessFlags(ClassDataItem.EncodedMethod encodedMethod) {
67f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        List<String> accessFlags = new ArrayList<String>();
688e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
698e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForMethod(encodedMethod.accessFlags)) {
708e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek            accessFlags.add(accessFlag.toString());
718e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek        }
728e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
738e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek        return accessFlags;
74f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    }
75f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
76f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    private static List<StringTemplate> getParameters(StringTemplateGroup stg, CodeItem codeItem,
77f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                                               AnnotationSetRefList parameterAnnotations) {
784d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek        DebugInfoItem debugInfoItem = null;
79f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        if (codeItem != null) {
80f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            debugInfoItem = codeItem.getDebugInfo();
81f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        }
82f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
83f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        int parameterCount = 0;
84425c08c53ccbfb84e52129406b259ec59da22e64Ted Kremenek
85f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        List<AnnotationSetItem> annotations = new ArrayList<AnnotationSetItem>();
86f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        if (parameterAnnotations != null) {
877d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek            AnnotationSetItem[] _annotations = parameterAnnotations.getAnnotationSets();
88f233d48cfc513b045e2c2cfca5c175220fbd0a82Ted Kremenek            if (_annotations != null) {
897d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                annotations.addAll(Arrays.asList(_annotations));
907d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek            }
9111062b118476368fa5b294954713e5df97d8599fTed Kremenek
926a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek            parameterCount = annotations.size();
936a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek        }
946a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek
95f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        List<String> parameterNames = new ArrayList<String>();
966a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek        if (debugInfoItem != null) {
977d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek            StringIdItem[] _parameterNames = debugInfoItem.getParameterNames();
986a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek            if (_parameterNames != null) {
996a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                for (StringIdItem parameterName: _parameterNames) {
100f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    parameterNames.add(parameterName==null?null:parameterName.getStringValue());
101754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                }
102daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek            }
103daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
104f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            if (parameterCount < parameterNames.size()) {
105f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                parameterCount = parameterNames.size();
1064d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek            }
1074d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek        }
108f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
109f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        List<StringTemplate> parameters = new ArrayList<StringTemplate>();
1104d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek        for (int i=0; i<parameterCount; i++) {
1118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek            AnnotationSetItem annotationSet = null;
112f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            if (i < annotations.size()) {
113f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                annotationSet = annotations.get(i);
114f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            }
115f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
11650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek            String parameterName = null;
117f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            if (i < parameterNames.size()) {
1184d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                parameterName = parameterNames.get(i);
119cb48b9c9c3c95f2650b74530264c288d1f58c73cTed Kremenek            }
120cb48b9c9c3c95f2650b74530264c288d1f58c73cTed Kremenek
121f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            parameters.add(ParameterAdaptor.makeTemplate(stg, parameterName, annotationSet));
122f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        }
123f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek
1244d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek        return parameters;
125f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    }
126f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
1273bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek    private static List<StringTemplate> getAnnotations(StringTemplateGroup stg, AnnotationSetItem annotationSet) {
128f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        if (annotationSet == null) {
129f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            return null;
130f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        }
131f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
132f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        List<StringTemplate> annotationAdaptors = new ArrayList<StringTemplate>();
133f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
134f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        for (AnnotationItem annotationItem: annotationSet.getAnnotations()) {
135f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            annotationAdaptors.add(AnnotationAdaptor.makeTemplate(stg, annotationItem));
136f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek        }
1374d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek        return annotationAdaptors;
138f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    }
139f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek
140f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek    private static List<MethodItem> getMethodItems(DexFile dexFile, StringTemplateGroup stg, CodeItem codeItem) {
1413bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek        List<MethodItem> methodItems = new ArrayList<MethodItem>();
1423bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek
1433bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek        MethodItemList methodItemList = new MethodItemList(dexFile, stg, codeItem);
144b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek        methodItemList.generateMethodItemList();
145f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
146f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        methodItems.addAll(methodItemList.labels.values());
14700a3a5f024ac54088ab887712b292171188064f0Ted Kremenek        methodItems.addAll(methodItemList.instructions);
14800a3a5f024ac54088ab887712b292171188064f0Ted Kremenek        methodItems.addAll(methodItemList.blanks);
14900a3a5f024ac54088ab887712b292171188064f0Ted Kremenek        methodItems.addAll(methodItemList.catches);
15000a3a5f024ac54088ab887712b292171188064f0Ted Kremenek        methodItems.addAll(methodItemList.debugItems);
15100a3a5f024ac54088ab887712b292171188064f0Ted Kremenek        Collections.sort(methodItems);
15200a3a5f024ac54088ab887712b292171188064f0Ted Kremenek
153f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        return methodItems;
1541b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek    }
1551b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek
156f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
1571b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek    private static class MethodItemList {
1581b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek        private final DexFile dexFile;
159f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        private final StringTemplateGroup stg;
160f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        private final CodeItem codeItem;
1611b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek
162f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public HashMap<LabelMethodItem, LabelMethodItem> labels = new HashMap<LabelMethodItem, LabelMethodItem>();
163f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public List<MethodItem> instructions = new ArrayList<MethodItem>();
164f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public List<BlankMethodItem> blanks = new ArrayList<BlankMethodItem>();
165f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public List<CatchMethodItem> catches = new ArrayList<CatchMethodItem>();
166f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public List<MethodItem> debugItems = new ArrayList<MethodItem>();
167f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
16899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek        private HashMap<Integer, Integer> packedSwitchMap = new HashMap<Integer, Integer>();
16999c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek        private HashMap<Integer, Integer> sparseSwitchMap = new HashMap<Integer, Integer>();
170f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek
171f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek        public MethodItemList(DexFile dexFile, StringTemplateGroup stg, CodeItem codeItem) {
172f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek            this.dexFile = dexFile;
173f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek            this.stg = stg;
174f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            this.codeItem = codeItem;
175f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek        }
1763bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek
177f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        public void generateMethodItemList() {
178e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            if (codeItem == null) {
179e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                return;
18099c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek            }
181f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
18299c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek            if (baksmali.deodexUtil != null && dexFile.isOdex()) {
18399c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                List<Instruction> instructions = baksmali.deodexUtil.deodexerizeCode(codeItem);
184b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek
185b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek                int offset = 0;
18699c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                for (Instruction instruction: instructions) {
1873bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                    if (instruction.opcode == Opcode.PACKED_SWITCH) {
1883bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                        Instruction31t ins = (Instruction31t)instruction;
18999c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                        packedSwitchMap.put(offset + ins.getOffset(), offset);
190e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                    } else if (instruction.opcode == Opcode.SPARSE_SWITCH) {
191e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                        Instruction31t ins = (Instruction31t)instruction;
19299c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                        sparseSwitchMap.put(offset + ins.getOffset(), offset);
19399c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                    }
19499c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek
19599c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                    offset += instruction.getSize()/2;
196e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                }
197e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek
19899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                offset = 0;
19999c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                for (Instruction instruction: instructions) {
20099c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                    addMethodItemsForInstruction(offset, instruction, false, null);
201f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek                    blanks.add(new BlankMethodItem(stg, offset));
202f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
203f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    offset += instruction.getSize()/2;
204f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                }
205f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            } else {
2061b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek                final byte[] encodedInstructions = codeItem.getEncodedInstructions();
207b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek
2081b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek                InstructionIterator.IterateInstructions(encodedInstructions,
209f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        new InstructionIterator.ProcessRawInstructionDelegate() {
210f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            public void ProcessNormalInstruction(Opcode opcode, int index) {
2111b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek                                if (opcode == Opcode.PACKED_SWITCH) {
212b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek                                    Instruction31t ins = (Instruction31t)opcode.format.Factory.makeInstruction(
2131b8bd4d71c2098126041b4de4267175a82f0103cTed Kremenek                                            dexFile, opcode, encodedInstructions, index);
2145c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                                    packedSwitchMap.put(index/2 + ins.getOffset(), index/2);
2155c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                                } else if (opcode == Opcode.SPARSE_SWITCH) {
21600a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                                    Instruction31t ins = (Instruction31t)opcode.format.Factory.makeInstruction(
21700a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                                            dexFile, opcode, encodedInstructions, index);
21800a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                                    sparseSwitchMap.put(index/2 + ins.getOffset(),  index/2);
21900a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                                }
22000a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                            }
22100a3a5f024ac54088ab887712b292171188064f0Ted Kremenek
22200a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                            public void ProcessReferenceInstruction(Opcode opcode, int index) {
22300a3a5f024ac54088ab887712b292171188064f0Ted Kremenek                            }
2243bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek
2253bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            public void ProcessPackedSwitchInstruction(int index, int targetCount, int instructionLength) {
2263bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            }
2273bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek
2283bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            public void ProcessSparseSwitchInstruction(int index, int targetCount, int instructionLength) {
2293bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            }
2303bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek
2313bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            public void ProcessFillArrayDataInstruction(int index, int elementWidth, int elementCount,
2323bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                                                                        int instructionLength) {
2333bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            }
2343bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                        });
2350e561a3e6755c4f248a8bb05d49071ddf4f2ef7bTed Kremenek
2365dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek                InstructionIterator.IterateInstructions(dexFile, encodedInstructions,
2375dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek                        new InstructionIterator.ProcessInstructionDelegate() {
2383bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek                            public void ProcessInstruction(int index, Instruction instruction) {
2395c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                                int offset = index/2;
240e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                                addMethodItemsForInstruction(offset, instruction, false, null);
241e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                                blanks.add(new BlankMethodItem(stg, offset));
242e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                            }
243e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                        });
244e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            }
245e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek
246e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            blanks.remove(blanks.size()-1);
247e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek
248e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            addTries();
249e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek
250e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            addDebugInfo();
251e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek        }
252e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek
253e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek        private void addInstructionMethodItem(InstructionFormatMethodItem methodItem, boolean commentedOut,
2545c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                                              String comment) {
255e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek            if (commentedOut) {
2565c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                instructions.add(new CommentedOutMethodItem(stg, methodItem));
2575c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek            } else {
2585c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                instructions.add(methodItem);
2595c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek            }
2605c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek        }
2614bf38da038cebf9396470630c3c39519e41706daTed Kremenek
2625dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek        private void addLabelMethodItem(LabelMethodItem labelMethodItem) {
2635dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek            LabelMethodItem internedLabelMethodItem = labels.get(labelMethodItem);
2645dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek            if (internedLabelMethodItem != null) {
26599c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek                if (!labelMethodItem.isCommentedOut() && internedLabelMethodItem.isCommentedOut()) {
266e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek                    internedLabelMethodItem.setCommentedOut(false);
26784867e60a466fa1199eb4e838ddf873a2f7658a9Ted Kremenek                }
268922059dec59c7bed235da01aff75ae522a369811Ted Kremenek            } else {
269922059dec59c7bed235da01aff75ae522a369811Ted Kremenek                labels.put(labelMethodItem, labelMethodItem);
270922059dec59c7bed235da01aff75ae522a369811Ted Kremenek            }
27199c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek        }
2725dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek
2734bf38da038cebf9396470630c3c39519e41706daTed Kremenek        private void addMethodItemsForInstruction(int offset, Instruction instruction, boolean commentedOut,
2745c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                                                  String comment) {
2755c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek            switch (instruction.getFormat()) {
2765c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek                case Format10t:
277b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek                    addInstructionMethodItem(
278b0533965f1b4db020692e3b23ca7b3bc15bf5897Ted Kremenek                            new Instruction10tMethodItem(codeItem, offset, stg,(Instruction10t)instruction),
279f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            commentedOut, comment);
280f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    addLabelMethodItem(new LabelMethodItem(offset + ((Instruction10t)instruction).getOffset(), stg,
2817d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            "goto_", commentedOut));
2824d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                    return;
2837d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                case Format10x:
2847d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
2857d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction10xMethodItem(codeItem, offset, stg, (Instruction10x)instruction),
2867d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            commentedOut, comment);
28752a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                    return;
2883b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek                case Format11n:
2893b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek                    addInstructionMethodItem(
2903b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek                            new Instruction11nMethodItem(codeItem, offset, stg, (Instruction11n)instruction),
29171c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                            commentedOut, comment);
29271c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                    return;
29371c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                case Format11x:
2947d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
2957d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction11xMethodItem(codeItem, offset, stg, (Instruction11x)instruction),
2964d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                            commentedOut, comment);
29771c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                    return;
29871c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                case Format12x:
2997d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
30071c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek                            new Instruction12xMethodItem(codeItem, offset, stg, (Instruction12x)instruction),
3017d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            commentedOut, comment);
302b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                    return;
3037d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                case Format20t:
3048e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    addInstructionMethodItem(
3057d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction20tMethodItem(codeItem, offset, stg, (Instruction20t)instruction),
3068e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                            commentedOut, comment);
3078e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    addLabelMethodItem(new LabelMethodItem(offset + ((Instruction20t)instruction).getOffset(), stg,
3088e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                            "goto_", commentedOut));
3098e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    return;
3108e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                case Format21c:
31152a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                    addInstructionMethodItem(
31252a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                            new Instruction21cMethodItem(codeItem, offset, stg, (Instruction21c)instruction),
31352a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                            commentedOut, comment);
31452a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                    return;
31552a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                case Format21h:
3167d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
3177d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction21hMethodItem(codeItem, offset, stg, (Instruction21h)instruction),
31850a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                            commentedOut, comment);
3197d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    return;
32050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                case Format21s:
32150a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                    addInstructionMethodItem(
3227d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction21sMethodItem(codeItem, offset, stg, (Instruction21s)instruction),
3237d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            commentedOut, comment);
3247d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    return;
3257d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                case Format21t:
3267d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
3277d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            new Instruction21tMethodItem(codeItem, offset, stg, (Instruction21t)instruction),
3287d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            commentedOut, comment);
3297d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addLabelMethodItem(new LabelMethodItem(offset + ((Instruction21t)instruction).getOffset(), stg,
3307d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            "cond_", commentedOut));
3317d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    return;
332b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                case Format22b:
333b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                    addInstructionMethodItem(
334b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                            new Instruction22bMethodItem(codeItem, offset, stg, (Instruction22b)instruction),
335b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                            commentedOut, comment);
336b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                    return;
337e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                case Format22c:
338b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                    addInstructionMethodItem(
339b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek                            new Instruction22cMethodItem(codeItem, offset, stg, (Instruction22c)instruction),
3407d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                            commentedOut, comment);
341e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                    return;
342e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                case Format22cs:
3437d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addInstructionMethodItem(
34452a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                            new Instruction22csMethodItem(codeItem, offset, stg, (Instruction22cs)instruction),
3458e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                            commentedOut, comment);
3468e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    return;
3478e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                case Format22csf:
3488e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    addInstructionMethodItem(
3498e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                            new Instruction22csfMethodItem(codeItem, offset, stg, (Instruction22csf)instruction),
3508e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                            commentedOut, comment);
3518e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                    return;
3528e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek                case Format22s:
35352a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                    addInstructionMethodItem(
35452a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                            new Instruction22sMethodItem(codeItem, offset, stg, (Instruction22s)instruction),
35552a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek                            commentedOut, comment);
3567d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    return;
3577d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                case Format22t:
358754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
3594d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                            new Instruction22tMethodItem(codeItem, offset, stg, (Instruction22t)instruction),
360754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
361754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addLabelMethodItem(new LabelMethodItem(offset + ((Instruction22t)instruction).getOffset(), stg,
362754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            "cond_", commentedOut));
363754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
364754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format22x:
365754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
366754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction22xMethodItem(codeItem, offset, stg, (Instruction22x)instruction),
3674d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                            commentedOut, comment);
368754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
369754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format23x:
370754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
371754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction23xMethodItem(codeItem, offset, stg, (Instruction23x)instruction),
372754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
373754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
374754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format30t:
375754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
376754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction30tMethodItem(codeItem, offset, stg, (Instruction30t)instruction),
377754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
378754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addLabelMethodItem(new LabelMethodItem(offset + ((Instruction30t)instruction).getOffset(), stg,
379754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            "goto_", commentedOut));
380754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
38124f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                case Format31c:
38224f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                    addInstructionMethodItem(
38324f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                            new Instruction31cMethodItem(codeItem, offset, stg, (Instruction31c)instruction),
38424f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                            commentedOut, comment);
38524f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                    return;
38624f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                case Format31i:
38724f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                    addInstructionMethodItem(
388754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction31iMethodItem(codeItem, offset, stg, (Instruction31i)instruction),
389754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
39024f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                    return;
39124f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                case Format31t:
392754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
39324f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek                            new Instruction31tMethodItem(codeItem, offset, stg, (Instruction31t)instruction),
394754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
395754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    if (instruction.opcode == Opcode.FILL_ARRAY_DATA) {
396754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                        addLabelMethodItem(new LabelMethodItem(offset + ((Instruction31t)instruction).getOffset(), stg,
397754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                                "array_", commentedOut));
398754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    } else if (instruction.opcode == Opcode.PACKED_SWITCH) {
399754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                        addLabelMethodItem(new LabelMethodItem(offset + ((Instruction31t)instruction).getOffset(), stg,
40050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                                "pswitch_data_", commentedOut));
401754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    } else if (instruction.opcode == Opcode.SPARSE_SWITCH) {
40250a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                        addLabelMethodItem(new LabelMethodItem(offset + ((Instruction31t)instruction).getOffset(), stg,
40350a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                                "sswitch_data_", commentedOut));
404754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    }
405754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
406754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format32x:
407754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
408754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction32xMethodItem(codeItem, offset, stg, (Instruction32x)instruction),
409754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
410754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
411754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format35c:
412754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
413754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            new Instruction35cMethodItem(codeItem, offset, stg, (Instruction35c)instruction),
414754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
415754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
416754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format35s:
417754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    addInstructionMethodItem(
418e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                            new Instruction35sMethodItem(codeItem, offset, stg, (Instruction35s)instruction),
419e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                            commentedOut, comment);
420754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
421754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                case Format35sf:
422e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                    addInstructionMethodItem(
423e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                            new Instruction35sfMethodItem(codeItem, offset, stg, (Instruction35sf)instruction),
424754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                            commentedOut, comment);
425754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek                    return;
426daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format35ms:
427daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
428daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction35msMethodItem(codeItem, offset, stg, (Instruction35ms)instruction),
429daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
430daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
431daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format35msf:
432daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
433daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction35msfMethodItem(codeItem, offset, stg, (Instruction35msf)instruction),
434daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
435daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
436daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format3rc:
437daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
438daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction3rcMethodItem(codeItem, offset, stg, (Instruction3rc)instruction),
439daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
440daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
441daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format3rms:
442daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
443daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction3rmsMethodItem(codeItem, offset, stg, (Instruction3rms)instruction),
444daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
445daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
446daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format3rmsf:
447daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
448daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction3rmsfMethodItem(codeItem, offset, stg, (Instruction3rmsf)instruction),
449daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
450daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
451daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case Format51l:
452daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
453daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new Instruction51lMethodItem(codeItem, offset, stg, (Instruction51l)instruction),
454daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
455daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
456daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case ArrayData:
457daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    addInstructionMethodItem(
458daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            new ArrayDataMethodItem(codeItem, offset, stg, (ArrayDataPseudoInstruction)instruction),
459daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
460daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
461daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case PackedSwitchData:
462daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                {
463daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    final Integer baseAddress = packedSwitchMap.get(offset);
464daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
465daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    if (baseAddress != null) {
46650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                        PackedSwitchDataPseudoInstruction packedSwitchInstruction =
467daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                                (PackedSwitchDataPseudoInstruction)instruction;
46850a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
46950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                        addInstructionMethodItem(
470daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                                new PackedSwitchMethodItem(codeItem, offset, stg, packedSwitchInstruction, baseAddress),
471daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            commentedOut, comment);
472daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
473daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        Iterator<PackedSwitchDataPseudoInstruction.PackedSwitchTarget> iterator =
474daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                                packedSwitchInstruction.getTargets();
475daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        while (iterator.hasNext()) {
476daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            PackedSwitchDataPseudoInstruction.PackedSwitchTarget target = iterator.next();
477daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                            addLabelMethodItem(new LabelMethodItem(baseAddress + target.target, stg, "pswitch_",
478daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                                    commentedOut));
479daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        }
480daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    }
481daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    return;
482daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                }
483daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                case SparseSwitchData:
484e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                {
485e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                    final Integer baseAddress = sparseSwitchMap.get(offset);
486daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
487daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    if (baseAddress != null) {
488e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                        SparseSwitchDataPseudoInstruction sparseSwitchInstruction =
489e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                                (SparseSwitchDataPseudoInstruction)instruction;
490daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
491daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        addInstructionMethodItem(
492e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                                new SparseSwitchMethodItem(codeItem, offset, stg, sparseSwitchInstruction, baseAddress),
493e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek                            commentedOut, comment);
494daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek
495daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        Iterator<SparseSwitchDataPseudoInstruction.SparseSwitchTarget> iterator =
49611062b118476368fa5b294954713e5df97d8599fTed Kremenek                                sparseSwitchInstruction.getTargets();
49711062b118476368fa5b294954713e5df97d8599fTed Kremenek                        while (iterator.hasNext()) {
49811062b118476368fa5b294954713e5df97d8599fTed Kremenek                            SparseSwitchDataPseudoInstruction.SparseSwitchTarget target = iterator.next();
49911062b118476368fa5b294954713e5df97d8599fTed Kremenek                            addLabelMethodItem(new LabelMethodItem(baseAddress + target.target, stg, "sswitch_",
50011062b118476368fa5b294954713e5df97d8599fTed Kremenek                                    commentedOut));
50111062b118476368fa5b294954713e5df97d8599fTed Kremenek                        }
50211062b118476368fa5b294954713e5df97d8599fTed Kremenek                    }
50311062b118476368fa5b294954713e5df97d8599fTed Kremenek                    return;
50411062b118476368fa5b294954713e5df97d8599fTed Kremenek                }
50511062b118476368fa5b294954713e5df97d8599fTed Kremenek                case UnresolvedNullReference:
50611062b118476368fa5b294954713e5df97d8599fTed Kremenek                {
50711062b118476368fa5b294954713e5df97d8599fTed Kremenek                    addInstructionMethodItem(new UnresolvedNullReferenceMethodItem(codeItem, offset, stg,
50811062b118476368fa5b294954713e5df97d8599fTed Kremenek                            (UnresolvedNullReference)instruction), commentedOut, comment);
50911062b118476368fa5b294954713e5df97d8599fTed Kremenek                    addMethodItemsForInstruction(offset, ((UnresolvedNullReference)instruction).OriginalInstruction,
51011062b118476368fa5b294954713e5df97d8599fTed Kremenek                            true, null);
51111062b118476368fa5b294954713e5df97d8599fTed Kremenek                    return;
51211062b118476368fa5b294954713e5df97d8599fTed Kremenek                }
51311062b118476368fa5b294954713e5df97d8599fTed Kremenek                case DeadInstruction:
51411062b118476368fa5b294954713e5df97d8599fTed Kremenek                {
51511062b118476368fa5b294954713e5df97d8599fTed Kremenek                    addMethodItemsForInstruction(offset, ((DeadInstruction)instruction).OriginalInstruction, true, null);
51611062b118476368fa5b294954713e5df97d8599fTed Kremenek                    return;
51711062b118476368fa5b294954713e5df97d8599fTed Kremenek                }
51811062b118476368fa5b294954713e5df97d8599fTed Kremenek            }
51911062b118476368fa5b294954713e5df97d8599fTed Kremenek        }
52011062b118476368fa5b294954713e5df97d8599fTed Kremenek
52111062b118476368fa5b294954713e5df97d8599fTed Kremenek        private void addTries() {
52211062b118476368fa5b294954713e5df97d8599fTed Kremenek            if (codeItem.getTries() == null) {
52311062b118476368fa5b294954713e5df97d8599fTed Kremenek                return;
52411062b118476368fa5b294954713e5df97d8599fTed Kremenek            }
52511062b118476368fa5b294954713e5df97d8599fTed Kremenek            for (CodeItem.TryItem tryItem: codeItem.getTries()) {
52611062b118476368fa5b294954713e5df97d8599fTed Kremenek                int startAddress = tryItem.startAddress;
52711062b118476368fa5b294954713e5df97d8599fTed Kremenek                int endAddress = tryItem.startAddress + tryItem.instructionCount;
52811062b118476368fa5b294954713e5df97d8599fTed Kremenek
52911062b118476368fa5b294954713e5df97d8599fTed Kremenek                /**
53011062b118476368fa5b294954713e5df97d8599fTed Kremenek                 * The end address points to the address immediately after the end of the last
53111062b118476368fa5b294954713e5df97d8599fTed Kremenek                 * instruction that the try block covers. We want the .catch directive and end_try
53211062b118476368fa5b294954713e5df97d8599fTed Kremenek                 * label to be associated with the last covered instruction, so we need to get
53311062b118476368fa5b294954713e5df97d8599fTed Kremenek                 * the offset for that instruction
53411062b118476368fa5b294954713e5df97d8599fTed Kremenek                 */
53511062b118476368fa5b294954713e5df97d8599fTed Kremenek                int index = Collections.binarySearch(instructions, new BlankMethodItem(stg, endAddress));
53611062b118476368fa5b294954713e5df97d8599fTed Kremenek                if (index < 0) {
53711062b118476368fa5b294954713e5df97d8599fTed Kremenek                    index = (index * -1) - 1;
53811062b118476368fa5b294954713e5df97d8599fTed Kremenek                }
53911062b118476368fa5b294954713e5df97d8599fTed Kremenek                //index should never by 0, so this should be safe
54011062b118476368fa5b294954713e5df97d8599fTed Kremenek                if (index == instructions.size()) {
54111062b118476368fa5b294954713e5df97d8599fTed Kremenek                    //if the end address is the same as the address of the last instruction, then
54211062b118476368fa5b294954713e5df97d8599fTed Kremenek                    //this try item ends at the next to last instruction.
54311062b118476368fa5b294954713e5df97d8599fTed Kremenek                    //otherwise, if the end address is past the address of the last instruction,
54411062b118476368fa5b294954713e5df97d8599fTed Kremenek                    //thin this try item ends at the last instruction
54511062b118476368fa5b294954713e5df97d8599fTed Kremenek                    if (instructions.get(instructions.size() - 1).getOffset() == endAddress) {
54611062b118476368fa5b294954713e5df97d8599fTed Kremenek                        //get the address for the next to last instruction
54711062b118476368fa5b294954713e5df97d8599fTed Kremenek                        index -= 2;
54811062b118476368fa5b294954713e5df97d8599fTed Kremenek                    } else {
54911062b118476368fa5b294954713e5df97d8599fTed Kremenek                        //get the address for the last instruction
55011062b118476368fa5b294954713e5df97d8599fTed Kremenek                        index--;
55111062b118476368fa5b294954713e5df97d8599fTed Kremenek                    }
55211062b118476368fa5b294954713e5df97d8599fTed Kremenek                } else {
55311062b118476368fa5b294954713e5df97d8599fTed Kremenek                    index -= 2;
55411062b118476368fa5b294954713e5df97d8599fTed Kremenek                }
555754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek
556f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                int lastInstructionOffset = instructions.get(index).getOffset();
55750a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
5584d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                //add the catch all handler if it exists
559f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                int catchAllAddress = tryItem.encodedCatchHandler.catchAllHandlerAddress;
56050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                if (catchAllAddress != -1) {
56150a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                    CatchMethodItem catchMethodItem = new CatchMethodItem(lastInstructionOffset, stg, null,
56250a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                            startAddress, endAddress, catchAllAddress) {
563f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        public String getTemplateName() {
564f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            return "CatchAll";
565f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        }
56650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                    };
567f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    catches.add(catchMethodItem);
568f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
56950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                    addLabelMethodItem(new LabelMethodItem(startAddress, stg, "try_start_", false));
570f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    //use the offset from the last covered instruction, but make the label
571f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    //name refer to the address of the next instruction
57211062b118476368fa5b294954713e5df97d8599fTed Kremenek                    addLabelMethodItem(new EndTryLabelMethodItem(lastInstructionOffset, stg, endAddress));
57311062b118476368fa5b294954713e5df97d8599fTed Kremenek                    addLabelMethodItem(new LabelMethodItem(catchAllAddress, stg, "handler_", false));
57411062b118476368fa5b294954713e5df97d8599fTed Kremenek
575f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                }
576f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
577f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek                //add the rest of the handlers
578f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek                //TODO: find adjacent handlers for the same type and combine them
57950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                for (CodeItem.EncodedTypeAddrPair handler: tryItem.encodedCatchHandler.handlers) {
580f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    //use the offset from the last covered instruction
5816a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                    CatchMethodItem catchMethodItem = new CatchMethodItem(lastInstructionOffset, stg,
5826a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                            handler.exceptionType, startAddress, endAddress, handler.handlerAddress);
5836a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                    catches.add(catchMethodItem);
58450a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
5856a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                    addLabelMethodItem(new LabelMethodItem(startAddress, stg, "try_start_", false));
586f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                    //use the offset from the last covered instruction, but make the label
587f233d48cfc513b045e2c2cfca5c175220fbd0a82Ted Kremenek                    //name refer to the address of the next instruction
5887d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek                    addLabelMethodItem(new EndTryLabelMethodItem(lastInstructionOffset, stg, endAddress));
58950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                    addLabelMethodItem(new LabelMethodItem(handler.handlerAddress, stg, "handler_", false));
59050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                }
591f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek            }
592f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek        }
593754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek
59450a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek        private void addDebugInfo() {
59550a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek            DebugInfoItem debugInfoItem = codeItem.getDebugInfo();
596754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek            if (debugInfoItem == null) {
597f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                return;
598daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek            }
59950a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
60050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek            DebugInstructionIterator.DecodeInstructions(debugInfoItem, codeItem.getRegisterCount(),
601daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                    new DebugInstructionIterator.ProcessDecodedDebugInstructionDelegate() {
602daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek                        @Override
603f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        public void ProcessStartLocal(int codeAddress, int length, int registerNum, StringIdItem name,
6044d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                                                      TypeIdItem type) {
605f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            debugItems.add(new LocalDebugMethodItem(codeItem, codeAddress, stg, "StartLocal", -1,
60650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                                    registerNum, name, type, null));
60763bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek                        }
60850a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
609f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        @Override
6104d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                        public void ProcessStartLocalExtended(int codeAddress, int length, int registerNum,
611f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                                              StringIdItem name, TypeIdItem type,
6124d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                                                              StringIdItem signature) {
61350a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                            debugItems.add(new LocalDebugMethodItem(codeItem, codeAddress, stg, "StartLocal", -1,
61450a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek                                    registerNum, name, type, signature));
61563bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek                        }
61650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
617f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        @Override
6184d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek                        public void ProcessEndLocal(int codeAddress, int length, int registerNum, StringIdItem name,
619f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                                    TypeIdItem type, StringIdItem signature) {
620f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            debugItems.add(new LocalDebugMethodItem(codeItem, codeAddress, stg, "EndLocal", -1,
621f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                    registerNum, name, type, signature));
622f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        }
623f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
624f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        @Override
625f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        public void ProcessRestartLocal(int codeAddress, int length, int registerNum, StringIdItem name,
626f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                                        TypeIdItem type, StringIdItem signature) {
627f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            debugItems.add(new LocalDebugMethodItem(codeItem, codeAddress, stg, "RestartLocal", -1,
628f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                                    registerNum, name, type, signature));
629f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        }
630f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
631f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        @Override
632f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        public void ProcessSetPrologueEnd(int codeAddress) {
633f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                            debugItems.add(new DebugMethodItem(codeAddress, stg, "EndPrologue", -4));
634f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek                        }
635
636                        @Override
637                        public void ProcessSetEpilogueBegin(int codeAddress) {
638                            debugItems.add(new DebugMethodItem(codeAddress, stg, "StartEpilogue", -4));
639                        }
640
641                        @Override
642                        public void ProcessSetFile(int codeAddress, int length, final StringIdItem name) {
643                            debugItems.add(new DebugMethodItem(codeAddress, stg, "SetFile", -3) {
644                                @Override
645                                protected void setAttributes(StringTemplate template) {
646                                    template.setAttribute("FileName", name.getStringValue());
647                                }
648                            });
649                        }
650
651                        @Override
652                        public void ProcessLineEmit(int codeAddress, final int line) {
653                             debugItems.add(new DebugMethodItem(codeAddress, stg, "Line", -2) {
654                                 @Override
655                                 protected void setAttributes(StringTemplate template) {
656                                     template.setAttribute("Line", line);
657                                 }
658                             });
659                        }
660                    });
661        }
662    }
663}
664