void execOrderReturn (long returnVal) { //----------------------------- // Assignment to function id... StackFrameHeaderPtr headerPtr = (StackFrameHeaderPtr)stackFrameBasePtr; long delta = level - CurRoutineIdPtr->level - 1; while (delta-- > 0) headerPtr = (StackFrameHeaderPtr)headerPtr->staticLink.address; if (CurRoutineIdPtr->defn.info.routine.flags & ROUTINE_FLAG_STATE) { //---------------------------------- // Return in a state function, so... if (debugger) debugger->traceDataStore(CurRoutineIdPtr, CurRoutineIdPtr->typePtr, (StackItemPtr)headerPtr, CurRoutineIdPtr->typePtr); ExitWithReturn = true; ExitFromTacOrder = true; if (returnVal == 0) { //---------------------------------------------------------- // Use the "eject" code only if called for a failed Order... codeSegmentPtr = (char*)ExitStateCodeSegment; getCodeToken(); } } else { //------------------------------------------------------------------------- // All Order functions (TacticalOrder/GeneralOrder/ActionOrder) must return // an integer error code, so we assume the return type is IntegerTypePtr... StackItemPtr targetPtr = (StackItemPtr)headerPtr; targetPtr->integer = returnVal; //---------------------------------------------------------------------- // Preserve the return value, in case we need it for the calling user... memcpy(&returnValue, targetPtr, sizeof(StackItem)); if (debugger) debugger->traceDataStore(CurRoutineIdPtr, CurRoutineIdPtr->typePtr, (StackItemPtr)headerPtr, CurRoutineIdPtr->typePtr); ExitWithReturn = true; ExitFromTacOrder = true; if (returnVal == 0) { //---------------------------------------------------------- // Use the "eject" code only if called for a failed Order... codeSegmentPtr = (char*)ExitOrderCodeSegment; getCodeToken(); } } }
void execAssignmentStatement(SymTableNodePtr idPtr) { StackItemPtr targetPtr; TypePtr targetTypePtr; TypePtr expressionTypePtr; //-------------------------- // Assignment to variable... targetTypePtr = execVariable(idPtr, USE_TARGET); targetPtr = (StackItemPtr)tos->address; //------------------------------ // Pop off the target address... pop(); //------------------------ // Pop the size, if nec... //if (targetTypePtr->form == FRM_ARRAY) // pop(); //--------------------------------------------------------------- // Routine execExpression() leaves the expression value on top of // stack... getCodeToken(); expressionTypePtr = execExpression(); //-------------------------- // Now, do the assignment... if((targetTypePtr == RealTypePtr) && (expressionTypePtr == IntegerTypePtr)) { //------------------------- // integer assigned to real targetPtr->real = (float)(tos->integer); } else if(targetTypePtr->form == FRM_ARRAY) { //------------------------- // Copy the array/record... PSTR dest = (PSTR)targetPtr; PSTR src = tos->address; int32_t size = targetTypePtr->size; memcpy(dest, src, size); } else if((targetTypePtr == IntegerTypePtr) || (targetTypePtr->form == FRM_ENUM)) { //------------------------------------------------------ // Range check assignment to integer or enum subrange... targetPtr->integer = tos->integer; } else if(targetTypePtr == CharTypePtr) targetPtr->byte = tos->byte; else { //----------------------- // Assign real to real... targetPtr->real = tos->real; } //----------------------------- // Grab the expression value... pop(); if(debugger) debugger->traceDataStore(idPtr, idPtr->typePtr, targetPtr, targetTypePtr); }
void execStdReturn (void) { memset(&returnValue, 0, sizeof(StackItem)); if (CurRoutineIdPtr->typePtr) { //----------------------------- // Assignment to function id... StackFrameHeaderPtr headerPtr = (StackFrameHeaderPtr)stackFrameBasePtr; long delta = level - CurRoutineIdPtr->level - 1; while (delta-- > 0) headerPtr = (StackFrameHeaderPtr)headerPtr->staticLink.address; StackItemPtr targetPtr = (StackItemPtr)headerPtr; TypePtr targetTypePtr = (TypePtr)(CurRoutineIdPtr->typePtr); getCodeToken(); //--------------------------------------------------------------- // Routine execExpression() leaves the expression value on top of // stack... getCodeToken(); TypePtr expressionTypePtr = execExpression(); //-------------------------- // Now, do the assignment... if ((targetTypePtr == RealTypePtr) && (expressionTypePtr == IntegerTypePtr)) { //------------------------- // integer assigned to real targetPtr->real = (float)(tos->integer); } else if (targetTypePtr->form == FRM_ARRAY) { //------------------------- // Copy the array/record... char* dest = (char*)targetPtr; char* src = tos->address; long size = targetTypePtr->size; memcpy(dest, src, size); } else if ((targetTypePtr == IntegerTypePtr) || (targetTypePtr->form == FRM_ENUM)) { //------------------------------------------------------ // Range check assignment to integer or enum subrange... targetPtr->integer = tos->integer; } else { //----------------------- // Assign real to real... targetPtr->real = tos->real; } //----------------------------- // Grab the expression value... pop(); //---------------------------------------------------------------------- // Preserve the return value, in case we need it for the calling user... memcpy(&returnValue, targetPtr, sizeof(StackItem)); if (debugger) debugger->traceDataStore(CurRoutineIdPtr, CurRoutineIdPtr->typePtr, targetPtr, targetTypePtr); } //----------------------- // Grab the semi-colon... getCodeToken(); if (CurRoutineIdPtr->defn.info.routine.flags & ROUTINE_FLAG_ORDER) codeSegmentPtr = (char*)ExitOrderCodeSegment; else if (CurRoutineIdPtr->defn.info.routine.flags & ROUTINE_FLAG_STATE) codeSegmentPtr = (char*)ExitStateCodeSegment; else codeSegmentPtr = (char*)ExitRoutineCodeSegment; ExitWithReturn = true; getCodeToken(); }