|
| 1 | +package net.hollowcube.luau; |
| 2 | + |
| 3 | +import net.hollowcube.luau.compiler.LuauCompiler; |
| 4 | +import net.hollowcube.luau.internal.compiler.lua_CompileOptions; |
| 5 | +import net.hollowcube.luau.internal.compiler.luacode_h; |
| 6 | +import net.hollowcube.luau.internal.vm.*; |
| 7 | + |
| 8 | +import java.lang.foreign.Arena; |
| 9 | +import java.util.*; |
| 10 | + |
| 11 | +public class ForceLoadAll { |
| 12 | + static void main() { |
| 13 | + var _ = LuauCompiler.DEFAULT; |
| 14 | + var _ = LuaState.LIGHTUSERDATA_TAG_LIMIT; |
| 15 | + |
| 16 | + var classes = Set.of( |
| 17 | + lua_CompileOptions.class, |
| 18 | + luacode_h.class, |
| 19 | + lua_Alloc.class, |
| 20 | + lua_Callbacks.class, |
| 21 | + lua_CFunction.class, |
| 22 | + lua_h.class, |
| 23 | + lua_newuserdatadtor$dtor.class, |
| 24 | + luaL_Reg.class, |
| 25 | + lualib_h.class |
| 26 | + ); |
| 27 | + var upcalls = new HashMap<Class<?>, Object>(); |
| 28 | + upcalls.put(lua_CFunction.class, (lua_CFunction.Function) (_) -> unreachable()); |
| 29 | + upcalls.put(lua_Alloc.class, (lua_Alloc.Function) (_, _, _, _) -> unreachable()); |
| 30 | + upcalls.put(lua_newuserdatadtor$dtor.class, (lua_newuserdatadtor$dtor.Function) (_) -> unreachable()); |
| 31 | + upcalls.put(lua_Callbacks.onallocate.class, (lua_Callbacks.onallocate.Function) (_, _, _) -> unreachable()); |
| 32 | + upcalls.put(lua_Callbacks.debugprotectederror.class, |
| 33 | + (lua_Callbacks.debugprotectederror.Function) (_) -> unreachable()); |
| 34 | + upcalls.put(lua_Callbacks.debuginterrupt.class, |
| 35 | + (lua_Callbacks.debuginterrupt.Function) (_, _) -> unreachable()); |
| 36 | + upcalls.put(lua_Callbacks.debugstep.class, (lua_Callbacks.debugstep.Function) (_, _) -> unreachable()); |
| 37 | + upcalls.put(lua_Callbacks.debugbreak.class, (lua_Callbacks.debugbreak.Function) (_, _) -> unreachable()); |
| 38 | + upcalls.put(lua_Callbacks.useratom.class, (lua_Callbacks.useratom.Function) (_, _) -> unreachable()); |
| 39 | + upcalls.put(lua_Callbacks.userthread.class, (lua_Callbacks.userthread.Function) (_, _) -> unreachable()); |
| 40 | + upcalls.put(lua_Callbacks.panic.class, (lua_Callbacks.panic.Function) (_, _) -> unreachable()); |
| 41 | + upcalls.put(lua_Callbacks.interrupt.class, (lua_Callbacks.interrupt.Function) (_, _) -> unreachable()); |
| 42 | + |
| 43 | + var toLoad = new ArrayDeque<>(classes); |
| 44 | + while (!toLoad.isEmpty()) { |
| 45 | + var classToLoad = toLoad.pop(); |
| 46 | + try { |
| 47 | + System.out.println("load: " + classToLoad.getName()); |
| 48 | + var theClass = Class.forName(classToLoad.getName()); |
| 49 | + toLoad.addAll(List.of(theClass.getDeclaredClasses())); |
| 50 | + |
| 51 | + for (var field : theClass.getDeclaredFields()) { |
| 52 | + if (!field.getName().equals("UP$MH")) continue; |
| 53 | + |
| 54 | + var functionClass = theClass.getDeclaredClasses()[0]; |
| 55 | + var instance = Objects.requireNonNull(upcalls.get(theClass), |
| 56 | + "no upcall for " + theClass.getName()); |
| 57 | + try (var arena = Arena.ofConfined()) { |
| 58 | + theClass.getDeclaredMethod("allocate", functionClass, Arena.class) |
| 59 | + .invoke(null, instance, arena); |
| 60 | + } |
| 61 | + } |
| 62 | + } catch (Exception e) { |
| 63 | + e.printStackTrace(); |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + |
| 68 | + private static <T> T unreachable() { |
| 69 | + throw new RuntimeException("unreachable"); |
| 70 | + } |
| 71 | +} |
0 commit comments