diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift index 50eb70c7..e5b691eb 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift @@ -7,7 +7,8 @@ import Gravity -@MainActor +@MainActor +@preconcurrency internal func errorCallback( vm: OpaquePointer?, errorType: error_type_t, diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift index 1c8f7969..680da66f 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift @@ -8,7 +8,8 @@ import Foundation import Gravity -@MainActor +@MainActor +@preconcurrency internal func filenameCallback( fileID: UInt32, xData: UnsafeMutableRawPointer? @@ -21,6 +22,7 @@ internal func filenameCallback( } @MainActor +@preconcurrency internal func loadFileCallback( file: UnsafePointer!, size: UnsafeMutablePointer!, diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift index e74f0224..7db313cb 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift @@ -9,6 +9,7 @@ import Gravity @MainActor +@preconcurrency internal func unittestCallback( vm: OpaquePointer!, errorType: error_type_t, diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity.swift b/Sources/GateEngine/Scripting/Gravity/Gravity.swift index c1569b7c..c1a74bd1 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity.swift @@ -5,7 +5,7 @@ * http://stregasgate.com */ -import Gravity +@preconcurrency import Gravity import struct Foundation.URL extension Gravity { @@ -374,36 +374,9 @@ public class Gravity { } } -// This is only called for global closures. Instance methods use the seperate bridge delegate callback. -@MainActor -internal func gravityCFuncInternal( - vm: OpaquePointer!, - args: UnsafeMutablePointer!, - nargs: UInt16, - rindex: UInt32 -) -> Bool { - let functionName: String = { - let gClosure = unsafeBitCast( - args!.pointee.p, - to: UnsafeMutablePointer.self - ) - let cName = gClosure.pointee.f.pointee.identifier! - return String(cString: cName) - }() - - let vmID = Int(bitPattern: vm) - - guard let function = Gravity.storage[vmID]?.cInternalFunctionMap[functionName] else { - fatalError() - } - var args = UnsafeBufferPointer(start: args, count: Int(nargs)).map({ GravityValue(gValue: $0) }) - args.removeFirst() // The first is always the closure being called - let result = function(Gravity(vm: vm), args) - return _gravityHandleCFuncReturn(vm: vm, returnValue: result, returnSlot: rindex) -} - @MainActor @inline(__always) +@preconcurrency internal func _gravityHandleCFuncReturn( vm: OpaquePointer, returnValue: GravityValue, @@ -472,7 +445,28 @@ extension Gravity { @MainActor public func setFunc(_ key: String, to function: @escaping GravitySwiftFunctionReturns) { key.withCString { cKey in - let gFunc = gravity_function_new_internal(vm, cKey, gravityCFuncInternal, 0) + let exec: gravity_c_internal = { vm, args, nargs, rindex -> Bool in + let functionName: String = { + let gClosure = unsafeBitCast( + args!.pointee.p, + to: UnsafeMutablePointer.self + ) + let cName = gClosure.pointee.f.pointee.identifier! + return String(cString: cName) + }() + + let vmID = Int(bitPattern: vm) + + guard let function = Gravity.storage[vmID]?.cInternalFunctionMap[functionName] else { + fatalError() + } + var args = UnsafeBufferPointer(start: args, count: Int(nargs)).map({ GravityValue(gValue: $0) }) + args.removeFirst() // The first is always the closure being called + let result = function(Gravity(vm: vm!), args) + return _gravityHandleCFuncReturn(vm: vm!, returnValue: result, returnSlot: rindex) + } + + let gFunc = gravity_function_new_internal(vm, cKey, exec, 0) let gClosure = gravity_closure_new(vm, gFunc) var gValue = gravity_value_t() diff --git a/Sources/GateEngine/Scripting/Gravity/GravityClass.swift b/Sources/GateEngine/Scripting/Gravity/GravityClass.swift index 67772467..90df3f05 100644 --- a/Sources/GateEngine/Scripting/Gravity/GravityClass.swift +++ b/Sources/GateEngine/Scripting/Gravity/GravityClass.swift @@ -134,6 +134,7 @@ internal class GravityCFuncBridgedUserData { } @MainActor +@preconcurrency internal func gravityCFuncBridged( vm: OpaquePointer!, xdata: UnsafeMutableRawPointer?,