mirror of
https://github.com/revanced/smali.git
synced 2025-05-02 23:54:38 +02:00
Fix IndexOutOfBounds exception when there's a wide parameter
This commit is contained in:
parent
64fb5097e0
commit
8d74f47b45
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user