📄 insmoddp.c
字号:
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -