aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorJimmi HC <jimmiholstchristensen@gmail.com>2019-01-06 17:49:24 +0100
committerJimmi HC <jimmiholstchristensen@gmail.com>2019-01-06 17:49:24 +0100
commite410b1f915974fe3daeebae324e8c4e4b42090dd (patch)
treecd70fbe70b7bedfe32613c43e40d51387519162a /src/ir.cpp
parentdb928915878c64f9e5c479739bd768bd4ac0b912 (diff)
downloadzig-e410b1f915974fe3daeebae324e8c4e4b42090dd.tar.gz
zig-e410b1f915974fe3daeebae324e8c4e4b42090dd.zip
Implemented buf_read_value_bytes for ZigTypeIdArray
* Only for x_array.special == ConstArraySpecialNone
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index d74bef2424..2353bb1086 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -20179,8 +20179,29 @@ static Error buf_read_value_bytes(IrAnalyze *ira, AstNode *source_node, uint8_t
val->data.x_ptr.data.hard_coded_addr.addr = bigint_as_unsigned(&bn);
return ErrorNone;
}
- case ZigTypeIdArray:
- zig_panic("TODO buf_read_value_bytes array type");
+ case ZigTypeIdArray: {
+ uint64_t elem_size = type_size(ira->codegen, val->type->data.array.child_type);
+ size_t len = val->type->data.array.len;
+
+ switch (val->data.x_array.special) {
+ case ConstArraySpecialNone:
+ val->data.x_array.data.s_none.elements = create_const_vals(len);
+ for (size_t i = 0; i < len; i++) {
+ ConstExprValue *elem = &val->data.x_array.data.s_none.elements[i];
+ elem->special = ConstValSpecialStatic;
+ elem->type = val->type->data.array.child_type;
+ if ((err = buf_read_value_bytes(ira, source_node, buf + (elem_size * i), elem)))
+ return err;
+ }
+ break;
+ case ConstArraySpecialUndef:
+ zig_panic("TODO buf_read_value_bytes ConstArraySpecialUndef array type");
+ case ConstArraySpecialBuf:
+ zig_panic("TODO buf_read_value_bytes ConstArraySpecialBuf array type");
+ }
+
+ return ErrorNone;
+ }
case ZigTypeIdStruct:
switch (val->type->data.structure.layout) {
case ContainerLayoutAuto: {