Search in sources :

Example 1 with RegisterType

use of org.jf.dexlib2.analysis.RegisterType in project smali by JesusFreke.

the class PreInstructionRegisterInfoMethodItem method writeFullMerge.

private void writeFullMerge(IndentingWriter writer, int registerNum) throws IOException {
    registerFormatter.writeTo(writer, registerNum);
    writer.write('=');
    analyzedInstruction.getPreInstructionRegisterType(registerNum).writeTo(writer);
    writer.write(":merge{");
    boolean first = true;
    for (AnalyzedInstruction predecessor : analyzedInstruction.getPredecessors()) {
        RegisterType predecessorRegisterType = analyzedInstruction.getPredecessorRegisterType(predecessor, registerNum);
        if (!first) {
            writer.write(',');
        }
        if (predecessor.getInstructionIndex() == -1) {
            //the fake "StartOfMethod" instruction
            writer.write("Start:");
        } else {
            writer.write("0x");
            writer.printUnsignedLongAsHex(methodAnalyzer.getInstructionAddress(predecessor));
            writer.write(':');
        }
        predecessorRegisterType.writeTo(writer);
        first = false;
    }
    writer.write('}');
}
Also used : RegisterType(org.jf.dexlib2.analysis.RegisterType) AnalyzedInstruction(org.jf.dexlib2.analysis.AnalyzedInstruction)

Example 2 with RegisterType

use of org.jf.dexlib2.analysis.RegisterType in project atlas by alibaba.

the class PostInstructionRegisterInfoMethodItem method writeRegisterInfo.

private boolean writeRegisterInfo(IndentingWriter writer, BitSet registers) throws IOException {
    int registerNum = registers.nextSetBit(0);
    if (registerNum < 0) {
        return false;
    }
    writer.write('#');
    for (; registerNum >= 0; registerNum = registers.nextSetBit(registerNum + 1)) {
        RegisterType registerType = analyzedInstruction.getPostInstructionRegisterType(registerNum);
        registerFormatter.writeTo(writer, registerNum);
        writer.write('=');
        registerType.writeTo(writer);
        writer.write(';');
    }
    return true;
}
Also used : RegisterType(org.jf.dexlib2.analysis.RegisterType)

Example 3 with RegisterType

use of org.jf.dexlib2.analysis.RegisterType in project atlas by alibaba.

the class PreInstructionRegisterInfoMethodItem method writeRegisterInfo.

private boolean writeRegisterInfo(IndentingWriter writer, BitSet registers, BitSet fullMergeRegisters) throws IOException {
    boolean firstRegister = true;
    boolean previousWasFullMerge = false;
    int registerNum = registers.nextSetBit(0);
    if (registerNum < 0) {
        return false;
    }
    writer.write('#');
    for (; registerNum >= 0; registerNum = registers.nextSetBit(registerNum + 1)) {
        boolean fullMerge = fullMergeRegisters != null && fullMergeRegisters.get(registerNum);
        if (fullMerge) {
            if (!firstRegister) {
                writer.write('\n');
                writer.write('#');
            }
            writeFullMerge(writer, registerNum);
            previousWasFullMerge = true;
        } else {
            if (previousWasFullMerge) {
                writer.write('\n');
                writer.write('#');
                previousWasFullMerge = false;
            }
            RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(registerNum);
            registerFormatter.writeTo(writer, registerNum);
            writer.write('=');
            registerType.writeTo(writer);
            writer.write(';');
        }
        firstRegister = false;
    }
    return true;
}
Also used : RegisterType(org.jf.dexlib2.analysis.RegisterType)

Example 4 with RegisterType

use of org.jf.dexlib2.analysis.RegisterType in project smali by JesusFreke.

the class PreInstructionRegisterInfoMethodItem method writeFullMerge.

