aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tilde_expr.cpp')
-rw-r--r--src/tilde_expr.cpp69
1 files changed, 38 insertions, 31 deletions
diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp
index 3d9054803..b6dbce181 100644
--- a/src/tilde_expr.cpp
+++ b/src/tilde_expr.cpp
@@ -15,6 +15,15 @@ gb_internal cgValue cg_flatten_value(cgProcedure *p, cgValue value) {
return value;
}
+gb_internal cgValue cg_emit_select(cgProcedure *p, cgValue const &cond, cgValue const &x, cgValue const &y) {
+ GB_ASSERT(x.kind == y.kind);
+ GB_ASSERT(cond.kind == cgValue_Value);
+ cgValue res = x;
+ res.node = tb_inst_select(p->func, cond.node, x.node, y.node);
+ return res;
+}
+
+
gb_internal bool cg_is_expr_untyped_const(Ast *expr) {
auto const &tv = type_and_value_of_expr(expr);
if (is_type_untyped(tv.type)) {
@@ -1724,36 +1733,35 @@ gb_internal cgValue cg_build_binary_expr(cgProcedure *p, Ast *expr) {
case Token_CmpEq:
case Token_NotEq:
- GB_PANIC("TODO(bill): comparisons");
- // if (is_type_untyped_nil(be->right->tav.type)) {
- // // `x == nil` or `x != nil`
- // cgValue left = cg_build_expr(p, be->left);
- // cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, left);
- // Type *type = default_type(tv.type);
- // return cg_emit_conv(p, cmp, type);
- // } else if (is_type_untyped_nil(be->left->tav.type)) {
- // // `nil == x` or `nil != x`
- // cgValue right = cg_build_expr(p, be->right);
- // cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, right);
- // Type *type = default_type(tv.type);
- // return cg_emit_conv(p, cmp, type);
- // } else if (cg_is_empty_string_constant(be->right)) {
- // // `x == ""` or `x != ""`
- // cgValue s = cg_build_expr(p, be->left);
- // s = cg_emit_conv(p, s, t_string);
- // cgValue len = cg_string_len(p, s);
- // cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0));
- // Type *type = default_type(tv.type);
- // return cg_emit_conv(p, cmp, type);
- // } else if (cg_is_empty_string_constant(be->left)) {
- // // `"" == x` or `"" != x`
- // cgValue s = cg_build_expr(p, be->right);
- // s = cg_emit_conv(p, s, t_string);
- // cgValue len = cg_string_len(p, s);
- // cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0));
- // Type *type = default_type(tv.type);
- // return cg_emit_conv(p, cmp, type);
- // }
+ if (is_type_untyped_nil(be->right->tav.type)) {
+ // `x == nil` or `x != nil`
+ cgValue left = cg_build_expr(p, be->left);
+ cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, left);
+ Type *type = default_type(tv.type);
+ return cg_emit_conv(p, cmp, type);
+ } else if (is_type_untyped_nil(be->left->tav.type)) {
+ // `nil == x` or `nil != x`
+ cgValue right = cg_build_expr(p, be->right);
+ cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, right);
+ Type *type = default_type(tv.type);
+ return cg_emit_conv(p, cmp, type);
+ }/* else if (cg_is_empty_string_constant(be->right)) {
+ // `x == ""` or `x != ""`
+ cgValue s = cg_build_expr(p, be->left);
+ s = cg_emit_conv(p, s, t_string);
+ cgValue len = cg_string_len(p, s);
+ cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0));
+ Type *type = default_type(tv.type);
+ return cg_emit_conv(p, cmp, type);
+ } else if (cg_is_empty_string_constant(be->left)) {
+ // `"" == x` or `"" != x`
+ cgValue s = cg_build_expr(p, be->right);
+ s = cg_emit_conv(p, s, t_string);
+ cgValue len = cg_string_len(p, s);
+ cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0));
+ Type *type = default_type(tv.type);
+ return cg_emit_conv(p, cmp, type);
+ }*/
/*fallthrough*/
case Token_Lt:
case Token_LtEq:
@@ -2255,7 +2263,6 @@ gb_internal cgValue cg_build_expr_internal(cgProcedure *p, Ast *expr) {
token_pos_to_string(token.pos));
return {};
} else if (e->kind == Entity_Nil) {
- GB_PANIC("TODO: cg_find_ident nil");
// TODO(bill): is this correct?
return cg_value(cast(TB_Node *)nullptr, e->type);
}