diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-02-20 00:08:05 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-02-20 00:08:05 -0700 |
| commit | 01638c250fa270c8cb3b3416ea55e22988cd32a2 (patch) | |
| tree | 668943f9135629f88b789b195dce1046d5eb2ba9 | |
| parent | bfff8544e1049fc7aa3310883f619efb3f394948 (diff) | |
| download | zig-01638c250fa270c8cb3b3416ea55e22988cd32a2.tar.gz zig-01638c250fa270c8cb3b3416ea55e22988cd32a2.zip | |
Sema: implement readFromMemory for arrays
| -rw-r--r-- | src/value.zig | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/value.zig b/src/value.zig index 84167e394f..a3569be29a 100644 --- a/src/value.zig +++ b/src/value.zig @@ -1090,7 +1090,12 @@ pub const Value = extern union { } } - pub fn readFromMemory(ty: Type, target: Target, buffer: []const u8, arena: Allocator) !Value { + pub fn readFromMemory( + ty: Type, + target: Target, + buffer: []const u8, + arena: Allocator, + ) Allocator.Error!Value { switch (ty.zigTypeTag()) { .Int => { const int_info = ty.intInfo(target); @@ -1111,6 +1116,17 @@ pub const Value = extern union { 128 => return Value.Tag.float_128.create(arena, floatReadFromMemory(f128, target, buffer)), else => unreachable, }, + .Array => { + const elem_ty = ty.childType(); + const elem_size = elem_ty.abiSize(target); + const elems = try arena.alloc(Value, @intCast(usize, ty.arrayLen())); + var offset: usize = 0; + for (elems) |*elem| { + elem.* = try readFromMemory(elem_ty, target, buffer[offset..], arena); + offset += elem_size; + } + return Tag.array.create(arena, elems); + }, else => @panic("TODO implement readFromMemory for more types"), } } |
