objc.odin 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package objc_Foundation
  2. foreign import "system:Foundation.framework"
  3. // NOTE: Most of our bindings are reliant on Cocoa (everything under appkit) so just unconditionally import it
  4. @(require) foreign import "system:Cocoa.framework"
  5. import "base:intrinsics"
  6. import "core:c"
  7. IMP :: proc "c" (object: id, sel: SEL, #c_vararg args: ..any) -> id
  8. @(default_calling_convention="c")
  9. foreign Foundation {
  10. objc_getMetaClass :: proc(name: cstring) -> id ---
  11. objc_lookUpClass :: proc(name: cstring) -> Class ---
  12. objc_allocateClassPair :: proc(superclass: Class, name: cstring, extraBytes: c.size_t) -> Class ---
  13. objc_registerClassPair :: proc(cls: Class) ---
  14. objc_disposeClassPair :: proc(cls: Class) ---
  15. objc_duplicateClass :: proc(original: Class, name: cstring, extraBytes: c.size_t) -> Class ---
  16. objc_getProtocol :: proc(name: cstring) -> ^Protocol ---
  17. objc_copyProtocolList :: proc(outCount: ^uint) -> [^]^Protocol ---
  18. objc_constructInstance :: proc(cls: Class, bytes: rawptr) -> id ---
  19. objc_destructInstance :: proc(obj: id) -> rawptr ---
  20. objc_getClassList :: proc(buffer: [^]Class, bufferCount: int) -> int ---
  21. objc_copyClassList :: proc(outCount: ^uint) -> [^]Class ---
  22. objc_getRequiredClass :: proc(name: cstring) -> Class ---
  23. objc_setAssociatedObject :: proc(object: id, key: rawptr, value: id, policy: objc_AssociationPolicy) ---
  24. objc_getAssociatedObject :: proc(object: id, key: rawptr) -> id ---
  25. objc_removeAssociatedObjects :: proc(object: id) ---
  26. sel_registerName :: proc(name: cstring) -> SEL ---
  27. sel_getName :: proc(sel: SEL) -> cstring ---
  28. sel_isEqual :: proc(lhs, rhs: SEL) -> BOOL ---
  29. class_addMethod :: proc(cls: Class, name: SEL, imp: IMP, types: cstring) -> BOOL ---
  30. class_getInstanceMethod :: proc(cls: Class, name: SEL) -> Method ---
  31. class_getClassMethod :: proc(cls: Class, name: SEL) -> Method ---
  32. class_copyMethodList :: proc(cls: Class, outCount: ^uint) -> [^]Method ---
  33. class_createInstance :: proc(cls: Class, extraBytes: c.size_t) -> id ---
  34. class_replaceMethod :: proc(cls: Class, name: SEL, imp: IMP, types: cstring) -> IMP ---
  35. class_getMethodImplementation :: proc(cls: Class, name: SEL) -> IMP ---
  36. class_getSuperclass :: proc(cls: Class) -> Class ---
  37. class_getName :: proc(cls: Class) -> cstring ---
  38. class_isMetaClass :: proc(cls: Class) -> BOOL ---
  39. class_addProtocol :: proc(cls: Class, protocol: ^Protocol) -> BOOL ---
  40. class_getVersion :: proc(cls: Class) -> c.int ---
  41. class_setVersion :: proc(cls: Class, version: c.int) ---
  42. class_getProperty :: proc(cls: Class, name: cstring) -> objc_property_t ---
  43. class_addProperty :: proc(cls: Class, name: cstring, attributes: [^]objc_property_attribute_t, attributeCount: uint) -> BOOL ---
  44. class_replaceProperty :: proc(cls: Class, name: cstring, attributes: [^]objc_property_attribute_t, attributeCount: uint) ---
  45. class_copyPropertyList :: proc(cls: Class, outCount: ^uint) -> [^]objc_property_t ---
  46. class_conformsToProtocol :: proc(cls: Class, protocol: ^Protocol) -> BOOL ---
  47. class_copyProtocolList :: proc(cls: Class, outCount: ^uint) -> [^]^Protocol ---
  48. class_respondsToSelector :: proc(cls: Class, sel: SEL) -> BOOL ---
  49. class_getClassVariable :: proc(cls: Class, name: cstring) -> Ivar ---
  50. class_getInstanceVariable :: proc(cls: Class, name: cstring) -> Ivar ---
  51. class_addIvar :: proc(cls: Class, name: cstring, size: c.size_t, alignment: u8, types: cstring) -> BOOL ---
  52. class_copyIvarList :: proc(cls: Class, outCount: ^uint) -> [^]Ivar ---
  53. class_getInstanceSize :: proc(cls: Class) -> c.size_t ---
  54. property_getName :: proc(property: objc_property_t) -> cstring ---
  55. property_getAttributes :: proc(property: objc_property_t) -> cstring ---
  56. property_copyAttributeList :: proc(property: objc_property_t, outCount: ^uint) -> [^]objc_property_attribute_t ---
  57. property_copyAttributeValue :: proc(property: objc_property_t, attributeName: cstring) -> cstring ---
  58. protocol_conformsToProtocol :: proc(proto: ^Protocol, other: ^Protocol) -> BOOL ---
  59. protocol_isEqual :: proc(proto: ^Protocol, other: ^Protocol) -> BOOL ---
  60. protocol_getName :: proc(proto: ^Protocol) -> cstring ---
  61. method_getImplementation :: proc(m: Method) -> IMP ---
  62. method_setImplementation :: proc(m: Method, imp: IMP) ---
  63. method_copyArgumentType :: proc(m: Method, index: uint) -> cstring ---
  64. method_getReturnType :: proc(m: Method, dst: cstring, dst_len: c.size_t) ---
  65. method_getNumberOfArguments :: proc(m: Method) -> uint ---
  66. method_getArgumentType :: proc(m: Method, index: uint, dst: cstring, dst_len: c.size_t) ---
  67. object_getClass :: proc(obj: id) -> Class ---
  68. object_setClass :: proc(obj: id, cls: Class) -> Class ---
  69. object_copy :: proc(obj: id, size: c.size_t) -> id ---
  70. object_dispose :: proc(obj: id) -> id ---
  71. object_getClassName :: proc(obj: id) -> cstring ---
  72. object_getIndexedIvars :: proc(obj: id) -> rawptr ---
  73. object_getInstanceVariable :: proc(obj: id, name: cstring, outValue: rawptr) -> Ivar ---
  74. object_setInstanceVariable :: proc(obj: id, name: cstring, value: rawptr) -> Ivar ---
  75. object_getIvar :: proc(obj: id, ivar: Ivar) -> id ---
  76. object_setIvar :: proc(obj: id, ivar: Ivar, value: id) ---
  77. ivar_getName :: proc(v: Ivar) -> cstring ---
  78. ivar_getTypeEncoding :: proc(v: Ivar) -> cstring ---
  79. ivar_getOffset :: proc(v: Ivar) -> c.ptrdiff_t ---
  80. }
  81. @(objc_class="NSZone")
  82. Zone :: struct {using _: Object}
  83. @(link_prefix="NS")
  84. foreign Foundation {
  85. AllocateObject :: proc "c" (aClass: Class, extraBytes: UInteger, zone: ^Zone) -> id ---
  86. DeallocateObject :: proc "c" (object: id) ---
  87. }
  88. Method :: ^objc_method
  89. objc_method :: struct {
  90. method_name: SEL,
  91. method_types: cstring,
  92. method_imp: IMP,
  93. }
  94. objc_method_list :: struct {}
  95. objc_property :: struct{}
  96. objc_property_t :: ^objc_property
  97. objc_property_attribute_t :: struct {
  98. name: cstring,
  99. value: cstring,
  100. }
  101. objc_ivar :: struct {}
  102. Ivar :: ^objc_ivar
  103. objc_ivar_list :: struct {}
  104. objc_cache :: struct {
  105. mask: u32,
  106. occupied: u32,
  107. buckets: [1]Method,
  108. }
  109. objc_protocol_list :: struct {
  110. next: ^objc_protocol_list,
  111. count: c.int,
  112. list: [1]^Protocol,
  113. }
  114. @(objc_class="Protocol")
  115. Protocol :: struct{using _: intrinsics.objc_object}
  116. objc_object_internals :: struct {
  117. isa: ^objc_class_internals,
  118. }
  119. objc_class_internals :: struct {
  120. isa: Class,
  121. super_class: Class,
  122. name: cstring,
  123. version: c.long,
  124. info: c.long,
  125. instance_size: c.long,
  126. ivars: ^objc_ivar_list,
  127. methodLists: ^^objc_method_list,
  128. cache: rawptr,
  129. protocols: rawptr,
  130. }
  131. objc_AssociationPolicy :: enum c.uintptr_t {
  132. Assign = 0,
  133. Retain_Nonatomic = 1,
  134. Copy_Nonatomic = 3,
  135. Retain = 01401,
  136. Copy = 01403,
  137. }