📄 exprnbin.c
字号:
break; 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) genfree(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 + -