| ... | @@ -6518,19 +6518,80 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr | ... | @@ -6518,19 +6518,80 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6518 | const target = sema.mod.getTarget(); | 6518 | const target = sema.mod.getTarget(); |
| 6519 | | 6519 | |
| 6520 | switch (ty.zigTypeTag()) { | 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 | .Fn => { | 6584 | .Fn => { |
| | 6585 | const info = ty.fnInfo(); |
| 6522 | const field_values = try sema.arena.alloc(Value, 6); | 6586 | const field_values = try sema.arena.alloc(Value, 6); |
| 6523 | // calling_convention: CallingConvention, | 6587 | // calling_convention: CallingConvention, |
| 6524 | field_values[0] = try Value.Tag.enum_field_index.create( | 6588 | field_values[0] = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(info.cc)); |
| 6525 | sema.arena, | | |
| 6526 | @enumToInt(ty.fnCallingConvention()), | | |
| 6527 | ); | | |
| 6528 | // alignment: comptime_int, | 6589 | // alignment: comptime_int, |
| 6529 | field_values[1] = try Value.Tag.int_u64.create(sema.arena, ty.abiAlignment(target)); | 6590 | field_values[1] = try Value.Tag.int_u64.create(sema.arena, ty.abiAlignment(target)); |
| 6530 | // is_generic: bool, | 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 | // is_var_args: bool, | 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 | // return_type: ?type, | 6595 | // return_type: ?type, |
| 6535 | field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType()); | 6596 | field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType()); |
| 6536 | // args: []const FnArg, | 6597 | // args: []const FnArg, |
| ... | @@ -6539,10 +6600,7 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr | ... | @@ -6539,10 +6600,7 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6539 | return sema.addConstant( | 6600 | return sema.addConstant( |
| 6540 | type_info_ty, | 6601 | type_info_ty, |
| 6541 | try Value.Tag.@"union".create(sema.arena, .{ | 6602 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6542 | .tag = try Value.Tag.enum_field_index.create( | 6603 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Fn)), |
| 6543 | sema.arena, | | |
| 6544 | @enumToInt(@typeInfo(std.builtin.TypeInfo).Union.tag_type.?.Fn), | | |
| 6545 | ), | | |
| 6546 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), | 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,10 +6619,92 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr |
| 6561 | return sema.addConstant( | 6619 | return sema.addConstant( |
| 6562 | type_info_ty, | 6620 | type_info_ty, |
| 6563 | try Value.Tag.@"union".create(sema.arena, .{ | 6621 | try Value.Tag.@"union".create(sema.arena, .{ |
| 6564 | .tag = try Value.Tag.enum_field_index.create( | 6622 | .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Int)), |
| 6565 | sema.arena, | 6623 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6566 | @enumToInt(@typeInfo(std.builtin.TypeInfo).Union.tag_type.?.Int), | 6624 | }), |
| 6567 | ), | 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 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), | 6708 | .val = try Value.Tag.@"struct".create(sema.arena, field_values), |
| 6569 | }), | 6709 | }), |
| 6570 | ); | 6710 | ); |