com.googlecode.d2j.node.DexDebugNode Maven / Gradle / Ivy
The newest version!
/*
* dex2jar - Tools to work with android .dex and java .class files
* Copyright (c) 2009-2014 Panxiaobo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.googlecode.d2j.node;
import java.util.ArrayList;
import java.util.List;
import com.googlecode.d2j.DexLabel;
import com.googlecode.d2j.visitors.DexDebugVisitor;
public class DexDebugNode extends DexDebugVisitor {
public List debugNodes = new ArrayList<>();
public List parameterNames;
public String fineName;
protected void addDebug(DexDebugOpNode dexDebugNode) {
debugNodes.add(dexDebugNode);
}
@Override
public void visitSetFile(String file) {
this.fineName = file;
}
@Override
public void visitRestartLocal(int reg, DexLabel label) {
addDebug(new DexDebugOpNode.RestartLocal(label, reg));
}
@Override
public void visitParameterName(final int parameterIndex, final String name) {
if (parameterNames == null) {
parameterNames = new ArrayList<>();
}
while (parameterNames.size() <= parameterIndex) {
parameterNames.add(null);
}
parameterNames.set(parameterIndex, name);
}
@Override
public void visitLineNumber(final int line, final DexLabel label) {
addDebug(new DexDebugOpNode.LineNumber(label, line));
}
@Override
public void visitStartLocal(int reg, DexLabel label, String name, String type, String signature) {
addDebug(new DexDebugOpNode.StartLocalNode(label, reg, name, type, signature));
}
@Override
public void visitEndLocal(int reg, DexLabel label) {
addDebug(new DexDebugOpNode.EndLocal(label, reg));
}
public void accept(DexDebugVisitor v) {
if (parameterNames != null) {
for (int i = 0; i < parameterNames.size(); i++) {
String name = parameterNames.get(i);
if (name != null) {
v.visitParameterName(i, name);
}
}
}
if (debugNodes != null) {
for (DexDebugOpNode n : debugNodes) {
n.accept(v);
}
}
if (fineName != null) {
v.visitSetFile(fineName);
}
}
@Override
public void visitPrologue(DexLabel dexLabel) {
addDebug(new DexDebugOpNode.Prologue(dexLabel));
}
@Override
public void visitEpiogue(DexLabel dexLabel) {
addDebug(new DexDebugOpNode.Epiogue(dexLabel));
}
public abstract static class DexDebugOpNode {
public DexLabel label;
protected DexDebugOpNode(DexLabel label) {
this.label = label;
}
public abstract void accept(DexDebugVisitor cv);
public static class StartLocalNode extends DexDebugOpNode {
public int reg;
public String name;
public String type;
public String signature;
public StartLocalNode(DexLabel label, int reg, String name, String type, String signature) {
super(label);
this.reg = reg;
this.name = name;
this.type = type;
this.signature = signature;
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitStartLocal(reg, label, name, type, signature);
}
}
public static class EndLocal extends DexDebugOpNode {
public int reg;
public EndLocal(DexLabel label, int reg) {
super(label);
this.reg = reg;
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitEndLocal(reg, label);
}
}
public static class Epiogue extends DexDebugOpNode {
public Epiogue(DexLabel label) {
super(label);
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitEpiogue(label);
}
}
public static class Prologue extends DexDebugOpNode {
public Prologue(DexLabel label) {
super(label);
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitPrologue(label);
}
}
public static class RestartLocal extends DexDebugOpNode {
public int reg;
public RestartLocal(DexLabel label, int reg) {
super(label);
this.reg = reg;
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitRestartLocal(reg, label);
}
}
public static class LineNumber extends DexDebugOpNode {
public int line;
public LineNumber(DexLabel label, int line) {
super(label);
this.line = line;
}
@Override
public void accept(DexDebugVisitor cv) {
cv.visitLineNumber(line, label);
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy