?? insmoddp.c
字號(hào):
oldOMDMV = InstanceData(theEnv)->ObjectModDupMsgValid; InstanceData(theEnv)->ObjectModDupMsgValid = TRUE; DirectMessage(theEnv,FindSymbolHN(theEnv,DIRECT_DUPLICATE_STRING),ins,result,&theExp[0]); InstanceData(theEnv)->ObjectModDupMsgValid = oldOMDMV; DeleteSlotOverrideEvaluations(theEnv,overrides,overrideCount); }/************************************************************* NAME : MsgDuplicateInstance DESCRIPTION : Duplicates an instance via the message-duplicate message INPUTS : The address of the result value RETURNS : Nothing useful SIDE EFFECTS : Slot updates performed w/ int & put- messages NOTES : H/L Syntax: (duplicate-instance <instance> [to <instance-name>] <slot-override>*) *************************************************************/globle void MsgDuplicateInstance( void *theEnv, DATA_OBJECT *result) { INSTANCE_TYPE *ins; DATA_OBJECT newName; EXPRESSION theExp[2]; DATA_OBJECT *overrides; int oldOMDMV,overrideCount,error; /* =========================================== The slot-overrides need to be evaluated now to resolve any variable references before a new frame is pushed for message-handler execution =========================================== */ overrides = EvaluateSlotOverrides(theEnv,GetFirstArgument()->nextArg->nextArg, &overrideCount,&error); if (error) { SetpType(result,SYMBOL); SetpValue(result,EnvFalseSymbol(theEnv)); return; } /* ================================== Find the instance and make sure it wasn't deleted by the overrides ================================== */ ins = CheckInstance(theEnv,ValueToString(ExpressionFunctionCallName(EvaluationData(theEnv)->CurrentExpression))); if (ins == NULL) { SetpType(result,SYMBOL); SetpValue(result,EnvFalseSymbol(theEnv)); DeleteSlotOverrideEvaluations(theEnv,overrides,overrideCount); return; } if (EnvArgTypeCheck(theEnv,ValueToString(ExpressionFunctionCallName(EvaluationData(theEnv)->CurrentExpression)), 2,INSTANCE_NAME,&newName) == FALSE) { SetpType(result,SYMBOL); SetpValue(result,EnvFalseSymbol(theEnv)); DeleteSlotOverrideEvaluations(theEnv,overrides,overrideCount); return; } /* ====================================== We are passing the slot override expression information along to whatever message-handler implements the duplicate ====================================== */ theExp[0].type = INSTANCE_NAME; theExp[0].value = newName.value; theExp[0].argList = NULL; theExp[0].nextArg = &theExp[1]; theExp[1].type = EXTERNAL_ADDRESS; theExp[1].value = (void *) overrides; theExp[1].argList = NULL; theExp[1].nextArg = NULL; oldOMDMV = InstanceData(theEnv)->ObjectModDupMsgValid; InstanceData(theEnv)->ObjectModDupMsgValid = TRUE; DirectMessage(theEnv,FindSymbolHN(theEnv,MSG_DUPLICATE_STRING),ins,result,&theExp[0]); InstanceData(theEnv)->ObjectModDupMsgValid = oldOMDMV; DeleteSlotOverrideEvaluations(theEnv,overrides,overrideCount); }#if DEFRULE_CONSTRUCT/************************************************************** NAME : InactiveModifyInstance DESCRIPTION : Modifies slots of an instance of a class Pattern-matching is automatically delayed until the slot updates are done INPUTS : The address of the result value RETURNS : Nothing useful SIDE EFFECTS : Slot updates performed directly NOTES : H/L Syntax: (modify-instance <instance-name> <slot-override>*) **************************************************************/globle void InactiveModifyInstance( void *theEnv, DATA_OBJECT *result) { int ov; ov = SetDelayObjectPatternMatching(theEnv,TRUE); ModifyInstance(theEnv,result); SetDelayObjectPatternMatching(theEnv,ov); }/************************************************************** NAME : InactiveMsgModifyInstance DESCRIPTION : Modifies slots of an instance of a class Pattern-matching is automatically delayed until the slot updates are done INPUTS : The address of the result value RETURNS : Nothing useful SIDE EFFECTS : Slot updates performed with put- messages NOTES : H/L Syntax: (message-modify-instance <instance-name> <slot-override>*) **************************************************************/globle void InactiveMsgModifyInstance( void *theEnv, DATA_OBJECT *result) { int ov; ov = SetDelayObjectPatternMatching(theEnv,TRUE); MsgModifyInstance(theEnv,result); SetDelayObjectPatternMatching(theEnv,ov); }/******************************************************************* NAME : InactiveDuplicateInstance DESCRIPTION : Duplicates an instance of a class Pattern-matching is automatically delayed until the slot updates are done INPUTS : The address of the result value RETURNS : Nothing useful SIDE EFFECTS : Slot updates performed directly NOTES : H/L Syntax: (duplicate-instance <instance> [to <instance-name>] <slot-override>*) *******************************************************************/globle void InactiveDuplicateInstance( void *theEnv, DATA_OBJECT *result) { int ov; ov = SetDelayObjectPatternMatching(theEnv,TRUE); DuplicateInstance(theEnv,result); SetDelayObjectPatternMatching(theEnv,ov); }/************************************************************** NAME : InactiveMsgDuplicateInstance DESCRIPTION : Duplicates an instance of a class Pattern-matching is automatically delayed until the slot updates are done INPUTS : The address of the result value RETURNS : Nothing useful SIDE EFFECTS : Slot updates performed with put- messages NOTES : H/L Syntax: (message-duplicate-instance <instance> [to <instance-name>] <slot-override>*) **************************************************************/globle void InactiveMsgDuplicateInstance( void *theEnv, DATA_OBJECT *result) { int ov; ov = SetDelayObjectPatternMatching(theEnv,TRUE); MsgDuplicateInstance(theEnv,result); SetDelayObjectPatternMatching(theEnv,ov); }#endif/***************************************************** NAME : DirectDuplicateMsgHandler DESCRIPTION : Implementation for the USER class handler direct-duplicate Implements duplicate-instance message with a series of direct slot placements INPUTS : A data object buffer to hold the result RETURNS : Nothing useful SIDE EFFECTS : Slot values updated NOTES : None *****************************************************/globle void DirectDuplicateMsgHandler( void *theEnv, DATA_OBJECT *result) { DuplicateMsgHandlerSupport(theEnv,result,FALSE); }/***************************************************** NAME : MsgDuplicateMsgHandler DESCRIPTION : Implementation for the USER class handler message-duplicate Implements duplicate-instance message with a series of put- messages INPUTS : A data object buffer to hold the result RETURNS : Nothing useful SIDE EFFECTS : Slot values updated NOTES : None *****************************************************/globle void MsgDuplicateMsgHandler( void *theEnv, DATA_OBJECT *result) { DuplicateMsgHandlerSupport(theEnv,result,TRUE); }/*************************************************** NAME : DirectModifyMsgHandler DESCRIPTION : Implementation for the USER class handler direct-modify Implements modify-instance message with a series of direct slot placements INPUTS : A data object buffer to hold the result RETURNS : Nothing useful SIDE EFFECTS : Slot values updated NOTES : None ***************************************************/globle void DirectModifyMsgHandler( void *theEnv, DATA_OBJECT *result) { ModifyMsgHandlerSupport(theEnv,result,FALSE); }/*************************************************** NAME : MsgModifyMsgHandler DESCRIPTION : Implementation for the USER class handler message-modify Implements modify-instance message with a series of put- messages INPUTS : A data object buffer to hold the result RETURNS : Nothing useful SIDE EFFECTS : Slot values updated NOTES : None ***************************************************/globle void MsgModifyMsgHandler( void *theEnv, DATA_OBJECT *result) { ModifyMsgHandlerSupport(theEnv,result,TRUE); }/* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** *//*********************************************************** NAME : EvaluateSlotOverrides DESCRIPTION : Evaluates the slot-override expressions for modify-instance and duplicate-instance Evaluations are stored in an array of data objects, where the supplementalInfo field points at the name of the slot The data object next fields are used to link the array as well. INPUTS : 1) The slot override expressions 2) A buffer to hold the number of slot overrides 3) A buffer to hold an error flag RETURNS : The slot override data object array SIDE EFFECTS : Data object array allocated and initialized override count and error buffers set NOTES : Slot overrides must be evaluated before calling supporting message-handlers for modify- and duplicate-instance in the event that the overrides contain variable references to an outer frame ***********************************************************/static DATA_OBJECT *EvaluateSlotOverrides( void *theEnv, EXPRESSION *ovExprs, int *ovCnt, int *error) { DATA_OBJECT *ovs; int ovi; void *slotName; *error = FALSE; /* ========================================== There are two expressions chains for every slot override: one for the slot name and one for the slot value ========================================== */ *ovCnt = CountArguments(ovExprs) / 2; if (*ovCnt == 0) return(NULL); /* =============================================== Evaluate all the slot override names and values and store them in a contiguous array =============================================== */ ovs = (DATA_OBJECT *) gm2(theEnv,(sizeof(DATA_OBJECT) * (*ovCnt))); ovi = 0; while (ovExprs != NULL) { if (EvaluateExpression(theEnv,ovExprs,&ovs[ovi])) goto EvaluateOverridesError; if (ovs[ovi].type != SYMBOL) { ExpectedTypeError1(theEnv,ValueToString(ExpressionFunctionCallName(EvaluationData(theEnv)->CurrentExpression)), ovi+1,"slot name"); SetEvaluationError(theEnv,TRUE); goto EvaluateOverridesError; } slotName = ovs[ovi].value; if (ovExprs->nextArg->argList) { if (EvaluateAndStoreInDataObject(theEnv,FALSE,ovExprs->nextArg->argList, &ovs[ovi],TRUE) == FALSE) goto EvaluateOverridesError; }
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -