Skip to content

Commit

Permalink
Check param index before attempting to substitute
Browse files Browse the repository at this point in the history
  • Loading branch information
Matyrobbrt committed Jan 27, 2024
1 parent 07494c6 commit 2649ef0
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Integer> handle = AdapterUtil.handleLocalVarInsnValue(insn);
if (handle == null) continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -239,17 +238,6 @@ static int calculateLVTIndex(List<Type> parameters, boolean nonStatic, int index
return lvt;
}

static int calculateLocalLVTIndex(List<LocalVariableNode> 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<? extends ParameterTransformer> codec() {
throw new UnsupportedOperationException("This transform is not serializable");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,19 @@ 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;
}

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);
});

Expand Down

0 comments on commit 2649ef0

Please sign in to comment.