diff --git a/common/src/main/java/org/figuramc/figura/lua/FakeStatic.java b/common/src/main/java/org/figuramc/figura/lua/FakeStatic.java new file mode 100644 index 000000000..7ba8110dc --- /dev/null +++ b/common/src/main/java/org/figuramc/figura/lua/FakeStatic.java @@ -0,0 +1,11 @@ +package org.figuramc.figura.lua; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface FakeStatic { +} diff --git a/common/src/main/java/org/figuramc/figura/lua/LuaTypeManager.java b/common/src/main/java/org/figuramc/figura/lua/LuaTypeManager.java index 9483389a2..e3276a0aa 100644 --- a/common/src/main/java/org/figuramc/figura/lua/LuaTypeManager.java +++ b/common/src/main/java/org/figuramc/figura/lua/LuaTypeManager.java @@ -1,5 +1,6 @@ package org.figuramc.figura.lua; +import io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess; import net.minecraft.network.chat.Component; import org.figuramc.figura.lua.docs.FiguraDocsManager; import org.figuramc.figura.lua.docs.LuaTypeDoc; @@ -126,8 +127,21 @@ private static boolean[] getRequiredNotNil(Method method) { public VarArgFunction getWrapper(Method method) { return new VarArgFunction() { - private final boolean isStatic = Modifier.isStatic(method.getModifiers()); + private final boolean fakeStatic = method.getAnnotation(FakeStatic.class) != null; + private final boolean isStatic = fakeStatic || Modifier.isStatic(method.getModifiers()); + private static final Map, ? super Object> warcrimes = new HashMap(); private Object caller; + { + if (fakeStatic) { + caller = warcrimes.computeIfAbsent(method.getDeclaringClass(), clazz -> { + try { + return UnsafeAccess.UNSAFE.allocateInstance(clazz); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } + }); + } + } private final Class clazz = method.getDeclaringClass();