Skip to content

Commit

Permalink
Change substitution calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
Matyrobbrt committed Jan 27, 2024
1 parent 851c60d commit 07494c6
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
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 @@ -185,8 +186,8 @@ public Result apply(ClassNode classNode, MethodNode methodNode, MethodContext me
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,6 +16,7 @@
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 @@ -238,6 +239,17 @@ 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,19 +27,21 @@ 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.calculateLVTIndex(parameters, isNonStatic, paramIndex);
final int localIndex = ParameterTransformer.calculateLocalLVTIndex(methodNode.localVariables, 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);
parameters.remove(paramIndex);
methodNode.parameters.remove(paramIndex);
methodNode.localVariables.removeIf(lvn -> lvn.index == localIndex);
if (paramIndex < parameters.size()) {
parameters.remove(paramIndex);
methodNode.parameters.remove(paramIndex);
}

final int substituteIndex = ParameterTransformer.calculateLVTIndex(parameters, isNonStatic, substituteParamIndex);
final int substituteIndex = ParameterTransformer.calculateLocalLVTIndex(methodNode.localVariables, isNonStatic, substituteParamIndex);
methodNode.localVariables.removeIf(lvn -> lvn.index == localIndex);
AdapterUtil.replaceLVT(methodNode, idx -> idx == localIndex ? substituteIndex : idx);
});

Expand Down

0 comments on commit 07494c6

Please sign in to comment.