diff options
| author | DerryAlex <105348204+DerryAlex@users.noreply.github.com> | 2023-03-14 19:08:56 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-14 13:08:56 +0200 |
| commit | d6e48abde87400a8a4851c7ab8c918005d81d058 (patch) | |
| tree | c87cf804f76125ebc1979e63e705d8e127a178eb /src | |
| parent | 9ecdcb8e300a4f6aac050e3118ceea0b7d35f899 (diff) | |
| download | zig-d6e48abde87400a8a4851c7ab8c918005d81d058.tar.gz zig-d6e48abde87400a8a4851c7ab8c918005d81d058.zip | |
Implement readFromMemory/writeToMemory for ptrLikeOptional
Diffstat (limited to 'src')
| -rw-r--r-- | src/value.zig | 34 |
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"), } } |
