authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-03-10 18:10:41-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 21:42:42-07:00
logbbd750ff05895f29be646bf51e8932c3c9fb14f3
treeeb76c4342ad12581cbf84289a692de18ead005ab
parenta2a5d3c2885cacf16d55d7943d10a81a5dc31b8a

stage2: Add container_ty/elem_ty to elem_ptr, field_ptr, *_payload_ptr Values


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(
57435752
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;
1633916355
...@@ -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 };
1635416370
...@@ -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 that16581 // @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 pointer2931 // 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 {
268268
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,
276274
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),
21672183
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 },
22492265
2250 .zero,2266 .zero,
...@@ -2272,12 +2288,14 @@ pub const Value = extern union {...@@ -2272,12 +2288,14 @@ pub const Value = extern union {
22722288
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),
22802294
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 }
24232441
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 }
24562466
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 };
41464156
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;
41494167
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 };