| ... | ... | @@ -10388,25 +10388,32 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10388 | 10388 | )).?; |
| 10389 | 10389 | try sema.mod.declareDeclDependency(sema.owner_decl, fn_info_decl); |
| 10390 | 10390 | try sema.ensureDeclAnalyzed(fn_info_decl); |
| 10391 | var fn_ty_buffer: Value.ToTypeBuffer = undefined; |
| 10392 | const fn_ty = fn_info_decl.val.toType(&fn_ty_buffer); |
| 10391 | 10393 | const param_info_decl = (try sema.namespaceLookup( |
| 10392 | 10394 | block, |
| 10393 | 10395 | src, |
| 10394 | | fn_info_decl.val.castTag(.ty).?.data.getNamespace().?, |
| 10396 | fn_ty.getNamespace().?, |
| 10395 | 10397 | "Param", |
| 10396 | 10398 | )).?; |
| 10397 | 10399 | try sema.mod.declareDeclDependency(sema.owner_decl, param_info_decl); |
| 10398 | 10400 | try sema.ensureDeclAnalyzed(param_info_decl); |
| 10401 | var param_buffer: Value.ToTypeBuffer = undefined; |
| 10402 | const param_ty = param_info_decl.val.toType(&param_buffer); |
| 10399 | 10403 | const new_decl = try params_anon_decl.finish( |
| 10400 | 10404 | try Type.Tag.array.create(params_anon_decl.arena(), .{ |
| 10401 | 10405 | .len = param_vals.len, |
| 10402 | | .elem_type = param_info_decl.ty, |
| 10406 | .elem_type = try param_ty.copy(params_anon_decl.arena()), |
| 10403 | 10407 | }), |
| 10404 | 10408 | try Value.Tag.aggregate.create( |
| 10405 | 10409 | params_anon_decl.arena(), |
| 10406 | 10410 | param_vals, |
| 10407 | 10411 | ), |
| 10408 | 10412 | ); |
| 10409 | | break :v try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10413 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10414 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| 10415 | .len = try Value.Tag.int_u64.create(sema.arena, param_vals.len), |
| 10416 | }); |
| 10410 | 10417 | }; |
| 10411 | 10418 | |
| 10412 | 10419 | const ret_ty_opt = if (info.return_type.tag() != .generic_poison) |
| ... | ... | @@ -10823,7 +10830,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10823 | 10830 | try fields_anon_decl.arena().dupe(Value, union_field_vals), |
| 10824 | 10831 | ), |
| 10825 | 10832 | ); |
| 10826 | | break :v try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10833 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10834 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| 10835 | .len = try Value.Tag.int_u64.create(sema.arena, union_field_vals.len), |
| 10836 | }); |
| 10827 | 10837 | }; |
| 10828 | 10838 | |
| 10829 | 10839 | const decls_val = try sema.typeInfoDecls(block, src, type_info_ty, union_ty.getNamespace()); |
| ... | ... | @@ -10897,7 +10907,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10897 | 10907 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10898 | 10908 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 10899 | 10909 | ); |
| 10900 | | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| 10910 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10911 | .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl), |
| 10912 | .len = try Value.Tag.int_u64.create(sema.arena, bytes.len), |
| 10913 | }); |
| 10901 | 10914 | }; |
| 10902 | 10915 | |
| 10903 | 10916 | const struct_field_fields = try fields_anon_decl.arena().create([5]Value); |
| ... | ... | @@ -10937,7 +10950,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10937 | 10950 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10938 | 10951 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 10939 | 10952 | ); |
| 10940 | | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| 10953 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10954 | .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl), |
| 10955 | .len = try Value.Tag.int_u64.create(sema.arena, bytes.len), |
| 10956 | }); |
| 10941 | 10957 | }; |
| 10942 | 10958 | |
| 10943 | 10959 | const struct_field_fields = try fields_anon_decl.arena().create([5]Value); |
| ... | ... | @@ -10979,7 +10995,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10979 | 10995 | try fields_anon_decl.arena().dupe(Value, struct_field_vals), |
| 10980 | 10996 | ), |
| 10981 | 10997 | ); |
| 10982 | | break :v try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10998 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10999 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| 11000 | .len = try Value.Tag.int_u64.create(sema.arena, struct_field_vals.len), |
| 11001 | }); |
| 10983 | 11002 | }; |
| 10984 | 11003 | |
| 10985 | 11004 | const decls_val = try sema.typeInfoDecls(block, src, type_info_ty, struct_ty.getNamespace()); |
| ... | ... | @@ -11048,7 +11067,7 @@ fn typeInfoDecls( |
| 11048 | 11067 | block, |
| 11049 | 11068 | src, |
| 11050 | 11069 | type_info_ty.getNamespace().?, |
| 11051 | | "EnumField", |
| 11070 | "Declaration", |
| 11052 | 11071 | )).?; |
| 11053 | 11072 | try sema.mod.declareDeclDependency(sema.owner_decl, declaration_ty_decl); |
| 11054 | 11073 | try sema.ensureDeclAnalyzed(declaration_ty_decl); |
| ... | ... | @@ -11069,7 +11088,10 @@ fn typeInfoDecls( |
| 11069 | 11088 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 11070 | 11089 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 11071 | 11090 | ); |
| 11072 | | break :v try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl); |
| 11091 | break :v try Value.Tag.slice.create(decls_anon_decl.arena(), .{ |
| 11092 | .ptr = try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl), |
| 11093 | .len = try Value.Tag.int_u64.create(decls_anon_decl.arena(), bytes.len), |
| 11094 | }); |
| 11073 | 11095 | }; |
| 11074 | 11096 | |
| 11075 | 11097 | const fields = try decls_anon_decl.arena().create([2]Value); |
| ... | ... | @@ -11092,7 +11114,10 @@ fn typeInfoDecls( |
| 11092 | 11114 | try decls_anon_decl.arena().dupe(Value, decls_vals), |
| 11093 | 11115 | ), |
| 11094 | 11116 | ); |
| 11095 | | return try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 11117 | return try Value.Tag.slice.create(sema.arena, .{ |
| 11118 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| 11119 | .len = try Value.Tag.int_u64.create(sema.arena, decls_vals.len), |
| 11120 | }); |
| 11096 | 11121 | } |
| 11097 | 11122 | |
| 11098 | 11123 | fn zirTypeof(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -16574,8 +16599,20 @@ fn elemVal( |
| 16574 | 16599 | const runtime_src = if (maybe_slice_val) |slice_val| rs: { |
| 16575 | 16600 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16576 | 16601 | const index = @intCast(usize, index_val.toUnsignedInt()); |
| 16577 | | const elem_val = try slice_val.elemValue(sema.arena, index); |
| 16578 | | return sema.addConstant(array_ty.elemType2(), elem_val); |
| 16602 | |
| 16603 | const elem_ty = array_ty.elemType2(); |
| 16604 | |
| 16605 | var payload: Value.Payload.ElemPtr = .{ .data = .{ |
| 16606 | .array_ptr = slice_val.slicePtr(), |
| 16607 | .elem_ty = elem_ty, |
| 16608 | .index = index, |
| 16609 | } }; |
| 16610 | const elem_ptr_val = Value.initPayload(&payload.base); |
| 16611 | |
| 16612 | if (try sema.pointerDeref(block, array_src, elem_ptr_val, array_ty)) |elem_val| { |
| 16613 | return sema.addConstant(elem_ty, elem_val); |
| 16614 | } |
| 16615 | break :rs array_src; |
| 16579 | 16616 | } else array_src; |
| 16580 | 16617 | |
| 16581 | 16618 | try sema.requireRuntimeBlock(block, runtime_src); |
| ... | ... | @@ -16589,8 +16626,19 @@ fn elemVal( |
| 16589 | 16626 | const array_val = maybe_array_val orelse break :rs array_src; |
| 16590 | 16627 | const index_val = maybe_index_val orelse break :rs elem_index_src; |
| 16591 | 16628 | const index = @intCast(usize, index_val.toUnsignedInt()); |
| 16592 | | const elem_val = try array_val.elemValue(sema.arena, index); |
| 16593 | | return sema.addConstant(array_ty.elemType2(), elem_val); |
| 16629 | const elem_ty = array_ty.elemType2(); |
| 16630 | |
| 16631 | var payload: Value.Payload.ElemPtr = .{ .data = .{ |
| 16632 | .array_ptr = array_val, |
| 16633 | .elem_ty = elem_ty, |
| 16634 | .index = index, |
| 16635 | } }; |
| 16636 | const elem_ptr_val = Value.initPayload(&payload.base); |
| 16637 | |
| 16638 | if (try sema.pointerDeref(block, array_src, elem_ptr_val, array_ty)) |elem_val| { |
| 16639 | return sema.addConstant(elem_ty, elem_val); |
| 16640 | } |
| 16641 | break :rs array_src; |
| 16594 | 16642 | }; |
| 16595 | 16643 | |
| 16596 | 16644 | try sema.requireRuntimeBlock(block, runtime_src); |
| ... | ... | @@ -16739,7 +16787,7 @@ fn elemPtrArray( |
| 16739 | 16787 | const index_u64 = index_val.toUnsignedInt(); |
| 16740 | 16788 | // @intCast here because it would have been impossible to construct a value that |
| 16741 | 16789 | // required a larger index. |
| 16742 | | const elem_ptr = try array_ptr_val.elemPtrDirect(array_ptr_ty, sema.arena, @intCast(usize, index_u64)); |
| 16790 | const elem_ptr = try array_ptr_val.elemPtr(array_ptr_ty, sema.arena, @intCast(usize, index_u64)); |
| 16743 | 16791 | return sema.addConstant(result_ty, elem_ptr); |
| 16744 | 16792 | } |
| 16745 | 16793 | } |