📄 objbin.c
字号:
NAME : BloadObjects DESCRIPTION : This routine moves through the class and handler binary arrays updating pointers INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Pointers reset from array indices NOTES : Assumes all loading is finished **************************************************************/static void BloadObjects( void *theEnv) { size_t space; GenReadBinary(theEnv,(void *) &space,sizeof(size_t)); if (space == 0L) return; if (ObjectBinaryData(theEnv)->ModuleCount != 0L) BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->ModuleCount,sizeof(BSAVE_DEFCLASS_MODULE),UpdateDefclassModule); if (ObjectBinaryData(theEnv)->ClassCount != 0L) { BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->ClassCount,sizeof(BSAVE_DEFCLASS),UpdateDefclass); BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->LinkCount,sizeof(DEFCLASS *),UpdateLink); BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->SlotNameCount,sizeof(BSAVE_SLOT_NAME),UpdateSlotName); BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->SlotCount,sizeof(BSAVE_SLOT_DESC),UpdateSlot); if (ObjectBinaryData(theEnv)->TemplateSlotCount != 0L) BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->TemplateSlotCount,sizeof(long),UpdateTemplateSlot); if (ObjectBinaryData(theEnv)->SlotNameMapCount != 0L) { space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount); GenReadBinary(theEnv,(void *) ObjectBinaryData(theEnv)->MapslotArray,space); } if (ObjectBinaryData(theEnv)->HandlerCount != 0L) { BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->HandlerCount,sizeof(BSAVE_HANDLER),UpdateHandler); space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->HandlerCount); GenReadBinary(theEnv,(void *) ObjectBinaryData(theEnv)->MaphandlerArray,space); } UpdatePrimitiveClassesMap(theEnv); } }/*************************************************** NAME : UpdatePrimitiveClassesMap DESCRIPTION : Resets the pointers for the global primitive classes map INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : PrimitiveClassMap pointers set into bload array NOTES : Looks at first nine primitive type codes in the source file CONSTANT.H ***************************************************/static void UpdatePrimitiveClassesMap( void *theEnv) { register unsigned i; for (i = 0 ; i < OBJECT_TYPE_CODE ; i++) DefclassData(theEnv)->PrimitiveClassMap[i] = (DEFCLASS *) &ObjectBinaryData(theEnv)->DefclassArray[i]; }/********************************************************* Refresh update routines for bsaved COOL structures *********************************************************/static void UpdateDefclassModule( void *theEnv, void *buf, long obji) { BSAVE_DEFCLASS_MODULE *bdptr; bdptr = (BSAVE_DEFCLASS_MODULE *) buf; UpdateDefmoduleItemHeader(theEnv,&bdptr->header,&ObjectBinaryData(theEnv)->ModuleArray[obji].header, (int) sizeof(DEFCLASS),(void *) ObjectBinaryData(theEnv)->DefclassArray); }static void UpdateDefclass( void *theEnv, void *buf, long obji) { BSAVE_DEFCLASS *bcls; DEFCLASS *cls; bcls = (BSAVE_DEFCLASS *) buf; cls = (DEFCLASS *) &ObjectBinaryData(theEnv)->DefclassArray[obji]; UpdateConstructHeader(theEnv,&bcls->header,&cls->header, (int) sizeof(DEFCLASS_MODULE),(void *) ObjectBinaryData(theEnv)->ModuleArray, (int) sizeof(DEFCLASS),(void *) ObjectBinaryData(theEnv)->DefclassArray); cls->abstract = bcls->abstract; cls->reactive = bcls->reactive; cls->system = bcls->system; cls->id = bcls->id; DefclassData(theEnv)->ClassIDMap[cls->id] = cls;#if DEBUGGING_FUNCTIONS cls->traceInstances = DefclassData(theEnv)->WatchInstances; cls->traceSlots = DefclassData(theEnv)->WatchSlots;#endif cls->slotCount = bcls->slotCount; cls->instanceSlotCount = bcls->instanceSlotCount; cls->localInstanceSlotCount = bcls->localInstanceSlotCount; cls->maxSlotNameID = bcls->maxSlotNameID; cls->handlerCount = bcls->handlerCount; cls->directSuperclasses.classCount =bcls->directSuperclasses.classCount; cls->directSuperclasses.classArray = LinkPointer(bcls->directSuperclasses.classArray); cls->directSubclasses.classCount =bcls->directSubclasses.classCount; cls->directSubclasses.classArray = LinkPointer(bcls->directSubclasses.classArray); cls->allSuperclasses.classCount =bcls->allSuperclasses.classCount; cls->allSuperclasses.classArray = LinkPointer(bcls->allSuperclasses.classArray); cls->slots = SlotPointer(bcls->slots); cls->instanceTemplate = TemplateSlotPointer(bcls->instanceTemplate); cls->slotNameMap = OrderedSlotPointer(bcls->slotNameMap); cls->instanceList = NULL; cls->handlers = HandlerPointer(bcls->handlers); cls->handlerOrderMap = OrderedHandlerPointer(bcls->handlers); cls->installed = 1; cls->busy = 0; cls->instanceList = NULL; cls->instanceListBottom = NULL;#if DEFMODULE_CONSTRUCT cls->scopeMap = BitMapPointer(bcls->scopeMap); IncrementBitMapCount(cls->scopeMap);#else cls->scopeMap = NULL;#endif PutClassInTable(theEnv,cls); }static void UpdateLink( void *theEnv, void *buf, long obji) { long *blink; blink = (long *) buf; ObjectBinaryData(theEnv)->LinkArray[obji] = DefclassPointer(*blink); }static void UpdateSlot( void *theEnv, void *buf, long obji) { SLOT_DESC *sp; BSAVE_SLOT_DESC *bsp; sp = (SLOT_DESC *) &ObjectBinaryData(theEnv)->SlotArray[obji]; bsp = (BSAVE_SLOT_DESC *) buf; sp->dynamicDefault = bsp->dynamicDefault; sp->noDefault = bsp->noDefault; sp->shared = bsp->shared; sp->multiple = bsp->multiple; sp->composite = bsp->composite; sp->noInherit = bsp->noInherit; sp->noWrite = bsp->noWrite; sp->initializeOnly = bsp->initializeOnly; sp->reactive = bsp->reactive; sp->publicVisibility = bsp->publicVisibility; sp->createReadAccessor = bsp->createReadAccessor; sp->createWriteAccessor = bsp->createWriteAccessor; sp->cls = DefclassPointer(bsp->cls); sp->slotName = SlotNamePointer(bsp->slotName); sp->overrideMessage = SymbolPointer(bsp->overrideMessage); IncrementSymbolCount(sp->overrideMessage); if (bsp->defaultValue != -1L) { if (sp->dynamicDefault) sp->defaultValue = (void *) ExpressionPointer(bsp->defaultValue); else { sp->defaultValue = (void *) get_struct(theEnv,dataObject); EvaluateAndStoreInDataObject(theEnv,(int) sp->multiple,ExpressionPointer(bsp->defaultValue), (DATA_OBJECT *) sp->defaultValue,TRUE); ValueInstall(theEnv,(DATA_OBJECT *) sp->defaultValue); } } else sp->defaultValue = NULL; sp->constraint = ConstraintPointer(bsp->constraint); sp->sharedCount = 0; sp->sharedValue.value = NULL; sp->bsaveIndex = 0L; if (sp->shared) { sp->sharedValue.desc = sp; sp->sharedValue.value = NULL; } }static void UpdateSlotName( void *theEnv, void *buf, long obji) { SLOT_NAME *snp; BSAVE_SLOT_NAME *bsnp; bsnp = (BSAVE_SLOT_NAME *) buf; snp = (SLOT_NAME *) &ObjectBinaryData(theEnv)->SlotNameArray[obji]; snp->id = bsnp->id; snp->name = SymbolPointer(bsnp->name); IncrementSymbolCount(snp->name); snp->putHandlerName = SymbolPointer(bsnp->putHandlerName); IncrementSymbolCount(snp->putHandlerName); snp->hashTableIndex = bsnp->hashTableIndex; snp->nxt = DefclassData(theEnv)->SlotNameTable[snp->hashTableIndex]; DefclassData(theEnv)->SlotNameTable[snp->hashTableIndex] = snp; }static void UpdateTemplateSlot( void *theEnv, void *buf, long obji) { ObjectBinaryData(theEnv)->TmpslotArray[obji] = SlotPointer(* (long *) buf); }static void UpdateHandler( void *theEnv, void *buf, long obji) { HANDLER *hnd; BSAVE_HANDLER *bhnd; hnd = (HANDLER *) &ObjectBinaryData(theEnv)->HandlerArray[obji]; bhnd = (BSAVE_HANDLER *) buf; hnd->system = bhnd->system; hnd->type = bhnd->type; hnd->minParams = bhnd->minParams; hnd->maxParams = bhnd->maxParams; hnd->localVarCount = bhnd->localVarCount; hnd->cls = DefclassPointer(bhnd->cls); hnd->name = SymbolPointer(bhnd->name); IncrementSymbolCount(hnd->name); hnd->actions = ExpressionPointer(bhnd->actions); hnd->ppForm = NULL; hnd->busy = 0; hnd->mark = 0; hnd->usrData = NULL;#if DEBUGGING_FUNCTIONS hnd->trace = MessageHandlerData(theEnv)->WatchHandlers;#endif }/*************************************************************** NAME : ClearBloadObjects DESCRIPTION : Release all binary-loaded class and handler structure arrays (and others) INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Memory cleared NOTES : None ***************************************************************/static void ClearBloadObjects( void *theEnv) { register long i; size_t space; space = (sizeof(DEFCLASS_MODULE) * ObjectBinaryData(theEnv)->ModuleCount); if (space == 0L) return; genfree(theEnv,(void *) ObjectBinaryData(theEnv)->ModuleArray,space); ObjectBinaryData(theEnv)->ModuleArray = NULL; ObjectBinaryData(theEnv)->ModuleCount = 0L; if (ObjectBinaryData(theEnv)->ClassCount != 0L) { rm(theEnv,(void *) DefclassData(theEnv)->ClassIDMap,(sizeof(DEFCLASS *) * DefclassData(theEnv)->AvailClassID)); DefclassData(theEnv)->ClassIDMap = NULL; DefclassData(theEnv)->MaxClassID = 0; DefclassData(theEnv)->AvailClassID = 0; for (i = 0L ; i < ObjectBinaryData(theEnv)->ClassCount ; i++) { UnmarkConstructHeader(theEnv,&ObjectBinaryData(theEnv)->DefclassArray[i].header);#if DEFMODULE_CONSTRUCT DecrementBitMapCount(theEnv,ObjectBinaryData(theEnv)->DefclassArray[i].scopeMap);#endif RemoveClassFromTable(theEnv,(DEFCLASS *) &ObjectBinaryData(theEnv)->DefclassArray[i]); } for (i = 0L ; i < ObjectBinaryData(theEnv)->SlotCount ; i++) { DecrementSymbolCount(theEnv,ObjectBinaryData(theEnv)->SlotArray[i].overrideMessage); if ((ObjectBinaryData(theEnv)->SlotArray[i].defaultValue != NULL) && (ObjectBinaryData(theEnv)->SlotArray[i].dynamicDefault == 0)) { ValueDeinstall(theEnv,(DATA_OBJECT *) ObjectBinaryData(theEnv)->SlotArray[i].defaultValue); rtn_struct(theEnv,dataObject,ObjectBinaryData(theEnv)->SlotArray[i].defaultValue); } } for (i = 0L ; i < ObjectBinaryData(theEnv)->SlotNameCount ; i++) { DefclassData(theEnv)->SlotNameTable[ObjectBinaryData(theEnv)->SlotNameArray[i].hashTableIndex] = NULL; DecrementSymbolCount(theEnv,ObjectBinaryData(theEnv)->SlotNameArray[i].name); DecrementSymbolCount(theEnv,ObjectBinaryData(theEnv)->SlotNameArray[i].putHandlerName); } space = (sizeof(DEFCLASS) * ObjectBinaryData(theEnv)->ClassCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->DefclassArray,space); ObjectBinaryData(theEnv)->DefclassArray = NULL; ObjectBinaryData(theEnv)->ClassCount = 0L; } space = (sizeof(DEFCLASS *) * ObjectBinaryData(theEnv)->LinkCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->LinkArray,space); ObjectBinaryData(theEnv)->LinkArray = NULL; ObjectBinaryData(theEnv)->LinkCount = 0L; } space = (sizeof(SLOT_DESC) * ObjectBinaryData(theEnv)->SlotCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->SlotArray,space); ObjectBinaryData(theEnv)->SlotArray = NULL; ObjectBinaryData(theEnv)->SlotCount = 0L; } space = (sizeof(SLOT_NAME) * ObjectBinaryData(theEnv)->SlotNameCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->SlotNameArray,space); ObjectBinaryData(theEnv)->SlotNameArray = NULL; ObjectBinaryData(theEnv)->SlotNameCount = 0L; } space = (sizeof(SLOT_DESC *) * ObjectBinaryData(theEnv)->TemplateSlotCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->TmpslotArray,space); ObjectBinaryData(theEnv)->TmpslotArray = NULL; ObjectBinaryData(theEnv)->TemplateSlotCount = 0L; } space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->MapslotArray,space); ObjectBinaryData(theEnv)->MapslotArray = NULL; ObjectBinaryData(theEnv)->SlotNameMapCount = 0L; } } if (ObjectBinaryData(theEnv)->HandlerCount != 0L) { for (i = 0L ; i < ObjectBinaryData(theEnv)->HandlerCount ; i++) DecrementSymbolCount(theEnv,ObjectBinaryData(theEnv)->HandlerArray[i].name); space = (sizeof(HANDLER) * ObjectBinaryData(theEnv)->HandlerCount); if (space != 0L) { genfree(theEnv,(void *) ObjectBinaryData(theEnv)->HandlerArray,space); ObjectBinaryData(theEnv)->HandlerArray = NULL; space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->HandlerCount); genfree(theEnv,(void *) ObjectBinaryData(theEnv)->MaphandlerArray,space); ObjectBinaryData(theEnv)->MaphandlerArray = NULL; ObjectBinaryData(theEnv)->HandlerCount = 0L; } } }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -