mirror of
https://github.com/ziglang/zig.git
synced 2026-02-15 22:09:49 +00:00
stage2: Type/Value use an enum rather than usize
Makes debugging nicer when you want to look at Type/Value
This commit is contained in:
parent
5529febab0
commit
a9a21c5988
20
src/type.zig
20
src/type.zig
@ -18,7 +18,7 @@ const file_struct = @This();
|
||||
pub const Type = extern union {
|
||||
/// If the tag value is less than Tag.no_payload_count, then no pointer
|
||||
/// dereference is needed.
|
||||
tag_if_small_enough: usize,
|
||||
tag_if_small_enough: Tag,
|
||||
ptr_otherwise: *Payload,
|
||||
|
||||
pub fn zigTypeTag(ty: Type) std.builtin.TypeId {
|
||||
@ -178,7 +178,7 @@ pub const Type = extern union {
|
||||
|
||||
pub fn initTag(comptime small_tag: Tag) Type {
|
||||
comptime assert(@enumToInt(small_tag) < Tag.no_payload_count);
|
||||
return .{ .tag_if_small_enough = @enumToInt(small_tag) };
|
||||
return .{ .tag_if_small_enough = small_tag };
|
||||
}
|
||||
|
||||
pub fn initPayload(payload: *Payload) Type {
|
||||
@ -187,8 +187,8 @@ pub const Type = extern union {
|
||||
}
|
||||
|
||||
pub fn tag(self: Type) Tag {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
return @intToEnum(Tag, @intCast(std.meta.Tag(Tag), self.tag_if_small_enough));
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return self.tag_if_small_enough;
|
||||
} else {
|
||||
return self.ptr_otherwise.tag;
|
||||
}
|
||||
@ -199,7 +199,7 @@ pub const Type = extern union {
|
||||
if (@hasField(T, "base_tag")) {
|
||||
return self.castTag(T.base_tag);
|
||||
}
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return null;
|
||||
}
|
||||
inline for (@typeInfo(Tag).Enum.fields) |field| {
|
||||
@ -217,7 +217,7 @@ pub const Type = extern union {
|
||||
}
|
||||
|
||||
pub fn castTag(self: Type, comptime t: Tag) ?*t.Type() {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count)
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count)
|
||||
return null;
|
||||
|
||||
if (self.ptr_otherwise.tag == t)
|
||||
@ -690,7 +690,7 @@ pub const Type = extern union {
|
||||
};
|
||||
|
||||
pub fn copy(self: Type, allocator: *Allocator) error{OutOfMemory}!Type {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return Type{ .tag_if_small_enough = self.tag_if_small_enough };
|
||||
} else switch (self.ptr_otherwise.tag) {
|
||||
.u1,
|
||||
@ -1459,7 +1459,7 @@ pub const Type = extern union {
|
||||
|
||||
pub fn isNoReturn(self: Type) bool {
|
||||
const definitely_correct_result = self.zigTypeTag() == .NoReturn;
|
||||
const fast_result = self.tag_if_small_enough == @enumToInt(Tag.noreturn);
|
||||
const fast_result = self.tag_if_small_enough == Tag.noreturn;
|
||||
assert(fast_result == definitely_correct_result);
|
||||
return fast_result;
|
||||
}
|
||||
@ -3165,7 +3165,7 @@ pub const Type = extern union {
|
||||
/// but with different alignment values, in this data structure they are represented
|
||||
/// with different enum tags, because the the former requires more payload data than the latter.
|
||||
/// See `zigTypeTag` for the function that corresponds to `std.builtin.TypeId`.
|
||||
pub const Tag = enum {
|
||||
pub const Tag = enum(usize) {
|
||||
// The first section of this enum are tags that require no payload.
|
||||
u1,
|
||||
u8,
|
||||
@ -3382,7 +3382,7 @@ pub const Type = extern union {
|
||||
|
||||
pub fn init(comptime t: Tag) file_struct.Type {
|
||||
comptime std.debug.assert(@enumToInt(t) < Tag.no_payload_count);
|
||||
return .{ .tag_if_small_enough = @enumToInt(t) };
|
||||
return .{ .tag_if_small_enough = t };
|
||||
}
|
||||
|
||||
pub fn create(comptime t: Tag, ally: *Allocator, data: Data(t)) error{OutOfMemory}!file_struct.Type {
|
||||
|
||||
@ -17,10 +17,10 @@ const Air = @import("Air.zig");
|
||||
pub const Value = extern union {
|
||||
/// If the tag value is less than Tag.no_payload_count, then no pointer
|
||||
/// dereference is needed.
|
||||
tag_if_small_enough: usize,
|
||||
tag_if_small_enough: Tag,
|
||||
ptr_otherwise: *Payload,
|
||||
|
||||
pub const Tag = enum {
|
||||
pub const Tag = enum(usize) {
|
||||
// The first section of this enum are tags that require no payload.
|
||||
u1_type,
|
||||
u8_type,
|
||||
@ -296,7 +296,7 @@ pub const Value = extern union {
|
||||
|
||||
pub fn initTag(small_tag: Tag) Value {
|
||||
assert(@enumToInt(small_tag) < Tag.no_payload_count);
|
||||
return .{ .tag_if_small_enough = @enumToInt(small_tag) };
|
||||
return .{ .tag_if_small_enough = small_tag };
|
||||
}
|
||||
|
||||
pub fn initPayload(payload: *Payload) Value {
|
||||
@ -305,8 +305,8 @@ pub const Value = extern union {
|
||||
}
|
||||
|
||||
pub fn tag(self: Value) Tag {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
return @intToEnum(Tag, @intCast(std.meta.Tag(Tag), self.tag_if_small_enough));
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return self.tag_if_small_enough;
|
||||
} else {
|
||||
return self.ptr_otherwise.tag;
|
||||
}
|
||||
@ -317,7 +317,7 @@ pub const Value = extern union {
|
||||
if (@hasField(T, "base_tag")) {
|
||||
return self.castTag(T.base_tag);
|
||||
}
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return null;
|
||||
}
|
||||
inline for (@typeInfo(Tag).Enum.fields) |field| {
|
||||
@ -335,7 +335,7 @@ pub const Value = extern union {
|
||||
}
|
||||
|
||||
pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count)
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count)
|
||||
return null;
|
||||
|
||||
if (self.ptr_otherwise.tag == t)
|
||||
@ -347,7 +347,7 @@ pub const Value = extern union {
|
||||
/// It's intentional that this function is not passed a corresponding Type, so that
|
||||
/// a Value can be copied from a Sema to a Decl prior to resolving struct/union field types.
|
||||
pub fn copy(self: Value, arena: *Allocator) error{OutOfMemory}!Value {
|
||||
if (self.tag_if_small_enough < Tag.no_payload_count) {
|
||||
if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) {
|
||||
return Value{ .tag_if_small_enough = self.tag_if_small_enough };
|
||||
} else switch (self.ptr_otherwise.tag) {
|
||||
.u1_type,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user