diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java index 421562a1..8a57a7dc 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java +++ b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java @@ -492,6 +492,9 @@ public class MethodAnalyzer { case IF_GT: case IF_LE: return handleIf(analyzedInstruction); + case IF_EQZ: + case IF_NEZ: + return handleIfEqzNez(analyzedInstruction); } assert false; return false; @@ -1309,6 +1312,24 @@ public class MethodAnalyzer { return true; } + private boolean handleIfEqzNez(AnalyzedInstruction analyzedInstruction) { + SingleRegisterInstruction instruction = (SingleRegisterInstruction)analyzedInstruction.instruction; + + RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterA()); + assert registerType != null; + if (registerType.category == RegisterType.Category.Unknown) { + return false; + } + + if (!ReferenceCategories.contains(registerType.category) && + !Primitive32BitCategories.contains(registerType.category)) { + throw new ValidationException(String.format("%s cannot be used with register type %s. Expecting 32-bit " + + "primitive type or reference type.", analyzedInstruction.instruction.opcode)); + } + + return true; + } + private static void checkRegister(RegisterType registerType, EnumSet validCategories) { if (!validCategories.contains(registerType.category)) { //TODO: add expected categories to error message