Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -184,7 +185,13 @@ public List<AbstractInsnNode> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand All @@ -46,6 +47,11 @@ public PipelineMethodTransformer(List<MethodPatch> 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;

Expand Down Expand Up @@ -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());
}
}