aboutsummaryrefslogtreecommitdiff
path: root/core/sys/darwin/Foundation/objc.odin
blob: 82d6199cef7d01f28d952d987747c86cbc0c4cdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package objc_Foundation

foreign import "system:Foundation.framework"
// NOTE: Most of our bindings are reliant on Cocoa (everything under appkit) so just unconditionally import it
@(require) foreign import "system:Cocoa.framework"

import "base:intrinsics"
import "core:c"

IMP :: proc "c" (object: id, sel: SEL, #c_vararg args: ..any) -> id

@(default_calling_convention="c")
foreign Foundation {
	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 ---
}


@(objc_class="NSZone")
Zone :: struct {using _: Object}

@(link_prefix="NS")
foreign Foundation {
	AllocateObject   :: proc "c" (aClass: Class, extraBytes: UInteger, zone: ^Zone) -> id ---
	DeallocateObject :: proc "c" (object: id) ---
}

Method :: ^objc_method
objc_method :: struct {
	method_name:  SEL,
	method_types: cstring,
	method_imp:   IMP,
}
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 {
	mask:     u32,
	occupied: u32,
	buckets:  [1]Method,
}

objc_protocol_list :: struct {
	next:  ^objc_protocol_list,
	count: c.int,
	list:  [1]^Protocol,
}

@(objc_class="Protocol")
Protocol :: struct{using _: intrinsics.objc_object}

objc_object_internals :: struct {
	isa: ^objc_class_internals,
}


objc_class_internals :: struct {
	isa:           Class,
	super_class:   Class,
	name:          cstring,
	version:       c.long,
	info:          c.long,
	instance_size: c.long,
	ivars:         ^objc_ivar_list,

	methodLists:   ^^objc_method_list,

	cache:         rawptr,
	protocols:     rawptr,

}

objc_AssociationPolicy :: enum c.uintptr_t {
	Assign = 0,
	Retain_Nonatomic = 1,
	Copy_Nonatomic = 3,
	Retain = 01401,
	Copy = 01403,
}