diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-12-30 22:31:56 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-12-30 21:41:02 -0800 |
| commit | 3f7d9b5fc19e4081236b3b63aebbc80e1b17f5b5 (patch) | |
| tree | a577bd97edf5d5da357d576c777861d443210aec /src/type.zig | |
| parent | 133da8692e80532797dd91b32539cf2175280a95 (diff) | |
| download | zig-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.zig | 43 |
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); } } |
