|
5 | 5 | * http://stregasgate.com |
6 | 6 | */ |
7 | 7 |
|
8 | | -import Gravity |
| 8 | +@preconcurrency import Gravity |
9 | 9 | import struct Foundation.URL |
10 | 10 |
|
11 | 11 | extension Gravity { |
@@ -374,36 +374,9 @@ public class Gravity { |
374 | 374 | } |
375 | 375 | } |
376 | 376 |
|
377 | | -// This is only called for global closures. Instance methods use the seperate bridge delegate callback. |
378 | | -@MainActor |
379 | | -internal func gravityCFuncInternal( |
380 | | - vm: OpaquePointer!, |
381 | | - args: UnsafeMutablePointer<gravity_value_t>!, |
382 | | - nargs: UInt16, |
383 | | - rindex: UInt32 |
384 | | -) -> Bool { |
385 | | - let functionName: String = { |
386 | | - let gClosure = unsafeBitCast( |
387 | | - args!.pointee.p, |
388 | | - to: UnsafeMutablePointer<gravity_closure_t>.self |
389 | | - ) |
390 | | - let cName = gClosure.pointee.f.pointee.identifier! |
391 | | - return String(cString: cName) |
392 | | - }() |
393 | | - |
394 | | - let vmID = Int(bitPattern: vm) |
395 | | - |
396 | | - guard let function = Gravity.storage[vmID]?.cInternalFunctionMap[functionName] else { |
397 | | - fatalError() |
398 | | - } |
399 | | - var args = UnsafeBufferPointer(start: args, count: Int(nargs)).map({ GravityValue(gValue: $0) }) |
400 | | - args.removeFirst() // The first is always the closure being called |
401 | | - let result = function(Gravity(vm: vm), args) |
402 | | - return _gravityHandleCFuncReturn(vm: vm, returnValue: result, returnSlot: rindex) |
403 | | -} |
404 | | - |
405 | 377 | @MainActor |
406 | 378 | @inline(__always) |
| 379 | +@preconcurrency |
407 | 380 | internal func _gravityHandleCFuncReturn( |
408 | 381 | vm: OpaquePointer, |
409 | 382 | returnValue: GravityValue, |
@@ -472,7 +445,28 @@ extension Gravity { |
472 | 445 | @MainActor |
473 | 446 | public func setFunc(_ key: String, to function: @escaping GravitySwiftFunctionReturns) { |
474 | 447 | key.withCString { cKey in |
475 | | - let gFunc = gravity_function_new_internal(vm, cKey, gravityCFuncInternal, 0) |
| 448 | + let exec: gravity_c_internal = { vm, args, nargs, rindex -> Bool in |
| 449 | + let functionName: String = { |
| 450 | + let gClosure = unsafeBitCast( |
| 451 | + args!.pointee.p, |
| 452 | + to: UnsafeMutablePointer<gravity_closure_t>.self |
| 453 | + ) |
| 454 | + let cName = gClosure.pointee.f.pointee.identifier! |
| 455 | + return String(cString: cName) |
| 456 | + }() |
| 457 | + |
| 458 | + let vmID = Int(bitPattern: vm) |
| 459 | + |
| 460 | + guard let function = Gravity.storage[vmID]?.cInternalFunctionMap[functionName] else { |
| 461 | + fatalError() |
| 462 | + } |
| 463 | + var args = UnsafeBufferPointer(start: args, count: Int(nargs)).map({ GravityValue(gValue: $0) }) |
| 464 | + args.removeFirst() // The first is always the closure being called |
| 465 | + let result = function(Gravity(vm: vm!), args) |
| 466 | + return _gravityHandleCFuncReturn(vm: vm!, returnValue: result, returnSlot: rindex) |
| 467 | + } |
| 468 | + |
| 469 | + let gFunc = gravity_function_new_internal(vm, cKey, exec, 0) |
476 | 470 | let gClosure = gravity_closure_new(vm, gFunc) |
477 | 471 |
|
478 | 472 | var gValue = gravity_value_t() |
|
0 commit comments