Merge branch 'upstream-loader' into 'master'

Use upstream loader during dev

See merge request jfmods/LibJF!2
This commit is contained in:
Johannes Frohnmeyer 2022-05-18 13:03:38 +00:00
commit e8a3257b3c
9 changed files with 49 additions and 64 deletions

View File

@ -1,13 +1,6 @@
apply from: "https://jfmods.gitlab.io/scripts/jfmod.gradle" apply from: "https://jfmods.gitlab.io/scripts/jfmod.gradle"
allprojects { allprojects {
sourceSets {
testmod {
compileClasspath += main.compileClasspath
runtimeClasspath += main.runtimeClasspath
}
}
loom { loom {
runs { runs {
testmodClient { testmodClient {
@ -23,18 +16,15 @@ allprojects {
source sourceSets.testmod source sourceSets.testmod
} }
} }
runConfigs.configureEach {
vmArgs "-Dfabric.debug.classPathIsolationBypassClasses=io/gitlab/jfronny/libjf"
}
} }
dependencies { dependencies {
modImplementation("com.terraformersmc:modmenu:3.1.0") modImplementation("com.terraformersmc:modmenu:3.1.0")
modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:$project.fabric_version") modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:$project.fabric_version")
modImplementation("io.gitlab.jfronny:commons:$project.commons_version") //TODO update for 1.19
modImplementation("io.gitlab.jfronny:commons-gson:$project.commons_version") implementation("io.gitlab.jfronny:commons:$project.commons_version")
modImplementation("io.gitlab.jfronny:commons-slf4j:$rootProject.commons_version") implementation("io.gitlab.jfronny:commons-gson:$project.commons_version")
implementation("io.gitlab.jfronny:commons-slf4j:$rootProject.commons_version")
} }
} }

View File

@ -1,7 +1,7 @@
# https://fabricmc.net/develop/ # https://fabricmc.net/develop/
minecraft_version=1.18.2 minecraft_version=1.18.2
yarn_mappings=build.3 yarn_mappings=build.3
loader_version=0.14.5+local loader_version=0.14.5
fabric_version=0.51.1+1.18.2 fabric_version=0.51.1+1.18.2
maven_group=io.gitlab.jfronny.libjf maven_group=io.gitlab.jfronny.libjf

View File

