diff --git a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/ModifyMethodParams.java b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/ModifyMethodParams.java index da6efe5..e60e1b5 100644 --- a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/ModifyMethodParams.java +++ b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/ModifyMethodParams.java @@ -14,7 +14,6 @@ import dev.su5ed.sinytra.adapter.patch.fixes.BytecodeFixerUpper; import dev.su5ed.sinytra.adapter.patch.fixes.TypeAdapter; import dev.su5ed.sinytra.adapter.patch.selector.AnnotationHandle; -import dev.su5ed.sinytra.adapter.patch.transformer.param.ParameterTransformer; import dev.su5ed.sinytra.adapter.patch.util.AdapterUtil; import dev.su5ed.sinytra.adapter.patch.util.LocalVariableLookup; import dev.su5ed.sinytra.adapter.patch.util.MethodQualifier; @@ -180,14 +179,14 @@ public Result apply(ClassNode classNode, MethodNode methodNode, MethodContext me this.context.substitutes.forEach(pair -> { int paramIndex = pair.getFirst(); int substituteParamIndex = pair.getSecond(); - int localIndex = calculateLVTIndex(newParameterTypes, isNonStatic, paramIndex); - LVTSnapshot lvtSnapshot = LVTSnapshot.take(methodNode); if (methodNode.parameters.size() > paramIndex) { + int localIndex = calculateLVTIndex(newParameterTypes, isNonStatic, paramIndex); + LVTSnapshot lvtSnapshot = LVTSnapshot.take(methodNode); LOGGER.info("Substituting parameter {} for {} in {}.{}", paramIndex, substituteParamIndex, classNode.name, methodNode.name); methodNode.parameters.remove(paramIndex); newParameterTypes.remove(paramIndex); + int substituteIndex = calculateLVTIndex(newParameterTypes, isNonStatic, substituteParamIndex); methodNode.localVariables.removeIf(lvn -> lvn.index == localIndex); - int substituteIndex = ParameterTransformer.calculateLocalLVTIndex(methodNode.localVariables, isNonStatic, substituteParamIndex); for (AbstractInsnNode insn : methodNode.instructions) { SingleValueHandle handle = AdapterUtil.handleLocalVarInsnValue(insn); if (handle == null) continue; diff --git a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/ParameterTransformer.java b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/ParameterTransformer.java index 58c08ed..585b993 100644 --- a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/ParameterTransformer.java +++ b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/ParameterTransformer.java @@ -16,7 +16,6 @@ import org.objectweb.asm.tree.*; import java.util.ArrayList; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -239,17 +238,6 @@ static int calculateLVTIndex(List parameters, boolean nonStatic, int index return lvt; } - static int calculateLocalLVTIndex(List locals, boolean nonStatic, int index) { - locals = new ArrayList<>(locals); - locals.sort(Comparator.comparing(l -> l.index)); - if (nonStatic) locals.remove(0); - int lvt = nonStatic ? 1 : 0; - for (int i = 0; i < index; i++) { - lvt += Type.getType(locals.get(i).desc).getSize(); - } - return lvt; - } - default Codec codec() { throw new UnsupportedOperationException("This transform is not serializable"); } diff --git a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/SubstituteParameterTransformer.java b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/SubstituteParameterTransformer.java index 7983862..9c8f0b6 100644 --- a/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/SubstituteParameterTransformer.java +++ b/definition/src/main/java/dev/su5ed/sinytra/adapter/patch/transformer/param/SubstituteParameterTransformer.java @@ -27,7 +27,7 @@ public Patch.Result apply(ClassNode classNode, MethodNode methodNode, MethodCont final int paramIndex = this.target + offset; final int substituteParamIndex = this.substitute + offset; final boolean isNonStatic = !methodContext.isStatic(methodNode); - final int localIndex = ParameterTransformer.calculateLocalLVTIndex(methodNode.localVariables, isNonStatic, paramIndex); + final int localIndex = ParameterTransformer.calculateLVTIndex(parameters, isNonStatic, paramIndex); if (methodNode.parameters.size() <= paramIndex) { return Patch.Result.PASS; @@ -35,13 +35,11 @@ public Patch.Result apply(ClassNode classNode, MethodNode methodNode, MethodCont withLVTSnapshot(methodNode, () -> { LOGGER.info("Substituting parameter {} for {} in {}.{}", paramIndex, substituteParamIndex, classNode.name, methodNode.name); - if (paramIndex < parameters.size()) { - parameters.remove(paramIndex); - methodNode.parameters.remove(paramIndex); - } - - final int substituteIndex = ParameterTransformer.calculateLocalLVTIndex(methodNode.localVariables, isNonStatic, substituteParamIndex); + parameters.remove(paramIndex); + methodNode.parameters.remove(paramIndex); methodNode.localVariables.removeIf(lvn -> lvn.index == localIndex); + + final int substituteIndex = ParameterTransformer.calculateLVTIndex(parameters, isNonStatic, substituteParamIndex); AdapterUtil.replaceLVT(methodNode, idx -> idx == localIndex ? substituteIndex : idx); });