From 7d7d4dc46c2063f60e36f6297eda47e0ec1b0cd6 Mon Sep 17 00:00:00 2001 From: Mumfrey Date: Sat, 6 Jul 2024 13:54:43 +0100 Subject: [PATCH] Properly handle empty args window and report name of the original method --- .../mixin/injection/invoke/ModifyArgInjector.java | 7 ++++++- .../mixin/injection/invoke/ModifyArgsInjector.java | 2 +- .../asm/mixin/injection/struct/ArgOffsets.java | 14 +++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgInjector.java b/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgInjector.java index a6064f7a..9f50fa4a 100644 --- a/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgInjector.java +++ b/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgInjector.java @@ -115,6 +115,11 @@ protected void injectAtInvoke(Target target, InjectionNode node) { boolean nested = node.hasDecoration(ArgOffsets.KEY); Type[] originalArgs = offsets.apply(args); + if (originalArgs.length == 0) { + throw new InvalidInjectionException(this.info, "@ModifyArg injector " + this + " targets a method invocation " + + ((MethodInsnNode)node.getOriginalTarget()).name + "()" + Type.getReturnType(methodNode.desc) + " with no arguments!"); + } + int argIndex = offsets.getArgIndex(this.findArgIndex(target, originalArgs)); int baseIndex = offsets.getStartIndex(); @@ -125,7 +130,7 @@ protected void injectAtInvoke(Target target, InjectionNode node) { this.injectSingleArgHandler(target, extraLocals, args, argIndex, insns, nested); } else { if (!Arrays.equals(originalArgs, this.methodArgs)) { - throw new InvalidInjectionException(this.info, "@ModifyArg method " + this + " targets a method with an invalid signature " + throw new InvalidInjectionException(this.info, "@ModifyArg injector " + this + " targets a method with an invalid signature " + Bytecode.getDescriptor(originalArgs) + ", expected " + Bytecode.getDescriptor(this.methodArgs)); } diff --git a/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgsInjector.java b/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgsInjector.java index e5712dc0..53157f1e 100644 --- a/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgsInjector.java +++ b/src/main/java/org/spongepowered/asm/mixin/injection/invoke/ModifyArgsInjector.java @@ -88,7 +88,7 @@ protected void injectAtInvoke(Target target, InjectionNode node) { if (originalArgs.length == 0) { throw new InvalidInjectionException(this.info, "@ModifyArgs injector " + this + " targets a method invocation " - + methodNode.name + targetMethodDesc + " with no arguments!"); + + ((MethodInsnNode)node.getOriginalTarget()).name + targetMethodDesc + " with no arguments!"); } String clArgs = this.argsClassGenerator.getArgsClass(targetMethodDesc, this.info.getMixin().getMixin()).getName(); diff --git a/src/main/java/org/spongepowered/asm/mixin/injection/struct/ArgOffsets.java b/src/main/java/org/spongepowered/asm/mixin/injection/struct/ArgOffsets.java index 4fcbcb49..2483cb02 100644 --- a/src/main/java/org/spongepowered/asm/mixin/injection/struct/ArgOffsets.java +++ b/src/main/java/org/spongepowered/asm/mixin/injection/struct/ArgOffsets.java @@ -95,9 +95,6 @@ public Type[] apply(Type[] args) { * @param length length */ public ArgOffsets(int offset, int length) { - if (length < 1) { - throw new IllegalArgumentException("Invalid length " + length + " for ArgOffsets window"); - } this.offset = offset; this.length = length; } @@ -121,12 +118,19 @@ public void replace(ArgOffsets old) { } /** - * Get the size of this mapping collection + * Get the size of the offset window */ public int getLength() { return this.length; } + /** + * Get whether this argument offset window is empty + */ + public boolean isEmpty() { + return this.length == 0; + } + /** * Compute the argument index for the start of the window (offet 0) * @@ -142,7 +146,7 @@ public int getStartIndex() { * @return the offset index for the end of the window (inclusive) */ public int getEndIndex() { - return this.getArgIndex(this.length - 1); + return this.isEmpty() ? this.getStartIndex() : this.getArgIndex(this.length - 1); } /**