@ -1,16 +1,13 @@
package io.gitlab.jfronny.libjf.config.impl.entrypoint; package io.gitlab.jfronny.libjf.config.impl.entrypoint;
import io.gitlab.jfronny.libjf.LibJf; import io.gitlab.jfronny.libjf.config.api.*;
import io.gitlab.jfronny.libjf.config.api.ConfigHolder; import io.gitlab.jfronny.libjf.config.impl.*;
import io.gitlab.jfronny.libjf.config.api.JfConfig; import io.gitlab.jfronny.libjf.unsafe.*;
import io.gitlab.jfronny.libjf.config.impl.ConfigHolderImpl; import net.fabricmc.loader.api.*;
import io.gitlab.jfronny.libjf.unsafe.SafeLog; import net.fabricmc.loader.api.entrypoint.*;
import net.fabricmc.loader.api.FabricLoader; import net.minecraft.util.*;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
import net.minecraft.util.Language;
import java.util.function.Function; import java.util.function.*;
public class JfConfigSafe implements PreLaunchEntrypoint { public class JfConfigSafe implements PreLaunchEntrypoint {
public static Function<String, String> TRANSLATION_SUPPLIER = s -> null; public static Function<String, String> TRANSLATION_SUPPLIER = s -> null;

View File

@ -17,11 +17,12 @@ public class JfLanguageAdapter implements LanguageAdapter {
public native <T> T create(net.fabricmc.loader.api.ModContainer mod, String value, Class<T> type); public native <T> T create(net.fabricmc.loader.api.ModContainer mod, String value, Class<T> type);
static { static {
Logger.registerFactory(FLLogger::new); // Reset in mixin plugin Logger.registerFactory(FLLogger::new); // Reset in SafeLog entrypoint
Set<Flags.BooleanFlag> flags = Flags.getBoolFlags("unsafe.unlock"); Set<Flags.BooleanFlag> flags = Flags.getBoolFlags("unsafe.unlock");
if (flags.stream().map(Flags.BooleanFlag::value).reduce(false, (left, right) -> left || right)) { if (flags.stream().map(Flags.BooleanFlag::value).reduce(false, (left, right) -> left || right)) {
SafeLog.warn("Unlocking classpath due to: " + flags.stream().map(Flags.BooleanFlag::source).collect(Collectors.joining(", "))); SafeLog.warn("Unlocking classpath due to: " + flags.stream().map(Flags.BooleanFlag::source).collect(Collectors.joining(", ")));
FabricLoaderImpl.INSTANCE.getGameProvider().unlockClassPath(new FabricLauncherClassUnlocker(new KnotClassLoaderInterfaceAccessor(Thread.currentThread().getContextClassLoader()))); FabricLoaderImpl.INSTANCE.getGameProvider().unlockClassPath(new FabricLauncherClassUnlocker(new KnotClassLoaderInterfaceAccessor(Thread.currentThread().getContextClassLoader())));
SafeLog.warn("Completed classpath unlock");
} }
HiddenAnnotationExclusionStrategy.register(); HiddenAnnotationExclusionStrategy.register();
GsonHolder.register(); GsonHolder.register();

View File

@ -1,27 +1,18 @@
package io.gitlab.jfronny.libjf.unsafe; package io.gitlab.jfronny.libjf.unsafe;
import io.gitlab.jfronny.commons.log.Logger; import io.gitlab.jfronny.libjf.unsafe.asm.*;
import io.gitlab.jfronny.libjf.unsafe.asm.AsmConfig; import org.objectweb.asm.tree.*;
import io.gitlab.jfronny.libjf.unsafe.asm.AsmTransformer; import org.spongepowered.asm.mixin.extensibility.*;
import io.gitlab.jfronny.libjf.unsafe.asm.BakedAsmConfig; import org.spongepowered.asm.mixin.transformer.*;
import org.objectweb.asm.tree.ClassNode; import sun.misc.*;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
import sun.misc.Unsafe;
import java.lang.reflect.Field; import java.lang.reflect.*;
import java.util.HashSet; import java.util.*;
import java.util.List;
import java.util.Set;
public class MixinPlugin implements IMixinConfigPlugin { public class MixinPlugin implements IMixinConfigPlugin {
@Override @Override
public void onLoad(String mixinPackage) { public void onLoad(String mixinPackage) {
try { try {
Logger.resetFactory();
SafeLog.BACKEND = Logger.forName("libjf");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<?> classLoaderClass = classLoader.getClass(); Class<?> classLoaderClass = classLoader.getClass();
@ -46,7 +37,7 @@ public class MixinPlugin implements IMixinConfigPlugin {
}); });
AsmTransformer.INSTANCE.init(); AsmTransformer.INSTANCE.init();
mixinTransformerField.set(delegate, AsmTransformer.INSTANCE); mixinTransformerField.set(delegate, AsmTransformer.INSTANCE);
} catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) { } catch (Throwable e) {
SafeLog.error("Could not initialize LibJF ASM", e); SafeLog.error("Could not initialize LibJF ASM", e);
} }
} }

View File

@ -1,9 +1,14 @@
package io.gitlab.jfronny.libjf.unsafe; package io.gitlab.jfronny.libjf.unsafe;
import io.gitlab.jfronny.commons.log.Logger; import io.gitlab.jfronny.commons.log.Logger;
import net.fabricmc.api.*;
public class SafeLog { public class SafeLog implements ModInitializer {
public static Logger BACKEND = Logger.forName("LibJF"); private static Logger BACKEND = Logger.forName("LibJF");
public static void debug(String text) {
BACKEND.debug(text);
}
public static void info(String text) { public static void info(String text) {
BACKEND.info(text); BACKEND.info(text);
@ -20,4 +25,10 @@ public class SafeLog {
public static void error(String text, Throwable e) { public static void error(String text, Throwable e) {
BACKEND.error(text, e); BACKEND.error(text, e);
} }
@Override
public void onInitialize() {
Logger.resetFactory();
BACKEND = Logger.forName("libjf");
}
} }

View File

@ -1,23 +1,15 @@
package io.gitlab.jfronny.libjf.unsafe.inject; package io.gitlab.jfronny.libjf.unsafe.inject;
import net.fabricmc.api.EnvType; import io.gitlab.jfronny.libjf.unsafe.*;
import net.fabricmc.loader.impl.launch.FabricLauncher; import net.fabricmc.api.*;
import net.fabricmc.loader.impl.launch.MappingConfiguration; import net.fabricmc.loader.impl.launch.*;
import net.fabricmc.loader.impl.util.log.Log;
import net.fabricmc.loader.impl.util.log.LogCategory;
import java.io.IOException; import java.io.*;
import java.io.InputStream; import java.nio.file.*;
import java.nio.file.Path; import java.util.*;
import java.util.Collection; import java.util.jar.*;
import java.util.List;
import java.util.jar.Manifest;
public record FabricLauncherClassUnlocker(KnotClassLoaderInterfaceAccessor classLoader) implements FabricLauncher { public record FabricLauncherClassUnlocker(KnotClassLoaderInterfaceAccessor classLoader) implements FabricLauncher {
static {
System.err.println("[libjf-unsafe-v0] Preparing to unlock classpath via reflection. This might cause issues");
}
@Override @Override
public MappingConfiguration getMappingConfiguration() { public MappingConfiguration getMappingConfiguration() {
return invalidCall(); return invalidCall();
@ -25,7 +17,7 @@ public record FabricLauncherClassUnlocker(KnotClassLoaderInterfaceAccessor class
@Override @Override
public void addToClassPath(Path path, String... allowedPrefixes) { public void addToClassPath(Path path, String... allowedPrefixes) {
Log.debug(LogCategory.KNOT, "Adding " + path + " to classpath."); SafeLog.debug("Adding " + path + " to classpath.");
classLoader.getDelegate().setAllowedPrefixes(path, allowedPrefixes); classLoader.getDelegate().setAllowedPrefixes(path, allowedPrefixes);
classLoader.getDelegate().addCodeSource(path); classLoader.getDelegate().addCodeSource(path);
@ -97,6 +89,7 @@ public record FabricLauncherClassUnlocker(KnotClassLoaderInterfaceAccessor class
} }
private <T> T invalidCall() { private <T> T invalidCall() {
SafeLog.warn("Attempted invalid call in class path unlocker");
throw new IllegalStateException("unlockClassPath attempted to call a method not implemented here"); throw new IllegalStateException("unlockClassPath attempted to call a method not implemented here");
} }
} }

View File

@ -1,8 +1,7 @@
package io.gitlab.jfronny.libjf.unsafe.inject; package io.gitlab.jfronny.libjf.unsafe.inject;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.*;
import java.lang.reflect.Method; import java.nio.file.*;
import java.nio.file.Path;
public record KnotClassDelegateAccessor(Object delegate) { public record KnotClassDelegateAccessor(Object delegate) {
private static final Method addCodeSourceMethod; private static final Method addCodeSourceMethod;

View File

@ -21,6 +21,9 @@
"minecraft": "*", "minecraft": "*",
"libjf-base": ">=${version}" "libjf-base": ">=${version}"
}, },
"entrypoints": {
"main": ["io.gitlab.jfronny.libjf.unsafe.SafeLog"]
},
"custom": { "custom": {
"modmenu": { "modmenu": {
"parent": "libjf", "parent": "libjf",