📄 objbin.c
字号:
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,(UNLN) 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;
register unsigned 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,(UNLN) 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,(UNLN) 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,(UNLN) 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;
register unsigned 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,(UNLN) 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
#endif
static void BsaveTemplateSlots(
void *theEnv,
struct constructHeader *theDefclass,
void *buf)
{
DEFCLASS *cls = (DEFCLASS *) theDefclass;
register unsigned 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,(UNLN) 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
#endif
static 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,
(UNLN) (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;
register unsigned 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,(UNLN) 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
#endif
static 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,
(UNLN) (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)
{
UNLN 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,(UNLN) sizeof(UNLN));
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 = (UNLN) (sizeof(DEFCLASS_MODULE) * ObjectBinaryData(theEnv)->ModuleCount);
ObjectBinaryData(theEnv)->ModuleArray = (DEFCLASS_MODULE *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->ClassCount != 0L)
{
space = (UNLN) (sizeof(DEFCLASS) * ObjectBinaryData(theEnv)->ClassCount);
ObjectBinaryData(theEnv)->DefclassArray = (DEFCLASS *) genlongalloc(theEnv,space);
DefclassData(theEnv)->ClassIDMap = (DEFCLASS **) gm2(theEnv,(sizeof(DEFCLASS *) * DefclassData(theEnv)->MaxClassID));
}
if (ObjectBinaryData(theEnv)->LinkCount != 0L)
{
space = (UNLN) (sizeof(DEFCLASS *) * ObjectBinaryData(theEnv)->LinkCount);
ObjectBinaryData(theEnv)->LinkArray = (DEFCLASS * *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->SlotCount != 0L)
{
space = (UNLN) (sizeof(SLOT_DESC) * ObjectBinaryData(theEnv)->SlotCount);
ObjectBinaryData(theEnv)->SlotArray = (SLOT_DESC *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->SlotNameCount != 0L)
{
space = (UNLN) (sizeof(SLOT_NAME) * ObjectBinaryData(theEnv)->SlotNameCount);
ObjectBinaryData(theEnv)->SlotNameArray = (SLOT_NAME *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->TemplateSlotCount != 0L)
{
space = (UNLN) (sizeof(SLOT_DESC *) * ObjectBinaryData(theEnv)->TemplateSlotCount);
ObjectBinaryData(theEnv)->TmpslotArray = (SLOT_DESC * *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->SlotNameMapCount != 0L)
{
space = (UNLN) (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount);
ObjectBinaryData(theEnv)->MapslotArray = (unsigned *) genlongalloc(theEnv,space);
}
if (ObjectBinaryData(theEnv)->HandlerCount != 0L)
{
space = (UNLN) (sizeof(HANDLER) * ObjectBinaryData(theEnv)->HandlerCount);
ObjectBinaryData(theEnv)->HandlerArray = (HANDLER *) genlongalloc(theEnv,space);
space = (UNLN) (sizeof(unsigned) * ObjectBinaryData(theEnv)->HandlerCount);
ObjectBinaryData(theEnv)->MaphandlerArray = (unsigned *) genlongalloc(theEnv,space);
}
}
/***************************************************************
NAME : BloadObjects
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -