1/*
2 * Copyright 2012, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 *     * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *     * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32package org.jf.baksmali.Adaptors.Debug;
33
34import org.jf.baksmali.Adaptors.MethodItem;
35import org.jf.baksmali.Adaptors.RegisterFormatter;
36import org.jf.dexlib2.DebugItemType;
37import org.jf.dexlib2.iface.debug.*;
38import org.jf.util.ExceptionWithContext;
39
40public abstract class DebugMethodItem extends MethodItem {
41    private final int sortOrder;
42
43    protected DebugMethodItem(int codeAddress, int sortOrder) {
44        super(codeAddress);
45        this.sortOrder = sortOrder;
46    }
47
48    @Override public double getSortOrder() { return sortOrder; }
49
50    public static DebugMethodItem build(RegisterFormatter registerFormatter, DebugItem debugItem) {
51        int codeAddress = debugItem.getCodeAddress();
52        switch (debugItem.getDebugItemType()) {
53            case DebugItemType.START_LOCAL:
54                return new StartLocalMethodItem(codeAddress, -1, registerFormatter, (StartLocal)debugItem);
55            case DebugItemType.END_LOCAL:
56                return new EndLocalMethodItem(codeAddress, -1, registerFormatter, (EndLocal)debugItem);
57            case DebugItemType.RESTART_LOCAL:
58                return new RestartLocalMethodItem(codeAddress, -1, registerFormatter, (RestartLocal)debugItem);
59            case DebugItemType.EPILOGUE_BEGIN:
60                return new BeginEpilogueMethodItem(codeAddress, -4);
61            case DebugItemType.PROLOGUE_END:
62                return new EndPrologueMethodItem(codeAddress, -4);
63            case DebugItemType.SET_SOURCE_FILE:
64                return new SetSourceFileMethodItem(codeAddress, -3, (SetSourceFile)debugItem);
65            case DebugItemType.LINE_NUMBER:
66                return new LineNumberMethodItem(codeAddress, -2, (LineNumber)debugItem);
67            default:
68                throw new ExceptionWithContext("Invalid debug item type: %d", debugItem.getDebugItemType());
69        }
70    }
71}
72