From d7b7da6f2ff80655cd3d38ac14cb47e05c198a8c Mon Sep 17 00:00:00 2001 From: Player Date: Sun, 22 Jun 2025 17:59:04 -0400 Subject: [PATCH 1/3] Move builtin transform selection to game provider Co-authored-by: Raik176 Co-authored-by: Space Walker --- .../game/minecraft/MinecraftGameProvider.java | 24 +++++++++++++++++++ .../loader/impl/game/GameProvider.java | 8 +++++++ .../impl/transformer/FabricTransformer.java | 11 +++++---- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java index cd481afb7..c6990f16a 100644 --- a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java +++ b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -159,6 +160,29 @@ public boolean requiresUrlClassLoader() { return hasModLoader; } + @Override + public Set getBuiltinTransforms(String className) { + boolean isMinecraftClass = className.startsWith("net.minecraft.") // unobf classes in indev and later + || className.startsWith("com.mojang.minecraft") // unobf classes in classic + || className.startsWith("com.mojang.rubydung") // unobf classes in pre-classic + || className.startsWith("com.mojang.blaze3d.") // unobf blaze3d classes + || className.indexOf('.') < 0; // obf classes + + if (isMinecraftClass) { + if (FabricLoaderImpl.INSTANCE.isDevelopmentEnvironment()) { // combined client+server jar, strip back down to production equivalent + return TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS; + } else { // environment specific jar, inherently env stripped + return TRANSFORM_WIDENALL_CLASSTWEAKS; + } + } else { // mod class TODO: exclude game libs + return TRANSFORM_STRIPENV; + } + } + + private static final Set TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_ACCESS, BuiltinTransform.STRIP_ENVIRONMENT, BuiltinTransform.CLASS_TWEAKS); + private static final Set TRANSFORM_WIDENALL_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_ACCESS, BuiltinTransform.CLASS_TWEAKS); + private static final Set TRANSFORM_STRIPENV = EnumSet.of(BuiltinTransform.STRIP_ENVIRONMENT); + @Override public boolean isEnabled() { return System.getProperty(SystemProperties.SKIP_MC_PROVIDER) == null; diff --git a/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java b/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java index 1495ad004..51d9102db 100644 --- a/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java +++ b/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Set; import net.fabricmc.loader.api.metadata.ModMetadata; import net.fabricmc.loader.impl.game.patch.GameTransformer; @@ -38,6 +39,13 @@ public interface GameProvider { // name directly referenced in net.fabricmc.load Path getLaunchDirectory(); boolean isObfuscated(); boolean requiresUrlClassLoader(); + Set getBuiltinTransforms(String className); + + enum BuiltinTransform { + STRIP_ENVIRONMENT, + WIDEN_ALL_ACCESS, + CLASS_TWEAKS, + } boolean isEnabled(); boolean locateGame(FabricLauncher launcher, String[] args); diff --git a/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java b/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java index bf39c052c..7102b8ea0 100644 --- a/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java +++ b/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java @@ -16,6 +16,8 @@ package net.fabricmc.loader.impl.transformer; +import java.util.Set; + import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; @@ -23,14 +25,15 @@ import net.fabricmc.accesswidener.AccessWidenerClassVisitor; import net.fabricmc.api.EnvType; import net.fabricmc.loader.impl.FabricLoaderImpl; +import net.fabricmc.loader.impl.game.GameProvider.BuiltinTransform; import net.fabricmc.loader.impl.launch.FabricLauncherBase; public final class FabricTransformer { public static byte[] transform(boolean isDevelopment, EnvType envType, String name, byte[] bytes) { - boolean isMinecraftClass = name.startsWith("net.minecraft.") || name.startsWith("com.mojang.blaze3d.") || name.indexOf('.') < 0; - boolean transformAccess = isMinecraftClass && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack(); - boolean environmentStrip = !isMinecraftClass || isDevelopment; - boolean applyAccessWidener = isMinecraftClass && FabricLoaderImpl.INSTANCE.getAccessWidener().getTargets().contains(name); + Set transforms = FabricLoaderImpl.INSTANCE.getGameProvider().getBuiltinTransforms(name); + boolean transformAccess = transforms.contains(BuiltinTransform.WIDEN_ALL_ACCESS) && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack(); + boolean environmentStrip = transforms.contains(BuiltinTransform.STRIP_ENVIRONMENT); + boolean applyAccessWidener = transforms.contains(BuiltinTransform.CLASS_TWEAKS) && FabricLoaderImpl.INSTANCE.getAccessWidener().getTargets().contains(name); if (!transformAccess && !environmentStrip && !applyAccessWidener) { return bytes; From e8014712d1583a05fb5ad3f5d9da6f233d9e6c60 Mon Sep 17 00:00:00 2001 From: Player Date: Sun, 22 Jun 2025 18:15:10 -0400 Subject: [PATCH 2/3] Add trailing separator to classic and pre-classic package tests --- .../loader/impl/game/minecraft/MinecraftGameProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java index c6990f16a..e9f2f5032 100644 --- a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java +++ b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java @@ -163,8 +163,8 @@ public boolean requiresUrlClassLoader() { @Override public Set getBuiltinTransforms(String className) { boolean isMinecraftClass = className.startsWith("net.minecraft.") // unobf classes in indev and later - || className.startsWith("com.mojang.minecraft") // unobf classes in classic - || className.startsWith("com.mojang.rubydung") // unobf classes in pre-classic + || className.startsWith("com.mojang.minecraft.") // unobf classes in classic + || className.startsWith("com.mojang.rubydung.") // unobf classes in pre-classic || className.startsWith("com.mojang.blaze3d.") // unobf blaze3d classes || className.indexOf('.') < 0; // obf classes From 27166dbe27495d6ef7f6e3162ac65df3b6bfcc70 Mon Sep 17 00:00:00 2001 From: Player Date: Sun, 22 Jun 2025 18:33:25 -0400 Subject: [PATCH 3/3] Add documentation, rename to WIDEN_ALL_PACKAGE_ACCESS --- .../game/minecraft/MinecraftGameProvider.java | 4 ++-- .../fabricmc/loader/impl/game/GameProvider.java | 15 ++++++++++++++- .../impl/transformer/FabricTransformer.java | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java index e9f2f5032..553cf7525 100644 --- a/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java +++ b/minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java @@ -179,8 +179,8 @@ public Set getBuiltinTransforms(String className) { } } - private static final Set TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_ACCESS, BuiltinTransform.STRIP_ENVIRONMENT, BuiltinTransform.CLASS_TWEAKS); - private static final Set TRANSFORM_WIDENALL_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_ACCESS, BuiltinTransform.CLASS_TWEAKS); + private static final Set TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS, BuiltinTransform.STRIP_ENVIRONMENT, BuiltinTransform.CLASS_TWEAKS); + private static final Set TRANSFORM_WIDENALL_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS, BuiltinTransform.CLASS_TWEAKS); private static final Set TRANSFORM_STRIPENV = EnumSet.of(BuiltinTransform.STRIP_ENVIRONMENT); @Override diff --git a/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java b/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java index 51d9102db..9facbf580 100644 --- a/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java +++ b/src/main/java/net/fabricmc/loader/impl/game/GameProvider.java @@ -22,11 +22,13 @@ import java.util.Objects; import java.util.Set; +import net.fabricmc.api.Environment; import net.fabricmc.loader.api.metadata.ModMetadata; import net.fabricmc.loader.impl.game.patch.GameTransformer; import net.fabricmc.loader.impl.launch.FabricLauncher; import net.fabricmc.loader.impl.util.Arguments; import net.fabricmc.loader.impl.util.LoaderUtil; +import net.fabricmc.loader.impl.util.SystemProperties; public interface GameProvider { // name directly referenced in net.fabricmc.loader.impl.launch.knot.Knot.findEmbedddedGameProvider() and service loader records String getGameId(); @@ -42,8 +44,19 @@ public interface GameProvider { // name directly referenced in net.fabricmc.load Set getBuiltinTransforms(String className); enum BuiltinTransform { + /** + * Removes classes, fields and methods annotated with a different {@literal @}{@link Environment} from the current runtime. + */ STRIP_ENVIRONMENT, - WIDEN_ALL_ACCESS, + /** + * Widens all package-internal access modifiers to public (protected and package-private, but not private). + * + *

This only has an effect if the mappings or {@link SystemProperties#FIX_PACKAGE_ACCESS} require these access modifications. + */ + WIDEN_ALL_PACKAGE_ACCESS, + /** + * Applies class tweakers, including access wideners, as supplied by mods. + */ CLASS_TWEAKS, } diff --git a/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java b/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java index 7102b8ea0..9085f4eab 100644 --- a/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java +++ b/src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java @@ -31,7 +31,7 @@ public final class FabricTransformer { public static byte[] transform(boolean isDevelopment, EnvType envType, String name, byte[] bytes) { Set transforms = FabricLoaderImpl.INSTANCE.getGameProvider().getBuiltinTransforms(name); - boolean transformAccess = transforms.contains(BuiltinTransform.WIDEN_ALL_ACCESS) && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack(); + boolean transformAccess = transforms.contains(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS) && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack(); boolean environmentStrip = transforms.contains(BuiltinTransform.STRIP_ENVIRONMENT); boolean applyAccessWidener = transforms.contains(BuiltinTransform.CLASS_TWEAKS) && FabricLoaderImpl.INSTANCE.getAccessWidener().getTargets().contains(name);