/* * Support code for the GNU runtime * * NOTE: This file uses some private functions in the GNU runtime as that seems * to be the only way to properly interface with that runtime. */#include "pyobjc.h"#if defined(GNU_RUNTIME)intPyObjCRT_SetupClass(Classcls,ClassmetaCls,constchar*name,ClasssuperCls,ClassrootCls,intivarSize,structobjc_ivar_list*ivarList){/* This is a private function, but seems to be the only way to * really create the class. */externvoid__objc_install_premature_dtable(Class);/* Initialize the structure */memset(cls,0,sizeof(*cls));memset(metaCls,0,sizeof(*cls));cls->version=0;metaCls->version=0;cls->subclass_list=NULL;metaCls->subclass_list=NULL;cls->sibling_class=NULL;metaCls->sibling_class=NULL;cls->protocols=NULL;metaCls->protocols=NULL;cls->methods=NULL;metaCls->methods=NULL;cls->class_pointer=metaCls;cls->info=CLS_CLASS;metaCls->info=CLS_META;cls->name=strdup(name);if(cls->name==NULL){return-1;}metaCls->name=strdup(name);if(metaCls->name==NULL){free((char*)(cls->name));cls->name=NULL;return-1;}cls->methods=NULL;metaCls->methods=NULL;cls->super_class=superCls;metaCls->super_class=superCls->class_pointer;metaCls->class_pointer=rootCls->class_pointer;CLS_SETRESOLV(cls);CLS_SETRESOLV(metaCls);cls->instance_size=ivarSize;cls->ivars=ivarList;metaCls->instance_size=metaCls->super_class->instance_size;metaCls->ivars=NULL;cls->protocols=metaCls->protocols=NULL;__objc_install_premature_dtable(cls);__objc_install_premature_dtable(metaCls);return0;}voidPyObjCRT_AddClass(Classcls){cls->sibling_class=cls->super_class->subclass_list;cls->super_class->subclass_list=cls;cls->class_pointer->sibling_class=cls->super_class->class_pointer->subclass_list;cls->super_class->class_pointer->subclass_list=cls->class_pointer;__objc_add_class_to_hash(cls);}voidPyObjCRT_ClearClass(Classcls){if(cls->methods){MethodList_tnext,cur;cur=cls->methods;while(cur!=NULL){next=cur->method_next;free(cur);cur=next;}cls->methods=NULL;}if(cls->name){free((char*)(cls->name));cls->name=NULL;}}structobjc_method_list*PyObjCRT_AllocMethodList(intnumMethods){structobjc_method_list*mlist;mlist=malloc(sizeof(structobjc_method_list)+((numMethods+1)*sizeof(structobjc_method)));if(mlist==NULL){returnNULL;}mlist->method_count=0;mlist->method_next=NULL;returnmlist;}/* * XXX: This functions should be renamed to avoid name classes with * the actual ObjC runtime */Ivar_tclass_getInstanceVariable(ClassaClass,constchar*name){if(!aClass||!name)returnNULL;for(;aClass!=Nil;aClass=aClass->super_class){inti;if(!aClass->ivars)continue;for(i=0;i<aClass->ivars->ivar_count;i++){if(!strcmp(aClass->ivars->ivar_list[i].ivar_name,name))return&aClass->ivars->ivar_list[i];}}returnNULL;}Ivar_tobject_getInstanceVariable(idobj,constchar*name,void**out){Ivar_tvar=NULL;if(obj&&name){void**varIndex=NULL;if((var=class_getInstanceVariable(obj->class_pointer,name)))varIndex=(void**)((char*)obj+var->ivar_offset);if(out)*out=*varIndex;}returnvar;}Ivar_tobject_setInstanceVariable(idobj,constchar*name,void*value){Ivar_tvar=NULL;if(obj&&name){void**varIndex;if((var=class_getInstanceVariable(obj->class_pointer,name))){varIndex=(void**)((char*)obj+var->ivar_offset);*varIndex=value;}}returnvar;}#else /* !GNU_RUNTIME */staticintdummy__attribute__((__unused__));#endif /* !GNU_RUNTIME */