Fix IndexOutOfBounds exception when there's a wide parameter

This commit is contained in:
Ben Gruver 2013-04-07 20:23:12 -07:00
parent 64fb5097e0
commit 8d74f47b45

View File

@ -154,16 +154,10 @@ public class MethodAnalyzer {
RegisterType.getRegisterType(RegisterType.REFERENCE, RegisterType.getRegisterType(RegisterType.REFERENCE,
classPath.getClass(method.getDefiningClass()))); classPath.getClass(method.getDefiningClass())));
} }
}
List<? extends MethodParameter> parameters = method.getParameters(); propagateParameterTypes(totalRegisters-parameterRegisters+1);
if (parameters != null) { } else {
RegisterType[] parameterTypes = getParameterTypes(parameters); propagateParameterTypes(totalRegisters-parameterRegisters);
for (int i=0; i<parameterTypes.length; i++) {
RegisterType registerType = parameterTypes[i];
int registerNum = (totalRegisters - parameterRegisters) + i;
setPostRegisterTypeAndPropagateChanges(startOfMethod, registerNum, registerType);
}
} }
RegisterType uninit = RegisterType.getRegisterType(RegisterType.UNINIT, null); RegisterType uninit = RegisterType.getRegisterType(RegisterType.UNINIT, null);
@ -282,20 +276,20 @@ public class MethodAnalyzer {
} }
} }
private RegisterType[] getParameterTypes(@Nonnull List<? extends MethodParameter> parameters) { private void propagateParameterTypes(int parameterStartRegister) {
RegisterType[] registerTypes = new RegisterType[parameters.size()]; int i=0;
for (MethodParameter parameter: method.getParameters()) {
int registerNum = 0;
for (MethodParameter parameter: parameters) {
if (TypeUtils.isWideType(parameter)) { if (TypeUtils.isWideType(parameter)) {
registerTypes[registerNum++] = RegisterType.getWideRegisterType(parameter, true); setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
registerTypes[registerNum++] = RegisterType.getWideRegisterType(parameter, false); RegisterType.getWideRegisterType(parameter, true));
setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
RegisterType.getWideRegisterType(parameter, false));
} else { } else {
registerTypes[registerNum++] = RegisterType.getRegisterType(classPath, parameter); setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
RegisterType.getRegisterType(classPath, parameter));
} }
} }
return registerTypes;
} }
public int getInstructionAddress(@Nonnull AnalyzedInstruction instruction) { public int getInstructionAddress(@Nonnull AnalyzedInstruction instruction) {