authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-09-19 19:38:17+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-09-20 20:50:55-07:00
logd64d5cfc0a72a9989ed58548dd806a663f847ef5
tree4f668f09f5991764fcd49956e46ff0d328d3d5a0
parent9a54ff72df5cc8631c467f3478117eb85a952ced

stage2: implement typeInfo for more types


1 files changed, 154 insertions(+), 14 deletions(-)

src/Sema.zig+154-14
......@@ -6518,19 +6518,80 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr
65186518 const target = sema.mod.getTarget();
65196519
65206520 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 ),
65216584 .Fn => {
6585 const info = ty.fnInfo();
65226586 const field_values = try sema.arena.alloc(Value, 6);
65236587 // 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));
65286589 // alignment: comptime_int,
65296590 field_values[1] = try Value.Tag.int_u64.create(sema.arena, ty.abiAlignment(target));
65306591 // 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);
65326593 // 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);
65346595 // return_type: ?type,
65356596 field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType());
65366597 // args: []const FnArg,
......@@ -6539,10 +6600,7 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr
65396600 return sema.addConstant(
65406601 type_info_ty,
65416602 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)),
65466604 .val = try Value.Tag.@"struct".create(sema.arena, field_values),
65476605 }),
65486606 );
......@@ -6561,10 +6619,92 @@ fn zirTypeInfo(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr
65616619 return sema.addConstant(
65626620 type_info_ty,
65636621 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)),
65686708 .val = try Value.Tag.@"struct".create(sema.arena, field_values),
65696709 }),
65706710 );