1b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com/* 2b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * [The "BSD licence"] 300fc68adf2e39aeb9fed35293f2576bbe729ec4bJesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver (JesusFreke) 4b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * All rights reserved. 5b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * 6b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 7b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 8b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * are met: 9b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 10b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 11b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 12b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 13b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 14b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 15b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 16b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * 17b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com */ 28b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com 29b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.compackage org.jf.baksmali.Adaptors; 30b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com 31baa030c201f558c274d74dc1511f2c982b87ae74jesusfreke@jesusfreke.comimport org.jf.dexlib.Util.Utf8Utils; 324b72225e9d81201838f387171a68a832486903f9JesusFreke@JesusFreke.comimport org.jf.util.IndentingWriter; 336eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.comimport org.jf.dexlib.CodeItem; 346eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.comimport org.jf.dexlib.StringIdItem; 356eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.comimport org.jf.dexlib.TypeIdItem; 367ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com 370b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.comimport java.io.IOException; 380b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com 396eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.compublic abstract class DebugMethodItem extends MethodItem { 40da69b22d6fe70d082b18858aea0d15ec383f1865JesusFreke@JesusFreke.com private final double sortOrder; 41b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com 426eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com public DebugMethodItem(int codeAddress, double sortOrder) { 4316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com super(codeAddress); 44b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com this.sortOrder = sortOrder; 45b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com } 46b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com 47da69b22d6fe70d082b18858aea0d15ec383f1865JesusFreke@JesusFreke.com public double getSortOrder() { 48b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com return sortOrder; 49b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com } 507ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com 510b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeLine(IndentingWriter writer, int line) throws IOException { 526eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".line "); 5374c14ffcca0ff4f8f3e66e66022894cd7b0b8540Ben Gruver writer.printSignedIntAsDec(line); 547ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com } 557ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com 560b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeEndPrologue(IndentingWriter writer) throws IOException { 576eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".prologue"); 586eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 596eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 600b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeBeginEpilogue(IndentingWriter writer) throws IOException { 616eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".epilogue"); 626eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 636eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 640b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeStartLocal(IndentingWriter writer, CodeItem codeItem, int register, 650b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com StringIdItem name, TypeIdItem type, StringIdItem signature) 660b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com throws IOException { 676eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".local "); 686eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com RegisterFormatter.writeTo(writer, codeItem, register); 696eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 706eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(name.getStringValue()); 716eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(':'); 726eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(type.getTypeDescriptor()); 736eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (signature != null) { 746eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(",\""); 756eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(signature.getStringValue()); 766eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('"'); 776eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 786eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 796eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 800b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeEndLocal(IndentingWriter writer, CodeItem codeItem, int register, StringIdItem name, 810b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com TypeIdItem type, StringIdItem signature) throws IOException { 826eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".end local "); 836eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com RegisterFormatter.writeTo(writer, codeItem, register); 846eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 856eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (name != null) { 866eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(" #"); 876eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(name.getStringValue()); 886eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(':'); 896eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(type.getTypeDescriptor()); 906eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (signature != null) { 916eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(",\""); 926eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(signature.getStringValue()); 936eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('"'); 946eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 956eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 966eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 976eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 986eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 990b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeRestartLocal(IndentingWriter writer, CodeItem codeItem, int register, 1000b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com StringIdItem name, TypeIdItem type, StringIdItem signature) 1010b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com throws IOException { 1026eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".restart local "); 1036eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com RegisterFormatter.writeTo(writer, codeItem, register); 1046eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 1056eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (name != null) { 1066eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(" #"); 1076eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(name.getStringValue()); 1086eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(':'); 1096eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(type.getTypeDescriptor()); 1106eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (signature != null) { 1116eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(",\""); 1126eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(signature.getStringValue()); 1136eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('"'); 1146eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 1156eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 1166eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 1176eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 1180b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected static void writeSetFile(IndentingWriter writer, String fileName) throws IOException { 1196eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(".source \""); 120baa030c201f558c274d74dc1511f2c982b87ae74jesusfreke@jesusfreke.com Utf8Utils.writeEscapedString(writer, fileName); 1216eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('"'); 1227ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com } 123b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com} 124