void CpReturn( void ) { if( !(ProgSw & PS_IN_SUBPROGRAM) ) { Extension( RE_IN_PROGRAM ); } CkRemBlock(); if( RecNOpn() && RecNextOpr( OPR_TRM ) ) { if( ( ( SubProgId->u.ns.flags & SY_CLASS ) == SY_SUBPROGRAM ) && ( ( SubProgId->u.ns.flags & SY_SUBPROG_TYPE ) == SY_SUBROUTINE ) ) { GNullRetIdx(); } } else { IntSubExpr(); if( ( ( SubProgId->u.ns.flags & SY_CLASS ) == SY_SUBPROGRAM ) && ( ( SubProgId->u.ns.flags & SY_SUBPROG_TYPE ) == SY_SUBROUTINE ) ) { GRetIdx(); } else { Error( RE_ALT_IN_SUBROUTINE ); } } AdvanceITPtr(); ReqEOS(); GGotoEpilog(); Remember.transfer = true; Remember.stop_or_return = true; }
void GEpilog( void ) { //================= // Generate a subprogram epilogue. if( (SubProgId->u.ns.flags & SY_SUBPROG_TYPE) == SY_SUBROUTINE ) { GNullRetIdx(); } if( EpilogLabel != 0 ) { GLabel( EpilogLabel ); FreeLabel( EpilogLabel ); } EmitOp( FC_EPILOGUE ); OutPtr( SubProgId ); }