Search in sources :

Example 1 with SmaliLabel

use of org.jf.smalidea.psi.impl.SmaliLabel in project smali by JesusFreke.

the class SmalideaExceptionHandler method getHandlerCodeAddress.

@Override
public int getHandlerCodeAddress() {
    SmaliLabelReference handlerLabel = catchStatement.getHandlerLabel();
    // TODO: how to handle a reference to a non-existent label..
    SmaliLabel smaliLabel = handlerLabel.resolve();
    return smaliLabel.getOffset() / 2;
}
Also used : SmaliLabelReference(org.jf.smalidea.psi.impl.SmaliLabelReference) SmaliLabel(org.jf.smalidea.psi.impl.SmaliLabel)

Example 2 with SmaliLabel

use of org.jf.smalidea.psi.impl.SmaliLabel in project smali by JesusFreke.

the class InstructionUtils method findFirstInstructionWithTarget.

@Nullable
public static SmaliInstruction findFirstInstructionWithTarget(@NotNull SmaliMethod method, @NotNull Opcode opcode, int targetOffset) {
    for (SmaliInstruction instruction : method.getInstructions()) {
        if (instruction.getOpcode() == opcode) {
            SmaliLabelReference labelReference = instruction.getTarget();
            if (labelReference == null) {
                continue;
            }
            SmaliLabel label = labelReference.resolve();
            if (label == null) {
                continue;
            }
            if (label.getOffset() == targetOffset) {
                return instruction;
            }
        }
    }
    return null;
}
Also used : SmaliLabelReference(org.jf.smalidea.psi.impl.SmaliLabelReference) SmaliInstruction(org.jf.smalidea.psi.impl.SmaliInstruction) SmaliLabel(org.jf.smalidea.psi.impl.SmaliLabel) Nullable(org.jetbrains.annotations.Nullable)

Example 3 with SmaliLabel

use of org.jf.smalidea.psi.impl.SmaliLabel in project smali by JesusFreke.

the class SmaliLabelReferenceTest method testLabelReference.

public void testLabelReference() throws Exception {
    String text = ".class public Lmy/pkg/blah; .super Ljava/lang/Object;\n" + ".method public getRandomParentType(I)I\n" + "    .registers 4\n" + "    .param p1, \"edge\"    # I\n" + "\n" + "    .prologue\n" + "    const/4 v1, 0x2\n" + "\n" + "    .line 179\n" + "    if-nez p1, :cond_5\n" + "\n" + "    move v0, v1\n" + "\n" + "    .line 185\n" + "    :goto_4\n" + "    return v0\n" + "\n" + "    .line 182\n" + "    :cond_5\n" + "    if-ne p1, v1, :cond_f\n" + "\n" + "    .line 183\n" + "    sget-object v0, Lorg/jf/Penroser/PenroserApp;->random:Ljava/util/Random;\n" + "\n" + "    const/4 v1, 0x3\n" + "\n" + "    invoke-virtual {v0, v1}, Ljava/util/Random;->nextInt(I)I\n" + "\n" + "    move-result v0\n" + "\n" + "    goto :goto_4\n" + "\n" + "    .line 185\n" + "    :cond_f\n" + "    sget-object v0, Lorg/jf/Penroser/PenroserApp;->random:Ljava/util/Random;\n" + "\n" + "    invoke-virtual {v0, v1}, Ljava/util/Random;->nextInt(I)I\n" + "\n" + "    move-result v0\n" + "\n" + "    goto :go<ref>to_4\n" + ".end method";
    ;
    SmaliLabelReference labelReference = (SmaliLabelReference) configureByFileText(text, "blah.smali");
    Assert.assertNotNull(labelReference);
    Assert.assertEquals("goto_4", labelReference.getName());
    SmaliLabel resolvedLabel = labelReference.resolve();
    Assert.assertNotNull(resolvedLabel);
    Assert.assertEquals("goto_4", resolvedLabel.getName());
    SmaliInstruction nextInstruction = resolvedLabel.findNextSiblingByClass(SmaliInstruction.class);
    Assert.assertNotNull(nextInstruction);
    Assert.assertEquals(8, nextInstruction.getOffset());
    Assert.assertEquals(Opcode.RETURN, nextInstruction.getOpcode());
}
Also used : SmaliLabelReference(org.jf.smalidea.psi.impl.SmaliLabelReference) SmaliInstruction(org.jf.smalidea.psi.impl.SmaliInstruction) SmaliLabel(org.jf.smalidea.psi.impl.SmaliLabel)

Aggregations

SmaliLabel (org.jf.smalidea.psi.impl.SmaliLabel)3 SmaliLabelReference (org.jf.smalidea.psi.impl.SmaliLabelReference)3 SmaliInstruction (org.jf.smalidea.psi.impl.SmaliInstruction)2 Nullable (org.jetbrains.annotations.Nullable)1