aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-06 20:07:43 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-06 20:07:43 -0700
commit3bcce5f6d1f48e20dd177a7e440ddea1c451e779 (patch)
tree0a5dca7cf1037e0fffe177a9c6fffe9605762a1b /src/value.zig
parentd4805472c3c98c488c17bce0ee28b6c44e93793c (diff)
downloadzig-3bcce5f6d1f48e20dd177a7e440ddea1c451e779.tar.gz
zig-3bcce5f6d1f48e20dd177a7e440ddea1c451e779.zip
Sema: implement writing structs to memory at comptime
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/value.zig b/src/value.zig
index 18c8357b6b..ac0344bf34 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -1033,6 +1033,11 @@ pub const Value = extern union {
}
pub fn writeToMemory(val: Value, ty: Type, target: Target, buffer: []u8) void {
+ if (val.isUndef()) {
+ const size = @intCast(usize, ty.abiSize(target));
+ std.mem.set(u8, buffer[0..size], 0xaa);
+ return;
+ }
switch (ty.zigTypeTag()) {
.Int => {
var bigint_buffer: BigIntSpace = undefined;
@@ -1068,6 +1073,14 @@ pub const Value = extern union {
buf_off += elem_size;
}
},
+ .Struct => {
+ const fields = ty.structFields().values();
+ const field_vals = val.castTag(.@"struct").?.data;
+ for (fields) |field, i| {
+ const off = @intCast(usize, ty.structFieldOffset(i, target));
+ writeToMemory(field_vals[i], field.ty, target, buffer[off..]);
+ }
+ },
else => @panic("TODO implement writeToMemory for more types"),
}
}
@@ -1106,7 +1119,7 @@ pub const Value = extern union {
fn floatReadFromMemory(comptime F: type, target: Target, buffer: []const u8) F {
if (F == f80) {
- // TODO: use std.math.F80Repr
+ // TODO: use std.math.F80Repr?
const big_int = std.mem.readInt(u128, buffer[0..16], target.cpu.arch.endian());
const int = @truncate(u80, big_int);
return @bitCast(F, int);