/*FUNCTION*/ pFixSizeMemoryObject memory_DupMortalize(pMemoryObject pMo, pFixSizeMemoryObject pVar, pMortalList pMyMortal, int *piErrorCode ){ /*noverbatim CUT*/ if( *piErrorCode )return NULL;/* if it was called after an erroneous evaluate then do not reset the error code. */ if( pVar && IsMortal(pVar) )return pVar; return memory_DupVar(pMo,pVar,pMyMortal,piErrorCode); }
/*FUNCTION*/ int hook_CallScribaFunction(pExecuteObject pEo, unsigned long lStartNode, pFixSizeMemoryObject *pArgument, unsigned long NumberOfPassedArguments, pFixSizeMemoryObject *pFunctionResult ){ /*noverbatim CUT*/ int iError; unsigned long SaveProgramCounter,SaveStepCounter; unsigned long SavefErrorGoto,SaveErrorGoto,SaveErrorResume; pFixSizeMemoryObject SaveLocalVariablesPointer; pFixSizeMemoryObject SaveFunctionResultPointer; MortalList _ThisCommandMortals=NULL; pMortalList _pThisCommandMortals = &_ThisCommandMortals; unsigned long _ActualNode=pEo->ProgramCounter; int iErrorCode; NODE nItem; unsigned long i; unsigned long NumberOfArguments; long Opcode; SaveLocalVariablesPointer = pEo->LocalVariables; SaveProgramCounter = pEo->ProgramCounter; pEo->ProgramCounter = lStartNode; if( pEo->ProgramCounter == 0 )return EXE_ERROR_USERFUN_UNDEFINED; SaveFunctionResultPointer = pEo->pFunctionResult; pEo->pFunctionResult = NULL; SaveStepCounter = pEo->lStepCounter; pEo->lStepCounter = 0; SaveErrorGoto = pEo->ErrorGoto; pEo->ErrorGoto = 0; SaveErrorResume = pEo->ErrorResume; pEo->ErrorResume = 0; SavefErrorGoto = pEo->fErrorGoto; pEo->fErrorGoto = ONERROR_NOTHING; nItem = pEo->CommandArray[pEo->ProgramCounter-1].Parameter.NodeList.actualm ; Opcode = pEo->CommandArray[nItem-1].OpCode; pEo->cLocalVariables = pEo->CommandArray[nItem-1].Parameter.CommandArgument.Argument.lLongValue; nItem = pEo->CommandArray[nItem-1].Parameter.CommandArgument.next; NumberOfArguments = pEo->CommandArray[nItem-1].Parameter.CommandArgument.Argument.lLongValue; nItem = pEo->CommandArray[nItem-1].Parameter.CommandArgument.next; nItem = pEo->CommandArray[nItem-1].Parameter.CommandArgument.Argument.lLongValue; if( pEo->cLocalVariables ){ pEo->LocalVariables = memory_NewArray(pEo->pMo,1,pEo->cLocalVariables); if( pEo->LocalVariables == NULL )return COMMAND_ERROR_MEMORY_LOW; }else pEo->LocalVariables = NULL; /* it should have been null anyway */ for( i=0 ; pArgument && i < NumberOfPassedArguments && i < NumberOfArguments ; i++ ){ pEo->LocalVariables->Value.aValue[i] = memory_DupVar(pEo->pMo, pArgument[i], _pThisCommandMortals, &iError); if( iError )return iError; } while( i < (unsigned)pEo->cLocalVariables ){ pEo->LocalVariables->Value.aValue[i] = NULL; i++; } /* and finally we start to execute the function when executing the next command */ pEo->lFunctionLevel++; /* some macros need this label */ // _FunctionFinishLabel: ; pEo->ProgramCounter = pEo->CommandArray[pEo->ProgramCounter-1].Parameter.NodeList.rest; execute_Execute_r(pEo,&iErrorCode); /* restore variables */ pEo->lStepCounter = SaveStepCounter; if( pEo->LocalVariables )/* this is null if the function did not have arguments and no local variables */ memory_ReleaseVariable(pEo->pMo,pEo->LocalVariables); pEo->ProgramCounter = SaveProgramCounter; pEo->LocalVariables = SaveLocalVariablesPointer; (*pFunctionResult) = pEo->pFunctionResult; pEo->pFunctionResult = SaveFunctionResultPointer; pEo->ErrorGoto = SaveErrorGoto; pEo->fErrorGoto = SavefErrorGoto; pEo->ErrorResume = SaveErrorResume; return iErrorCode; }