Commit a9a21c5988
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 {
src/value.zig
@@ -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,