aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-09-03 14:28:02 +0100
committerGitHub <noreply@github.com>2024-09-03 14:28:02 +0100
commitd93aca647bd3b46e3160934a61a84762fb97a889 (patch)
treefa7962a17b8963f7f822c3eb8c6ceebbf58cc115
parent6ed4bfeba1f64a0bd3cdb328c29826749ed761f1 (diff)
parentc86bbc61bc5c52365defc70ba8262941802a5218 (diff)
Merge pull request #4171 from yay/objc-runtime-bindings
More Objective-C Runtime bindings.
-rw-r--r--core/sys/darwin/Foundation/NSString.odin5
-rw-r--r--core/sys/darwin/Foundation/objc.odin113
2 files changed, 100 insertions, 18 deletions
diff --git a/core/sys/darwin/Foundation/NSString.odin b/core/sys/darwin/Foundation/NSString.odin
index b4918b3fb..a10b33fc0 100644
--- a/core/sys/darwin/Foundation/NSString.odin
+++ b/core/sys/darwin/Foundation/NSString.odin
@@ -58,7 +58,10 @@ MakeConstantString :: proc "c" (#const c: cstring) -> ^String {
@(link_prefix="NS", default_calling_convention="c")
foreign Foundation {
- StringFromClass :: proc(cls: Class) -> ^String ---
+ StringFromClass :: proc(cls: Class) -> ^String ---
+ ClassFromString :: proc(str: ^String) -> Class ---
+ StringFromSelector :: proc(selector: SEL) -> ^String ---
+ SelectorFromString :: proc(str: ^String) -> SEL ---
}
@(objc_type=String, objc_name="alloc", objc_is_class_method=true)
diff --git a/core/sys/darwin/Foundation/objc.odin b/core/sys/darwin/Foundation/objc.odin
index 51cfee444..82d6199ce 100644
--- a/core/sys/darwin/Foundation/objc.odin
+++ b/core/sys/darwin/Foundation/objc.odin
@@ -9,24 +9,85 @@ import "core:c"
IMP :: proc "c" (object: id, sel: SEL, #c_vararg args: ..any) -> id
+@(default_calling_convention="c")
foreign Foundation {
- objc_getMetaClass :: proc "c" (name: cstring) -> id ---
- objc_lookUpClass :: proc "c" (name: cstring) -> Class ---
- objc_allocateClassPair :: proc "c" (superclass : Class, name : cstring, extraBytes : c.size_t) -> Class ---
- objc_registerClassPair :: proc "c" (cls : Class) ---
-
- sel_registerName :: proc "c" (name: cstring) -> SEL ---
-
- class_addMethod :: proc "c" (cls: Class, name: SEL, imp: IMP, types: cstring) -> BOOL ---
- class_getInstanceMethod :: proc "c" (cls: Class, name: SEL) -> Method ---
- class_createInstance :: proc "c" (cls: Class, extraBytes: c.size_t) -> id ---
-
- method_setImplementation :: proc "c" (method: Method, imp: IMP) ---
-
- object_getClass :: proc "c" (obj: id) -> Class ---
- object_setClass :: proc "c" (obj: id, cls: Class) -> Class ---
- object_getClassName :: proc "c" (obj: id) -> cstring ---
- object_getIndexedIvars :: proc "c" (obj: id) -> rawptr ---
+ objc_getMetaClass :: proc(name: cstring) -> id ---
+ objc_lookUpClass :: proc(name: cstring) -> Class ---
+ objc_allocateClassPair :: proc(superclass: Class, name: cstring, extraBytes: c.size_t) -> Class ---
+ objc_registerClassPair :: proc(cls: Class) ---
+ objc_disposeClassPair :: proc(cls: Class) ---
+ objc_duplicateClass :: proc(original: Class, name: cstring, extraBytes: c.size_t) -> Class ---
+ objc_getProtocol :: proc(name: cstring) -> ^Protocol ---
+ objc_copyProtocolList :: proc(outCount: ^uint) -> [^]^Protocol ---
+ objc_constructInstance :: proc(cls: Class, bytes: rawptr) -> id ---
+ objc_destructInstance :: proc(obj: id) -> rawptr ---
+ objc_getClassList :: proc(buffer: [^]Class, bufferCount: int) -> int ---
+ objc_copyClassList :: proc(outCount: ^uint) -> [^]Class ---
+ objc_getRequiredClass :: proc(name: cstring) -> Class ---
+ objc_setAssociatedObject :: proc(object: id, key: rawptr, value: id, policy: objc_AssociationPolicy) ---
+ objc_getAssociatedObject :: proc(object: id, key: rawptr) -> id ---
+ objc_removeAssociatedObjects :: proc(object: id) ---
+
+ sel_registerName :: proc(name: cstring) -> SEL ---
+ sel_getName :: proc(sel: SEL) -> cstring ---
+ sel_isEqual :: proc(lhs, rhs: SEL) -> BOOL ---
+
+ class_addMethod :: proc(cls: Class, name: SEL, imp: IMP, types: cstring) -> BOOL ---
+ class_getInstanceMethod :: proc(cls: Class, name: SEL) -> Method ---
+ class_getClassMethod :: proc(cls: Class, name: SEL) -> Method ---
+ class_copyMethodList :: proc(cls: Class, outCount: ^uint) -> [^]Method ---
+ class_createInstance :: proc(cls: Class, extraBytes: c.size_t) -> id ---
+ class_replaceMethod :: proc(cls: Class, name: SEL, imp: IMP, types: cstring) -> IMP ---
+ class_getMethodImplementation :: proc(cls: Class, name: SEL) -> IMP ---
+ class_getSuperclass :: proc(cls: Class) -> Class ---
+ class_getName :: proc(cls: Class) -> cstring ---
+ class_isMetaClass :: proc(cls: Class) -> BOOL ---
+ class_addProtocol :: proc(cls: Class, protocol: ^Protocol) -> BOOL ---
+ class_getVersion :: proc(cls: Class) -> c.int ---
+ class_setVersion :: proc(cls: Class, version: c.int) ---
+ class_getProperty :: proc(cls: Class, name: cstring) -> objc_property_t ---
+ class_addProperty :: proc(cls: Class, name: cstring, attributes: [^]objc_property_attribute_t, attributeCount: uint) -> BOOL ---
+ class_replaceProperty :: proc(cls: Class, name: cstring, attributes: [^]objc_property_attribute_t, attributeCount: uint) ---
+ class_copyPropertyList :: proc(cls: Class, outCount: ^uint) -> [^]objc_property_t ---
+ class_conformsToProtocol :: proc(cls: Class, protocol: ^Protocol) -> BOOL ---
+ class_copyProtocolList :: proc(cls: Class, outCount: ^uint) -> [^]^Protocol ---
+ class_respondsToSelector :: proc(cls: Class, sel: SEL) -> BOOL ---
+ class_getClassVariable :: proc(cls: Class, name: cstring) -> Ivar ---
+ class_getInstanceVariable :: proc(cls: Class, name: cstring) -> Ivar ---
+ class_addIvar :: proc(cls: Class, name: cstring, size: c.size_t, alignment: u8, types: cstring) -> BOOL ---
+ class_copyIvarList :: proc(cls: Class, outCount: ^uint) -> [^]Ivar ---
+ class_getInstanceSize :: proc(cls: Class) -> c.size_t ---
+
+ property_getName :: proc(property: objc_property_t) -> cstring ---
+ property_getAttributes :: proc(property: objc_property_t) -> cstring ---
+ property_copyAttributeList :: proc(property: objc_property_t, outCount: ^uint) -> [^]objc_property_attribute_t ---
+ property_copyAttributeValue :: proc(property: objc_property_t, attributeName: cstring) -> cstring ---
+
+ protocol_conformsToProtocol :: proc(proto: ^Protocol, other: ^Protocol) -> BOOL ---
+ protocol_isEqual :: proc(proto: ^Protocol, other: ^Protocol) -> BOOL ---
+ protocol_getName :: proc(proto: ^Protocol) -> cstring ---
+
+ method_getImplementation :: proc(m: Method) -> IMP ---
+ method_setImplementation :: proc(m: Method, imp: IMP) ---
+ method_copyArgumentType :: proc(m: Method, index: uint) -> cstring ---
+ method_getReturnType :: proc(m: Method, dst: cstring, dst_len: c.size_t) ---
+ method_getNumberOfArguments :: proc(m: Method) -> uint ---
+ method_getArgumentType :: proc(m: Method, index: uint, dst: cstring, dst_len: c.size_t) ---
+
+ object_getClass :: proc(obj: id) -> Class ---
+ object_setClass :: proc(obj: id, cls: Class) -> Class ---
+ object_copy :: proc(obj: id, size: c.size_t) -> id ---
+ object_dispose :: proc(obj: id) -> id ---
+ object_getClassName :: proc(obj: id) -> cstring ---
+ object_getIndexedIvars :: proc(obj: id) -> rawptr ---
+ object_getInstanceVariable :: proc(obj: id, name: cstring, outValue: rawptr) -> Ivar ---
+ object_setInstanceVariable :: proc(obj: id, name: cstring, value: rawptr) -> Ivar ---
+ object_getIvar :: proc(obj: id, ivar: Ivar) -> id ---
+ object_setIvar :: proc(obj: id, ivar: Ivar, value: id) ---
+
+ ivar_getName :: proc(v: Ivar) -> cstring ---
+ ivar_getTypeEncoding :: proc(v: Ivar) -> cstring ---
+ ivar_getOffset :: proc(v: Ivar) -> c.ptrdiff_t ---
}
@@ -47,7 +108,17 @@ objc_method :: struct {
}
objc_method_list :: struct {}
+objc_property :: struct{}
+objc_property_t :: ^objc_property
+
+objc_property_attribute_t :: struct {
+ name: cstring,
+ value: cstring,
+}
+
objc_ivar :: struct {}
+Ivar :: ^objc_ivar
+
objc_ivar_list :: struct {}
objc_cache :: struct {
@@ -85,3 +156,11 @@ objc_class_internals :: struct {
protocols: rawptr,
}
+
+objc_AssociationPolicy :: enum c.uintptr_t {
+ Assign = 0,
+ Retain_Nonatomic = 1,
+ Copy_Nonatomic = 3,
+ Retain = 01401,
+ Copy = 01403,
+}