Beispiel #1
0
tr_expr_t tr_if_expr(tr_expr_t cond, tr_expr_t then, tr_expr_t else_)
{
    tmp_label_t t = tmp_label();
    tmp_label_t f = tmp_label();
    tmp_label_t done = tmp_label();
    cx_t cx = un_cx(cond);
    ir_expr_t result = ir_tmp_expr(temp());

    fill_patch(cx.trues, t);
    fill_patch(cx.falses, f);
    if (else_)
    {
        return tr_ex(ir_eseq_expr(ir_seq_stmt(vlist(
                7,
                cx.stmt,
                ir_label_stmt(t),
                ir_move_stmt(ir_mem_expr(result), un_ex(then)),
                ir_jump_stmt(ir_name_expr(done), list(done, NULL)),
                ir_label_stmt(f),
                ir_move_stmt(ir_mem_expr(result), un_ex(else_)),
                ir_label_stmt(done))),
            result));
    }
    else
    {
        return tr_nx(ir_seq_stmt(vlist(
              4,
              cx.stmt,
              ir_label_stmt(t),
              un_nx(then),
              ir_label_stmt(f))));
    }
    return NULL;
}
Beispiel #2
0
static ir_expr_t un_ex(tr_expr_t expr)
{
    switch (expr->kind)
    {
        case TR_EX:
            return expr->u.ex;
        case TR_NX:
            return ir_eseq_expr(expr->u.nx, ir_const_expr(0));
        case TR_CX: {
            temp_t tmp = temp();
            tmp_label_t t = tmp_label();
            tmp_label_t f = tmp_label();
            fill_patch(expr->u.cx.trues, t);
            fill_patch(expr->u.cx.falses, f);
            return ir_eseq_expr(
              ir_seq_stmt(vlist(
                  5,
                  ir_move_stmt(ir_tmp_expr(tmp),
                               ir_const_expr(1)),
                  expr->u.cx.stmt,
                  ir_label_stmt(f),
                  ir_move_stmt(ir_tmp_expr(tmp),
                               ir_const_expr(0)),
                  ir_label_stmt(t))),
              ir_tmp_expr(tmp));
        }
    }

    assert(0);
    return NULL;
}
Beispiel #3
0
tr_expr_t tr_string_expr(string_t str)
{
    tmp_label_t label = tmp_label();
    fr_frag_t frag = fr_string_frag(label, str);
    fr_add_frag(frag);
    return tr_ex(ir_name_expr(label));
}
Beispiel #4
0
tr_expr_t tr_while_expr(tr_expr_t cond, tr_expr_t body)
{
    tmp_label_t start = tmp_label();
    tmp_label_t loop = tmp_label();
    tmp_label_t done = tmp_label();
    cx_t cx = un_cx(cond);

    fill_patch(cx.trues, loop);
    fill_patch(cx.falses, done);
    return tr_nx(ir_seq_stmt(vlist(
          6,
          ir_label_stmt(start),
          cx.stmt,
          ir_label_stmt(loop),
          un_nx(body),
          ir_jump_stmt(ir_name_expr(start), list(start, NULL)),
          ir_label_stmt(done))));
}
Beispiel #5
0
tr_expr_t tr_for_expr(tr_access_t access,
                      tr_expr_t low,
                      tr_expr_t high,
                      tr_expr_t body)
{
    ir_expr_t var = fr_expr(access->access, ir_tmp_expr(fr_fp()));
    tmp_label_t start = tmp_label();
    tmp_label_t loop = tmp_label();
    tmp_label_t done = tmp_label();
    ir_stmt_t cond = ir_cjump_stmt(IR_LE, var, un_ex(high), loop, done);
    return tr_nx(ir_seq_stmt(vlist(
          7,
          ir_move_stmt(var, un_ex(low)),
          ir_label_stmt(start),
          cond,
          ir_label_stmt(loop),
          un_nx(body),
          ir_move_stmt(var, ir_binop_expr(IR_PLUS, var, ir_const_expr(1))),
          ir_label_stmt(done))));
}
Beispiel #6
0
void FilterGenre::OnOptionAdded(FilterOption::Ptr const& new_filter)
{
  std::string tmp_label(new_filter->name);

  glib::String escape(g_markup_escape_text(tmp_label.c_str(), -1));
  std::string label(escape.Value());

  FilterGenreButton* button = new FilterGenreButton(label, NUX_TRACKER_LOCATION);
  button->scale = scale();
  button->SetFilter(new_filter);
  genre_layout_->AddView(button, 0, nux::MINOR_POSITION_CENTER, nux::MINOR_SIZE_FULL);
  buttons_.push_back(button);

  QueueRelayout();
}
Beispiel #7
0
static ir_stmt_t un_nx(tr_expr_t expr)
{
    switch (expr->kind)
    {
        case TR_EX:
            return ir_expr_stmt(expr->u.ex);
        case TR_NX:
            return expr->u.nx;
        case TR_CX: {
            tmp_label_t label = tmp_label();
            fill_patch(expr->u.cx.trues, label);
            fill_patch(expr->u.cx.falses, label);
            return ir_seq_stmt(list(expr->u.cx.stmt,
                                    list(ir_label_stmt(label), NULL)));
        }
    }

    assert(0);
    return NULL;
}
Beispiel #8
0
tr_level_t tr_outermost(void)
{
    if (!_outermost)
        _outermost = tr_level(NULL, tmp_label(), NULL);
    return _outermost;
}