# 1 "objcrt.m" struct _PRIVATE { struct _PRIVATE *isa; }; typedef struct _PRIVATE *id; struct _SHARED { id isa; id clsSuper; char *clsName; char *clsTypes; short clsSizInstance; short clsSizDict; struct _SLT *clsDispTable; long clsStatus; struct modDescriptor *clsMod; unsigned clsVersion; id clsCats; id *clsGlbl; }; extern id (* _imp(id,char*))(); extern id (* _impSuper(id,char*))(); extern struct modDescriptor *_OBJCBIND_objcrt(void); static char **selTransTbl; struct _SLT {char *_cmd;id (*_imp)();}; struct modDescriptor { char *modName; char *modVersion; long modStatus; char *modMinSel; char *modMaxSel; id *modClsLst; short modSelRef; char **modSelTbl; struct methodDescriptor *modMapTbl; }; extern struct modDescriptor objcrt_modDesc; # 1 "../../util/stdarg.h" #include # 1 "../../util/stdio.h" #include # 1 "../../util/stddef.h" #include # 55 "objcrt.h" typedef char*SEL; typedef char*STR; typedef char BOOL; typedef FILE*IOD; typedef id SHR; # 64 "objcrt.h" typedef id(*IMP)(); typedef void(*ARGIMP)(id,SEL,void*); # 1 "../../util/stdarg.h" #include # 117 "objcrt.h" struct objcrt_private { id isa; # 123 "objcrt.h" unsigned short attr; unsigned short objID; }; struct objcrt_shared { id isa; # 134 "objcrt.h" id clsSuper; char*clsName; char*clsTypes; short clsSizInstance; short clsSizDict; struct objcrt_slt*clsDispTable; long clsStatus; struct objcrt_modDescriptor*clsMod; unsigned clsVersion; id clsCats; id*clsGlbl; }; typedef struct objcrt_shared*Cls_t; # 179 "objcrt.h" struct objcrt_slt { SEL _cmd; IMP _imp; }; # 189 "objcrt.h" struct objcrt_useDescriptor { int processed; struct objcrt_useDescriptor*next; struct objcrt_useDescriptor***uses; struct objcrt_modDescriptor*(*bind)(); }; # 201 "objcrt.h" typedef struct hashedSelector { struct hashedSelector*next; STR key; } HASH,*PHASH; # 213 "objcrt.h" typedef struct objcrt_modDescriptor MOD,*PMOD; typedef struct objcrt_methodDescriptor METH,*PMETH; struct objcrt_modDescriptor { STR modName; STR modVersion; long modStatus; SEL modMinSel; SEL modMaxSel; id*modClsLst; short modSelRef; SEL*modSelTbl; PMETH modMapTbl; }; struct objcrt_modEntry { PMOD(*modLink)(); PMOD modInfo; }; typedef struct objcrt_modEntry*Mentry_t; struct objcrt_methodDescriptor { id*cls; SEL*sel; IMP imp; }; # 256 "objcrt.h" extern BOOL msgFlag; extern FILE*msgIOD; extern FILE*dbgIOD; extern BOOL allocFlag; extern BOOL dbgFlag; extern BOOL noCacheFlag; extern BOOL noNilRcvr; # 269 "objcrt.h" SEL selUid(STR); STR selName(SEL); void dbg(char*fmt,...); void prnstack(FILE*file); void loadobjc(void*modPtr); void unloadobjc(void*modPtr); # 287 "objcrt.h" IMP _imp(id,SEL); IMP _impSuper(id,SEL); # 292 "objcrt.h" IMP fwdimp(id,SEL,IMP); IMP fwdimpSuper(id,SEL,IMP); void fwdmsg(id,SEL,void*,ARGIMP); id selptrfwd(id,SEL,id,id,id,id); id idincref(id obj); id idassign(id*lhs,id rhs); id iddecref(id obj); # 321 "objcrt.h" extern id(*oc_alloc)(id,unsigned int); extern id(*oc_dealloc)(id); extern id(*oc_copy)(id,unsigned int); extern id(*oc_error)(id,STR,va_list); extern id(*oc_cvtToId)(STR); extern SEL(*oc_cvtToSel)(STR); extern id(*_fileIn)(FILE*); extern BOOL(*_fileOut)(FILE*,id); extern BOOL(*_storeOn)(STR,id); extern id(*_readFrom)(STR); void setfilein(id(*f)(FILE*)); void setfileout(BOOL(*f)(FILE*,id)); extern id(*_showOn)(id,unsigned); void*OC_Malloc(size_t); void*OC_MallocAtomic(size_t); void*OC_Calloc(size_t); void*OC_Realloc(void*,size_t); void*OC_Free(void*data); void addSubclassesTo(id c,STR name); id newsubclass(STR name,id superClass,int ivars,int cvars); void linkclass(id aclass); void unlinkclass(id aclass); void addMethods(id src,id dst); void poseAs(id posing,id target); id swapclass(id self,id target); # 1 "../../util/string.h" #include # 1 "../../util/stdio.h" #include # 42 "Block.h" extern id newBlock(int n,IMP fn,void*data,IMP dtor); # 1 "../../util/stdio.h" #include # 1 "../../util/stdio.h" #include # 1 "../../util/assert.h" #include # 1 "../../util/stdlib.h" #include # 1 "../../util/string.h" #include # 61 "objcrt.m" static BOOL isfactory(Cls_t cls) { return(cls)->clsStatus&0x1L; } static BOOL ismeta(Cls_t cls) { return(cls)->clsStatus&0x2L; } static BOOL iscatgry(Cls_t cls) { return(cls)->clsStatus&0x40L; } static Cls_t getmeta(Cls_t cls) { return ismeta(cls)?cls:((Cls_t)(cls->isa)); } static BOOL initlzd(Cls_t cls) { return getmeta(cls)->clsStatus&0x4L; } static void markinitlzd(Cls_t cls) { getmeta(cls)->clsStatus|=0x4L; } static BOOL ismapped(Cls_t aCls) { return(aCls)->clsStatus&0x10L; } static void markmapped(Cls_t aCls) { aCls->clsStatus|=0x10L; } static id getisa(id anObject) { return anObject->isa; # 117 "objcrt.m" } static void setisa(id anObject,id aClass) { anObject->isa=aClass; # 127 "objcrt.m" } static short nstsize(id aClass) { return((Cls_t)(aClass))->clsSizInstance; } # 138 "objcrt.m" static PHASH*hashList; static int nHashLists; # 149 "objcrt.m" static void markmodmapped(struct objcrt_modDescriptor*aMod) { (aMod)->modStatus|=0x2L; } static BOOL morethanone(struct objcrt_modDescriptor*aMod) { return(aMod)->modStatus&0x4L; } static SEL minsel,maxsel; static BOOL isminmaxsel(SEL s) { return(minsel<=s)&&(s<=maxsel); } # 185 "objcrt.m" extern Mentry_t _objcModules; # 195 "objcrt.m" typedef struct modnode { Mentry_t objcmodules; struct modnode*next; }* modnode_t; static modnode_t modnodelist; static modnode_t newmodnode(Mentry_t me,modnode_t next) { modnode_t r; r=(modnode_t)OC_Malloc(sizeof(struct modnode)); r->next=next; r->objcmodules=me; return r; } static void freemodnode(modnode_t*n,modnode_t m) { * n=m->next; OC_Free(m); } # 227 "objcrt.m" static id outOfMem; void* OC_Malloc(size_t nBytes) { id objcT0; # 232 "objcrt.m" void*data; if( !nBytes) nBytes=sizeof(void*); if(nBytes>32*1024) dbg("OC_Malloc call for %i bytes\n",nBytes); # 243 "objcrt.m" data=malloc(nBytes); # 247 "objcrt.m" if( !data) (objcT0=outOfMem,(*_imp(objcT0,selTransTbl[0]))(objcT0,selTransTbl[0])); return data; } void* OC_MallocAtomic(size_t nBytes) { id objcT1; # 255 "objcrt.m" void*data; if( !nBytes) nBytes=sizeof(void*); if(nBytes>32*1024) dbg("OC_MallocAtomic call for %i bytes\n",nBytes); # 265 "objcrt.m" data=malloc(nBytes); # 269 "objcrt.m" if( !data) (objcT1=outOfMem,(*_imp(objcT1,selTransTbl[0]))(objcT1,selTransTbl[0])); return data; } void* OC_Calloc(size_t nBytes) { char*p; p=(char*)OC_Malloc(nBytes); memset(p,0,nBytes); return(void*)p; } void* OC_Realloc(void*data,size_t nBytes) { id objcT2; if( !nBytes) nBytes=sizeof(void*); if(nBytes>32*1024) dbg("OC_Realloc call for %i bytes\n",nBytes); # 298 "objcrt.m" data=realloc(data,nBytes); # 302 "objcrt.m" if( !data) (objcT2=outOfMem,(*_imp(objcT2,selTransTbl[0]))(objcT2,selTransTbl[0])); return data; } void* OC_Free(void*data) { # 313 "objcrt.m" free(data); return NULL; } # 355 "objcrt.m" id idassign(id*lhs,id rhs) { # 376 "objcrt.m" return( *lhs=rhs); } id idincref(id rhs) { # 392 "objcrt.m" return rhs; } id iddecref(id e) { # 411 "objcrt.m" return(id)0; } # 40 "Object.h" extern id Object; # 414 "objcrt.m" static id nstalloc(id aClass,unsigned int nBytes) { id objcT3; # 417 "objcrt.m" id anObject; unsigned aSize; if( !aClass) (objcT3=Object,(*(id(*)(id,SEL,STR,...))_imp(objcT3,selTransTbl[1]))(objcT3,selTransTbl[1],"alloc: nil class")); aSize=nstsize(aClass)+nBytes; anObject=(id)OC_Calloc(aSize); # 429 "objcrt.m" setisa(anObject,aClass); return anObject; } static id nstcopy(id anObject,unsigned int nBytes) { char*p,*q; id newObject; unsigned aSize; id aClass=getisa(anObject); aSize=nstsize(aClass)+nBytes; newObject=(id)OC_Malloc(aSize); p=(char*)newObject; q=(char*)anObject; # 455 "objcrt.m" memcpy(p,q,aSize); # 460 "objcrt.m" (void)0; return newObject; } static id nstdealloc(id anObject) { setisa(anObject,(id)0); OC_Free(anObject); # 477 "objcrt.m" return(id)0; } id(*oc_alloc)(id,unsigned int)=nstalloc; id(*oc_copy)(id,unsigned int)=nstcopy; # 485 "objcrt.m" id(*oc_dealloc)(id)=nstdealloc; # 508 "objcrt.m" typedef struct _msgframe { struct _msgframe*prev; id(*ret)(); struct _argframe { id receiver; SEL cmd; int arg; } argfrm; }* msgframe; # 568 "objcrt.m" void prnstack(FILE*firstArg) { # 575 "objcrt.m" FILE*stream=firstArg; msgframe pf,f=((msgframe)((unsigned) &firstArg-((unsigned) &(((msgframe)0)->argfrm.receiver)))); int nsels=0; SEL sels[100]; fprintf(stream,"Message backtrace:\n"); for(pf=f->prev;(1&&(((unsigned)(pf)&0xfff00000)!=0)&&(pf)<(pf)->prev)&&nsels<100;f=pf,pf=pf->prev) { SEL s=f->argfrm.cmd; if(isminmaxsel(s)&&1&&selUid(s)!=NULL) sels[nsels++]=s; } while(nsels--) fprintf(stream," %.80s\n",sels[nsels]); } # 603 "objcrt.m" static id reportv(id self,STR fmt,va_list ap) { fflush(stderr); prnstack(stderr); fprintf(stderr,"error: "); vfprintf(stderr,fmt,ap); fprintf(stderr,"\n"); abort(); return self; } static id report(id self,STR fmt,...) { va_list ap; va_start(ap,fmt); reportv(self,fmt,ap); va_end(ap); return self; } id(*oc_error)(id self,STR fmt,va_list ap)=reportv; # 636 "objcrt.m" static void nofiler(void) { id objcT4; # 639 "objcrt.m" (objcT4=Object,(*(id(*)(id,SEL,STR,...))_imp(objcT4,selTransTbl[1]))(objcT4,selTransTbl[1],"No filer class linked into application.")); } static id readfilein(STR aFileName) { FILE*f; id r=(id)0; if((f=fopen(aFileName,"r"))) { r=( *_fileIn)(f); fclose(f); } return r; } static BOOL storefileout(STR aFileName,id anObject) { FILE*f; BOOL r=(BOOL)0; if((f=fopen(aFileName,"w"))) { r=( *_fileOut)(f,anObject); fclose(f); } return r; } static id nofilein(FILE*f) { nofiler(); return(id)0; } static BOOL nofileout(FILE*f,id anObject) { nofiler(); return(BOOL)0; } id(*_fileIn)(FILE*)=nofilein; id(*_readFrom)(STR)=readfilein; BOOL(*_fileOut)(FILE*,id)=nofileout; BOOL(*_storeOn)(STR,id)=storefileout; void setfilein(id(*f)(FILE*)) { _fileIn=f; } void setfileout(BOOL(*f)(FILE*,id)) { _fileOut=f; } # 703 "objcrt.m" id __showOn(id self,unsigned level) { ( *_fileOut)(stderr,self); return(id)0; } id(*_showOn)(id,unsigned)=__showOn; # 720 "objcrt.m" static int strCmp(char*s1,char*s2) { int r; int c1,c2; while(1) { c1= *s1++; c2= *s2++; if(c1=='\0') return(c2==0)?0: -1; if(c2=='\0') return 1; if((r=c1-c2)) return r; } return 0; } static unsigned strHash(char*s) { unsigned hash=0; while(1) { if( *s=='\0') break; else hash^= *s++; if( *s=='\0') break; else hash^=( *s++<<8); if( *s=='\0') break; else hash^=( *s++<<16); if( *s=='\0') break; else hash^=( *s++<<24); } return hash; } static void hashInit() { int i; nHashLists=73; hashList=(PHASH*)OC_Malloc(nHashLists*sizeof(PHASH)); for(i=0;inext=link; n=strlen(key); obj->key=(STR)OC_Malloc(n+1); strcpy(obj->key,key); return obj; } static PHASH search(STR key,int*slot,PHASH*prev) { PHASH target; * slot=strHash(key)%nHashLists; * prev=0; target=hashList[ *slot]; while(target&&(strCmp(key,target->key)!=0)) { * prev=target; target=target->next; } return target; } static PHASH hashEnter(STR key,int slot) { (void)0; if(minsel) { if(keymaxsel) maxsel=key; } else { minsel=key; maxsel=key; } if(slot<0) slot=strHash(key)%nHashLists; hashList[slot]=hashNew(key,hashList[slot]); return hashList[slot]; } static PHASH hashLookup(STR key,int*slot) { PHASH prev; return search(key,slot, &prev); } # 893 "objcrt.m" static void mapsels(PMOD info,SEL*sel) { PHASH ent; int i,slot; for(i=0;imodSelRef;i++) { SEL k; if( !(ent=hashLookup(info->modSelTbl[i], &slot))) { ent=hashEnter(info->modSelTbl[i],slot); } k=ent->key; if(sel!=0&& *sel==info->modSelTbl[i]) { * sel=k; } info->modSelTbl[i]=k; } markmodmapped(info); } static void mapcls(Cls_t cls) { PHASH ent; int i,slot; for(i=0;iclsSizDict;i++) { if( !(ent=hashLookup(cls->clsDispTable[i]._cmd, &slot))) { ent=hashEnter(cls->clsDispTable[i]._cmd,slot); } cls->clsDispTable[i]._cmd=ent->key; } markmapped(cls); } static void mapclass(Cls_t cls) { if( !ismapped(cls)) mapcls(cls); while(isfactory(cls)) { cls=getmeta(cls); if( !ismapped(cls)) mapcls(cls); } } # 964 "objcrt.m" static BOOL objcinitflag; # 973 "objcrt.m" static struct objcrt_useDescriptor*modlist=0; static int bindcnt=0; extern struct objcrt_useDescriptor*OCU_main; # 984 "objcrt.m" static void traverse(struct objcrt_useDescriptor*desc) { struct objcrt_useDescriptor***nxt; desc->processed=1; for(nxt=desc->uses; *nxt;nxt++) { if( * *nxt&& !(( * *nxt)->processed)) traverse( * *nxt); } # 1005 "objcrt.m" if(desc->bind) { desc->next=modlist; modlist=desc; bindcnt++; } } static Mentry_t findmods(struct objcrt_useDescriptor*desc) { Mentry_t tmp; unsigned aSize; Mentry_t theModules; struct objcrt_useDescriptor*md; if(desc&& !(desc->processed)) traverse(desc); aSize=(bindcnt+1)*sizeof(struct objcrt_modEntry); theModules=(Mentry_t)OC_Malloc(aSize); # 1031 "objcrt.m" for(md=modlist,tmp=theModules;md;md=md->next,tmp++) { tmp->modLink=md->bind; tmp->modInfo=0; } tmp->modLink=0; tmp->modInfo=0; return theModules; } static void initsels(Mentry_t modPtr) { static int needHashInit=1; # 1053 "objcrt.m" if(needHashInit) { hashInit(); needHashInit=0; } for(;modPtr&&modPtr->modLink;modPtr++) { PMOD info=modPtr->modInfo=( *modPtr->modLink)(); if(info) { id*cls; if(info->modSelTbl) mapsels(info,0); cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) mapclass(((Cls_t)( *cls++))); } else { if(cls) mapclass(((Cls_t)( *cls))); } } } } static void initcls(id cls) { id objcT5; # 1089 "objcrt.m" Cls_t aCls=((Cls_t)(cls)); if(initlzd(aCls)) return; # 1106 "objcrt.m" if(aCls->clsSuper) { initcls(aCls->clsSuper); } # 1116 "objcrt.m" if(initlzd(aCls)) return; markinitlzd(aCls); if(iscatgry(aCls)) addMethods(cls,aCls->clsSuper); (objcT5=cls,(*_imp(objcT5,selTransTbl[2]))(objcT5,selTransTbl[2])); } static void initmods(Mentry_t modPtr) { for(;modPtr->modInfo;modPtr++) { id*cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) { initcls( *cls); cls++; } } else { if(cls&& *cls) { initcls( *cls); } } } } # 1162 "objcrt.m" static void msgiods(void) { STR s; dbgIOD=stderr; if((s=(getenv("OBJCRTDBG")))) { dbgFlag=(BOOL)1; if(strcmp(s,"stderr")==0) { dbgIOD=stderr; } else { dbgIOD=fopen(s,"w"); setbuf(dbgIOD,NULL); } } msgIOD=stderr; if((s=(getenv("OBJCRTMSG")))) { msgFlag=(BOOL)1; if(strcmp(s,"stderr")==0) { msgIOD=stderr; } else { msgIOD=fopen(s,"w"); if(dbgFlag) setbuf(msgIOD,NULL); } } # 1204 "objcrt.m" } # 28 "OutOfMem.h" extern id OutOfMemory; # 1206 "objcrt.m" int _objcInitNoShared( Mentry_t _objcModules,struct objcrt_useDescriptor*OCU_main) { modnode_t m; if(objcinitflag) { return 1; } else { id objcT6; msgiods(); # 1225 "objcrt.m" if( !_objcModules) _objcModules=findmods(OCU_main); loadobjc(_objcModules); # 1235 "objcrt.m" for(m=modnodelist;m;m=m->next) initsels(m->objcmodules); for(m=modnodelist;m;m=m->next) initmods(m->objcmodules); # 1245 "objcrt.m" outOfMem=(objcT6=OutOfMemory,(*_imp(objcT6,selTransTbl[3]))(objcT6,selTransTbl[3])); # 1251 "objcrt.m" objcinitflag=(BOOL)1; return 0; } } # 1263 "objcrt.m" int oc_objcInit(int debug,BOOL traceInit) { return _objcInitNoShared(_objcModules,OCU_main); } # 1276 "objcrt.m" STR selName(SEL sel) { if(isminmaxsel(sel)) { return(STR)(sel); } else { return NULL; } } SEL selUid(STR sel) { int slot; PHASH retVal; if((retVal=hashLookup(sel, &slot))) return(SEL)retVal->key; return NULL; } static SEL cvtToSel(STR aString) { if(aString==NULL) return NULL; return selUid(aString); } static id cvtToId(STR aClassName) { modnode_t m; Mentry_t modPtr; if(aClassName==NULL) return(id)0; for(m=modnodelist;m;m=m->next) { for(modPtr=m->objcmodules;modPtr&&modPtr->modLink;modPtr++) { id*cls; Cls_t aCls; cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) { aCls=((Cls_t)( *cls)); if(strCmp(aCls->clsName,aClassName)==0) { return *cls; } cls++; } } else { if(cls) { aCls=((Cls_t)( *cls)); if(strCmp(aCls->clsName,aClassName)==0) return *cls; } } } } return(id)0; } id(*oc_cvtToId)(STR)=cvtToId; SEL(*oc_cvtToSel)(STR)=cvtToSel; # 1362 "objcrt.m" static BOOL issubclass(Cls_t aCls,STR aClassname) { if(aCls->clsSuper) { Cls_t clsSuper=((Cls_t)(aCls->clsSuper)); return strCmp(clsSuper->clsName,aClassname)==0; } else { return 0; } } void addSubclassesTo(id c,STR aClassname) { modnode_t m; Mentry_t modPtr; for(m=modnodelist;m;m=m->next) { for(modPtr=m->objcmodules;modPtr&&modPtr->modLink;modPtr++) { id*cls; Cls_t aCls; cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) { id objcT7; # 1395 "objcrt.m" aCls=((Cls_t)( *cls)); if(issubclass(aCls,aClassname)) (objcT7=c,(*_imp(objcT7,selTransTbl[4]))(objcT7,selTransTbl[4], *cls)); cls++; } } else { if(cls) { id objcT8; # 1405 "objcrt.m" aCls=((Cls_t)( *cls)); if(issubclass(aCls,aClassname)) (objcT8=c,(*_imp(objcT8,selTransTbl[4]))(objcT8,selTransTbl[4], *cls)); } } } } } # 1420 "objcrt.m" static id newShared(int aSize) { return(id)OC_Malloc(aSize); } static id newMeta(STR name,id superClass,int esize) { id m; Cls_t n; m=newShared(sizeof(struct objcrt_shared)); n=((Cls_t)(m)); n->isa=((Cls_t)(superClass))->isa; n->clsSuper=superClass; n->clsName=name; n->clsTypes=((Cls_t)(superClass))->clsTypes; n->clsSizInstance=((Cls_t)(superClass))->clsSizInstance+esize; n->clsSizDict=0; n->clsDispTable=NULL; n->clsStatus=0; n->clsMod=NULL; n->clsVersion=((Cls_t)(superClass))->clsVersion; n->clsGlbl=NULL; return m; } static id newClass(STR name,id superClass,int eisize,int ecsize) { id m,meta; Cls_t n,c; meta=newMeta(name,((Cls_t)(superClass))->isa,ecsize); m=newShared(((Cls_t)(meta))->clsSizInstance); n=((Cls_t)(m)); c=((Cls_t)(superClass)); n->isa=meta; n->clsSuper=superClass; n->clsName=name; n->clsTypes=c->clsTypes; n->clsSizInstance=c->clsSizInstance+eisize; n->clsSizDict=0; n->clsDispTable=NULL; n->clsStatus=0; n->clsMod=NULL; n->clsVersion=c->clsVersion; n->clsGlbl=NULL; return m; } static PMOD newModDesc(id*clsLst) { PMOD mod=(PMOD)OC_Malloc(sizeof(MOD)); mod->modName="dynamic"; mod->modName="2.3.15"; mod->modStatus=0; mod->modMinSel=NULL; mod->modMaxSel=NULL; mod->modClsLst=clsLst; mod->modSelRef=0; mod->modSelTbl=NULL; mod->modMapTbl=NULL; return mod; } static PMOD dynMod; static PMOD dynBIND(void) { return dynMod; } static void addModEntry(id aCls) { id*clsLst; Mentry_t entry,sentin; entry=(Mentry_t)OC_Malloc(2*sizeof(struct objcrt_modEntry)); clsLst=OC_Malloc(sizeof(id)); * clsLst=aCls; dynMod=newModDesc(clsLst); entry->modLink=dynBIND; entry->modInfo=NULL; sentin=entry+1; sentin->modLink=NULL; sentin->modInfo=NULL; loadobjc(entry); } id newsubclass(STR name,id superClass,int ivars,int cvars) { return newClass(name,superClass,ivars,cvars); } void linkclass(id aclass) { addModEntry(aclass); } void unlinkclass(id aclass) { modnode_t m; Mentry_t modPtr; if(aclass==(id)0) return; for(m=modnodelist;m;m=m->next) { for(modPtr=m->objcmodules;modPtr&&modPtr->modLink;modPtr++) { id*cls; cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) { if( *cls==aclass) { unloadobjc(modPtr); return; } cls++; } } else { if(cls) { if( *cls==aclass) { unloadobjc(modPtr); return; } } } } } } # 1591 "objcrt.m" char* objcrt_bindError(char*m) { fprintf(stderr,"objcrt initialization error (_OBJCBIND_%s)",m); return NULL; } static void prnframe(FILE*f,id obj,SEL sel,BOOL isSuper) { char*nam,*fac; if(obj) { Cls_t cls=((Cls_t)(getisa(obj))); nam=cls->clsName; fac=(ismeta(cls))?"+":"-"; } else { nam="nil"; fac=""; } fprintf(f,(isSuper?"%s\t%s%s\tsuper\n":"%s\t%s%s\n"),nam,fac,sel); } static id _errHandler(id self,SEL sel) { if(sel==selTransTbl[5]) { char*msg; msg="Completely messed up: Object does not recognize -doesNotRecognize:"; return report(self,msg); } else { id objcT9; # 1629 "objcrt.m" return(objcT9=self,(*(id(*)(id,SEL,SEL))_imp(objcT9,selTransTbl[5]))(objcT9,selTransTbl[5],sel)); } } static id _nofwdHandler(id self,SEL sel) { return report(self,"'%s': This type of message cannot be forwarded.",sel); } static id _freedHandler(id self,SEL sel) { return report(self,"Message '%s' sent to freed object.",sel); } # 1648 "objcrt.m" BOOL noNilRcvr=(BOOL)0; id _nilHandler(id self,SEL sel) { return(noNilRcvr)?report(self,"Message '%s' sent to nil.",sel):(id)0; } # 1668 "objcrt.m" static id clsCache[1031]; static SEL selCache[1031]; static IMP impCache[1031]; static void flushCache(void) { int i=0; for(i=0;i<1031;i++) clsCache[i]=(id)0; } FILE*msgIOD; BOOL msgFlag=(BOOL)0; BOOL noCacheFlag=(BOOL)0; BOOL dbgFlag=(BOOL)0; BOOL allocFlag=(BOOL)0; FILE*dbgIOD; # 1718 "objcrt.m" static IMP _getImp(id cls,SEL sel,int index,IMP fwd) { Cls_t wCls; id ncls=cls; do { int n; struct objcrt_slt*smt; wCls=((Cls_t)(ncls)); smt=wCls->clsDispTable; for(n=0;nclsSizDict;n++,smt++) { if(sel==smt->_cmd) { if(noCacheFlag) { return smt->_imp; } else { IMP imp=smt->_imp; selCache[index]=sel; clsCache[index]=cls; impCache[index]=imp; return imp; } } } } while((ncls=wCls->clsSuper)); if(objcinitflag) { return(fwd)?fwd:_nofwdHandler; } else { return _errHandler; } } # 1773 "objcrt.m" IMP _imp(id aRecvr,SEL aSel) { return fwdimp(aRecvr,aSel,(IMP)_errHandler); } IMP _impSuper(id aRecvr,SEL aSel) { return fwdimpSuper(aRecvr,aSel,(IMP)_errHandler); } IMP fwdimp(id aRecvr,SEL aSel,IMP fwd) { id shr; int index; Cls_t wCls; BOOL inSuper=(BOOL)0; if(msgFlag) prnframe(msgIOD,aRecvr,aSel,inSuper); if( !aRecvr) return(IMP)_nilHandler; shr=getisa(aRecvr); if( !shr) return(IMP)_freedHandler; index=(int)((((unsigned long)aSel)^((unsigned long)shr))%1031); if( !noCacheFlag) { if(clsCache[index]==shr&&selCache[index]==aSel) { IMP imp=impCache[index]; return imp; } } # 1818 "objcrt.m" if(ismeta((wCls=((Cls_t)(shr))))) { if( !initlzd(wCls)) initcls(aRecvr); } else { if( !initlzd(wCls)) initcls(shr); } return _getImp(shr,aSel,index,fwd); } IMP fwdimpSuper(id aClass,SEL aSel,IMP fwd) { int index; BOOL inSuper=(BOOL)1; if(msgFlag) prnframe(msgIOD,aClass,aSel,inSuper); if( !aClass) return(IMP)_nilHandler; index=(int)((((unsigned long)aSel)^((unsigned long)aClass))%1031); if( !noCacheFlag) { if(clsCache[index]==aClass&&selCache[index]==aSel) { IMP imp=impCache[index]; return imp; } } return _getImp(aClass,aSel,index,fwd); } # 37 "Message.h" extern id Message; # 1860 "objcrt.m" void fwdmsg(id self,SEL sel,void*args,ARGIMP disp) { if(sel==selTransTbl[6]) { char*msg; msg="Completely messed up: Object does not understand -doesNotUnderstand:"; report(self,msg); } else { id objcT10,objcT11,objcT12; # 1871 "objcrt.m" id msg=(objcT10=Message,(*(id(*)(id,SEL,SEL,ARGIMP,void*))_imp(objcT10,selTransTbl[7]))(objcT10,selTransTbl[7],sel,disp,args)); (objcT11=self,(*_imp(objcT11,selTransTbl[6]))(objcT11,selTransTbl[6],msg)); msg=(objcT12=msg,(*_imp(objcT12,selTransTbl[8]))(objcT12,selTransTbl[8])); } } static void selptrdisp(id self,SEL sel,id*p) { p[0]=( *fwdimp(self,sel,selptrfwd))(self,sel,p[1],p[2],p[3],p[4]); } id selptrfwd(id self,SEL sel,id a,id b,id c,id d) { id p[5]; p[1]=a; p[2]=b; p[3]=c; p[4]=d; fwdmsg(self,sel,p,(ARGIMP)selptrdisp); return p[0]; } # 1900 "objcrt.m" void dbg(char*fmt,...) { if(dbgFlag) { va_list arglist; va_start(arglist,fmt); vfprintf(dbgIOD,fmt,arglist); va_end(arglist); fflush(dbgIOD); } } # 1920 "objcrt.m" static struct objcrt_slt* newDispTable(int n) { return(struct objcrt_slt*)OC_Malloc(n*sizeof(struct objcrt_slt)); } static void copyDispTable(struct objcrt_slt*dst,struct objcrt_slt*src,int n) { while(n--) { dst->_imp=src->_imp; dst->_cmd=src->_cmd; dst++; src++; } } static void freeDispTable(struct objcrt_slt*self) { } static void addnstmeth(Cls_t src,Cls_t dst) { struct objcrt_slt*n=newDispTable(dst->clsSizDict+src->clsSizDict); copyDispTable(n,dst->clsDispTable,dst->clsSizDict); copyDispTable(n+dst->clsSizDict,src->clsDispTable,src->clsSizDict); dst->clsSizDict+=src->clsSizDict; freeDispTable(dst->clsDispTable); dst->clsDispTable=n; } void addMethods(id isrc,id idst) { STR srcName,dstName; Cls_t src=((Cls_t)(isrc)); Cls_t dst=((Cls_t)(idst)); if(src==dst) return; # 1971 "objcrt.m" srcName=src->clsName; dstName=dst->clsName; if(src->clsSuper&&((Cls_t)(src->clsSuper))!=dst) { id objcT13; # 1976 "objcrt.m" (objcT13=isrc,(*(id(*)(id,SEL,STR,...))_imp(objcT13,selTransTbl[1]))(objcT13,selTransTbl[1],"addMethods: %s not direct subclass of %s.", srcName,dstName)); } if(src->clsSizInstance!=dst->clsSizInstance) { id objcT14; # 1982 "objcrt.m" (objcT14=isrc,(*(id(*)(id,SEL,STR,...))_imp(objcT14,selTransTbl[1]))(objcT14,selTransTbl[1],"addMethods: %s adds instance variables to %s.", srcName,dstName)); } addnstmeth(src,dst); addnstmeth(getmeta(src),getmeta(dst)); flushCache(); } # 1999 "objcrt.m" id swapclass(id self,id other) { # 2009 "objcrt.m" return self; } void poseAs(id iposing,id itarget) { modnode_t m; Mentry_t modPtr; STR newName,posingName,targetName; Cls_t posing=((Cls_t)(iposing)); Cls_t target=((Cls_t)(itarget)); if(posing==target) return; # 2030 "objcrt.m" posingName=posing->clsName; targetName=target->clsName; if( !((target)->clsStatus&0x8L)) { id objcT15; # 2035 "objcrt.m" (objcT15=itarget,(*(id(*)(id,SEL,STR,...))_imp(objcT15,selTransTbl[1]))(objcT15,selTransTbl[1],"poseAs: %s needs to be recompiled",targetName)); } if(posing->clsSuper&&((Cls_t)(posing->clsSuper))!=target) { id objcT16; # 2040 "objcrt.m" (objcT16=iposing,(*(id(*)(id,SEL,STR,...))_imp(objcT16,selTransTbl[1]))(objcT16,selTransTbl[1],"poseAs: %s not direct subclass of %s.", posingName,targetName)); } if(posing->clsSizInstance!=target->clsSizInstance) { id objcT17; # 2046 "objcrt.m" (objcT17=iposing,(*(id(*)(id,SEL,STR,...))_imp(objcT17,selTransTbl[1]))(objcT17,selTransTbl[1],"poseAs: %s adds instance variables to %s.", posingName,targetName)); } # 2055 "objcrt.m" newName=(char*)OC_Malloc(strlen(targetName)+2+1); strcpy(newName,"_%"); strcpy(newName+2,targetName); posing->clsName=targetName; getmeta(posing)->clsName=getmeta(target)->clsName; target->clsName=newName+1; getmeta(target)->clsName=newName; # 2068 "objcrt.m" for(m=modnodelist;m;m=m->next) { for(modPtr=m->objcmodules;modPtr&&modPtr->modLink;modPtr++) { id*cls; Cls_t aCls; cls=modPtr->modInfo->modClsLst; if(morethanone(modPtr->modInfo)) { while( *cls) { aCls=((Cls_t)( *cls++)); if(aCls==posing) continue; if(aCls->clsSuper==itarget) { aCls->clsSuper=iposing; getmeta(aCls)->clsSuper=posing->isa; } } } else { if(cls) { aCls=((Cls_t)( *cls)); if(aCls==posing) continue; if(aCls->clsSuper==itarget) { aCls->clsSuper=iposing; getmeta(aCls)->clsSuper=posing->isa; } } } } } (void)0; if(target->clsGlbl) * (target->clsGlbl)=iposing; flushCache(); } # 2122 "objcrt.m" static void initobjc(Mentry_t modPtr) { initsels(modPtr); initmods(modPtr); } void loadobjc(void*p) { Mentry_t modPtr=(Mentry_t)p; if( !modPtr) report((id)0,"loadobjc with NULL argument"); # 2146 "objcrt.m" modnodelist=newmodnode(modPtr,modnodelist); if( !objcinitflag) { return; } else { initobjc(modPtr); return; } } void unloadobjc(void*p) { id objcT18; # 2162 "objcrt.m" modnode_t m,*n; Mentry_t modPtr=(Mentry_t)p; if( !modPtr) report((id)0,"unloadobjc with NULL argument"); for(n=( &modnodelist),m=( *n);m;m=( *n)) { if(modPtr==m->objcmodules) { freemodnode(n,m); flushCache(); return; } else { n= &(m->next); } } (objcT18=Object,(*(id(*)(id,SEL,STR,...))_imp(objcT18,selTransTbl[1]))(objcT18,selTransTbl[1],"unloadobjc() for module that is not loaded.")); } static char *_selTransTbl[] ={ "signal", "error:", "initialize", "new", "add:", "doesNotRecognize:", "doesNotUnderstand:", "selector:dispatch:args:", "free", 0 }; struct modDescriptor objcrt_modDesc = { "objcrt", "objc3.2.8", 0L, 0, 0, 0, 9, _selTransTbl, 0 }; struct modDescriptor *_OBJCBIND_objcrt(void) { selTransTbl = _selTransTbl; return &objcrt_modDesc; } int _OBJCPOSTLINK_objcrt = 1;