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