@Nonnull public Opcode getAndCheckDeodexedOpcode(@Nonnull String fieldType, @Nonnull Opcode odexedOpcode) { FieldOpcode fieldOpcode = opcodeMap[isGet(odexedOpcode)?GET:PUT] [isStatic(odexedOpcode)?STATIC:INSTANCE] [getTypeIndex(fieldType.charAt(0))]; if (!isCompatible(odexedOpcode, fieldOpcode.type)) { throw new AnalysisException(String.format("Incorrect field type \"%s\" for %s", fieldType, odexedOpcode.name)); } return fieldOpcode.normalOpcode; }
public OdexedFieldInstructionMapper(boolean isArt) { FieldOpcode[] opcodes; if (isArt) { opcodes = artFieldOpcodes; } else { opcodes = dalvikFieldOpcodes; } for (FieldOpcode fieldOpcode: opcodes) { opcodeMap[isGet(fieldOpcode.normalOpcode)?GET:PUT] [isStatic(fieldOpcode.normalOpcode)?STATIC:INSTANCE] [getTypeIndex(fieldOpcode.type)] = fieldOpcode; if (fieldOpcode.quickOpcode != null) { opcodeValueTypeMap.put(fieldOpcode.quickOpcode, getValueType(fieldOpcode.type)); } if (fieldOpcode.volatileOpcode != null) { opcodeValueTypeMap.put(fieldOpcode.volatileOpcode, getValueType(fieldOpcode.type)); } } }
@Nonnull static Opcode getAndCheckDeodexedOpcodeForOdexedOpcode(@Nonnull String fieldType, @Nonnull Opcode odexedOpcode,MethodAnalyzer ma) { int opcodeType = odexedOpcode.setsRegister()?0:1; int opcodeSubType = getOpcodeSubtype(odexedOpcode); int typeIndex = getTypeIndex(fieldType.charAt(0)); Opcode correctOdexedOpcode, deodexedOpcode; correctOdexedOpcode = opcodeMap[opcodeType][opcodeSubType][0][typeIndex]; deodexedOpcode = opcodeMap[opcodeType][opcodeSubType][1][typeIndex]; if (correctOdexedOpcode != odexedOpcode) { throw new AnalysisException(String.format("Incorrect field type \"%s\" for %s", fieldType, odexedOpcode.name)); } return deodexedOpcode; } }
@Nonnull public Opcode getAndCheckDeodexedOpcode(@Nonnull String fieldType, @Nonnull Opcode odexedOpcode) { FieldOpcode fieldOpcode = opcodeMap[isGet(odexedOpcode)?GET:PUT] [isStatic(odexedOpcode)?STATIC:INSTANCE] [getTypeIndex(fieldType.charAt(0))]; if (!isCompatible(odexedOpcode, fieldOpcode.type)) { throw new AnalysisException(String.format("Incorrect field type \"%s\" for %s", fieldType, odexedOpcode.name)); } return fieldOpcode.normalOpcode; }
public OdexedFieldInstructionMapper(boolean isArt) { FieldOpcode[] opcodes; if (isArt) { opcodes = artFieldOpcodes; } else { opcodes = dalvikFieldOpcodes; } for (FieldOpcode fieldOpcode: opcodes) { opcodeMap[isGet(fieldOpcode.normalOpcode)?GET:PUT] [isStatic(fieldOpcode.normalOpcode)?STATIC:INSTANCE] [getTypeIndex(fieldOpcode.type)] = fieldOpcode; if (fieldOpcode.quickOpcode != null) { opcodeValueTypeMap.put(fieldOpcode.quickOpcode, getValueType(fieldOpcode.type)); } if (fieldOpcode.volatileOpcode != null) { opcodeValueTypeMap.put(fieldOpcode.volatileOpcode, getValueType(fieldOpcode.type)); } } }