void FiniSubProg( void ) { FrlFini( &ITPool ); CheckCSList( CS_EMPTY_LIST ); // all control structures should be finished if( !Remember.endstmt ) { Error( EN_NO_END ); } if( ( SgmtSw & SG_SYMTAB_RESOLVED ) == 0 ) { STResolve(); SgmtSw |= SG_SYMTAB_RESOLVED; } if(( ProgSw & PS_BLOCK_DATA ) != 0 ) { GEndBlockData(); } else if(( ProgSw & PS_IN_SUBPROGRAM ) != 0 ) { Epilogue(); } else if( ( ProgSw & PS_ERROR ) == 0 ) { GReturn(); } DumpEntries(); BIResolveUndefTypes(); STDump(); TDSubFini(); BIEndSubProg(); EnPurge(); // Must come after TDSubFini() for optimizing compiler SubProgId = NULL; }
void CpEndBlock( void ) { CheckCSList( CS_REMOTEBLOCK ); if( CSHead->typ == CS_REMOTEBLOCK ) { GLabel( CSHead->bottom ); FreeLabel( CSHead->bottom ); // Make sure REMOTEBLOCK statement was valid. if( CSHead->cs_info.rb != NULL ) { GEndBlock(); } GLabel( CSHead->branch ); FreeLabel( CSHead->branch ); DelCSNode(); } else { Match(); } CSNoMore(); StNumbers.in_remote = FALSE; ClearRem(); CSNoMore(); BIEndRBorEP(); }