diff options
| author | gingerBill <bill@gingerbill.org> | 2018-07-28 20:56:27 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-07-28 20:56:27 +0100 |
| commit | a11d6e696a6c0b3c0e3147ee3f8dae2968ae2352 (patch) | |
| tree | c9f3b2ec2e724e33bca1120fc22d206601d62567 /src/ir.cpp | |
| parent | 1705ba806905bfbfd2352767ad95a0d1c0376090 (diff) | |
`expand_to_tuple` for fixed arrays
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 98bfbb99f..e546015d7 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -4840,19 +4840,29 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu case BuiltinProc_expand_to_tuple: { ir_emit_comment(proc, str_lit("expand_to_tuple")); - irValue *s = ir_build_expr(proc, ce->args[0]); - Type *t = base_type(ir_type(s)); + irValue *val = ir_build_expr(proc, ce->args[0]); + Type *t = base_type(ir_type(val)); - GB_ASSERT(t->kind == Type_Struct); GB_ASSERT(is_type_tuple(tv.type)); - irValue *tuple = ir_add_local_generated(proc, tv.type); - for_array(src_index, t->Struct.fields) { - Entity *field = t->Struct.fields[src_index]; - i32 field_index = field->Variable.field_index; - irValue *f = ir_emit_struct_ev(proc, s, field_index); - irValue *ep = ir_emit_struct_ep(proc, tuple, cast(i32)src_index); - ir_emit_store(proc, ep, f); + if (t->kind == Type_Struct) { + for_array(src_index, t->Struct.fields) { + Entity *field = t->Struct.fields[src_index]; + i32 field_index = field->Variable.field_index; + irValue *f = ir_emit_struct_ev(proc, val, field_index); + irValue *ep = ir_emit_struct_ep(proc, tuple, cast(i32)src_index); + ir_emit_store(proc, ep, f); + } + } else if (t->kind == Type_Array) { + // TODO(bill): Clean-up this code + irValue *ap = ir_address_from_load_or_generate_local(proc, val); + for (i32 i = 0; i < cast(i32)t->Array.count; i++) { + irValue *f = ir_emit_load(proc, ir_emit_array_epi(proc, ap, i)); + irValue *ep = ir_emit_struct_ep(proc, tuple, i); + ir_emit_store(proc, ep, f); + } + } else { + GB_PANIC("Unknown type of expand_to_tuple"); } return ir_emit_load(proc, tuple); } |