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 250b2524..c7d22bc0 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 @@ -566,6 +566,8 @@ public class MethodAnalyzer { return handle32BitPrimitiveSget(analyzedInstruction, RegisterType.Category.Char); case SGET_SHORT: return handle32BitPrimitiveSget(analyzedInstruction, RegisterType.Category.Short); + case SGET_WIDE: + return handleSgetWide(analyzedInstruction); } assert false; @@ -2008,6 +2010,28 @@ public class MethodAnalyzer { return true; } + private boolean handleSgetWide(AnalyzedInstruction analyzedInstruction) { + //TODO: check access + Item referencedItem = ((InstructionWithReference)analyzedInstruction.instruction).getReferencedItem(); + assert referencedItem instanceof FieldIdItem; + FieldIdItem field = (FieldIdItem)referencedItem; + + RegisterType fieldType = RegisterType.getRegisterTypeForTypeIdItem(field.getFieldType()); + + + if (fieldType.category != RegisterType.Category.LongLo && + fieldType.category != RegisterType.Category.DoubleLo) { + + throw new ValidationException(String.format("Cannot use %s with field %s. Incorrect field type " + + "for the instruction.", analyzedInstruction.instruction.opcode.name, + field.getFieldString())); + } + + setWideDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, fieldType); + + return true; + } + private static boolean checkArrayFieldAssignment(RegisterType.Category arrayFieldCategory, RegisterType.Category instructionCategory) { if (arrayFieldCategory == instructionCategory) {