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; }
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; }
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)); }
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)))); }
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)))); }
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(); }
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; }
tr_level_t tr_outermost(void) { if (!_outermost) _outermost = tr_level(NULL, tmp_label(), NULL); return _outermost; }