| author | |
| committer | |
| log | bbd750ff05895f29be646bf51e8932c3c9fb14f3 |
| tree | eb76c4342ad12581cbf84289a692de18ead005ab |
| parent | a2a5d3c2885cacf16d55d7943d10a81a5dc31b8a |
3 files changed, 92 insertions(+), 55 deletions(-)
src/Sema.zig+31-14| ... | @@ -5568,7 +5568,10 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -5568,7 +5568,10 @@ fn analyzeOptionalPayloadPtr( |
| 5568 | } | 5568 | } |
| 5569 | return sema.addConstant( | 5569 | return sema.addConstant( |
| 5570 | child_pointer, | 5570 | child_pointer, |
| 5571 | try Value.Tag.opt_payload_ptr.create(sema.arena, ptr_val), | 5571 | try Value.Tag.opt_payload_ptr.create(sema.arena, .{ |
| 5572 | .container_ptr = ptr_val, | ||
| 5573 | .container_ty = optional_ptr_ty.childType(), | ||
| 5574 | }), | ||
| 5572 | ); | 5575 | ); |
| 5573 | } | 5576 | } |
| 5574 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { | 5577 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { |
| ... | @@ -5578,7 +5581,10 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -5578,7 +5581,10 @@ fn analyzeOptionalPayloadPtr( |
| 5578 | // The same Value represents the pointer to the optional and the payload. | 5581 | // The same Value represents the pointer to the optional and the payload. |
| 5579 | return sema.addConstant( | 5582 | return sema.addConstant( |
| 5580 | child_pointer, | 5583 | child_pointer, |
| 5581 | try Value.Tag.opt_payload_ptr.create(sema.arena, ptr_val), | 5584 | try Value.Tag.opt_payload_ptr.create(sema.arena, .{ |
| 5585 | .container_ptr = ptr_val, | ||
| 5586 | .container_ty = optional_ptr_ty.childType(), | ||
| 5587 | }), | ||
| 5582 | ); | 5588 | ); |
| 5583 | } | 5589 | } |
| 5584 | } | 5590 | } |
| ... | @@ -5733,7 +5739,10 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -5733,7 +5739,10 @@ fn analyzeErrUnionPayloadPtr( |
| 5733 | } | 5739 | } |
| 5734 | return sema.addConstant( | 5740 | return sema.addConstant( |
| 5735 | operand_pointer_ty, | 5741 | operand_pointer_ty, |
| 5736 | try Value.Tag.eu_payload_ptr.create(sema.arena, ptr_val), | 5742 | try Value.Tag.eu_payload_ptr.create(sema.arena, .{ |
| 5743 | .container_ptr = ptr_val, | ||
| 5744 | .container_ty = operand_ty.elemType(), | ||
| 5745 | }), | ||
| 5737 | ); | 5746 | ); |
| 5738 | } | 5747 | } |
| 5739 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { | 5748 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { |
| ... | @@ -5743,7 +5752,10 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -5743,7 +5752,10 @@ fn analyzeErrUnionPayloadPtr( |
| 5743 | 5752 | ||
| 5744 | return sema.addConstant( | 5753 | return sema.addConstant( |
| 5745 | operand_pointer_ty, | 5754 | operand_pointer_ty, |
| 5746 | try Value.Tag.eu_payload_ptr.create(sema.arena, ptr_val), | 5755 | try Value.Tag.eu_payload_ptr.create(sema.arena, .{ |
| 5756 | .container_ptr = ptr_val, | ||
| 5757 | .container_ty = operand_ty.elemType(), | ||
| 5758 | }), | ||
| 5747 | ); | 5759 | ); |
| 5748 | } | 5760 | } |
| 5749 | } | 5761 | } |
| ... | @@ -6652,6 +6664,7 @@ fn zirSwitchCapture( | ... | @@ -6652,6 +6664,7 @@ fn zirSwitchCapture( |
| 6652 | field_ty_ptr, | 6664 | field_ty_ptr, |
| 6653 | try Value.Tag.field_ptr.create(sema.arena, .{ | 6665 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 6654 | .container_ptr = op_ptr_val, | 6666 | .container_ptr = op_ptr_val, |
| 6667 | .container_ty = operand_ty, | ||
| 6655 | .field_index = field_index, | 6668 | .field_index = field_index, |
| 6656 | }), | 6669 | }), |
| 6657 | ); | 6670 | ); |
| ... | @@ -9638,7 +9651,7 @@ fn analyzePtrArithmetic( | ... | @@ -9638,7 +9651,7 @@ fn analyzePtrArithmetic( |
| 9638 | if (air_tag == .ptr_sub) { | 9651 | if (air_tag == .ptr_sub) { |
| 9639 | return sema.fail(block, op_src, "TODO implement Sema comptime pointer subtraction", .{}); | 9652 | return sema.fail(block, op_src, "TODO implement Sema comptime pointer subtraction", .{}); |
| 9640 | } | 9653 | } |
| 9641 | const new_ptr_val = try ptr_val.elemPtr(sema.arena, offset_int); | 9654 | const new_ptr_val = try ptr_val.elemPtr(ptr_ty, sema.arena, offset_int); |
| 9642 | return sema.addConstant(new_ptr_ty, new_ptr_val); | 9655 | return sema.addConstant(new_ptr_ty, new_ptr_val); |
| 9643 | } else break :rs offset_src; | 9656 | } else break :rs offset_src; |
| 9644 | } else break :rs ptr_src; | 9657 | } else break :rs ptr_src; |
| ... | @@ -15903,6 +15916,7 @@ fn finishFieldCallBind( | ... | @@ -15903,6 +15916,7 @@ fn finishFieldCallBind( |
| 15903 | ptr_field_ty, | 15916 | ptr_field_ty, |
| 15904 | try Value.Tag.field_ptr.create(arena, .{ | 15917 | try Value.Tag.field_ptr.create(arena, .{ |
| 15905 | .container_ptr = struct_ptr_val, | 15918 | .container_ptr = struct_ptr_val, |
| 15919 | .container_ty = ptr_ty.childType(), | ||
| 15906 | .field_index = field_index, | 15920 | .field_index = field_index, |
| 15907 | }), | 15921 | }), |
| 15908 | ); | 15922 | ); |
| ... | @@ -16065,6 +16079,7 @@ fn structFieldPtrByIndex( | ... | @@ -16065,6 +16079,7 @@ fn structFieldPtrByIndex( |
| 16065 | ptr_field_ty, | 16079 | ptr_field_ty, |
| 16066 | try Value.Tag.field_ptr.create(sema.arena, .{ | 16080 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 16067 | .container_ptr = struct_ptr_val, | 16081 | .container_ptr = struct_ptr_val, |
| 16082 | .container_ty = struct_ptr_ty.childType(), | ||
| 16068 | .field_index = field_index, | 16083 | .field_index = field_index, |
| 16069 | }), | 16084 | }), |
| 16070 | ); | 16085 | ); |
| ... | @@ -16241,6 +16256,7 @@ fn unionFieldPtr( | ... | @@ -16241,6 +16256,7 @@ fn unionFieldPtr( |
| 16241 | ptr_field_ty, | 16256 | ptr_field_ty, |
| 16242 | try Value.Tag.field_ptr.create(arena, .{ | 16257 | try Value.Tag.field_ptr.create(arena, .{ |
| 16243 | .container_ptr = union_ptr_val, | 16258 | .container_ptr = union_ptr_val, |
| 16259 | .container_ty = union_ty, | ||
| 16244 | .field_index = field_index, | 16260 | .field_index = field_index, |
| 16245 | }), | 16261 | }), |
| 16246 | ); | 16262 | ); |
| ... | @@ -16333,7 +16349,7 @@ fn elemPtr( | ... | @@ -16333,7 +16349,7 @@ fn elemPtr( |
| 16333 | const runtime_src = if (maybe_slice_val) |slice_val| rs: { | 16349 | const runtime_src = if (maybe_slice_val) |slice_val| rs: { |
| 16334 | const index_val = maybe_index_val orelse break :rs elem_index_src; | 16350 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16335 | const index = @intCast(usize, index_val.toUnsignedInt()); | 16351 | const index = @intCast(usize, index_val.toUnsignedInt()); |
| 16336 | const elem_ptr = try slice_val.elemPtr(sema.arena, index); | 16352 | const elem_ptr = try slice_val.elemPtr(array_ty, sema.arena, index); |
| 16337 | return sema.addConstant(result_ty, elem_ptr); | 16353 | return sema.addConstant(result_ty, elem_ptr); |
| 16338 | } else array_ptr_src; | 16354 | } else array_ptr_src; |
| 16339 | 16355 | ||
| ... | @@ -16348,7 +16364,7 @@ fn elemPtr( | ... | @@ -16348,7 +16364,7 @@ fn elemPtr( |
| 16348 | const ptr_val = maybe_ptr_val orelse break :rs array_ptr_src; | 16364 | const ptr_val = maybe_ptr_val orelse break :rs array_ptr_src; |
| 16349 | const index_val = maybe_index_val orelse break :rs elem_index_src; | 16365 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16350 | const index = @intCast(usize, index_val.toUnsignedInt()); | 16366 | const index = @intCast(usize, index_val.toUnsignedInt()); |
| 16351 | const elem_ptr = try ptr_val.elemPtr(sema.arena, index); | 16367 | const elem_ptr = try ptr_val.elemPtr(array_ty, sema.arena, index); |
| 16352 | return sema.addConstant(result_ty, elem_ptr); | 16368 | return sema.addConstant(result_ty, elem_ptr); |
| 16353 | }; | 16369 | }; |
| 16354 | 16370 | ||
| ... | @@ -16473,6 +16489,7 @@ fn tupleFieldPtr( | ... | @@ -16473,6 +16489,7 @@ fn tupleFieldPtr( |
| 16473 | ptr_field_ty, | 16489 | ptr_field_ty, |
| 16474 | try Value.Tag.field_ptr.create(sema.arena, .{ | 16490 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 16475 | .container_ptr = tuple_ptr_val, | 16491 | .container_ptr = tuple_ptr_val, |
| 16492 | .container_ty = tuple_ty, | ||
| 16476 | .field_index = field_index, | 16493 | .field_index = field_index, |
| 16477 | }), | 16494 | }), |
| 16478 | ); | 16495 | ); |
| ... | @@ -16563,7 +16580,7 @@ fn elemPtrArray( | ... | @@ -16563,7 +16580,7 @@ fn elemPtrArray( |
| 16563 | const index_u64 = index_val.toUnsignedInt(); | 16580 | const index_u64 = index_val.toUnsignedInt(); |
| 16564 | // @intCast here because it would have been impossible to construct a value that | 16581 | // @intCast here because it would have been impossible to construct a value that |
| 16565 | // required a larger index. | 16582 | // required a larger index. |
| 16566 | const elem_ptr = try array_ptr_val.elemPtr(sema.arena, @intCast(usize, index_u64)); | 16583 | const elem_ptr = try array_ptr_val.elemPtr(array_ptr_ty, sema.arena, @intCast(usize, index_u64)); |
| 16567 | return sema.addConstant(result_ty, elem_ptr); | 16584 | return sema.addConstant(result_ty, elem_ptr); |
| 16568 | } | 16585 | } |
| 16569 | } | 16586 | } |
| ... | @@ -17757,8 +17774,8 @@ fn beginComptimePtrMutation( | ... | @@ -17757,8 +17774,8 @@ fn beginComptimePtrMutation( |
| 17757 | } | 17774 | } |
| 17758 | }, | 17775 | }, |
| 17759 | .eu_payload_ptr => { | 17776 | .eu_payload_ptr => { |
| 17760 | const eu_ptr_val = ptr_val.castTag(.eu_payload_ptr).?.data; | 17777 | const eu_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 17761 | var parent = try beginComptimePtrMutation(sema, block, src, eu_ptr_val); | 17778 | var parent = try beginComptimePtrMutation(sema, block, src, eu_ptr.container_ptr); |
| 17762 | const payload_ty = parent.ty.errorUnionPayload(); | 17779 | const payload_ty = parent.ty.errorUnionPayload(); |
| 17763 | switch (parent.val.tag()) { | 17780 | switch (parent.val.tag()) { |
| 17764 | else => { | 17781 | else => { |
| ... | @@ -17790,8 +17807,8 @@ fn beginComptimePtrMutation( | ... | @@ -17790,8 +17807,8 @@ fn beginComptimePtrMutation( |
| 17790 | } | 17807 | } |
| 17791 | }, | 17808 | }, |
| 17792 | .opt_payload_ptr => { | 17809 | .opt_payload_ptr => { |
| 17793 | const opt_ptr_val = ptr_val.castTag(.opt_payload_ptr).?.data; | 17810 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 17794 | var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr_val); | 17811 | var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr); |
| 17795 | const payload_ty = try parent.ty.optionalChildAlloc(sema.arena); | 17812 | const payload_ty = try parent.ty.optionalChildAlloc(sema.arena); |
| 17796 | switch (parent.val.tag()) { | 17813 | switch (parent.val.tag()) { |
| 17797 | .undef, .null_value => { | 17814 | .undef, .null_value => { |
| ... | @@ -17965,7 +17982,7 @@ fn beginComptimePtrLoad( | ... | @@ -17965,7 +17982,7 @@ fn beginComptimePtrLoad( |
| 17965 | }, | 17982 | }, |
| 17966 | .eu_payload_ptr => { | 17983 | .eu_payload_ptr => { |
| 17967 | const err_union_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; | 17984 | const err_union_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 17968 | const parent = try beginComptimePtrLoad(sema, block, src, err_union_ptr); | 17985 | const parent = try beginComptimePtrLoad(sema, block, src, err_union_ptr.container_ptr); |
| 17969 | return ComptimePtrLoadKit{ | 17986 | return ComptimePtrLoadKit{ |
| 17970 | .root_val = parent.root_val, | 17987 | .root_val = parent.root_val, |
| 17971 | .root_ty = parent.root_ty, | 17988 | .root_ty = parent.root_ty, |
| ... | @@ -17977,7 +17994,7 @@ fn beginComptimePtrLoad( | ... | @@ -17977,7 +17994,7 @@ fn beginComptimePtrLoad( |
| 17977 | }, | 17994 | }, |
| 17978 | .opt_payload_ptr => { | 17995 | .opt_payload_ptr => { |
| 17979 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; | 17996 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 17980 | const parent = try beginComptimePtrLoad(sema, block, src, opt_ptr); | 17997 | const parent = try beginComptimePtrLoad(sema, block, src, opt_ptr.container_ptr); |
| 17981 | return ComptimePtrLoadKit{ | 17998 | return ComptimePtrLoadKit{ |
| 17982 | .root_val = parent.root_val, | 17999 | .root_val = parent.root_val, |
| 17983 | .root_ty = parent.root_ty, | 18000 | .root_ty = parent.root_ty, |
src/codegen/llvm.zig+2-2| ... | @@ -2901,7 +2901,7 @@ pub const DeclGen = struct { | ... | @@ -2901,7 +2901,7 @@ pub const DeclGen = struct { |
| 2901 | }, | 2901 | }, |
| 2902 | .opt_payload_ptr => { | 2902 | .opt_payload_ptr => { |
| 2903 | const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; | 2903 | const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 2904 | const parent = try dg.lowerParentPtr(opt_payload_ptr, base_ty); | 2904 | const parent = try dg.lowerParentPtr(opt_payload_ptr.container_ptr, base_ty); |
| 2905 | var buf: Type.Payload.ElemType = undefined; | 2905 | var buf: Type.Payload.ElemType = undefined; |
| 2906 | const payload_ty = parent.ty.optionalChild(&buf); | 2906 | const payload_ty = parent.ty.optionalChild(&buf); |
| 2907 | if (!payload_ty.hasRuntimeBitsIgnoreComptime() or parent.ty.isPtrLikeOptional()) { | 2907 | if (!payload_ty.hasRuntimeBitsIgnoreComptime() or parent.ty.isPtrLikeOptional()) { |
| ... | @@ -2925,7 +2925,7 @@ pub const DeclGen = struct { | ... | @@ -2925,7 +2925,7 @@ pub const DeclGen = struct { |
| 2925 | }, | 2925 | }, |
| 2926 | .eu_payload_ptr => { | 2926 | .eu_payload_ptr => { |
| 2927 | const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; | 2927 | const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 2928 | const parent = try dg.lowerParentPtr(eu_payload_ptr, base_ty); | 2928 | const parent = try dg.lowerParentPtr(eu_payload_ptr.container_ptr, base_ty); |
| 2929 | const payload_ty = parent.ty.errorUnionPayload(); | 2929 | const payload_ty = parent.ty.errorUnionPayload(); |
| 2930 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { | 2930 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { |
| 2931 | // In this case, we represent pointer to error union the same as pointer | 2931 | // In this case, we represent pointer to error union the same as pointer |
src/value.zig+59-39| ... | @@ -268,12 +268,14 @@ pub const Value = extern union { | ... | @@ -268,12 +268,14 @@ pub const Value = extern union { |
| 268 | 268 | ||
| 269 | .repeated, | 269 | .repeated, |
| 270 | .eu_payload, | 270 | .eu_payload, |
| 271 | .eu_payload_ptr, | ||
| 272 | .opt_payload, | 271 | .opt_payload, |
| 273 | .opt_payload_ptr, | ||
| 274 | .empty_array_sentinel, | 272 | .empty_array_sentinel, |
| 275 | => Payload.SubValue, | 273 | => Payload.SubValue, |
| 276 | 274 | ||
| 275 | .eu_payload_ptr, | ||
| 276 | .opt_payload_ptr, | ||
| 277 | => Payload.PayloadPtr, | ||
| 278 | |||
| 277 | .bytes, | 279 | .bytes, |
| 278 | .enum_literal, | 280 | .enum_literal, |
| 279 | => Payload.Bytes, | 281 | => Payload.Bytes, |
| ... | @@ -479,6 +481,20 @@ pub const Value = extern union { | ... | @@ -479,6 +481,20 @@ pub const Value = extern union { |
| 479 | .variable => return self.copyPayloadShallow(arena, Payload.Variable), | 481 | .variable => return self.copyPayloadShallow(arena, Payload.Variable), |
| 480 | .decl_ref => return self.copyPayloadShallow(arena, Payload.Decl), | 482 | .decl_ref => return self.copyPayloadShallow(arena, Payload.Decl), |
| 481 | .decl_ref_mut => return self.copyPayloadShallow(arena, Payload.DeclRefMut), | 483 | .decl_ref_mut => return self.copyPayloadShallow(arena, Payload.DeclRefMut), |
| 484 | .eu_payload_ptr, | ||
| 485 | .opt_payload_ptr, | ||
| 486 | => { | ||
| 487 | const payload = self.cast(Payload.PayloadPtr).?; | ||
| 488 | const new_payload = try arena.create(Payload.PayloadPtr); | ||
| 489 | new_payload.* = .{ | ||
| 490 | .base = payload.base, | ||
| 491 | .data = .{ | ||
| 492 | .container_ptr = try payload.data.container_ptr.copy(arena), | ||
| 493 | .container_ty = try payload.data.container_ty.copy(arena), | ||
| 494 | }, | ||
| 495 | }; | ||
| 496 | return Value{ .ptr_otherwise = &new_payload.base }; | ||
| 497 | }, | ||
| 482 | .elem_ptr => { | 498 | .elem_ptr => { |
| 483 | const payload = self.castTag(.elem_ptr).?; | 499 | const payload = self.castTag(.elem_ptr).?; |
| 484 | const new_payload = try arena.create(Payload.ElemPtr); | 500 | const new_payload = try arena.create(Payload.ElemPtr); |
| ... | @@ -486,6 +502,7 @@ pub const Value = extern union { | ... | @@ -486,6 +502,7 @@ pub const Value = extern union { |
| 486 | .base = payload.base, | 502 | .base = payload.base, |
| 487 | .data = .{ | 503 | .data = .{ |
| 488 | .array_ptr = try payload.data.array_ptr.copy(arena), | 504 | .array_ptr = try payload.data.array_ptr.copy(arena), |
| 505 | .elem_ty = try payload.data.elem_ty.copy(arena), | ||
| 489 | .index = payload.data.index, | 506 | .index = payload.data.index, |
| 490 | }, | 507 | }, |
| 491 | }; | 508 | }; |
| ... | @@ -498,6 +515,7 @@ pub const Value = extern union { | ... | @@ -498,6 +515,7 @@ pub const Value = extern union { |
| 498 | .base = payload.base, | 515 | .base = payload.base, |
| 499 | .data = .{ | 516 | .data = .{ |
| 500 | .container_ptr = try payload.data.container_ptr.copy(arena), | 517 | .container_ptr = try payload.data.container_ptr.copy(arena), |
| 518 | .container_ty = try payload.data.container_ty.copy(arena), | ||
| 501 | .field_index = payload.data.field_index, | 519 | .field_index = payload.data.field_index, |
| 502 | }, | 520 | }, |
| 503 | }; | 521 | }; |
| ... | @@ -506,9 +524,7 @@ pub const Value = extern union { | ... | @@ -506,9 +524,7 @@ pub const Value = extern union { |
| 506 | .bytes => return self.copyPayloadShallow(arena, Payload.Bytes), | 524 | .bytes => return self.copyPayloadShallow(arena, Payload.Bytes), |
| 507 | .repeated, | 525 | .repeated, |
| 508 | .eu_payload, | 526 | .eu_payload, |
| 509 | .eu_payload_ptr, | ||
| 510 | .opt_payload, | 527 | .opt_payload, |
| 511 | .opt_payload_ptr, | ||
| 512 | .empty_array_sentinel, | 528 | .empty_array_sentinel, |
| 513 | => { | 529 | => { |
| 514 | const payload = self.cast(Payload.SubValue).?; | 530 | const payload = self.cast(Payload.SubValue).?; |
| ... | @@ -740,11 +756,11 @@ pub const Value = extern union { | ... | @@ -740,11 +756,11 @@ pub const Value = extern union { |
| 740 | .inferred_alloc_comptime => return out_stream.writeAll("(inferred comptime allocation value)"), | 756 | .inferred_alloc_comptime => return out_stream.writeAll("(inferred comptime allocation value)"), |
| 741 | .eu_payload_ptr => { | 757 | .eu_payload_ptr => { |
| 742 | try out_stream.writeAll("(eu_payload_ptr)"); | 758 | try out_stream.writeAll("(eu_payload_ptr)"); |
| 743 | val = val.castTag(.eu_payload_ptr).?.data; | 759 | val = val.castTag(.eu_payload_ptr).?.data.container_ptr; |
| 744 | }, | 760 | }, |
| 745 | .opt_payload_ptr => { | 761 | .opt_payload_ptr => { |
| 746 | try out_stream.writeAll("(opt_payload_ptr)"); | 762 | try out_stream.writeAll("(opt_payload_ptr)"); |
| 747 | val = val.castTag(.opt_payload_ptr).?.data; | 763 | val = val.castTag(.opt_payload_ptr).?.data.container_ptr; |
| 748 | }, | 764 | }, |
| 749 | .bound_fn => { | 765 | .bound_fn => { |
| 750 | const bound_func = val.castTag(.bound_fn).?.data; | 766 | const bound_func = val.castTag(.bound_fn).?.data; |
| ... | @@ -2162,8 +2178,8 @@ pub const Value = extern union { | ... | @@ -2162,8 +2178,8 @@ pub const Value = extern union { |
| 2162 | .decl_ref_mut => true, | 2178 | .decl_ref_mut => true, |
| 2163 | .elem_ptr => isComptimeMutablePtr(val.castTag(.elem_ptr).?.data.array_ptr), | 2179 | .elem_ptr => isComptimeMutablePtr(val.castTag(.elem_ptr).?.data.array_ptr), |
| 2164 | .field_ptr => isComptimeMutablePtr(val.castTag(.field_ptr).?.data.container_ptr), | 2180 | .field_ptr => isComptimeMutablePtr(val.castTag(.field_ptr).?.data.container_ptr), |
| 2165 | .eu_payload_ptr => isComptimeMutablePtr(val.castTag(.eu_payload_ptr).?.data), | 2181 | .eu_payload_ptr => isComptimeMutablePtr(val.castTag(.eu_payload_ptr).?.data.container_ptr), |
| 2166 | .opt_payload_ptr => isComptimeMutablePtr(val.castTag(.opt_payload_ptr).?.data), | 2182 | .opt_payload_ptr => isComptimeMutablePtr(val.castTag(.opt_payload_ptr).?.data.container_ptr), |
| 2167 | 2183 | ||
| 2168 | else => false, | 2184 | else => false, |
| 2169 | }; | 2185 | }; |
| ... | @@ -2174,9 +2190,9 @@ pub const Value = extern union { | ... | @@ -2174,9 +2190,9 @@ pub const Value = extern union { |
| 2174 | switch (val.tag()) { | 2190 | switch (val.tag()) { |
| 2175 | .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(), | 2191 | .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(), |
| 2176 | .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(), | 2192 | .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(), |
| 2177 | .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.canMutateComptimeVarState(), | 2193 | .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.container_ptr.canMutateComptimeVarState(), |
| 2178 | .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(), | 2194 | .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(), |
| 2179 | .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.canMutateComptimeVarState(), | 2195 | .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.container_ptr.canMutateComptimeVarState(), |
| 2180 | .aggregate => { | 2196 | .aggregate => { |
| 2181 | const fields = val.castTag(.aggregate).?.data; | 2197 | const fields = val.castTag(.aggregate).?.data; |
| 2182 | for (fields) |field| { | 2198 | for (fields) |field| { |
| ... | @@ -2239,12 +2255,12 @@ pub const Value = extern union { | ... | @@ -2239,12 +2255,12 @@ pub const Value = extern union { |
| 2239 | .eu_payload_ptr => { | 2255 | .eu_payload_ptr => { |
| 2240 | const err_union_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; | 2256 | const err_union_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 2241 | std.hash.autoHash(hasher, Value.Tag.eu_payload_ptr); | 2257 | std.hash.autoHash(hasher, Value.Tag.eu_payload_ptr); |
| 2242 | hashPtr(err_union_ptr, hasher); | 2258 | hashPtr(err_union_ptr.container_ptr, hasher); |
| 2243 | }, | 2259 | }, |
| 2244 | .opt_payload_ptr => { | 2260 | .opt_payload_ptr => { |
| 2245 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; | 2261 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 2246 | std.hash.autoHash(hasher, Value.Tag.opt_payload_ptr); | 2262 | std.hash.autoHash(hasher, Value.Tag.opt_payload_ptr); |
| 2247 | hashPtr(opt_ptr, hasher); | 2263 | hashPtr(opt_ptr.container_ptr, hasher); |
| 2248 | }, | 2264 | }, |
| 2249 | 2265 | ||
| 2250 | .zero, | 2266 | .zero, |
| ... | @@ -2272,12 +2288,14 @@ pub const Value = extern union { | ... | @@ -2272,12 +2288,14 @@ pub const Value = extern union { |
| 2272 | 2288 | ||
| 2273 | .repeated, | 2289 | .repeated, |
| 2274 | .eu_payload, | 2290 | .eu_payload, |
| 2275 | .eu_payload_ptr, | ||
| 2276 | .opt_payload, | 2291 | .opt_payload, |
| 2277 | .opt_payload_ptr, | ||
| 2278 | .empty_array_sentinel, | 2292 | .empty_array_sentinel, |
| 2279 | => return markReferencedDeclsAlive(val.cast(Payload.SubValue).?.data), | 2293 | => return markReferencedDeclsAlive(val.cast(Payload.SubValue).?.data), |
| 2280 | 2294 | ||
| 2295 | .eu_payload_ptr, | ||
| 2296 | .opt_payload_ptr, | ||
| 2297 | => return markReferencedDeclsAlive(val.cast(Payload.PayloadPtr).?.data.container_ptr), | ||
| 2298 | |||
| 2281 | .slice => { | 2299 | .slice => { |
| 2282 | const slice = val.cast(Payload.Slice).?.data; | 2300 | const slice = val.cast(Payload.Slice).?.data; |
| 2283 | markReferencedDeclsAlive(slice.ptr); | 2301 | markReferencedDeclsAlive(slice.ptr); |
| ... | @@ -2422,36 +2440,28 @@ pub const Value = extern union { | ... | @@ -2422,36 +2440,28 @@ pub const Value = extern union { |
| 2422 | } | 2440 | } |
| 2423 | 2441 | ||
| 2424 | /// Returns a pointer to the element value at the index. | 2442 | /// Returns a pointer to the element value at the index. |
| 2425 | pub fn elemPtr(val: Value, arena: Allocator, index: usize) Allocator.Error!Value { | 2443 | pub fn elemPtr(val: Value, ty: Type, arena: Allocator, index: usize) Allocator.Error!Value { |
| 2426 | switch (val.tag()) { | 2444 | const elem_ty = ty.elemType2(); |
| 2427 | .elem_ptr => { | 2445 | const ptr_val = switch (val.tag()) { |
| 2428 | const elem_ptr = val.castTag(.elem_ptr).?.data; | 2446 | .slice => val.slicePtr(), |
| 2447 | else => val, | ||
| 2448 | }; | ||
| 2449 | |||
| 2450 | if (ptr_val.tag() == .elem_ptr) { | ||
| 2451 | const elem_ptr = ptr_val.castTag(.elem_ptr).?.data; | ||
| 2452 | if (elem_ptr.elem_ty.eql(elem_ty)) { | ||
| 2429 | return Tag.elem_ptr.create(arena, .{ | 2453 | return Tag.elem_ptr.create(arena, .{ |
| 2430 | .array_ptr = elem_ptr.array_ptr, | 2454 | .array_ptr = elem_ptr.array_ptr, |
| 2455 | .elem_ty = elem_ptr.elem_ty, | ||
| 2431 | .index = elem_ptr.index + index, | 2456 | .index = elem_ptr.index + index, |
| 2432 | }); | 2457 | }); |
| 2433 | }, | 2458 | } |
| 2434 | .slice => { | ||
| 2435 | const ptr_val = val.castTag(.slice).?.data.ptr; | ||
| 2436 | switch (ptr_val.tag()) { | ||
| 2437 | .elem_ptr => { | ||
| 2438 | const elem_ptr = ptr_val.castTag(.elem_ptr).?.data; | ||
| 2439 | return Tag.elem_ptr.create(arena, .{ | ||
| 2440 | .array_ptr = elem_ptr.array_ptr, | ||
| 2441 | .index = elem_ptr.index + index, | ||
| 2442 | }); | ||
| 2443 | }, | ||
| 2444 | else => return Tag.elem_ptr.create(arena, .{ | ||
| 2445 | .array_ptr = ptr_val, | ||
| 2446 | .index = index, | ||
| 2447 | }), | ||
| 2448 | } | ||
| 2449 | }, | ||
| 2450 | else => return Tag.elem_ptr.create(arena, .{ | ||
| 2451 | .array_ptr = val, | ||
| 2452 | .index = index, | ||
| 2453 | }), | ||
| 2454 | } | 2459 | } |
| 2460 | return Tag.elem_ptr.create(arena, .{ | ||
| 2461 | .array_ptr = ptr_val, | ||
| 2462 | .elem_ty = elem_ty, | ||
| 2463 | .index = index, | ||
| 2464 | }); | ||
| 2455 | } | 2465 | } |
| 2456 | 2466 | ||
| 2457 | pub fn isUndef(self: Value) bool { | 2467 | pub fn isUndef(self: Value) bool { |
| ... | @@ -4144,12 +4154,21 @@ pub const Value = extern union { | ... | @@ -4144,12 +4154,21 @@ pub const Value = extern union { |
| 4144 | }; | 4154 | }; |
| 4145 | }; | 4155 | }; |
| 4146 | 4156 | ||
| 4157 | pub const PayloadPtr = struct { | ||
| 4158 | base: Payload, | ||
| 4159 | data: struct { | ||
| 4160 | container_ptr: Value, | ||
| 4161 | container_ty: Type, | ||
| 4162 | }, | ||
| 4163 | }; | ||
| 4164 | |||
| 4147 | pub const ElemPtr = struct { | 4165 | pub const ElemPtr = struct { |
| 4148 | pub const base_tag = Tag.elem_ptr; | 4166 | pub const base_tag = Tag.elem_ptr; |
| 4149 | 4167 | ||
| 4150 | base: Payload = Payload{ .tag = base_tag }, | 4168 | base: Payload = Payload{ .tag = base_tag }, |
| 4151 | data: struct { | 4169 | data: struct { |
| 4152 | array_ptr: Value, | 4170 | array_ptr: Value, |
| 4171 | elem_ty: Type, | ||
| 4153 | index: usize, | 4172 | index: usize, |
| 4154 | }, | 4173 | }, |
| 4155 | }; | 4174 | }; |
| ... | @@ -4160,6 +4179,7 @@ pub const Value = extern union { | ... | @@ -4160,6 +4179,7 @@ pub const Value = extern union { |
| 4160 | base: Payload = Payload{ .tag = base_tag }, | 4179 | base: Payload = Payload{ .tag = base_tag }, |
| 4161 | data: struct { | 4180 | data: struct { |
| 4162 | container_ptr: Value, | 4181 | container_ptr: Value, |
| 4182 | container_ty: Type, | ||
| 4163 | field_index: usize, | 4183 | field_index: usize, |
| 4164 | }, | 4184 | }, |
| 4165 | }; | 4185 | }; |