📄 exprnbin.c
字号:
case FLOAT :
DecrementFloatCount(theEnv,(FLOAT_HN *) ExpressionData(theEnv)->ExpressionArray[i].value);
break;
case INTEGER :
DecrementIntegerCount(theEnv,(INTEGER_HN *) ExpressionData(theEnv)->ExpressionArray[i].value);
break;
#if DEFTEMPLATE_CONSTRUCT
case FACT_ADDRESS :
EnvDecrementFactCount(theEnv,ExpressionData(theEnv)->ExpressionArray[i].value);
break;
#endif
#if OBJECT_SYSTEM
case INSTANCE_ADDRESS :
EnvDecrementInstanceCount(theEnv,ExpressionData(theEnv)->ExpressionArray[i].value);
break;
#endif
case RVOID:
break;
default:
if (EvaluationData(theEnv)->PrimitivesArray[ExpressionData(theEnv)->ExpressionArray[i].type] == NULL) break;
if (EvaluationData(theEnv)->PrimitivesArray[ExpressionData(theEnv)->ExpressionArray[i].type]->bitMap)
{ DecrementBitMapCount(theEnv,(BITMAP_HN *) ExpressionData(theEnv)->ExpressionArray[i].value); }
break;
}
}
/*===================================*/
/* Free the binary expression array. */
/*===================================*/
space = ExpressionData(theEnv)->NumberOfExpressions * sizeof(struct expr);
if (space != 0) genlongfree(theEnv,(void *) ExpressionData(theEnv)->ExpressionArray,space);
ExpressionData(theEnv)->ExpressionArray = 0;
}
#if BLOAD_AND_BSAVE
/***************************************************
NAME : FindHashedExpressions
DESCRIPTION : Sets the bsave expression array
indices for hashed expression nodes
and marks the items needed by
these expressions
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : Atoms marked and ids set
NOTES : None
***************************************************/
globle void FindHashedExpressions(
void *theEnv)
{
register unsigned i;
EXPRESSION_HN *exphash;
for (i = 0 ; i < EXPRESSION_HASH_SIZE ; i++)
for (exphash = ExpressionData(theEnv)->ExpressionHashTable[i] ; exphash != NULL ; exphash = exphash->next)
{
MarkNeededItems(theEnv,exphash->exp);
exphash->bsaveID = ExpressionData(theEnv)->ExpressionCount;
ExpressionData(theEnv)->ExpressionCount += ExpressionSize(exphash->exp);
}
}
/***************************************************
NAME : BsaveHashedExpressions
DESCRIPTION : Writes out hashed expressions
INPUTS : Bsave file stream pointer
RETURNS : Nothing useful
SIDE EFFECTS : Expressions written
NOTES : None
***************************************************/
globle void BsaveHashedExpressions(
void *theEnv,
FILE *fp)
{
register unsigned i;
EXPRESSION_HN *exphash;
for (i = 0 ; i < EXPRESSION_HASH_SIZE ; i++)
for (exphash = ExpressionData(theEnv)->ExpressionHashTable[i] ; exphash != NULL ; exphash = exphash->next)
BsaveExpression(theEnv,exphash->exp,fp);
}
/***************************************************************/
/* BsaveConstructExpressions: Writes all expression needed by */
/* constructs for this binary image to the binary save file. */
/***************************************************************/
globle void BsaveConstructExpressions(
void *theEnv,
FILE *fp)
{
struct BinaryItem *biPtr;
for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
biPtr != NULL;
biPtr = biPtr->next)
{
if (biPtr->expressionFunction != NULL)
{ (*biPtr->expressionFunction)(theEnv,fp); }
}
}
/***************************************/
/* BsaveExpression: Recursively saves */
/* an expression to the binary file. */
/***************************************/
globle void BsaveExpression(
void *theEnv,
struct expr *testPtr,
FILE *fp)
{
BSAVE_EXPRESSION newTest;
long int newIndex;
while (testPtr != NULL)
{
ExpressionData(theEnv)->ExpressionCount++;
/*================*/
/* Copy the type. */
/*================*/
newTest.type = testPtr->type;
/*=======================================*/
/* Convert the argList slot to an index. */
/*=======================================*/
if (testPtr->argList == NULL)
{ newTest.argList = -1L; }
else
{ newTest.argList = ExpressionData(theEnv)->ExpressionCount; }
/*========================================*/
/* Convert the nextArg slot to an index. */
/*========================================*/
if (testPtr->nextArg == NULL)
{ newTest.nextArg = -1L; }
else
{
newIndex = ExpressionData(theEnv)->ExpressionCount + ExpressionSize(testPtr->argList);
newTest.nextArg = newIndex;
}
/*=========================*/
/* Convert the value slot. */
/*=========================*/
switch(testPtr->type)
{
case FLOAT:
newTest.value = (long) ((FLOAT_HN *) testPtr->value)->bucket;
break;
case INTEGER:
newTest.value = (long) ((INTEGER_HN *) testPtr->value)->bucket;
break;
case FCALL:
newTest.value = (long) ((struct FunctionDefinition *)
testPtr->value)->bsaveIndex;
break;
case GCALL:
#if DEFGENERIC_CONSTRUCT
if (testPtr->value != NULL)
newTest.value = ((struct constructHeader *) testPtr->value)->bsaveID;
else
#endif
newTest.value = -1L;
break;
case PCALL:
#if DEFFUNCTION_CONSTRUCT
if (testPtr->value != NULL)
newTest.value = ((struct constructHeader *) testPtr->value)->bsaveID;
else
#endif
newTest.value = -1L;
break;
case DEFTEMPLATE_PTR:
#if DEFTEMPLATE_CONSTRUCT
if (testPtr->value != NULL)
newTest.value = ((struct constructHeader *) testPtr->value)->bsaveID;
else
#endif
newTest.value = -1L;
break;
case DEFCLASS_PTR:
#if OBJECT_SYSTEM
if (testPtr->value != NULL)
newTest.value = ((struct constructHeader *) testPtr->value)->bsaveID;
else
#endif
newTest.value = -1L;
break;
case DEFGLOBAL_PTR:
#if DEFGLOBAL_CONSTRUCT
if (testPtr->value != NULL)
newTest.value = ((struct defglobal *) testPtr->value)->header.bsaveID;
else
#endif
newTest.value = -1L;
break;
#if OBJECT_SYSTEM
case INSTANCE_NAME:
#endif
case SYMBOL:
case GBL_VARIABLE:
case STRING:
newTest.value = (long) ((SYMBOL_HN *) testPtr->value)->bucket;
break;
case FACT_ADDRESS:
case INSTANCE_ADDRESS:
case EXTERNAL_ADDRESS:
newTest.value = -1L;
break;
case RVOID:
break;
default:
if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type] == NULL) break;
if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type]->bitMap)
{ newTest.value = (long) ((BITMAP_HN *) testPtr->value)->bucket; }
break;
}
/*===========================*/
/* Write out the expression. */
/*===========================*/
GenWrite(&newTest,(unsigned long) sizeof(BSAVE_EXPRESSION),fp);
/*==========================*/
/* Write out argument list. */
/*==========================*/
if (testPtr->argList != NULL)
{
BsaveExpression(theEnv,testPtr->argList,fp);
}
testPtr = testPtr->nextArg;
}
}
#endif /* BLOAD_AND_BSAVE */
#endif /* (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -