extern an BGStopInline( call_handle handle, type_def *tipe ) { /******************************************************************/ // works if we're in the middle of a conditional??? label_handle lbl; inline_stack *junk; an retv; if( HaveCurrBlock == FALSE ) { EnLink( AskForNewLabel(), TRUE ); HaveCurrBlock = TRUE; } lbl = AskForNewLabel(); GenBlock( JUMP, 1 ); AddTarget( lbl, FALSE ); EnLink( lbl, TRUE ); InlineStack->tipe = tipe; FEGenProc( InlineStack->proc_sym, handle ); retv = InlineStack->addr; junk = InlineStack; InlineStack = InlineStack->next; CGFree( junk ); return( retv ); }
static an FlowOut( an node, type_def *tipe ) { /**************************************************/ name *temp; label_handle lbl; lbl = AskForNewLabel(); temp = BGGlobalTemp( tipe ); AddIns( MakeMove( AllocIntConst( FETrue() ), temp, temp->n.type_class ) ); *(node->u.b.t) = CurrBlock->label; GenBlock( BLK_JUMP, 1 ); AddTarget( lbl, false ); EnLink( AskForNewLabel(), true ); AddIns( MakeMove( AllocIntConst( 0 ), temp, temp->n.type_class ) ); *(node->u.b.f) = CurrBlock->label; GenBlock( BLK_JUMP, 1 ); AddTarget( lbl, false ); EnLink( lbl, true ); NamesCrossBlocks(); AddrFree( node ); return( AddrName( temp, tipe ) ); }