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;
}
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;
}
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());
}
Aggregations