Mixin
Mixin copied to clipboard
Fix apply failure when mixin method calls `clone` on an array
Any Mixin method calling clone on an array will trigger the bug.
Stacktrace:
Caused by: java.lang.NullPointerException: Cannot invoke "org.spongepowered.asm.mixin.transformer.ClassInfo.isMixin()" because the return value of "org.spongepowered.asm.mixin.transformer.ClassInfo.forName(String)" is null
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethodRef(MixinTargetContext.java:592)
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethod(MixinTargetContext.java:484)
... 22 more
Workaround:
public final class MixinWorkarounds {
public static long[] clone(final long[] values) {
return values.clone();
}
}
This should be already fixed by my existing changes. Have you tested on the latest release?
The original stacktrace was with these versions (default from latest floader).
Issue still seems present when upgrading to 0.14.0+0.8.6 (running through loom):
[12:31:39] [main/WARN] (FabricLoader/Mixin) Error loading class: [J (java.lang.ClassNotFoundException: [J)
[12:31:39] [main/ERROR] (FabricLoader/Mixin) Mixin apply for mod moonrise failed moonrise.mixins.json:collisions.BitSetDiscreteVoxelShapeMixin from mod moonrise -> net.minecraft.world.phys.shapes.BitSetDiscreteVoxelShape: org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException Unexpecteded NullPointerException whilst transforming the mixin class: [MAIN Applicator Phase -> moonrise.mixins.json:collisions.BitSetDiscreteVoxelShapeMixin from mod moonrise -> Apply Methods -> (Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape;Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape$IntLineConsumer;Z)V:forAllBoxes -> Transform Instructions -> INVOKEVIRTUAL [J::clone()Ljava/lang/Object;]
org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException: Unexpecteded NullPointerException whilst transforming the mixin class: [MAIN Applicator Phase -> moonrise.mixins.json:collisions.BitSetDiscreteVoxelShapeMixin from mod moonrise -> Apply Methods -> (Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape;Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape$IntLineConsumer;Z)V:forAllBoxes -> Transform Instructions -> INVOKEVIRTUAL [J::clone()Ljava/lang/Object;]
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethod(MixinTargetContext.java:520) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyNormalMethod(MixinApplicatorStandard.java:428) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMethods(MixinApplicatorStandard.java:414) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:281) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:220) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:363) [sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:234) [sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202) [sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:422) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:323) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:218) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119) [fabric-loader-0.15.11.jar:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) [?:?]
at net.minecraft.world.level.block.Block.box(Block.java:154) [minecraft-merged-f32918113c-1.21-loom.mappings.1_21.layered+hash.2198-v2.jar:?]
at net.minecraft.world.level.block.BaseFireBlock.<clinit>(BaseFireBlock.java:28) [minecraft-merged-f32918113c-1.21-loom.mappings.1_21.layered+hash.2198-v2.jar:?]
at net.minecraft.server.Bootstrap.bootStrap(Bootstrap.java:52) [minecraft-merged-f32918113c-1.21-loom.mappings.1_21.layered+hash.2198-v2.jar:?]
at net.minecraft.client.main.Main.main(Main.java:130) [minecraft-merged-f32918113c-1.21-loom.mappings.1_21.layered+hash.2198-v2.jar:?]
at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:470) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.15.11.jar:?]
at net.fabricmc.devlaunchinjector.Main.main(Main.java:86) [dev-launch-injector-0.2.1+build.8.jar:?]
Caused by: java.lang.NullPointerException: Cannot invoke "org.spongepowered.asm.mixin.transformer.ClassInfo.isMixin()" because the return value of "org.spongepowered.asm.mixin.transformer.ClassInfo.forName(String)" is null
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethodRef(MixinTargetContext.java:603) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethod(MixinTargetContext.java:494) ~[sponge-mixin-0.14.0+mixin.0.8.6.jar:0.14.0+mixin.0.8.6]
... 22 more
Ah different issue I see.
The change is not unreasonable but I would like first to investigate other places where classes are assumed to have ClassInfos, in case there is a more general solution.