diff --git a/core/src/main/java/org/sinytra/adapter/env/ctx/MethodHelper.java b/core/src/main/java/org/sinytra/adapter/env/ctx/MethodHelper.java index bdb253a..e043415 100644 --- a/core/src/main/java/org/sinytra/adapter/env/ctx/MethodHelper.java +++ b/core/src/main/java/org/sinytra/adapter/env/ctx/MethodHelper.java @@ -22,6 +22,7 @@ import org.spongepowered.asm.mixin.injection.code.ISliceContext; import org.spongepowered.asm.mixin.injection.code.MethodSlice; import org.spongepowered.asm.mixin.injection.struct.Target; +import org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException; import org.spongepowered.asm.mixin.refmap.IMixinContext; import org.spongepowered.asm.util.Locals; @@ -184,7 +185,13 @@ public List computeInjectionTargetInsns(@Nullable TargetPair t // Provide a minimum implementation of IMixinContext IMixinContext mixinContext = MockMixinRuntime.forClass(this.context.classNode().name, target.classNode().name, patchContext.environment()); // Parse injection point - InjectionPoint injectionPoint = injectionPointParser.apply(mixinContext, atNodeCopy); + InjectionPoint injectionPoint; + try { + injectionPoint = injectionPointParser.apply(mixinContext, atNodeCopy); + } catch (InvalidInjectionException e) { + LOGGER.debug("Skipping unsupported injection point for {}", this.context.getMixinId(), e); + return List.of(); + } Target mixinTarget = MockMixinRuntime.createMixinTarget(target); // Find target instructions InsnList instructions = ignoreSlice ? target.methodNode().instructions : getSlicedInsns(this.context.methodAnnotation(), this.context.classNode(), this.context.methodNode(), target.classNode(), target.methodNode(), patchContext, mixinTarget); diff --git a/core/src/main/java/org/sinytra/adapter/env/util/MixinAnnotationConstants.java b/core/src/main/java/org/sinytra/adapter/env/util/MixinAnnotationConstants.java index e8a6588..8982c1f 100644 --- a/core/src/main/java/org/sinytra/adapter/env/util/MixinAnnotationConstants.java +++ b/core/src/main/java/org/sinytra/adapter/env/util/MixinAnnotationConstants.java @@ -11,6 +11,7 @@ public class MixinAnnotationConstants { public static final String AT_VAL_STORE = "STORE"; public static final String AT_VAL_CONST = "CONSTANT"; public static final String AT_VAL_SINYTRA_INSTANCEOF = "sinytra:INSTANCEOF"; + public static final String AT_VAL_MIXINEXTRAS_EXPRESSION = "MIXINEXTRAS:EXPRESSION"; public static final String AT_SHIFT = "shift"; public static final String PROPERTY_AT = "at"; diff --git a/core/src/main/java/org/sinytra/adapter/transform/PipelineMethodTransformer.java b/core/src/main/java/org/sinytra/adapter/transform/PipelineMethodTransformer.java index c9d3409..835a2b4 100644 --- a/core/src/main/java/org/sinytra/adapter/transform/PipelineMethodTransformer.java +++ b/core/src/main/java/org/sinytra/adapter/transform/PipelineMethodTransformer.java @@ -4,8 +4,8 @@ import org.jetbrains.annotations.Nullable; import org.objectweb.asm.Type; import org.objectweb.asm.tree.AbstractInsnNode; -import org.sinytra.adapter.env.ctx.MixinContext; import org.sinytra.adapter.env.ann.AtData; +import org.sinytra.adapter.env.ctx.MixinContext; import org.sinytra.adapter.env.ann.SliceData; import org.sinytra.adapter.env.ctx.AuditTrail; import org.sinytra.adapter.env.ctx.PatchResult; @@ -31,6 +31,7 @@ import java.util.List; import java.util.Objects; +import static org.sinytra.adapter.env.util.MixinAnnotationConstants.AT_VAL_MIXINEXTRAS_EXPRESSION; import static org.sinytra.adapter.util.AdapterUtil.MIXINPATCH; public class PipelineMethodTransformer implements MethodTransformer { @@ -46,6 +47,11 @@ public PipelineMethodTransformer(List methodPatches, boolean patche @Override public PatchResult apply(MixinContext context, Configuration config) { + if (hasMixinExtrasExpressionInjectionPoint(config)) { + LOGGER.debug(MIXINPATCH, "Skipping MixinExtras expression injection point for {}", context.getMixinId()); + return PatchResult.PASS; + } + TargetPair cleanTarget = context.methods().findOwnMethodPair(context.cleanLookup(), config.getTargetMethod()); if (cleanTarget == null) return PatchResult.PASS; @@ -185,4 +191,9 @@ private boolean validateAtNode(MixinContext context, AtData at, TargetPair targe ); return !insns.isEmpty(); } + + private static boolean hasMixinExtrasExpressionInjectionPoint(Configuration config) { + AtData atData = config.getAtData(); + return atData != null && AT_VAL_MIXINEXTRAS_EXPRESSION.equals(atData.getValue()); + } }