📄 objbin.c
字号:
dummy_class.maxSlotNameID = cls->maxSlotNameID; dummy_class.handlerCount = cls->handlerCount; dummy_class.directSuperclasses.classCount = cls->directSuperclasses.classCount; dummy_class.directSubclasses.classCount = cls->directSubclasses.classCount; dummy_class.allSuperclasses.classCount = cls->allSuperclasses.classCount; if (cls->directSuperclasses.classCount != 0) { dummy_class.directSuperclasses.classArray = ObjectBinaryData(theEnv)->LinkCount; ObjectBinaryData(theEnv)->LinkCount += cls->directSuperclasses.classCount; } else dummy_class.directSuperclasses.classArray = -1L; if (cls->directSubclasses.classCount != 0) { dummy_class.directSubclasses.classArray = ObjectBinaryData(theEnv)->LinkCount; ObjectBinaryData(theEnv)->LinkCount += cls->directSubclasses.classCount; } else dummy_class.directSubclasses.classArray = -1L; if (cls->allSuperclasses.classCount != 0) { dummy_class.allSuperclasses.classArray = ObjectBinaryData(theEnv)->LinkCount; ObjectBinaryData(theEnv)->LinkCount += cls->allSuperclasses.classCount; } else dummy_class.allSuperclasses.classArray = -1L; if (cls->slots != NULL) { dummy_class.slots = ObjectBinaryData(theEnv)->SlotCount; ObjectBinaryData(theEnv)->SlotCount += (long) cls->slotCount; } else dummy_class.slots = -1L; if (cls->instanceTemplate != NULL) { dummy_class.instanceTemplate = ObjectBinaryData(theEnv)->TemplateSlotCount; ObjectBinaryData(theEnv)->TemplateSlotCount += (long) cls->instanceSlotCount; dummy_class.slotNameMap = ObjectBinaryData(theEnv)->SlotNameMapCount; ObjectBinaryData(theEnv)->SlotNameMapCount += (long) cls->maxSlotNameID + 1; } else { dummy_class.instanceTemplate = -1L; dummy_class.slotNameMap = -1L; } if (cls->handlers != NULL) { dummy_class.handlers = ObjectBinaryData(theEnv)->HandlerCount; ObjectBinaryData(theEnv)->HandlerCount += (long) cls->handlerCount; } else dummy_class.handlers = -1L;#if DEFMODULE_CONSTRUCT dummy_class.scopeMap = (long) cls->scopeMap->bucket;#else dummy_class.scopeMap = -1L;#endif GenWrite((void *) &dummy_class,sizeof(BSAVE_DEFCLASS),(FILE *) buf); }/*************************************************** NAME : BsaveClassLinks DESCRIPTION : Writes class links binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass links binary data written NOTES : None ***************************************************/static void BsaveClassLinks( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; long i; long dummy_class_index; for (i = 0 ; i < cls->directSuperclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->directSuperclasses.classArray[i]); GenWrite((void *) &dummy_class_index,sizeof(long),(FILE *) buf); } ObjectBinaryData(theEnv)->LinkCount += cls->directSuperclasses.classCount; for (i = 0 ; i < cls->directSubclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->directSubclasses.classArray[i]); GenWrite((void *) &dummy_class_index,sizeof(long),(FILE *) buf); } ObjectBinaryData(theEnv)->LinkCount += cls->directSubclasses.classCount; for (i = 0 ; i < cls->allSuperclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->allSuperclasses.classArray[i]); GenWrite((void *) &dummy_class_index,sizeof(long),(FILE *) buf); } ObjectBinaryData(theEnv)->LinkCount += cls->allSuperclasses.classCount; }/*************************************************** NAME : BsaveSlots DESCRIPTION : Writes class slots binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass slots binary data written NOTES : None ***************************************************/static void BsaveSlots( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; long i; BSAVE_SLOT_DESC dummy_slot; SLOT_DESC *sp; EXPRESSION *tmpexp; for (i = 0 ; i < cls->slotCount ; i++) { sp = &cls->slots[i]; dummy_slot.dynamicDefault = sp->dynamicDefault; dummy_slot.noDefault = sp->noDefault; dummy_slot.shared = sp->shared; dummy_slot.multiple = sp->multiple; dummy_slot.composite = sp->composite; dummy_slot.noInherit = sp->noInherit; dummy_slot.noWrite = sp->noWrite; dummy_slot.initializeOnly = sp->initializeOnly; dummy_slot.reactive = sp->reactive; dummy_slot.publicVisibility = sp->publicVisibility; dummy_slot.createReadAccessor = sp->createReadAccessor; dummy_slot.createWriteAccessor = sp->createWriteAccessor; dummy_slot.cls = DefclassIndex(sp->cls); dummy_slot.slotName = SlotNameIndex(sp->slotName); dummy_slot.overrideMessage = (long) sp->overrideMessage->bucket; if (sp->defaultValue != NULL) { dummy_slot.defaultValue = ExpressionData(theEnv)->ExpressionCount; if (sp->dynamicDefault) ExpressionData(theEnv)->ExpressionCount += ExpressionSize((EXPRESSION *) sp->defaultValue); else { tmpexp = ConvertValueToExpression(theEnv,(DATA_OBJECT *) sp->defaultValue); ExpressionData(theEnv)->ExpressionCount += ExpressionSize(tmpexp); ReturnExpression(theEnv,tmpexp); } } else dummy_slot.defaultValue = -1L; dummy_slot.constraint = ConstraintIndex(sp->constraint); GenWrite((void *) &dummy_slot,sizeof(BSAVE_SLOT_DESC),(FILE *) buf); } }/************************************************************** NAME : BsaveTemplateSlots DESCRIPTION : Writes class instance template binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass instance template binary data written NOTES : None **************************************************************/#if IBM_TBC#pragma argsused#endifstatic void BsaveTemplateSlots( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; long i; long tsp;#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif for (i = 0 ; i < cls->instanceSlotCount ; i++) { tsp = SlotIndex(cls->instanceTemplate[i]); GenWrite((void *) &tsp,sizeof(long),(FILE *) buf); } }/*************************************************************** NAME : BsaveSlotMap DESCRIPTION : Writes class canonical slot map binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass canonical slot map binary data written NOTES : None ***************************************************************/#if IBM_TBC#pragma argsused#endifstatic void BsaveSlotMap( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass;#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif if (cls->instanceSlotCount != 0) GenWrite((void *) cls->slotNameMap, (sizeof(unsigned) * (cls->maxSlotNameID + 1)),(FILE *) buf); }/************************************************************ NAME : BsaveHandlers DESCRIPTION : Writes class message-handlers binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass message-handler binary data written NOTES : None ************************************************************/static void BsaveHandlers( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; long i; BSAVE_HANDLER dummy_handler; HANDLER *hnd; for (i = 0 ; i < cls->handlerCount ; i++) { hnd = &cls->handlers[i]; dummy_handler.system = hnd->system; dummy_handler.type = hnd->type; dummy_handler.minParams = hnd->minParams; dummy_handler.maxParams = hnd->maxParams; dummy_handler.localVarCount = hnd->localVarCount; dummy_handler.cls = DefclassIndex(hnd->cls); dummy_handler.name = (long) hnd->name->bucket; if (hnd->actions != NULL) { dummy_handler.actions = ExpressionData(theEnv)->ExpressionCount; ExpressionData(theEnv)->ExpressionCount += ExpressionSize(hnd->actions); } else dummy_handler.actions = -1L; GenWrite((void *) &dummy_handler,sizeof(BSAVE_HANDLER),(FILE *) buf); } }/**************************************************************** NAME : BsaveHandlerMap DESCRIPTION : Writes class message-handler map binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass message-handler map binary data written NOTES : None ****************************************************************/#if IBM_TBC#pragma argsused#endifstatic void BsaveHandlerMap( void *theEnv, struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass;#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif GenWrite((void *) cls->handlerOrderMap, (sizeof(unsigned) * cls->handlerCount),(FILE *) buf); }#endif/*********************************************************************** NAME : BloadStorageObjects DESCRIPTION : This routine reads class and handler information from a binary file in five chunks: Class count Handler count Class array Handler array INPUTS : Notthing RETURNS : Nothing useful SIDE EFFECTS : Arrays allocated and set NOTES : This routine makes no attempt to reset any pointers within the structures Bload fails if there are still classes in the system!! ***********************************************************************/static void BloadStorageObjects( void *theEnv) { size_t space; long counts[9]; if ((DefclassData(theEnv)->ClassIDMap != NULL) || (DefclassData(theEnv)->MaxClassID != 0)) { SystemError(theEnv,"OBJBIN",1); EnvExitRouter(theEnv,EXIT_FAILURE); } GenReadBinary(theEnv,(void *) &space,sizeof(size_t)); if (space == 0L) { ObjectBinaryData(theEnv)->ClassCount = ObjectBinaryData(theEnv)->HandlerCount = 0L; return; } GenReadBinary(theEnv,(void *) counts,space); ObjectBinaryData(theEnv)->ModuleCount = counts[0]; ObjectBinaryData(theEnv)->ClassCount = counts[1]; ObjectBinaryData(theEnv)->LinkCount = counts[2]; ObjectBinaryData(theEnv)->SlotNameCount = counts[3]; ObjectBinaryData(theEnv)->SlotCount = counts[4]; ObjectBinaryData(theEnv)->TemplateSlotCount = counts[5]; ObjectBinaryData(theEnv)->SlotNameMapCount = counts[6]; ObjectBinaryData(theEnv)->HandlerCount = counts[7]; DefclassData(theEnv)->MaxClassID = (unsigned short) counts[8]; DefclassData(theEnv)->AvailClassID = (unsigned short) counts[8]; if (ObjectBinaryData(theEnv)->ModuleCount != 0L) { space = (sizeof(DEFCLASS_MODULE) * ObjectBinaryData(theEnv)->ModuleCount); ObjectBinaryData(theEnv)->ModuleArray = (DEFCLASS_MODULE *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->ClassCount != 0L) { space = (sizeof(DEFCLASS) * ObjectBinaryData(theEnv)->ClassCount); ObjectBinaryData(theEnv)->DefclassArray = (DEFCLASS *) genalloc(theEnv,space); DefclassData(theEnv)->ClassIDMap = (DEFCLASS **) gm2(theEnv,(sizeof(DEFCLASS *) * DefclassData(theEnv)->MaxClassID)); } if (ObjectBinaryData(theEnv)->LinkCount != 0L) { space = (sizeof(DEFCLASS *) * ObjectBinaryData(theEnv)->LinkCount); ObjectBinaryData(theEnv)->LinkArray = (DEFCLASS * *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->SlotCount != 0L) { space = (sizeof(SLOT_DESC) * ObjectBinaryData(theEnv)->SlotCount); ObjectBinaryData(theEnv)->SlotArray = (SLOT_DESC *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->SlotNameCount != 0L) { space = (sizeof(SLOT_NAME) * ObjectBinaryData(theEnv)->SlotNameCount); ObjectBinaryData(theEnv)->SlotNameArray = (SLOT_NAME *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->TemplateSlotCount != 0L) { space = (sizeof(SLOT_DESC *) * ObjectBinaryData(theEnv)->TemplateSlotCount); ObjectBinaryData(theEnv)->TmpslotArray = (SLOT_DESC * *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->SlotNameMapCount != 0L) { space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount); ObjectBinaryData(theEnv)->MapslotArray = (unsigned *) genalloc(theEnv,space); } if (ObjectBinaryData(theEnv)->HandlerCount != 0L) { space = (sizeof(HANDLER) * ObjectBinaryData(theEnv)->HandlerCount); ObjectBinaryData(theEnv)->HandlerArray = (HANDLER *) genalloc(theEnv,space); space = (sizeof(unsigned) * ObjectBinaryData(theEnv)->HandlerCount); ObjectBinaryData(theEnv)->MaphandlerArray = (unsigned *) genalloc(theEnv,space); } }/***************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -