| ... | ... | @@ -1217,19 +1217,37 @@ pub const DeclGen = struct { |
| 1217 | 1217 | const error_ty = ty.errorUnionSet(); |
| 1218 | 1218 | const payload_ty = ty.errorUnionPayload(); |
| 1219 | 1219 | const is_pl = val.errorUnionIsPayload(); |
| 1220 | const abi_align = ty.abiAlignment(self.target()); |
| 1220 | 1221 | |
| 1221 | | const err_val = if (!is_pl) val else Value.initTag(.zero); |
| 1222 | | switch (try self.genTypedValue(error_ty, err_val)) { |
| 1223 | | .externally_managed => |data| try writer.writeAll(data), |
| 1224 | | .appended => {}, |
| 1222 | { |
| 1223 | const err_val = if (!is_pl) val else Value.initTag(.zero); |
| 1224 | const start = self.code.items.len; |
| 1225 | switch (try self.genTypedValue(error_ty, err_val)) { |
| 1226 | .externally_managed => |data| try writer.writeAll(data), |
| 1227 | .appended => {}, |
| 1228 | } |
| 1229 | const unpadded_end = self.code.items.len - start; |
| 1230 | const padded_end = mem.alignForwardGeneric(usize, unpadded_end, abi_align); |
| 1231 | const padding = padded_end - unpadded_end; |
| 1232 | if (padding > 0) { |
| 1233 | try writer.writeByteNTimes(0, padding); |
| 1234 | } |
| 1225 | 1235 | } |
| 1226 | 1236 | |
| 1227 | 1237 | if (payload_ty.hasRuntimeBits()) { |
| 1238 | const start = self.code.items.len; |
| 1228 | 1239 | const pl_val = if (val.castTag(.eu_payload)) |pl| pl.data else Value.initTag(.undef); |
| 1229 | 1240 | switch (try self.genTypedValue(payload_ty, pl_val)) { |
| 1230 | 1241 | .externally_managed => |data| try writer.writeAll(data), |
| 1231 | 1242 | .appended => {}, |
| 1232 | 1243 | } |
| 1244 | |
| 1245 | const unpadded_end = self.code.items.len - start; |
| 1246 | const padded_end = mem.alignForwardGeneric(usize, unpadded_end, abi_align); |
| 1247 | const padding = padded_end - unpadded_end; |
| 1248 | if (padding > 0) { |
| 1249 | try writer.writeByteNTimes(0, padding); |
| 1250 | } |
| 1233 | 1251 | } |
| 1234 | 1252 | |
| 1235 | 1253 | return Result{ .appended = {} }; |
| ... | ... | @@ -2065,15 +2083,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue { |
| 2065 | 2083 | decl.markAlive(); |
| 2066 | 2084 | const target_sym_index = decl.link.wasm.sym_index; |
| 2067 | 2085 | if (ty.isSlice()) { |
| 2068 | | var slice_len: Value.Payload.U64 = .{ |
| 2069 | | .base = .{ .tag = .int_u64 }, |
| 2070 | | .data = val.sliceLen(), |
| 2071 | | }; |
| 2072 | | var slice_val: Value.Payload.Slice = .{ |
| 2073 | | .base = .{ .tag = .slice }, |
| 2074 | | .data = .{ .ptr = val.slicePtr(), .len = Value.initPayload(&slice_len.base) }, |
| 2075 | | }; |
| 2076 | | return self.lowerConstant(Value.initPayload(&slice_val.base), ty); |
| 2086 | return WValue{ .memory = try self.bin_file.lowerUnnamedConst(self.decl, .{ .ty = ty, .val = val }) }; |
| 2077 | 2087 | } else if (decl.ty.zigTypeTag() == .Fn) { |
| 2078 | 2088 | try self.bin_file.addTableFunction(target_sym_index); |
| 2079 | 2089 | return WValue{ .function_index = target_sym_index }; |
| ... | ... | @@ -2702,11 +2712,13 @@ fn airUnwrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) InnerError!WValue |
| 2702 | 2712 | const err_ty = self.air.typeOf(ty_op.operand); |
| 2703 | 2713 | const payload_ty = err_ty.errorUnionPayload(); |
| 2704 | 2714 | if (!payload_ty.hasRuntimeBits()) return WValue{ .none = {} }; |
| 2705 | | const offset = @intCast(u32, err_ty.errorUnionSet().abiSize(self.target)); |
| 2715 | const err_align = err_ty.abiAlignment(self.target); |
| 2716 | const set_size = err_ty.errorUnionSet().abiSize(self.target); |
| 2717 | const offset = mem.alignForwardGeneric(u64, set_size, err_align); |
| 2706 | 2718 | if (isByRef(payload_ty, self.target)) { |
| 2707 | 2719 | return self.buildPointerOffset(operand, offset, .new); |
| 2708 | 2720 | } |
| 2709 | | return self.load(operand, payload_ty, offset); |
| 2721 | return self.load(operand, payload_ty, @intCast(u32, offset)); |
| 2710 | 2722 | } |
| 2711 | 2723 | |
| 2712 | 2724 | fn airUnwrapErrUnionError(self: *Self, inst: Air.Inst.Index) InnerError!WValue { |
| ... | ... | @@ -2732,7 +2744,9 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) InnerError!WValue { |
| 2732 | 2744 | const op_ty = self.air.typeOf(ty_op.operand); |
| 2733 | 2745 | if (!op_ty.hasRuntimeBits()) return operand; |
| 2734 | 2746 | const err_ty = self.air.getRefType(ty_op.ty); |
| 2735 | | const offset = err_ty.errorUnionSet().abiSize(self.target); |
| 2747 | const err_align = err_ty.abiAlignment(self.target); |
| 2748 | const set_size = err_ty.errorUnionSet().abiSize(self.target); |
| 2749 | const offset = mem.alignForwardGeneric(u64, set_size, err_align); |
| 2736 | 2750 | |
| 2737 | 2751 | const err_union = try self.allocStack(err_ty); |
| 2738 | 2752 | const payload_ptr = try self.buildPointerOffset(err_union, offset, .new); |