aboutsummaryrefslogtreecommitdiff
path: root/src/ir.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-04-30 15:09:36 +0100
committerGinger Bill <bill@gingerbill.org>2017-04-30 15:09:36 +0100
commit784f3ecf7e427c1d948541f62253d6d2eab9e70d (patch)
treedd1dba8ff48b3b31944773fc341de8832b0fd582 /src/ir.c
parent54ea70df985546fa2d1fc95f55b5a83a41ee469c (diff)
Syntax change: cast(T)x => T(x); union_cast(T)x => x.(T); transmute(T)x => transmute(T, x); `y:=^x` => `y:=&x;`
Sorry for all the code breaking in this commit :(
Diffstat (limited to 'src/ir.c')
-rw-r--r--src/ir.c81
1 files changed, 22 insertions, 59 deletions
diff --git a/src/ir.c b/src/ir.c
index 6de568b91..12bb07826 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -3105,7 +3105,7 @@ irValue *ir_emit_union_cast(irProcedure *proc, irValue *value, Type *type, Token
args[4] = ir_type_info(proc, src_type);
args[5] = ir_type_info(proc, dst_type);
- ir_emit_global_call(proc, "__union_cast_check", args, 6);
+ ir_emit_global_call(proc, "__type_assertion_check", args, 6);
return ir_emit_load(proc, ir_emit_struct_ep(proc, v, 0));
}
@@ -3606,36 +3606,21 @@ irValue *ir_build_expr(irProcedure *proc, AstNode *expr) {
case_end;
#endif
- case_ast_node(ce, CastExpr, expr);
+ case_ast_node(ta, TypeAssertion, expr);
Type *type = tv->type;
- irValue *e = ir_build_expr(proc, ce->expr);
- switch (ce->token.kind) {
- case Token_cast:
- ir_emit_comment(proc, str_lit("cast - cast"));
- return ir_emit_conv(proc, e, type);
-
- case Token_transmute:
- ir_emit_comment(proc, str_lit("cast - transmute"));
- return ir_emit_transmute(proc, e, type);
-
- #if 0
- case Token_down_cast:
- ir_emit_comment(proc, str_lit("cast - down_cast"));
- return ir_emit_down_cast(proc, e, type);
- #endif
-
- case Token_union_cast:
+ irValue *e = ir_build_expr(proc, ta->expr);
+ Type *t = type_deref(ir_type(e));
+ if (is_type_union(t)) {
ir_emit_comment(proc, str_lit("cast - union_cast"));
return ir_emit_union_cast(proc, e, type, ast_node_token(expr).pos);
-
- default:
- GB_PANIC("Unknown cast expression");
+ } else {
+ GB_PANIC("TODO(bill): type assertion %s", type_to_string(ir_type(e)));
}
case_end;
case_ast_node(ue, UnaryExpr, expr);
switch (ue->op.kind) {
- case Token_Pointer:
+ case Token_And:
return ir_emit_ptr_offset(proc, ir_build_addr(proc, ue->expr).addr, v_zero); // Make a copy of the pointer
default:
return ir_emit_unary_arith(proc, ue->op.kind, ir_build_expr(proc, ue->expr), tv->type);
@@ -3734,6 +3719,11 @@ irValue *ir_build_expr(irProcedure *proc, AstNode *expr) {
return ir_type_info(proc, t);
} break;
+ case BuiltinProc_transmute: {
+ irValue *x = ir_build_expr(proc, ce->args.e[1]);
+ return ir_emit_transmute(proc, x, tv->type);
+ }
+
case BuiltinProc_len: {
irValue *v = ir_build_expr(proc, ce->args.e[0]);
Type *t = base_type(ir_type(v));
@@ -4736,50 +4726,23 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
}
case_end;
- case_ast_node(ce, CastExpr, expr);
- switch (ce->token.kind) {
- case Token_cast: {
- ir_emit_comment(proc, str_lit("Cast - cast"));
- // NOTE(bill): Needed for dereference of pointer conversion
- Type *type = type_of_expr(proc->module->info, expr);
- irValue *v = ir_add_local_generated(proc, type);
- ir_emit_store(proc, v, ir_emit_conv(proc, ir_build_expr(proc, ce->expr), type));
- return ir_addr(v);
- }
- case Token_transmute: {
- ir_emit_comment(proc, str_lit("Cast - transmute"));
- // NOTE(bill): Needed for dereference of pointer conversion
- Type *type = type_of_expr(proc->module->info, expr);
- irValue *v = ir_add_local_generated(proc, type);
- ir_emit_store(proc, v, ir_emit_transmute(proc, ir_build_expr(proc, ce->expr), type));
- return ir_addr(v);
- }
- #if 0
- case Token_down_cast: {
- ir_emit_comment(proc, str_lit("Cast - down_cast"));
- // NOTE(bill): Needed for dereference of pointer conversion
+ case_ast_node(ta, TypeAssertion, expr);
+ irValue *e = ir_build_expr(proc, ta->expr);
+ Type *t = type_deref(ir_type(e));
+ if (is_type_union(t)) {
Type *type = type_of_expr(proc->module->info, expr);
irValue *v = ir_add_local_generated(proc, type);
- ir_emit_store(proc, v, ir_emit_down_cast(proc, ir_build_expr(proc, ce->expr), type));
- return ir_addr(v);
- }
- #endif
- case Token_union_cast: {
- ir_emit_comment(proc, str_lit("Cast - union_cast"));
- // NOTE(bill): Needed for dereference of pointer conversion
- Type *type = type_of_expr(proc->module->info, expr);
- irValue *v = ir_add_local_generated(proc, type);
- ir_emit_store(proc, v, ir_emit_union_cast(proc, ir_build_expr(proc, ce->expr), type, ast_node_token(expr).pos));
+ ir_emit_comment(proc, str_lit("cast - union_cast"));
+ ir_emit_store(proc, v, ir_emit_union_cast(proc, ir_build_expr(proc, ta->expr), type, ast_node_token(expr).pos));
return ir_addr(v);
- }
- default:
- GB_PANIC("Unknown cast expression");
+ } else {
+ GB_PANIC("TODO(bill): type assertion %s", type_to_string(ir_type(e)));
}
case_end;
case_ast_node(ue, UnaryExpr, expr);
switch (ue->op.kind) {
- case Token_Pointer: {
+ case Token_And: {
return ir_build_addr(proc, ue->expr);
}
default: