aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorDerryAlex <105348204+DerryAlex@users.noreply.github.com>2023-03-14 19:08:56 +0800
committerGitHub <noreply@github.com>2023-03-14 13:08:56 +0200
commitd6e48abde87400a8a4851c7ab8c918005d81d058 (patch)
treec87cf804f76125ebc1979e63e705d8e127a178eb /src/value.zig
parent9ecdcb8e300a4f6aac050e3118ceea0b7d35f899 (diff)
downloadzig-d6e48abde87400a8a4851c7ab8c918005d81d058.tar.gz
zig-d6e48abde87400a8a4851c7ab8c918005d81d058.zip
Implement readFromMemory/writeToMemory for ptrLikeOptional
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig
index b6d27d620d..e5283d1270 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -1365,6 +1365,17 @@ pub const Value = extern union {
if (val.isDeclRef()) return error.ReinterpretDeclRef;
return val.writeToMemory(Type.usize, mod, buffer);
},
+ .Optional => {
+ assert(ty.isPtrLikeOptional());
+ var buf: Type.Payload.ElemType = undefined;
+ const child = ty.optionalChild(&buf);
+ const opt_val = val.optionalValue();
+ if (opt_val) |some| {
+ return some.writeToMemory(child, mod, buffer);
+ } else {
+ return writeToMemory(Value.zero, Type.usize, mod, buffer);
+ }
+ },
else => @panic("TODO implement writeToMemory for more types"),
}
}
@@ -1471,6 +1482,17 @@ pub const Value = extern union {
if (val.isDeclRef()) return error.ReinterpretDeclRef;
return val.writeToPackedMemory(Type.usize, mod, buffer, bit_offset);
},
+ .Optional => {
+ assert(ty.isPtrLikeOptional());
+ var buf: Type.Payload.ElemType = undefined;
+ const child = ty.optionalChild(&buf);
+ const opt_val = val.optionalValue();
+ if (opt_val) |some| {
+ return some.writeToPackedMemory(child, mod, buffer, bit_offset);
+ } else {
+ return writeToPackedMemory(Value.zero, Type.usize, mod, buffer, bit_offset);
+ }
+ },
else => @panic("TODO implement writeToPackedMemory for more types"),
}
}
@@ -1579,6 +1601,12 @@ pub const Value = extern union {
assert(!ty.isSlice()); // No well defined layout.
return readFromMemory(Type.usize, mod, buffer, arena);
},
+ .Optional => {
+ assert(ty.isPtrLikeOptional());
+ var buf: Type.Payload.ElemType = undefined;
+ const child = ty.optionalChild(&buf);
+ return readFromMemory(child, mod, buffer, arena);
+ },
else => @panic("TODO implement readFromMemory for more types"),
}
}
@@ -1670,6 +1698,12 @@ pub const Value = extern union {
assert(!ty.isSlice()); // No well defined layout.
return readFromPackedMemory(Type.usize, mod, buffer, bit_offset, arena);
},
+ .Optional => {
+ assert(ty.isPtrLikeOptional());
+ var buf: Type.Payload.ElemType = undefined;
+ const child = ty.optionalChild(&buf);
+ return readFromPackedMemory(child, mod, buffer, bit_offset, arena);
+ },
else => @panic("TODO implement readFromPackedMemory for more types"),
}
}