Files
c3c/lib/std/os/macos/objc.c3
2023-03-20 01:03:54 +01:00

50 lines
1.9 KiB
C

module std::os::macos::objc;
$if (env::OS_TYPE == OsType.MACOSX)
typedef Class = distinct void*;
typedef Method = distinct void*;
typedef Ivar = distinct void*;
typedef Selector = distinct void*;
fault ObjcFailure
{
CLASS_NOT_FOUND
}
macro char* Class.name(Class cls) => _macos_class_getName(cls);
macro Class Class.superclass(Class cls) => _macos_class_getSuperclass(cls);
macro bool Class.responds_to(Class cls, Selector sel) => _macos_class_respondsToSelector(cls, sel);
macro Method Class.method(Class cls, Selector name) => _macos_class_getClassMethod(cls, name);
macro bool Selector.equals(Selector a, Selector b) => a == b;
macro bool Class.equals(Class a, Class b) => a == b;
macro Selector selector_register(char* c) => _macos_sel_registerName(c);
macro Class! class_by_name(char* c)
{
Class cls = _macos_objc_lookUpClass(c);
if (!cls) return ObjcFailure.CLASS_NOT_FOUND!;
return cls;
}
macro Class[] class_get_list(Allocator *using = mem::heap())
{
int num_classes = _macos_objc_getClassList(null, 0);
if (!num_classes) return {};
Class[] entries = array::make(Class, num_classes, using);
_macos_objc_getClassList(entries.ptr, entries.len);
return entries;
}
extern fn Class _macos_objc_getClass(char* name) @extern("objc_getClass");
extern fn int _macos_objc_getClassList(Class* buffer, int buffer_count) @extern("objc_getClassList");
extern fn char* _macos_class_getName(Class cls) @extern("class_getName");
extern fn Class _macos_class_getSuperclass(Class cls) @extern("class_getSuperclass");
extern fn Method _macos_class_getClassMethod(Class cls, Selector name) @extern("class_getClassMethod");
extern fn bool _macos_class_respondsToSelector(Class cls, Selector name) @extern("class_respondsToSelector");
extern fn Selector _macos_sel_registerName(char* str) @extern("sel_registerName");
extern fn Class _macos_objc_lookUpClass(char* name) @extern("objc_lookUpClass");
$endif