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