📄 objbin.c
字号:
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)
{
UNLN space;
GenReadBinary(theEnv,(void *) &space,(UNLN) sizeof(UNLN));
if (space == 0L)
return;
if (ObjectBinaryData(theEnv)->ModuleCount != 0L)
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->ModuleCount,(unsigned) sizeof(BSAVE_DEFCLASS_MODULE),UpdateDefclassModule);
if (ObjectBinaryData(theEnv)->ClassCount != 0L)
{
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->ClassCount,(unsigned) sizeof(BSAVE_DEFCLASS),UpdateDefclass);
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->LinkCount,(unsigned) sizeof(DEFCLASS *),UpdateLink);
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->SlotNameCount,(unsigned) sizeof(BSAVE_SLOT_NAME),UpdateSlotName);
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->SlotCount,(unsigned) sizeof(BSAVE_SLOT_DESC),UpdateSlot);
if (ObjectBinaryData(theEnv)->TemplateSlotCount != 0L)
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->TemplateSlotCount,(unsigned) sizeof(long),UpdateTemplateSlot);
if (ObjectBinaryData(theEnv)->SlotNameMapCount != 0L)
{
space = (UNLN) (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount);
GenReadBinary(theEnv,(void *) ObjectBinaryData(theEnv)->MapslotArray,space);
}
if (ObjectBinaryData(theEnv)->HandlerCount != 0L)
{
BloadandRefresh(theEnv,ObjectBinaryData(theEnv)->HandlerCount,(unsigned) sizeof(BSAVE_HANDLER),UpdateHandler);
space = (UNLN) (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;
UNLN space;
space = (unsigned long) (sizeof(DEFCLASS_MODULE) * ObjectBinaryData(theEnv)->ModuleCount);
if (space == 0L)
return;
genlongfree(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 = (UNLN) (sizeof(DEFCLASS) * ObjectBinaryData(theEnv)->ClassCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->DefclassArray,space);
ObjectBinaryData(theEnv)->DefclassArray = NULL;
ObjectBinaryData(theEnv)->ClassCount = 0L;
}
space = (UNLN) (sizeof(DEFCLASS *) * ObjectBinaryData(theEnv)->LinkCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->LinkArray,space);
ObjectBinaryData(theEnv)->LinkArray = NULL;
ObjectBinaryData(theEnv)->LinkCount = 0L;
}
space = (UNLN) (sizeof(SLOT_DESC) * ObjectBinaryData(theEnv)->SlotCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->SlotArray,space);
ObjectBinaryData(theEnv)->SlotArray = NULL;
ObjectBinaryData(theEnv)->SlotCount = 0L;
}
space = (UNLN) (sizeof(SLOT_NAME) * ObjectBinaryData(theEnv)->SlotNameCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->SlotNameArray,space);
ObjectBinaryData(theEnv)->SlotNameArray = NULL;
ObjectBinaryData(theEnv)->SlotNameCount = 0L;
}
space = (UNLN) (sizeof(SLOT_DESC *) * ObjectBinaryData(theEnv)->TemplateSlotCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->TmpslotArray,space);
ObjectBinaryData(theEnv)->TmpslotArray = NULL;
ObjectBinaryData(theEnv)->TemplateSlotCount = 0L;
}
space = (UNLN) (sizeof(unsigned) * ObjectBinaryData(theEnv)->SlotNameMapCount);
if (space != 0L)
{
genlongfree(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 = (UNLN) (sizeof(HANDLER) * ObjectBinaryData(theEnv)->HandlerCount);
if (space != 0L)
{
genlongfree(theEnv,(void *) ObjectBinaryData(theEnv)->HandlerArray,space);
ObjectBinaryData(theEnv)->HandlerArray = NULL;
space = (UNLN) (sizeof(unsigned) * ObjectBinaryData(theEnv)->HandlerCount);
genlongfree(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 + -