diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2024-09-03 14:28:02 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-03 14:28:02 +0100 |
| commit | d93aca647bd3b46e3160934a61a84762fb97a889 (patch) | |
| tree | fa7962a17b8963f7f822c3eb8c6ceebbf58cc115 | |
| parent | 6ed4bfeba1f64a0bd3cdb328c29826749ed761f1 (diff) | |
| parent | c86bbc61bc5c52365defc70ba8262941802a5218 (diff) | |
Merge pull request #4171 from yay/objc-runtime-bindings
More Objective-C Runtime bindings.
| -rw-r--r-- | core/sys/darwin/Foundation/NSString.odin | 5 | ||||
| -rw-r--r-- | core/sys/darwin/Foundation/objc.odin | 113 |
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, +} |