예제 #1
0
void routineExit(SymTableNodePtr routineIdPtr)
{
	if(debugger)
		debugger->traceRoutineExit(routineIdPtr);
	//-----------------------------------------
	// De-alloc parameters & local variables...
	SymTableNodePtr idPtr;
	for(idPtr = (SymTableNodePtr)(routineIdPtr->defn.info.routine.params);
			idPtr != nullptr;
			idPtr = idPtr->next)
		freeLocal(idPtr);
	for(idPtr = (SymTableNodePtr)(routineIdPtr->defn.info.routine.locals);
			idPtr != nullptr;
			idPtr = idPtr->next)
		if(idPtr->defn.info.data.varType == VAR_TYPE_NORMAL)
			freeLocal(idPtr);
	StackFrameHeaderPtr headerPtr = (StackFrameHeaderPtr)stackFrameBasePtr;
	codeSegmentPtr = headerPtr->returnAddress.address;
	if(routineIdPtr->typePtr == nullptr)
		tos = stackFrameBasePtr - 1;
	else
		tos = stackFrameBasePtr;
	stackFrameBasePtr = (StackItemPtr)headerPtr->dynamicLink.address;
}