| ... | ... | @@ -6518,19 +6518,80 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6518 | 6518 | const target = sema.mod.getTarget(); |
| 6519 | 6519 | |
| 6520 | 6520 | switch (ty.zigTypeTag()) { |
| 6521 | .Type => return sema.addConstant( |
| 6522 | type_info_ty, |
| 6523 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6524 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Type)), |
| 6525 | .val = Value.initTag(.unreachable_value), |
| 6526 | }), |
| 6527 | ), |
| 6528 | .Void => return sema.addConstant( |
| 6529 | type_info_ty, |
| 6530 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6531 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Void)), |
| 6532 | .val = Value.initTag(.unreachable_value), |
| 6533 | }), |
| 6534 | ), |
| 6535 | .Bool => return sema.addConstant( |
| 6536 | type_info_ty, |
| 6537 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6538 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Bool)), |
| 6539 | .val = Value.initTag(.unreachable_value), |
| 6540 | }), |
| 6541 | ), |
| 6542 | .NoReturn => return sema.addConstant( |
| 6543 | type_info_ty, |
| 6544 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6545 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.NoReturn)), |
| 6546 | .val = Value.initTag(.unreachable_value), |
| 6547 | }), |
| 6548 | ), |
| 6549 | .ComptimeFloat => return sema.addConstant( |
| 6550 | type_info_ty, |
| 6551 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6552 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ComptimeFloat)), |
| 6553 | .val = Value.initTag(.unreachable_value), |
| 6554 | }), |
| 6555 | ), |
| 6556 | .ComptimeInt => return sema.addConstant( |
| 6557 | type_info_ty, |
| 6558 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6559 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ComptimeInt)), |
| 6560 | .val = Value.initTag(.unreachable_value), |
| 6561 | }), |
| 6562 | ), |
| 6563 | .Undefined => return sema.addConstant( |
| 6564 | type_info_ty, |
| 6565 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6566 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Undefined)), |
| 6567 | .val = Value.initTag(.unreachable_value), |
| 6568 | }), |
| 6569 | ), |
| 6570 | .Null => return sema.addConstant( |
| 6571 | type_info_ty, |
| 6572 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6573 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Null)), |
| 6574 | .val = Value.initTag(.unreachable_value), |
| 6575 | }), |
| 6576 | ), |
| 6577 | .EnumLiteral => return sema.addConstant( |
| 6578 | type_info_ty, |
| 6579 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6580 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.EnumLiteral)), |
| 6581 | .val = Value.initTag(.unreachable_value), |
| 6582 | }), |
| 6583 | ), |
| 6521 | 6584 | .Fn => { |
| 6585 | const info = ty.fnInfo(); |
| 6522 | 6586 | const field_values = try sema.arena.alloc(Value, 6); |
| 6523 | 6587 | // calling_convention: CallingConvention, |
| 6524 | | field_values[0] = try Value.Tag.enum_field_index.create( |
| 6525 | | sema.arena, |
| 6526 | | @enumToInt(ty.fnCallingConvention()), |
| 6527 | | ); |
| 6588 | field_values[0] = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(info.cc)); |
| 6528 | 6589 | // alignment: comptime_int, |
| 6529 | 6590 | field_values[1] = try Value.Tag.int_u64.create(sema.arena, ty.abiAlignment(target)); |
| 6530 | 6591 | // is_generic: bool, |
| 6531 | | field_values[2] = Value.initTag(.bool_false); // TODO |
| 6592 | field_values[2] = if (info.is_generic) Value.initTag(.bool_true) else Value.initTag(.bool_false); |
| 6532 | 6593 | // is_var_args: bool, |
| 6533 | | field_values[3] = Value.initTag(.bool_false); // TODO |
| 6594 | field_values[3] = if (info.is_var_args) Value.initTag(.bool_true) else Value.initTag(.bool_false); |
| 6534 | 6595 | // return_type: ?type, |
| 6535 | 6596 | field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType()); |
| 6536 | 6597 | // args: []const FnArg, |
| ... | ... | @@ -6539,10 +6600,7 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6539 | 6600 | return sema.addConstant( |
| 6540 | 6601 | type_info_ty, |
| 6541 | 6602 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6542 | | .tag = try Value.Tag.enum_field_index.create( |
| 6543 | | sema.arena, |
| 6544 | | @enumToInt(@typeInfo(std.builtin.TypeInfo).Union.tag_type.?.Fn), |
| 6545 | | ), |
| 6603 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Fn)), |
| 6546 | 6604 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6547 | 6605 | }), |
| 6548 | 6606 | ); |
| ... | ... | @@ -6561,10 +6619,92 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6561 | 6619 | return sema.addConstant( |
| 6562 | 6620 | type_info_ty, |
| 6563 | 6621 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6564 | | .tag = try Value.Tag.enum_field_index.create( |
| 6565 | | sema.arena, |
| 6566 | | @enumToInt(@typeInfo(std.builtin.TypeInfo).Union.tag_type.?.Int), |
| 6567 | | ), |
| 6622 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Int)), |
| 6623 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6624 | }), |
| 6625 | ); |
| 6626 | }, |
| 6627 | .Float => { |
| 6628 | const field_values = try sema.arena.alloc(Value, 1); |
| 6629 | // bits: comptime_int, |
| 6630 | field_values[0] = try Value.Tag.int_u64.create(sema.arena, ty.bitSize(target)); |
| 6631 | |
| 6632 | return sema.addConstant( |
| 6633 | type_info_ty, |
| 6634 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6635 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Float)), |
| 6636 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6637 | }), |
| 6638 | ); |
| 6639 | }, |
| 6640 | .Pointer => { |
| 6641 | const info = ty.ptrInfo().data; |
| 6642 | const field_values = try sema.arena.alloc(Value, 7); |
| 6643 | // size: Size, |
| 6644 | field_values[0] = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(info.size)); |
| 6645 | // is_const: bool, |
| 6646 | field_values[1] = if (!info.mutable) Value.initTag(.bool_true) else Value.initTag(.bool_false); |
| 6647 | // is_volatile: bool, |
| 6648 | field_values[2] = if (info.@"volatile") Value.initTag(.bool_true) else Value.initTag(.bool_false); |
| 6649 | // alignment: comptime_int, |
| 6650 | field_values[3] = try Value.Tag.int_u64.create(sema.arena, info.@"align"); |
| 6651 | // child: type, |
| 6652 | field_values[4] = try Value.Tag.ty.create(sema.arena, info.pointee_type); |
| 6653 | // is_allowzero: bool, |
| 6654 | field_values[5] = if (info.@"allowzero") Value.initTag(.bool_true) else Value.initTag(.bool_false); |
| 6655 | // sentinel: anytype, |
| 6656 | field_values[6] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.initTag(.null_value); |
| 6657 | |
| 6658 | return sema.addConstant( |
| 6659 | type_info_ty, |
| 6660 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6661 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Pointer)), |
| 6662 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6663 | }), |
| 6664 | ); |
| 6665 | }, |
| 6666 | .Array => { |
| 6667 | const info = ty.arrayInfo(); |
| 6668 | const field_values = try sema.arena.alloc(Value, 3); |
| 6669 | // len: comptime_int, |
| 6670 | field_values[0] = try Value.Tag.int_u64.create(sema.arena, info.len); |
| 6671 | // child: type, |
| 6672 | field_values[1] = try Value.Tag.ty.create(sema.arena, info.elem_type); |
| 6673 | // sentinel: anytype, |
| 6674 | field_values[2] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.initTag(.null_value); |
| 6675 | |
| 6676 | return sema.addConstant( |
| 6677 | type_info_ty, |
| 6678 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6679 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Array)), |
| 6680 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6681 | }), |
| 6682 | ); |
| 6683 | }, |
| 6684 | .Optional => { |
| 6685 | const field_values = try sema.arena.alloc(Value, 1); |
| 6686 | // child: type, |
| 6687 | field_values[0] = try Value.Tag.ty.create(sema.arena, try ty.optionalChildAlloc(sema.arena)); |
| 6688 | |
| 6689 | return sema.addConstant( |
| 6690 | type_info_ty, |
| 6691 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6692 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Optional)), |
| 6693 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6694 | }), |
| 6695 | ); |
| 6696 | }, |
| 6697 | .ErrorUnion => { |
| 6698 | const field_values = try sema.arena.alloc(Value, 2); |
| 6699 | // error_set: type, |
| 6700 | field_values[0] = try Value.Tag.ty.create(sema.arena, ty.errorUnionSet()); |
| 6701 | // payload: type, |
| 6702 | field_values[1] = try Value.Tag.ty.create(sema.arena, ty.errorUnionPayload()); |
| 6703 | |
| 6704 | return sema.addConstant( |
| 6705 | type_info_ty, |
| 6706 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6707 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ErrorUnion)), |
| 6568 | 6708 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6569 | 6709 | }), |
| 6570 | 6710 | ); |