aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-12-30 22:31:56 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-12-30 21:41:02 -0800
commit3f7d9b5fc19e4081236b3b63aebbc80e1b17f5b5 (patch)
treea577bd97edf5d5da357d576c777861d443210aec /src/type.zig
parent133da8692e80532797dd91b32539cf2175280a95 (diff)
downloadzig-3f7d9b5fc19e4081236b3b63aebbc80e1b17f5b5.tar.gz
zig-3f7d9b5fc19e4081236b3b63aebbc80e1b17f5b5.zip
stage2: rework Value Payload layout
This is the same as the previous commit but for Value instead of Type. Add `Value.castTag` and note that it is preferable to call than `Value.cast`. This matches other abstractions in the codebase. Added a convenience function `Value.Tag.create` which really cleans up the callsites of creating `Value` objects. `Value` tags can now share payload types. This is in preparation for another improvement that I want to do.
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig43
1 files changed, 11 insertions, 32 deletions
diff --git a/src/type.zig b/src/type.zig
index ce237f89c7..9d834a19f2 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -733,11 +733,7 @@ pub const Type = extern union {
.single_const_pointer_to_comptime_int => return Value.initTag(.single_const_pointer_to_comptime_int_type),
.const_slice_u8 => return Value.initTag(.const_slice_u8_type),
.enum_literal => return Value.initTag(.enum_literal_type),
- else => {
- const ty_payload = try allocator.create(Value.Payload.Ty);
- ty_payload.* = .{ .ty = self };
- return Value.initPayload(&ty_payload.base);
- },
+ else => return Value.Tag.ty.create(allocator, self),
}
}
@@ -2951,11 +2947,8 @@ pub const Type = extern union {
}
if ((info.bits - 1) <= std.math.maxInt(u6)) {
- const payload = try arena.allocator.create(Value.Payload.Int_i64);
- payload.* = .{
- .int = -(@as(i64, 1) << @truncate(u6, info.bits - 1)),
- };
- return Value.initPayload(&payload.base);
+ const n: i64 = -(@as(i64, 1) << @truncate(u6, info.bits - 1));
+ return Value.Tag.int_i64.create(&arena.allocator, n);
}
var res = try std.math.big.int.Managed.initSet(&arena.allocator, 1);
@@ -2964,13 +2957,9 @@ pub const Type = extern union {
const res_const = res.toConst();
if (res_const.positive) {
- const val_payload = try arena.allocator.create(Value.Payload.IntBigPositive);
- val_payload.* = .{ .limbs = res_const.limbs };
- return Value.initPayload(&val_payload.base);
+ return Value.Tag.int_big_positive.create(&arena.allocator, res_const.limbs);
} else {
- const val_payload = try arena.allocator.create(Value.Payload.IntBigNegative);
- val_payload.* = .{ .limbs = res_const.limbs };
- return Value.initPayload(&val_payload.base);
+ return Value.Tag.int_big_negative.create(&arena.allocator, res_const.limbs);
}
}
@@ -2980,17 +2969,11 @@ pub const Type = extern union {
const info = self.intInfo(target);
if (info.signedness == .signed and (info.bits - 1) <= std.math.maxInt(u6)) {
- const payload = try arena.allocator.create(Value.Payload.Int_i64);
- payload.* = .{
- .int = (@as(i64, 1) << @truncate(u6, info.bits - 1)) - 1,
- };
- return Value.initPayload(&payload.base);
+ const n: i64 = (@as(i64, 1) << @truncate(u6, info.bits - 1)) - 1;
+ return Value.Tag.int_i64.create(&arena.allocator, n);
} else if (info.signedness == .signed and info.bits <= std.math.maxInt(u6)) {
- const payload = try arena.allocator.create(Value.Payload.Int_u64);
- payload.* = .{
- .int = (@as(u64, 1) << @truncate(u6, info.bits)) - 1,
- };
- return Value.initPayload(&payload.base);
+ const n: u64 = (@as(u64, 1) << @truncate(u6, info.bits)) - 1;
+ return Value.Tag.int_u64.create(&arena.allocator, n);
}
var res = try std.math.big.int.Managed.initSet(&arena.allocator, 1);
@@ -3003,13 +2986,9 @@ pub const Type = extern union {
const res_const = res.toConst();
if (res_const.positive) {
- const val_payload = try arena.allocator.create(Value.Payload.IntBigPositive);
- val_payload.* = .{ .limbs = res_const.limbs };
- return Value.initPayload(&val_payload.base);
+ return Value.Tag.int_big_positive.create(&arena.allocator, res_const.limbs);
} else {
- const val_payload = try arena.allocator.create(Value.Payload.IntBigNegative);
- val_payload.* = .{ .limbs = res_const.limbs };
- return Value.initPayload(&val_payload.base);
+ return Value.Tag.int_big_negative.create(&arena.allocator, res_const.limbs);
}
}