Exemple #1
0
void genstmt(STATEMENT *stmt, SYMBOL *funcsp)
/*
 *      genstmt will generate a statement and follow the next pointer
 *      until the block is generated.
 */
{
    while (stmt != 0)
    {
        switch (stmt->type)
        {
            case st_varstart:
                gen_varstart(stmt->select);
                break;
            case st_dbgblock:
                gen_dbgblock(stmt->label);
                break;
            case st_tryblock:
/*				gen_tryblock(stmt->label); */
                break;
            case st_block:
                genstmt(stmt->lower, funcsp);
                genstmt(stmt->blockTail, funcsp);
                break;
            case st_label:
                gen_label((int)stmt->label);
                break;
            case st_goto:
                gen_igoto(i_goto, (int)stmt->label);
                break;
            case st_asmgoto:
                gen_igoto(i_asmgoto, (int)stmt->label);
                break;
            case st_asmcond:
                gen_igoto(i_asmcond, (int)stmt->label);
                break;
            case st_throw:
/*                gen_throw((TYPE *)stmt->lst, stmt->select);*/
                break;
/*			case st_functailexpr: 
                gen_icode(i_functailstart, 0, 0, 0); 
                gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select)); *
                gen_icode(i_functailend, 0, 0, 0);
               break;
*/
            case st_expr:
            case st_declare:
                gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select));
                break;
            case st_return:
                genreturn(stmt, funcsp, 0, 0, NULL);
                break;
            case st_line:
                gen_line(stmt->lineData);
                break;
            case st_select:
                genselect(stmt, funcsp, TRUE);
                break;
            case st_notselect:
                genselect(stmt, funcsp, FALSE);
                break;
            case st_switch:
                genxswitch(stmt, funcsp);
                break;
            case st__genword:
                gen_genword(stmt, funcsp);
                break;
            case st_passthrough:
                gen_asm(stmt);
                break;
            case st_datapassthrough:
                gen_asmdata(stmt);
                break;
            default:
                diag("unknown statement.");
                break;
        }
        stmt = stmt->next;
    }
}
Exemple #2
0
IMODE *genstmt(STATEMENT *stmt, SYMBOL *funcsp)
/*
 *      genstmt will generate a statement and follow the next pointer
 *      until the block is generated.
 */
{
    IMODE *rv = NULL;
    while (stmt != 0)
    {
        STATEMENT *last = stmt;
        switch (stmt->type)
        {
            case st_varstart:
                gen_varstart(stmt->select);
                break;
            case st_dbgblock:
                gen_dbgblock(stmt->label);
                break;
                break;
            case st_block:
                rv = genstmt(stmt->lower, funcsp);
                genstmt(stmt->blockTail, funcsp);
                break;
            case st_label:
                gen_label((int)stmt->label);
                break;
            case st_goto:
                gen_igoto(i_goto, (int)stmt->label);
                break;
            case st_asmgoto:
                gen_igoto(i_asmgoto, (int)stmt->label);
                break;
            case st_asmcond:
                gen_igoto(i_asmcond, (int)stmt->label);
                break;
            case st_try:
                gen_try(funcsp, stmt, stmt->label, stmt->endlabel, stmt->breaklabel, stmt->lower);
                break;
            case st_catch:
            {
                STATEMENT *last;
                while (stmt && stmt->type == st_catch)
                {
                    gen_catch(funcsp, stmt, stmt->altlabel, stmt->breaklabel, stmt->lower);
                    last = stmt;
                    stmt = stmt->next;
                }
                stmt = last;
                gen_label(stmt->breaklabel);
            }
                break;
            case st_expr:
            case st_declare:
                if (stmt->select)
                    rv = gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select));
                break;
            case st_return:
                genreturn(stmt, funcsp, 0, 0, NULL);
                break;
            case st_line:
                gen_line(stmt->lineData);
                break;
            case st_select:
                genselect(stmt, funcsp, TRUE);
                break;
            case st_notselect:
                genselect(stmt, funcsp, FALSE);
                break;
            case st_switch:
                genxswitch(stmt, funcsp);
                break;
            case st__genword:
                gen_genword(stmt, funcsp);
                break;
            case st_passthrough:
                gen_asm(stmt);
                break;
            case st_datapassthrough:
                gen_asmdata(stmt);
                break;
            default:
                diag("unknown statement.");
                break;
        }
        if (last->type != st_return && last->destexp)
        {
            gen_expr(funcsp, last->destexp, F_NOVALUE, ISZ_ADDR);
        }
        stmt = stmt->next;
    }
    return rv;
}