private void writeFullMerge(BaksmaliWriter writer, int registerNum) throws IOException {
    registerFormatter.writeTo(writer, registerNum);
    writer.write('=');
    analyzedInstruction.getPreInstructionRegisterType(registerNum).writeTo(writer);
    writer.write(":merge{");
    boolean first = true;
    for (AnalyzedInstruction predecessor : analyzedInstruction.getPredecessors()) {
        RegisterType predecessorRegisterType = analyzedInstruction.getPredecessorRegisterType(predecessor, registerNum);
        if (!first) {
            writer.write(',');
        }
        if (predecessor.getInstructionIndex() == -1) {
            // the fake "StartOfMethod" instruction
            writer.write("Start:");
        } else {
            writer.write("0x");
            writer.writeUnsignedLongAsHex(methodAnalyzer.getInstructionAddress(predecessor));
            writer.write(':');
        }
        predecessorRegisterType.writeTo(writer);
        first = false;
    }
    writer.write('}');
}
Also used : RegisterType(org.jf.dexlib2.analysis.RegisterType) AnalyzedInstruction(org.jf.dexlib2.analysis.AnalyzedInstruction)

Example 5 with RegisterType

use of org.jf.dexlib2.analysis.RegisterType in project smali by JesusFreke.

the class PreInstructionRegisterInfoMethodItem method writeRegisterInfo.

private boolean writeRegisterInfo(BaksmaliWriter writer, BitSet registers, BitSet fullMergeRegisters) throws IOException {
    boolean firstRegister = true;
    boolean previousWasFullMerge = false;
    int registerNum = registers.nextSetBit(0);
    if (registerNum < 0) {
        return false;
    }
    writer.write('#');
    for (; registerNum >= 0; registerNum = registers.nextSetBit(registerNum + 1)) {
        boolean fullMerge = fullMergeRegisters != null && fullMergeRegisters.get(registerNum);
        if (fullMerge) {
            if (!firstRegister) {
                writer.write('\n');
                writer.write('#');
            }
            writeFullMerge(writer, registerNum);
            previousWasFullMerge = true;
        } else {
            if (previousWasFullMerge) {
                writer.write('\n');
                writer.write('#');
                previousWasFullMerge = false;
            }
            RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(registerNum);
            registerFormatter.writeTo(writer, registerNum);
            writer.write('=');
            registerType.writeTo(writer);
            writer.write(';');
        }
        firstRegister = false;
    }
    return true;
}
Also used : RegisterType(org.jf.dexlib2.analysis.RegisterType)

Aggregations

RegisterType (org.jf.dexlib2.analysis.RegisterType)10 TypeReference (org.jf.dexlib2.iface.reference.TypeReference)7 Opcode (org.jf.dexlib2.Opcode)4 AnalyzedInstruction (org.jf.dexlib2.analysis.AnalyzedInstruction)4 FieldReference (org.jf.dexlib2.iface.reference.FieldReference)4 ImmutableFieldReference (org.jf.dexlib2.immutable.reference.ImmutableFieldReference)4 BaseMethodReference (org.jf.dexlib2.base.reference.BaseMethodReference)3 MethodReference (org.jf.dexlib2.iface.reference.MethodReference)3 ImmutableMethodReference (org.jf.dexlib2.immutable.reference.ImmutableMethodReference)3 Instruction22c (org.jf.dexlib2.iface.instruction.formats.Instruction22c)2 Reference (org.jf.dexlib2.iface.reference.Reference)2 ExceptionWithContext (org.jf.util.ExceptionWithContext)2 JavaCodeFragment (com.intellij.psi.JavaCodeFragment)1 JavaRecursiveElementVisitor (com.intellij.psi.JavaRecursiveElementVisitor)1 PsiElement (com.intellij.psi.PsiElement)1 PsiLocalVariable (com.intellij.psi.PsiLocalVariable)1 LazyValue (org.jf.smalidea.debugging.value.LazyValue)1 SmaliInstruction (org.jf.smalidea.psi.impl.SmaliInstruction)1 SmaliMethod (org.jf.smalidea.psi.impl.SmaliMethod)1