aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorHarold Brenes <harold@hbrenes.com>2025-08-06 15:13:12 -0400
committerHarold Brenes <harold@hbrenes.com>2025-08-06 20:27:31 -0400
commit9d8e15b3af6e41b3b3d4359eb0d2324cfa34608f (patch)
treee6b09afad4fefe38c8ab9888198e1bbf75eea2cf /base
parent09a1e170bc92a0ea48a8ee67599c2936e924fe4d (diff)
Implementes the block ABI.2010.3.16 natively via the `objc_block` intrinsic and the `Objc_Block` builtin type.
See: https://clang.llvm.org/docs/Block-ABI-Apple.html
Diffstat (limited to 'base')
-rw-r--r--base/intrinsics/intrinsics.odin1
-rw-r--r--base/runtime/core_builtin.odin5
-rw-r--r--base/runtime/procs_darwin.odin12
3 files changed, 17 insertions, 1 deletions
diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin
index d45d24f48..4f644728e 100644
--- a/base/intrinsics/intrinsics.odin
+++ b/base/intrinsics/intrinsics.odin
@@ -381,6 +381,7 @@ objc_register_selector :: proc($name: string) -> objc_SEL ---
objc_find_class :: proc($name: string) -> objc_Class ---
objc_register_class :: proc($name: string) -> objc_Class ---
objc_ivar_get :: proc(self: ^$T) -> ^$U ---
+objc_block :: proc(invoke: $T, ..any) -> ^Objc_Block(T) where type_is_proc(T) ---
valgrind_client_request :: proc(default: uintptr, request: uintptr, a0, a1, a2, a3, a4: uintptr) -> uintptr ---
diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin
index 09118998c..3a51d71fb 100644
--- a/base/runtime/core_builtin.odin
+++ b/base/runtime/core_builtin.odin
@@ -5,6 +5,11 @@ import "base:intrinsics"
@builtin
Maybe :: union($T: typeid) {T}
+/*
+Represents an Objective-C block with a given procedure signature T
+*/
+@builtin
+Objc_Block :: struct($T: typeid) where intrinsics.type_is_proc(T) { using _: intrinsics.objc_object }
/*
Recovers the containing/parent struct from a pointer to one of its fields.
diff --git a/base/runtime/procs_darwin.odin b/base/runtime/procs_darwin.odin
index 20f09400d..d176f0f63 100644
--- a/base/runtime/procs_darwin.odin
+++ b/base/runtime/procs_darwin.odin
@@ -1,9 +1,12 @@
#+private
package runtime
-@(priority_index=-1e6)
+@(priority_index=-1e5)
foreign import ObjC "system:objc"
+@(priority_index=-1e6)
+foreign import libSystem "system:System"
+
import "base:intrinsics"
objc_id :: ^intrinsics.objc_object
@@ -34,3 +37,10 @@ foreign ObjC {
object_getClass :: proc "c" (obj: objc_id) -> objc_Class ---
}
+foreign libSystem {
+ _NSConcreteGlobalBlock: intrinsics.objc_class
+ _NSConcreteStackBlock: intrinsics.objc_class
+
+ _Block_object_assign :: proc "c" (rawptr, rawptr, i32) ---
+ _Block_object_dispose :: proc "c" (rawptr, i32) ---
+}