mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
wasm: Implement opt_payload_ptr
Implements lowering constants for pointers of value 'opt_payload_ptr'. The offset is calculated by determining the abi size of the full type and then substracting the payload size.
This commit is contained in:
parent
a9a629f89a
commit
685f05b562
@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV
|
||||
.offset = @intCast(u32, offset),
|
||||
} };
|
||||
},
|
||||
.opt_payload_ptr => {
|
||||
const payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
|
||||
const parent_ptr = try self.lowerParentPtr(payload_ptr.container_ptr, payload_ptr.container_ty);
|
||||
var buf: Type.Payload.ElemType = undefined;
|
||||
const payload_ty = payload_ptr.container_ty.optionalChild(&buf);
|
||||
if (!payload_ty.hasRuntimeBitsIgnoreComptime() or payload_ty.isPtrLikeOptional()) {
|
||||
return parent_ptr;
|
||||
}
|
||||
|
||||
const abi_size = payload_ptr.container_ty.abiSize(self.target);
|
||||
const offset = abi_size - payload_ty.abiSize(self.target);
|
||||
|
||||
return WValue{ .memory_offset = .{
|
||||
.pointer = parent_ptr.memory,
|
||||
.offset = @intCast(u32, offset),
|
||||
} };
|
||||
},
|
||||
else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),
|
||||
}
|
||||
}
|
||||
@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {
|
||||
else => unreachable,
|
||||
},
|
||||
.Pointer => switch (val.tag()) {
|
||||
.field_ptr, .elem_ptr => {
|
||||
.field_ptr, .elem_ptr, .opt_payload_ptr => {
|
||||
return self.lowerParentPtr(val, ty.childType());
|
||||
},
|
||||
.int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user