Mercurial > projects > dstep
view dstep/objc/runtime.d @ 23:420969b22201
Removed an import to a private library. Added support for building as a dynamic library and framework
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Wed, 10 Feb 2010 17:29:12 +0100 |
parents | 19885b43130e |
children | ab33fc0c3fc1 |
line wrap: on
line source
/** * Copyright: Copyright (c) 2009 Jacob Carlborg. * Authors: Jacob Carlborg * Version: Initial created: Feb 1, 2009 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) */ module dstep.objc.runtime; import dstep.internal.String; import dstep.internal.Types; import dstep.internal.Version; import bindings = dstep.objc.bindings; import dstep.objc.message; import dstep.objc.objc; struct objc_property; alias objc_method* Method; alias objc_ivar* Ivar; alias objc_category* Category; alias objc_property* objc_property_t; alias objc_object Protocol; alias objc_symtab* Symtab; alias objc_cache* Cache; const char _C_ID = '@'; const char _C_CLASS = '#'; const char _C_SEL = ':'; const char _C_CHR = 'c'; const char _C_UCHR = 'C'; const char _C_SHT = 's'; const char _C_USHT = 'S'; const char _C_INT = 'i'; const char _C_UINT = 'I'; const char _C_LNG = 'l'; const char _C_ULNG = 'L'; const char _C_LNG_LNG = 'q'; const char _C_ULNG_LNG = 'Q'; const char _C_FLT = 'f'; const char _C_DBL = 'd'; const char _C_BFLD = 'b'; const char _C_BOOL = 'B'; const char _C_VOID = 'v'; const char _C_UNDEF = '?'; const char _C_PTR = '^'; const char _C_CHARPTR = '*'; const char _C_ATOM = '%'; const char _C_ARY_B = '['; const char _C_ARY_E = ']'; const char _C_UNION_B = '('; const char _C_UNION_E = ')'; const char _C_STRUCT_B = '{'; const char _C_STRUCT_E = '}'; const char _C_VECTOR = '!'; const char _C_CONST = 'r'; struct objc_class { Class isa; Class super_class; /*const*/ char* name; c_long version_; c_long info; c_long instance_size; objc_ivar_list* ivars; objc_method_list** methodLists; objc_cache* cache; objc_protocol_list* protocols; // D Extensions: void setFutureClass (string name) () { bindings.objc_setFutureClass(this, name.ptr); } string getName () { return fromStringz(bindings.class_getName(this)); } Ivar getInstanceVariable (string name) () { return bindings.class_getInstanceVariable(this, name.ptr); } Ivar getClassVariable (string name) () { return bindings.class_getClassVariable(this, name.ptr); } Ivar[] copyIvarList () { uint outCount; Ivar* list = bindings.class_copyIvarList(this, &outCount); if (list) return list[0 .. outCount]; return null; } Method[] copyMethodList () { uint outCount; Method* list = bindings.class_copyMethodList(this, &outCount); if (list) return list[0 .. outCount]; return null; } Protocol*[] copyProtocolList () { uint outCount; Protocol** list = bindings.class_copyProtocolList(this, &outCount); if (list) return list[0 .. outCount]; return null; } string getIvarLayout () { return fromStringz(bindings.class_getIvarLayout(this)); } string getWeakIvarLayout () { return fromStringz(bindings.class_getWeakIvarLayout(this)); } Class duplicateClass (string name) (size_t extraBytes) { return bindings.objc_duplicateClass(this, name.ptr, extraBytes); } bool addMethod (string types) (SEL name, IMP imp) { return bindings.class_addMethod(this, name, imp, types.ptr); } IMP replaceMethod (string types) (SEL name, IMP imp) { return bindings.class_replaceMethod(this, name, imp, types.ptr); } bool addIvar (string name, string types) (size_t size, ubyte alignment) { return bindings.class_addIvar(this, name.ptr, size, alignment, types.ptr); } void setIvarLayout (string layout) () { bindings.class_setIvarLayout(this, layout.ptr); } void setWeakIvarLayout (string layout) () { bindings.class_setWeakIvarLayout(this, layout.ptr); } objc_property_t* getProperty (string name) () { return bindings.class_getProperty(this, name.ptr); } string getImageName () { return fromStringz(bindings.class_getImageName(this)); } bool isMetaClass () { return bindings.class_isMetaClass(this); } Class getSuperclass () { return bindings.class_getSuperclass(this); } Class setSuperClass (Class newSuper) { return bindings.class_setSuperclass(this, newSuper); } int getVersion () { return bindings.class_getVersion(this); } void serVersion (int version_) { return bindings.class_setVersion(this, version_); } size_t getInstanceSize () { return bindings.class_getInstanceSize(this); } Method getInstanceMethod (SEL name) { return bindings.class_getInstanceMethod(this, name); } Method getClassMethod (SEL name) { return bindings.class_getClassMethod(this, name); } IMP getMethodImplementation (SEL name) { return bindings.class_getMethodImplementation(this, name); } IMP getMethodImplementation_stret (SEL name) { return bindings.class_getMethodImplementation_stret(this, name); } bool respondsToSelector (SEL sel) { return bindings.class_respondsToSelector(this, sel); } bool conformsToProtocol (Protocol* protocol) { return bindings.class_conformsToProtocol(this, protocol); } void addProtocol (Protocol* protocol) { return bindings.class_addProtocol(this, protocol); } id createInstanceFromZone (size_t idxIvars, void* z) { return bindings.class_createInstanceFromZone(this, idxIvars, z); } void addMethods (objc_method_list* methodList) { return.class_addMethods(this, methodList); } void removeMethods (objc_method_list* methodList) { return bindings.class_removeMethods(this, methodList); } Class poseAs (Class original) { return bindings.class_poseAs(this, original); } bool respondsToMethod (SEL sel) { return bindings.class_respondsToMethod(this, sel); } objc_method_list* class_nextMethodList (void* arg) { return bindings.class_nextMethodList(this, arg); } } struct objc_method_description { SEL name; char* types; } struct objc_method_description_list { int count; objc_method_description[1] list; } struct objc_protocol_list { objc_protocol_list* next; c_long count; Protocol*[1] list; } struct objc_category { char* category_name; char* class_name; objc_method_list* instance_methods; objc_method_list* class_methods; objc_protocol_list* protocols; } struct objc_ivar { char* ivar_name; char* ivar_type; int ivar_offset; static if (D_LP64) int space; // D Extensions: string getName () { return fromStringz(bindings.ivar_getName(this)); } string getTypeEncoding () { return fromStringz(bindings.ivar_getTypeEncoding(this)); } ptrdiff_t getOffset () { return bindings.ivar_getOffset(this); } } struct objc_ivar_list { int ivar_count; static if (D_LP64) int space; /* variable length structure */ objc_ivar[1] ivar_list; } struct objc_method { SEL method_name; char* method_types; IMP method_imp; // D Extensions: /*uint getArgumentInfo (string[] type) (int arg, int* offset) { char*[] arr; arr.length = type.length; foreach (i, str ; type) arr[i] = str.ptr; return bindings.method_getArgumentInfo(this, arg, arr.ptr, offset); }*/ string getTypeEncoding () { return fromStringz(bindings.method_getTypeEncoding(this)); } string copyReturnType () { return fromStringz(bindings.method_copyReturnType(this)); } string copyArgumentType (uint index) { return fromStringz(bindings.method_copyArgumentType(this, index)); } void getReturnType (string dst, size_t dst_len) { bindings.method_getReturnType(this, dst.toStringz(), dst_len); } void getArgumentType (uint index, string dst, size_t dst_len) { bindings.method_getArgumentType(this, index, dst.toStringz(), dst_len); } SEL getName () { return bindings.method_getName(this); } IMP getImplementation () { return bindings.method_getImplementation(this); } uint getNumberOfArguments () { return bindings.method_getNumberOfArguments(this); } objc_method_description* getDescription () { return bindings.method_getDescription(this); } IMP setImplementation (IMP imp) { return bindings.method_setImplementation(this, imp); } void exchangeImplementations (Method m2) { bindings.method_exchangeImplementations(this, m2); } uint getSizeOfArguments () { return bindings.method_getSizeOfArguments(this); } } struct objc_method_list { objc_method_list* obsolete; int method_count; static if (D_LP64) int space; /* variable length structure */ objc_method method_list[1]; } struct objc_symtab { c_ulong sel_ref_cnt; SEL* refs; ushort cls_def_cnt; ushort cat_def_cnt; void*[1] defs; } struct objc_cache { uint mask /* total = mask + 1 */; uint occupied; Method[1] buckets; } struct objc_module { c_ulong version_; c_ulong size; char* name; Symtab symtab; } string object_getClassName (id obj) { return fromStringz(bindings.object_getClassName(obj)); } Ivar object_setInstanceVariable (T) (id obj, string name, T value) { return bindings.object_setInstanceVariable(obj, name.toStringz(), value); } Ivar object_getInstanceVariable (T) (id obj, string name, out T outValue) { return bindings.object_getInstanceVariable(obj, name.toStringz(), &outValue); } id objc_getClass (string name) { return bindings.objc_getClass(name.toStringz()); } id objc_getMetaClass (string name) { return bindings.objc_getMetaClass(name.toStringz()); } id objc_lookUpClass (string name) { return bindings.objc_lookUpClass(name.toStringz()); } id objc_getRequiredClass (string name) { return bindings.objc_getRequiredClass(name.toStringz()); } Class objc_getFutureClass (string name) { return bindings.objc_getFutureClass(name.toStringz()); } void objc_setFutureClass (Class cls, string name) { bindings.objc_setFutureClass(cls, name.toStringz()); } id objc_getProtocol (string name) { return bindings.objc_getProtocol(name.toStringz()); } Protocol** objc_copyProtocolList (out uint outCount) { return bindings.objc_copyProtocolList(&outCount); } string class_getName (Class cls) { return fromStringz(bindings.class_getName(cls)); } Ivar class_getInstanceVariable (Class cls, string name) { return bindings.class_getInstanceVariable(cls, name.toStringz()); } Ivar class_getClassVariable (Class cls, string name) { return bindings.class_getClassVariable(cls, name.toStringz()); } Ivar* class_copyIvarList (Class cls, out uint outCount) { return bindings.class_copyIvarList(cls, &outCount); } Method* class_copyMethodList (Class cls, out uint outCount) { return bindings.class_copyMethodList(cls, &outCount); } Protocol** class_copyProtocolList (Class cls, out uint outCount) { return bindings.class_copyProtocolList(cls, &outCount); } objc_property_t* class_getProperty (Class cls, string name) { return bindings.class_getProperty(cls, name.toStringz()); } objc_property_t* class_copyPropertyList (Class cls, out uint outCount) { return bindings.class_copyPropertyList(cls, &outCount); } string class_getIvarLayout (Class cls) { return fromStringz(bindings.class_getIvarLayout(cls)); } string class_getWeakIvarLayout (Class cls) { return fromStringz(bindings.class_getWeakIvarLayout(cls)); } Class objc_allocateClassPair (Class superclass, string name, size_t extraBytes) { return bindings.objc_allocateClassPair(superclass, name.toStringz(), extraBytes); } Class objc_duplicateClass (Class original, string name, size_t extraBytes) { return bindings.objc_duplicateClass(original, name.toStringz(), extraBytes); } bool class_addMethod (Class cls, SEL name, IMP imp, string types) { return bindings.class_addMethod(cls, name, imp, types.toStringz()); } IMP class_replaceMethod (Class cls, SEL name, IMP imp, string types) { return bindings.class_replaceMethod(cls, name, imp, types.toStringz()); } bool class_addIvar (Class cls, string name, size_t size, ubyte alignment, string types) { return bindings.class_addIvar(cls, name.toStringz(), size, alignment, types.toStringz()); } void class_setIvarLayout (Class cls, string layout) { bindings.class_setIvarLayout(cls, layout.toStringz()); } void class_setWeakIvarLayout (Class cls, string layout) { bindings.class_setWeakIvarLayout(cls, layout.toStringz()); } string method_getTypeEncoding (Method m) { return fromStringz(bindings.method_getTypeEncoding(m)); } string method_copyReturnType (Method m) { return fromStringz(bindings.method_copyReturnType(m)); } string method_copyArgumentType (Method m, uint index) { return fromStringz(bindings.method_copyArgumentType(m, index)); } void method_getReturnType (Method m, string dst, size_t dst_len) { bindings.method_getReturnType(m, dst.toStringz(), dst_len); } void method_getArgumentType (Method m, uint index, string dst, size_t dst_len) { bindings.method_getArgumentType(m, index, dst.toStringz(), dst_len); } string ivar_getName (Ivar v) { return fromStringz(bindings.ivar_getName(v)); } string ivar_getTypeEncoding (Ivar v) { return fromStringz(bindings.ivar_getTypeEncoding(v)); } string property_getName (objc_property_t* property) { return fromStringz(bindings.property_getName(property)); } string property_getAttributes (objc_property_t* property) { return fromStringz(bindings.property_getAttributes(property)); } string protocol_getName (id p) { return fromStringz(bindings.protocol_getName(p)); } objc_method_description* protocol_copyMethodDescriptionList(id p, bool isRequiredMethod, bool isInstanceMethod, out uint outCount) { return bindings.protocol_copyMethodDescriptionList(p, isRequiredMethod, isInstanceMethod, &outCount); } objc_property_t* protocol_getProperty (id proto, string name, bool isRequiredProperty, bool isInstanceProperty) { return bindings.protocol_getProperty(proto, name.toStringz(), isRequiredProperty, isInstanceProperty); } objc_property_t* protocol_copyPropertyList (id proto, out uint outCount) { return bindings.protocol_copyPropertyList(proto, &outCount); } Protocol** protocol_copyProtocolList (id proto, out uint outCount) { return bindings.protocol_copyProtocolList(proto, &outCount); } static string[] objc_copyImageNames (out uint outCount) { string[] ret; char** result = bindings.objc_copyImageNames(&outCount); ret.length = outCount; for (size_t i = 0; i < outCount; i++) ret[i] = fromStringz(result[i]); return ret; } string class_getImageName (Class cls) { return fromStringz(bindings.class_getImageName(cls)); } string[] objc_copyClassNamesForImage (string image, out uint outCount) { string[] ret; char** result = bindings.objc_copyClassNamesForImage(image.toStringz(), &outCount); ret.length = outCount; for (size_t i = 0; i < outCount; i++) ret[i] = fromStringz(result[i]); return ret; } string sel_getName (SEL sel) { return fromStringz(bindings.sel_getName(sel)); } SEL sel_getUid (string str) { return bindings.sel_getUid(str.toStringz()); } SEL sel_registerName (string str) { return bindings.sel_registerName(str.toStringz()); } uint method_getArgumentInfo (objc_method* m, int arg, string[] type, int* offset) { char*[] arr; arr.length = type.length; foreach (i, str ; type) arr[i] = str.toStringz(); return bindings.method_getArgumentInfo(m, arg, arr.ptr, offset); } Class objc_getOrigClass (string name) { return bindings.objc_getOrigClass(name.toStringz()); } alias bindings.object_copy object_copy; alias bindings.object_dispose object_dispose; alias bindings.object_getClass object_getClass; alias bindings.object_setClass object_setClass; alias bindings.object_getIndexedIvars object_getIndexedIvars; alias bindings.object_getIvar object_getIvar; alias bindings.object_setIvar object_setIvar; alias bindings.objc_getClassList objc_getClassList; alias bindings.class_isMetaClass class_isMetaClass; alias bindings.class_getSuperclass class_getSuperclass; alias bindings.class_setSuperclass class_setSuperclass; alias bindings.class_getVersion class_getVersion; alias bindings.class_setVersion class_setVersion; alias bindings.class_getInstanceSize class_getInstanceSize; alias bindings.class_getInstanceMethod class_getInstanceMethod; alias bindings.class_getClassMethod class_getClassMethod; alias bindings.class_getMethodImplementation class_getMethodImplementation; alias bindings.class_getMethodImplementation_stret class_getMethodImplementation_stret; alias bindings.class_respondsToSelector class_respondsToSelector; alias bindings.class_conformsToProtocol class_conformsToProtocol; alias bindings.class_createInstance class_createInstance; alias bindings.objc_registerClassPair objc_registerClassPair; alias bindings.objc_disposeClassPair objc_disposeClassPair; alias bindings.class_addProtocol class_addProtocol; alias bindings.method_getName method_getName; alias bindings.method_getImplementation method_getImplementation; alias bindings.method_getNumberOfArguments method_getNumberOfArguments; alias bindings.method_getDescription method_getDescription; alias bindings.method_setImplementation method_setImplementation; alias bindings.method_exchangeImplementations method_exchangeImplementations; alias bindings.ivar_getOffset ivar_getOffset; alias bindings.protocol_conformsToProtocol protocol_conformsToProtocol; alias bindings.protocol_isEqual protocol_isEqual; alias bindings.protocol_getMethodDescription protocol_getMethodDescription; alias bindings.sel_isEqual sel_isEqual; alias bindings.objc_enumerationMutation objc_enumerationMutation; alias bindings.objc_setForwardHandler objc_setForwardHandler; alias bindings.sel_isMapped sel_isMapped; alias bindings.object_copyFromZone object_copyFromZone; alias bindings.object_realloc object_realloc; alias bindings.object_reallocFromZone object_reallocFromZone; alias bindings.objc_getClasses objc_getClasses; alias bindings.objc_addClass objc_addClass; alias bindings.objc_setMultithreaded objc_setMultithreaded; alias bindings.class_createInstanceFromZone class_createInstanceFromZone; alias bindings.class_addMethods class_addMethods; alias bindings.class_removeMethods class_removeMethods; alias bindings.class_poseAs class_poseAs; alias bindings.method_getSizeOfArguments method_getSizeOfArguments; alias bindings.class_respondsToMethod class_respondsToMethod; alias bindings.class_lookupMethod class_lookupMethod; alias bindings.class_nextMethodList class_nextMethodList;