| 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 | 5568 | } |
| 5569 | 5569 | return sema.addConstant( |
| 5570 | 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 | 5577 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { |
| ... | ... | @@ -5578,7 +5581,10 @@ fn analyzeOptionalPayloadPtr( |
| 5578 | 5581 | // The same Value represents the pointer to the optional and the payload. |
| 5579 | 5582 | return sema.addConstant( |
| 5580 | 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 | 5739 | } |
| 5734 | 5740 | return sema.addConstant( |
| 5735 | 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 | 5748 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { |
| ... | ... | @@ -5743,7 +5752,10 @@ fn analyzeErrUnionPayloadPtr( |
| 5743 | 5752 | |
| 5744 | 5753 | return sema.addConstant( |
| 5745 | 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 | 6664 | field_ty_ptr, |
| 6653 | 6665 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 6654 | 6666 | .container_ptr = op_ptr_val, |
| 6667 | .container_ty = operand_ty, | |
| 6655 | 6668 | .field_index = field_index, |
| 6656 | 6669 | }), |
| 6657 | 6670 | ); |
| ... | ... | @@ -9638,7 +9651,7 @@ fn analyzePtrArithmetic( |
| 9638 | 9651 | if (air_tag == .ptr_sub) { |
| 9639 | 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 | 9655 | return sema.addConstant(new_ptr_ty, new_ptr_val); |
| 9643 | 9656 | } else break :rs offset_src; |
| 9644 | 9657 | } else break :rs ptr_src; |
| ... | ... | @@ -15903,6 +15916,7 @@ fn finishFieldCallBind( |
| 15903 | 15916 | ptr_field_ty, |
| 15904 | 15917 | try Value.Tag.field_ptr.create(arena, .{ |
| 15905 | 15918 | .container_ptr = struct_ptr_val, |
| 15919 | .container_ty = ptr_ty.childType(), | |
| 15906 | 15920 | .field_index = field_index, |
| 15907 | 15921 | }), |
| 15908 | 15922 | ); |
| ... | ... | @@ -16065,6 +16079,7 @@ fn structFieldPtrByIndex( |
| 16065 | 16079 | ptr_field_ty, |
| 16066 | 16080 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 16067 | 16081 | .container_ptr = struct_ptr_val, |
| 16082 | .container_ty = struct_ptr_ty.childType(), | |
| 16068 | 16083 | .field_index = field_index, |
| 16069 | 16084 | }), |
| 16070 | 16085 | ); |
| ... | ... | @@ -16241,6 +16256,7 @@ fn unionFieldPtr( |
| 16241 | 16256 | ptr_field_ty, |
| 16242 | 16257 | try Value.Tag.field_ptr.create(arena, .{ |
| 16243 | 16258 | .container_ptr = union_ptr_val, |
| 16259 | .container_ty = union_ty, | |
| 16244 | 16260 | .field_index = field_index, |
| 16245 | 16261 | }), |
| 16246 | 16262 | ); |
| ... | ... | @@ -16333,7 +16349,7 @@ fn elemPtr( |
| 16333 | 16349 | const runtime_src = if (maybe_slice_val) |slice_val| rs: { |
| 16334 | 16350 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16335 | 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 | 16353 | return sema.addConstant(result_ty, elem_ptr); |
| 16338 | 16354 | } else array_ptr_src; |
| 16339 | 16355 | |
| ... | ... | @@ -16348,7 +16364,7 @@ fn elemPtr( |
| 16348 | 16364 | const ptr_val = maybe_ptr_val orelse break :rs array_ptr_src; |
| 16349 | 16365 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16350 | 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 | 16368 | return sema.addConstant(result_ty, elem_ptr); |
| 16353 | 16369 | }; |
| 16354 | 16370 | |
| ... | ... | @@ -16473,6 +16489,7 @@ fn tupleFieldPtr( |
| 16473 | 16489 | ptr_field_ty, |
| 16474 | 16490 | try Value.Tag.field_ptr.create(sema.arena, .{ |
| 16475 | 16491 | .container_ptr = tuple_ptr_val, |
| 16492 | .container_ty = tuple_ty, | |
| 16476 | 16493 | .field_index = field_index, |
| 16477 | 16494 | }), |
| 16478 | 16495 | ); |
| ... | ... | @@ -16563,7 +16580,7 @@ fn elemPtrArray( |
| 16563 | 16580 | const index_u64 = index_val.toUnsignedInt(); |
| 16564 | 16581 | // @intCast here because it would have been impossible to construct a value that |
| 16565 | 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 | 16584 | return sema.addConstant(result_ty, elem_ptr); |
| 16568 | 16585 | } |
| 16569 | 16586 | } |
| ... | ... | @@ -17757,8 +17774,8 @@ fn beginComptimePtrMutation( |
| 17757 | 17774 | } |
| 17758 | 17775 | }, |
| 17759 | 17776 | .eu_payload_ptr => { |
| 17760 | const eu_ptr_val = ptr_val.castTag(.eu_payload_ptr).?.data; | |
| 17761 | var parent = try beginComptimePtrMutation(sema, block, src, eu_ptr_val); | |
| 17777 | const eu_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; | |
| 17778 | var parent = try beginComptimePtrMutation(sema, block, src, eu_ptr.container_ptr); | |
| 17762 | 17779 | const payload_ty = parent.ty.errorUnionPayload(); |
| 17763 | 17780 | switch (parent.val.tag()) { |
| 17764 | 17781 | else => { |
| ... | ... | @@ -17790,8 +17807,8 @@ fn beginComptimePtrMutation( |
| 17790 | 17807 | } |
| 17791 | 17808 | }, |
| 17792 | 17809 | .opt_payload_ptr => { |
| 17793 | const opt_ptr_val = ptr_val.castTag(.opt_payload_ptr).?.data; | |
| 17794 | var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr_val); | |
| 17810 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; | |
| 17811 | var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr); | |
| 17795 | 17812 | const payload_ty = try parent.ty.optionalChildAlloc(sema.arena); |
| 17796 | 17813 | switch (parent.val.tag()) { |
| 17797 | 17814 | .undef, .null_value => { |
| ... | ... | @@ -17965,7 +17982,7 @@ fn beginComptimePtrLoad( |
| 17965 | 17982 | }, |
| 17966 | 17983 | .eu_payload_ptr => { |
| 17967 | 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 | 17986 | return ComptimePtrLoadKit{ |
| 17970 | 17987 | .root_val = parent.root_val, |
| 17971 | 17988 | .root_ty = parent.root_ty, |
| ... | ... | @@ -17977,7 +17994,7 @@ fn beginComptimePtrLoad( |
| 17977 | 17994 | }, |
| 17978 | 17995 | .opt_payload_ptr => { |
| 17979 | 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 | 17998 | return ComptimePtrLoadKit{ |
| 17982 | 17999 | .root_val = parent.root_val, |
| 17983 | 18000 | .root_ty = parent.root_ty, |
src/codegen/llvm.zig+2-2| ... | ... | @@ -2901,7 +2901,7 @@ pub const DeclGen = struct { |
| 2901 | 2901 | }, |
| 2902 | 2902 | .opt_payload_ptr => { |
| 2903 | 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 | 2905 | var buf: Type.Payload.ElemType = undefined; |
| 2906 | 2906 | const payload_ty = parent.ty.optionalChild(&buf); |
| 2907 | 2907 | if (!payload_ty.hasRuntimeBitsIgnoreComptime() or parent.ty.isPtrLikeOptional()) { |
| ... | ... | @@ -2925,7 +2925,7 @@ pub const DeclGen = struct { |
| 2925 | 2925 | }, |
| 2926 | 2926 | .eu_payload_ptr => { |
| 2927 | 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 | 2929 | const payload_ty = parent.ty.errorUnionPayload(); |
| 2930 | 2930 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { |
| 2931 | 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 | 268 | |
| 269 | 269 | .repeated, |
| 270 | 270 | .eu_payload, |
| 271 | .eu_payload_ptr, | |
| 272 | 271 | .opt_payload, |
| 273 | .opt_payload_ptr, | |
| 274 | 272 | .empty_array_sentinel, |
| 275 | 273 | => Payload.SubValue, |
| 276 | 274 | |
| 275 | .eu_payload_ptr, | |
| 276 | .opt_payload_ptr, | |
| 277 | => Payload.PayloadPtr, | |
| 278 | ||
| 277 | 279 | .bytes, |
| 278 | 280 | .enum_literal, |
| 279 | 281 | => Payload.Bytes, |
| ... | ... | @@ -479,6 +481,20 @@ pub const Value = extern union { |
| 479 | 481 | .variable => return self.copyPayloadShallow(arena, Payload.Variable), |
| 480 | 482 | .decl_ref => return self.copyPayloadShallow(arena, Payload.Decl), |
| 481 | 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 | 498 | .elem_ptr => { |
| 483 | 499 | const payload = self.castTag(.elem_ptr).?; |
| 484 | 500 | const new_payload = try arena.create(Payload.ElemPtr); |
| ... | ... | @@ -486,6 +502,7 @@ pub const Value = extern union { |
| 486 | 502 | .base = payload.base, |
| 487 | 503 | .data = .{ |
| 488 | 504 | .array_ptr = try payload.data.array_ptr.copy(arena), |
| 505 | .elem_ty = try payload.data.elem_ty.copy(arena), | |
| 489 | 506 | .index = payload.data.index, |
| 490 | 507 | }, |
| 491 | 508 | }; |
| ... | ... | @@ -498,6 +515,7 @@ pub const Value = extern union { |
| 498 | 515 | .base = payload.base, |
| 499 | 516 | .data = .{ |
| 500 | 517 | .container_ptr = try payload.data.container_ptr.copy(arena), |
| 518 | .container_ty = try payload.data.container_ty.copy(arena), | |
| 501 | 519 | .field_index = payload.data.field_index, |
| 502 | 520 | }, |
| 503 | 521 | }; |
| ... | ... | @@ -506,9 +524,7 @@ pub const Value = extern union { |
| 506 | 524 | .bytes => return self.copyPayloadShallow(arena, Payload.Bytes), |
| 507 | 525 | .repeated, |
| 508 | 526 | .eu_payload, |
| 509 | .eu_payload_ptr, | |
| 510 | 527 | .opt_payload, |
| 511 | .opt_payload_ptr, | |
| 512 | 528 | .empty_array_sentinel, |
| 513 | 529 | => { |
| 514 | 530 | const payload = self.cast(Payload.SubValue).?; |
| ... | ... | @@ -740,11 +756,11 @@ pub const Value = extern union { |
| 740 | 756 | .inferred_alloc_comptime => return out_stream.writeAll("(inferred comptime allocation value)"), |
| 741 | 757 | .eu_payload_ptr => { |
| 742 | 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 | 761 | .opt_payload_ptr => { |
| 746 | 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 | 765 | .bound_fn => { |
| 750 | 766 | const bound_func = val.castTag(.bound_fn).?.data; |
| ... | ... | @@ -2162,8 +2178,8 @@ pub const Value = extern union { |
| 2162 | 2178 | .decl_ref_mut => true, |
| 2163 | 2179 | .elem_ptr => isComptimeMutablePtr(val.castTag(.elem_ptr).?.data.array_ptr), |
| 2164 | 2180 | .field_ptr => isComptimeMutablePtr(val.castTag(.field_ptr).?.data.container_ptr), |
| 2165 | .eu_payload_ptr => isComptimeMutablePtr(val.castTag(.eu_payload_ptr).?.data), | |
| 2166 | .opt_payload_ptr => isComptimeMutablePtr(val.castTag(.opt_payload_ptr).?.data), | |
| 2181 | .eu_payload_ptr => isComptimeMutablePtr(val.castTag(.eu_payload_ptr).?.data.container_ptr), | |
| 2182 | .opt_payload_ptr => isComptimeMutablePtr(val.castTag(.opt_payload_ptr).?.data.container_ptr), | |
| 2167 | 2183 | |
| 2168 | 2184 | else => false, |
| 2169 | 2185 | }; |
| ... | ... | @@ -2174,9 +2190,9 @@ pub const Value = extern union { |
| 2174 | 2190 | switch (val.tag()) { |
| 2175 | 2191 | .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(), |
| 2176 | 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 | 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 | 2196 | .aggregate => { |
| 2181 | 2197 | const fields = val.castTag(.aggregate).?.data; |
| 2182 | 2198 | for (fields) |field| { |
| ... | ... | @@ -2239,12 +2255,12 @@ pub const Value = extern union { |
| 2239 | 2255 | .eu_payload_ptr => { |
| 2240 | 2256 | const err_union_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 2241 | 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 | 2260 | .opt_payload_ptr => { |
| 2245 | 2261 | const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 2246 | 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 | 2266 | .zero, |
| ... | ... | @@ -2272,12 +2288,14 @@ pub const Value = extern union { |
| 2272 | 2288 | |
| 2273 | 2289 | .repeated, |
| 2274 | 2290 | .eu_payload, |
| 2275 | .eu_payload_ptr, | |
| 2276 | 2291 | .opt_payload, |
| 2277 | .opt_payload_ptr, | |
| 2278 | 2292 | .empty_array_sentinel, |
| 2279 | 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 | 2299 | .slice => { |
| 2282 | 2300 | const slice = val.cast(Payload.Slice).?.data; |
| 2283 | 2301 | markReferencedDeclsAlive(slice.ptr); |
| ... | ... | @@ -2422,36 +2440,28 @@ pub const Value = extern union { |
| 2422 | 2440 | } |
| 2423 | 2441 | |
| 2424 | 2442 | /// Returns a pointer to the element value at the index. |
| 2425 | pub fn elemPtr(val: Value, arena: Allocator, index: usize) Allocator.Error!Value { | |
| 2426 | switch (val.tag()) { | |
| 2427 | .elem_ptr => { | |
| 2428 | const elem_ptr = val.castTag(.elem_ptr).?.data; | |
| 2443 | pub fn elemPtr(val: Value, ty: Type, arena: Allocator, index: usize) Allocator.Error!Value { | |
| 2444 | const elem_ty = ty.elemType2(); | |
| 2445 | const ptr_val = switch (val.tag()) { | |
| 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 | 2453 | return Tag.elem_ptr.create(arena, .{ |
| 2430 | 2454 | .array_ptr = elem_ptr.array_ptr, |
| 2455 | .elem_ty = elem_ptr.elem_ty, | |
| 2431 | 2456 | .index = elem_ptr.index + index, |
| 2432 | 2457 | }); |
| 2433 | }, | |
| 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 | }), | |
| 2458 | } | |
| 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 | 2467 | pub fn isUndef(self: Value) bool { |
| ... | ... | @@ -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 | 4165 | pub const ElemPtr = struct { |
| 4148 | 4166 | pub const base_tag = Tag.elem_ptr; |
| 4149 | 4167 | |
| 4150 | 4168 | base: Payload = Payload{ .tag = base_tag }, |
| 4151 | 4169 | data: struct { |
| 4152 | 4170 | array_ptr: Value, |
| 4171 | elem_ty: Type, | |
| 4153 | 4172 | index: usize, |
| 4154 | 4173 | }, |
| 4155 | 4174 | }; |
| ... | ... | @@ -4160,6 +4179,7 @@ pub const Value = extern union { |
| 4160 | 4179 | base: Payload = Payload{ .tag = base_tag }, |
| 4161 | 4180 | data: struct { |
| 4162 | 4181 | container_ptr: Value, |
| 4182 | container_ty: Type, | |
| 4163 | 4183 | field_index: usize, |
| 4164 | 4184 | }, |
| 4165 | 4185 | }; |