From 52150c3024485d29676d1da9b066044f8c593f4d Mon Sep 17 00:00:00 2001 From: Saad Nadeem Date: Thu, 23 Jul 2026 20:25:21 -0400 Subject: [PATCH] fix: use functional interface for GL callback --- .../ui/services/GLInterfaceFactory.kt | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/services/GLInterfaceFactory.kt b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/services/GLInterfaceFactory.kt index 3f0e51f12..0c1d94f65 100644 --- a/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/services/GLInterfaceFactory.kt +++ b/minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/ui/services/GLInterfaceFactory.kt @@ -58,30 +58,23 @@ internal object GLInterfaceFactory { } } - private class GetProcCallback( - private val provider: FunctionProvider, - ) : CallbackI { - + @FunctionalInterface + private fun interface GetProcCallbackI : CallbackI { //? if >=26.1 override fun getDescriptor(): Callback.Descriptor = DESCRIPTOR //? if <26.1 //override fun getCallInterface(): FFICIF = CALL_INTERFACE override fun callback(ret: Long, args: Long) { - var addr = 0L - try { - val namePtr = MemoryUtil.memGetAddress( - MemoryUtil.memGetAddress(args + Pointer.POINTER_SIZE.toLong()) - ) - if (namePtr != 0L) { - addr = provider.getFunctionAddress(MemoryUtil.memUTF8(namePtr)) - } - } catch (_: Throwable) { - addr = 0L - } - APIUtil.apiClosureRetP(ret, addr) + val contextPtr = MemoryUtil.memGetAddress(MemoryUtil.memGetAddress(args)) + val namePtr = MemoryUtil.memGetAddress( + MemoryUtil.memGetAddress(args + Pointer.POINTER_SIZE.toLong()) + ) + APIUtil.apiClosureRetP(ret, invoke(contextPtr, namePtr)) } + fun invoke(context: Long, name: Long): Long + companion object { private val CALL_INTERFACE: FFICIF = APIUtil.apiCreateCIF( LibFFI.FFI_DEFAULT_ABI, @@ -93,4 +86,15 @@ internal object GLInterfaceFactory { private val DESCRIPTOR: Callback.Descriptor = Callback.Descriptor(MethodHandles.lookup(), CALL_INTERFACE) } } + + private class GetProcCallback( + private val provider: FunctionProvider, + ) : GetProcCallbackI { + + override fun invoke(context: Long, name: Long): Long = try { + if (name != 0L) provider.getFunctionAddress(MemoryUtil.memUTF8(name)) else 0L + } catch (_: Throwable) { + 0L + } + } }