Browse Source

Merge pull request #4171 from yay/objc-runtime-bindings

More Objective-C Runtime bindings.
gingerBill 1 year ago
parent
commit
d93aca647b
2 changed files with 100 additions and 18 deletions
  1. 4 1
      core/sys/darwin/Foundation/NSString.odin
  2. 96 17
      core/sys/darwin/Foundation/objc.odin

+ 4 - 1
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)

+ 96 - 17
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,
+}