aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-12 18:23:40 +0200
committerAndrew Kelley <andrew@ziglang.org>2022-11-13 15:45:25 -0500
commit0184c8d86f614a216641039e06e97f08d439fff7 (patch)
tree078692e2754178870af16e4316e14e89557555b8 /src/value.zig
parentb2ffe113d3fd2835b25ddf2de1cc8dd49f5de722 (diff)
downloadzig-0184c8d86f614a216641039e06e97f08d439fff7.tar.gz
zig-0184c8d86f614a216641039e06e97f08d439fff7.zip
Sema: remove `block` and `src` parameters from `getBuiltin`
These parameters are only ever needed when `std.builtin` is out of sync with the compiler in which case panicking is the only valid operation anyways. Removing them causes a domino effect of functions no longer needing a `src` and/or a `block` parameter resulting in handling compilation errors where they are actually meaningful becoming simpler.
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig112
1 files changed, 56 insertions, 56 deletions
diff --git a/src/value.zig b/src/value.zig
index ddff0da58c..16b6cc87b7 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -1099,7 +1099,7 @@ pub const Value = extern union {
val: Value,
space: *BigIntSpace,
target: Target,
- sema_kit: ?Module.WipAnalysis,
+ opt_sema: ?*Sema,
) Module.CompileError!BigIntConst {
switch (val.tag()) {
.null_value,
@@ -1121,16 +1121,16 @@ pub const Value = extern union {
.lazy_align => {
const ty = val.castTag(.lazy_align).?.data;
- if (sema_kit) |sk| {
- try sk.sema.resolveTypeLayout(sk.block, sk.src, ty);
+ if (opt_sema) |sema| {
+ try sema.resolveTypeLayout(ty);
}
const x = ty.abiAlignment(target);
return BigIntMutable.init(&space.limbs, x).toConst();
},
.lazy_size => {
const ty = val.castTag(.lazy_size).?.data;
- if (sema_kit) |sk| {
- try sk.sema.resolveTypeLayout(sk.block, sk.src, ty);
+ if (opt_sema) |sema| {
+ try sema.resolveTypeLayout(ty);
}
const x = ty.abiSize(target);
return BigIntMutable.init(&space.limbs, x).toConst();
@@ -1138,7 +1138,7 @@ pub const Value = extern union {
.elem_ptr => {
const elem_ptr = val.castTag(.elem_ptr).?.data;
- const array_addr = (try elem_ptr.array_ptr.getUnsignedIntAdvanced(target, sema_kit)).?;
+ const array_addr = (try elem_ptr.array_ptr.getUnsignedIntAdvanced(target, opt_sema)).?;
const elem_size = elem_ptr.elem_ty.abiSize(target);
const new_addr = array_addr + elem_size * elem_ptr.index;
return BigIntMutable.init(&space.limbs, new_addr).toConst();
@@ -1156,7 +1156,7 @@ pub const Value = extern union {
/// If the value fits in a u64, return it, otherwise null.
/// Asserts not undefined.
- pub fn getUnsignedIntAdvanced(val: Value, target: Target, sema_kit: ?Module.WipAnalysis) !?u64 {
+ pub fn getUnsignedIntAdvanced(val: Value, target: Target, opt_sema: ?*Sema) !?u64 {
switch (val.tag()) {
.zero,
.bool_false,
@@ -1176,16 +1176,16 @@ pub const Value = extern union {
.lazy_align => {
const ty = val.castTag(.lazy_align).?.data;
- if (sema_kit) |sk| {
- return (try ty.abiAlignmentAdvanced(target, .{ .sema_kit = sk })).scalar;
+ if (opt_sema) |sema| {
+ return (try ty.abiAlignmentAdvanced(target, .{ .sema = sema })).scalar;
} else {
return ty.abiAlignment(target);
}
},
.lazy_size => {
const ty = val.castTag(.lazy_size).?.data;
- if (sema_kit) |sk| {
- return (try ty.abiSizeAdvanced(target, .{ .sema_kit = sk })).scalar;
+ if (opt_sema) |sema| {
+ return (try ty.abiSizeAdvanced(target, .{ .sema = sema })).scalar;
} else {
return ty.abiSize(target);
}
@@ -1886,7 +1886,7 @@ pub const Value = extern union {
pub fn orderAgainstZeroAdvanced(
lhs: Value,
- sema_kit: ?Module.WipAnalysis,
+ opt_sema: ?*Sema,
) Module.CompileError!std.math.Order {
return switch (lhs.tag()) {
.zero,
@@ -1911,7 +1911,7 @@ pub const Value = extern union {
.lazy_align => {
const ty = lhs.castTag(.lazy_align).?.data;
- if (try ty.hasRuntimeBitsAdvanced(false, sema_kit)) {
+ if (try ty.hasRuntimeBitsAdvanced(false, opt_sema)) {
return .gt;
} else {
return .eq;
@@ -1919,7 +1919,7 @@ pub const Value = extern union {
},
.lazy_size => {
const ty = lhs.castTag(.lazy_size).?.data;
- if (try ty.hasRuntimeBitsAdvanced(false, sema_kit)) {
+ if (try ty.hasRuntimeBitsAdvanced(false, opt_sema)) {
return .gt;
} else {
return .eq;
@@ -1934,7 +1934,7 @@ pub const Value = extern union {
.elem_ptr => {
const elem_ptr = lhs.castTag(.elem_ptr).?.data;
- switch (try elem_ptr.array_ptr.orderAgainstZeroAdvanced(sema_kit)) {
+ switch (try elem_ptr.array_ptr.orderAgainstZeroAdvanced(opt_sema)) {
.lt => unreachable,
.gt => return .gt,
.eq => {
@@ -1957,12 +1957,12 @@ pub const Value = extern union {
}
/// Asserts the value is comparable.
- /// If sema_kit is null then this function asserts things are resolved and cannot fail.
- pub fn orderAdvanced(lhs: Value, rhs: Value, target: Target, sema_kit: ?Module.WipAnalysis) !std.math.Order {
+ /// If opt_sema is null then this function asserts things are resolved and cannot fail.
+ pub fn orderAdvanced(lhs: Value, rhs: Value, target: Target, opt_sema: ?*Sema) !std.math.Order {
const lhs_tag = lhs.tag();
const rhs_tag = rhs.tag();
- const lhs_against_zero = try lhs.orderAgainstZeroAdvanced(sema_kit);
- const rhs_against_zero = try rhs.orderAgainstZeroAdvanced(sema_kit);
+ const lhs_against_zero = try lhs.orderAgainstZeroAdvanced(opt_sema);
+ const rhs_against_zero = try rhs.orderAgainstZeroAdvanced(opt_sema);
switch (lhs_against_zero) {
.lt => if (rhs_against_zero != .lt) return .lt,
.eq => return rhs_against_zero.invert(),
@@ -1996,8 +1996,8 @@ pub const Value = extern union {
var lhs_bigint_space: BigIntSpace = undefined;
var rhs_bigint_space: BigIntSpace = undefined;
- const lhs_bigint = try lhs.toBigIntAdvanced(&lhs_bigint_space, target, sema_kit);
- const rhs_bigint = try rhs.toBigIntAdvanced(&rhs_bigint_space, target, sema_kit);
+ const lhs_bigint = try lhs.toBigIntAdvanced(&lhs_bigint_space, target, opt_sema);
+ const rhs_bigint = try rhs.toBigIntAdvanced(&rhs_bigint_space, target, opt_sema);
return lhs_bigint.order(rhs_bigint);
}
@@ -2012,7 +2012,7 @@ pub const Value = extern union {
op: std.math.CompareOperator,
rhs: Value,
target: Target,
- sema_kit: ?Module.WipAnalysis,
+ opt_sema: ?*Sema,
) !bool {
if (lhs.pointerDecl()) |lhs_decl| {
if (rhs.pointerDecl()) |rhs_decl| {
@@ -2035,7 +2035,7 @@ pub const Value = extern union {
else => {},
}
}
- return (try orderAdvanced(lhs, rhs, target, sema_kit)).compare(op);
+ return (try orderAdvanced(lhs, rhs, target, opt_sema)).compare(op);
}
/// Asserts the values are comparable. Both operands have type `ty`.
@@ -2079,13 +2079,13 @@ pub const Value = extern union {
pub fn compareAllWithZeroAdvanced(
lhs: Value,
op: std.math.CompareOperator,
- sema_kit: ?Module.WipAnalysis,
+ opt_sema: ?*Sema,
) Module.CompileError!bool {
switch (lhs.tag()) {
- .repeated => return lhs.castTag(.repeated).?.data.compareAllWithZeroAdvanced(op, sema_kit),
+ .repeated => return lhs.castTag(.repeated).?.data.compareAllWithZeroAdvanced(op, opt_sema),
.aggregate => {
for (lhs.castTag(.aggregate).?.data) |elem_val| {
- if (!(try elem_val.compareAllWithZeroAdvanced(op, sema_kit))) return false;
+ if (!(try elem_val.compareAllWithZeroAdvanced(op, opt_sema))) return false;
}
return true;
},
@@ -2096,7 +2096,7 @@ pub const Value = extern union {
.float_128 => if (std.math.isNan(lhs.castTag(.float_128).?.data)) return op != .neq,
else => {},
}
- return (try orderAgainstZeroAdvanced(lhs, sema_kit)).compare(op);
+ return (try orderAgainstZeroAdvanced(lhs, opt_sema)).compare(op);
}
pub fn eql(a: Value, b: Value, ty: Type, mod: *Module) bool {
@@ -2111,14 +2111,14 @@ pub const Value = extern union {
/// for `a`. This function must act *as if* `a` has been coerced to `ty`. This complication
/// is required in order to make generic function instantiation efficient - specifically
/// the insertion into the monomorphized function table.
- /// If `null` is provided for `sema_kit` then it is guaranteed no error will be returned.
+ /// If `null` is provided for `opt_sema` then it is guaranteed no error will be returned.
pub fn eqlAdvanced(
a: Value,
a_ty: Type,
b: Value,
ty: Type,
mod: *Module,
- sema_kit: ?Module.WipAnalysis,
+ opt_sema: ?*Sema,
) Module.CompileError!bool {
const target = mod.getTarget();
const a_tag = a.tag();
@@ -2141,33 +2141,33 @@ pub const Value = extern union {
const b_payload = b.castTag(.opt_payload).?.data;
var buffer: Type.Payload.ElemType = undefined;
const payload_ty = ty.optionalChild(&buffer);
- return eqlAdvanced(a_payload, payload_ty, b_payload, payload_ty, mod, sema_kit);
+ return eqlAdvanced(a_payload, payload_ty, b_payload, payload_ty, mod, opt_sema);
},
.slice => {
const a_payload = a.castTag(.slice).?.data;
const b_payload = b.castTag(.slice).?.data;
- if (!(try eqlAdvanced(a_payload.len, Type.usize, b_payload.len, Type.usize, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_payload.len, Type.usize, b_payload.len, Type.usize, mod, opt_sema))) {
return false;
}
var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
- return eqlAdvanced(a_payload.ptr, ptr_ty, b_payload.ptr, ptr_ty, mod, sema_kit);
+ return eqlAdvanced(a_payload.ptr, ptr_ty, b_payload.ptr, ptr_ty, mod, opt_sema);
},
.elem_ptr => {
const a_payload = a.castTag(.elem_ptr).?.data;
const b_payload = b.castTag(.elem_ptr).?.data;
if (a_payload.index != b_payload.index) return false;
- return eqlAdvanced(a_payload.array_ptr, ty, b_payload.array_ptr, ty, mod, sema_kit);
+ return eqlAdvanced(a_payload.array_ptr, ty, b_payload.array_ptr, ty, mod, opt_sema);
},
.field_ptr => {
const a_payload = a.castTag(.field_ptr).?.data;
const b_payload = b.castTag(.field_ptr).?.data;
if (a_payload.field_index != b_payload.field_index) return false;
- return eqlAdvanced(a_payload.container_ptr, ty, b_payload.container_ptr, ty, mod, sema_kit);
+ return eqlAdvanced(a_payload.container_ptr, ty, b_payload.container_ptr, ty, mod, opt_sema);
},
.@"error" => {
const a_name = a.castTag(.@"error").?.data.name;
@@ -2178,7 +2178,7 @@ pub const Value = extern union {
const a_payload = a.castTag(.eu_payload).?.data;
const b_payload = b.castTag(.eu_payload).?.data;
const payload_ty = ty.errorUnionPayload();
- return eqlAdvanced(a_payload, payload_ty, b_payload, payload_ty, mod, sema_kit);
+ return eqlAdvanced(a_payload, payload_ty, b_payload, payload_ty, mod, opt_sema);
},
.eu_payload_ptr => @panic("TODO: Implement more pointer eql cases"),
.opt_payload_ptr => @panic("TODO: Implement more pointer eql cases"),
@@ -2196,7 +2196,7 @@ pub const Value = extern union {
const types = ty.tupleFields().types;
assert(types.len == a_field_vals.len);
for (types) |field_ty, i| {
- if (!(try eqlAdvanced(a_field_vals[i], field_ty, b_field_vals[i], field_ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_field_vals[i], field_ty, b_field_vals[i], field_ty, mod, opt_sema))) {
return false;
}
}
@@ -2207,7 +2207,7 @@ pub const Value = extern union {
const fields = ty.structFields().values();
assert(fields.len == a_field_vals.len);
for (fields) |field, i| {
- if (!(try eqlAdvanced(a_field_vals[i], field.ty, b_field_vals[i], field.ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_field_vals[i], field.ty, b_field_vals[i], field.ty, mod, opt_sema))) {
return false;
}
}
@@ -2218,7 +2218,7 @@ pub const Value = extern union {
for (a_field_vals) |a_elem, i| {
const b_elem = b_field_vals[i];
- if (!(try eqlAdvanced(a_elem, elem_ty, b_elem, elem_ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_elem, elem_ty, b_elem, elem_ty, mod, opt_sema))) {
return false;
}
}
@@ -2230,7 +2230,7 @@ pub const Value = extern union {
switch (ty.containerLayout()) {
.Packed, .Extern => {
const tag_ty = ty.unionTagTypeHypothetical();
- if (!(try eqlAdvanced(a_union.tag, tag_ty, b_union.tag, tag_ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_union.tag, tag_ty, b_union.tag, tag_ty, mod, opt_sema))) {
// In this case, we must disregard mismatching tags and compare
// based on the in-memory bytes of the payloads.
@panic("TODO comptime comparison of extern union values with mismatching tags");
@@ -2238,13 +2238,13 @@ pub const Value = extern union {
},
.Auto => {
const tag_ty = ty.unionTagTypeHypothetical();
- if (!(try eqlAdvanced(a_union.tag, tag_ty, b_union.tag, tag_ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_union.tag, tag_ty, b_union.tag, tag_ty, mod, opt_sema))) {
return false;
}
},
}
const active_field_ty = ty.unionFieldType(a_union.tag, mod);
- return eqlAdvanced(a_union.val, active_field_ty, b_union.val, active_field_ty, mod, sema_kit);
+ return eqlAdvanced(a_union.val, active_field_ty, b_union.val, active_field_ty, mod, opt_sema);
},
else => {},
} else if (b_tag == .null_value or b_tag == .@"error") {
@@ -2278,7 +2278,7 @@ pub const Value = extern union {
const b_val = b.enumToInt(ty, &buf_b);
var buf_ty: Type.Payload.Bits = undefined;
const int_ty = ty.intTagType(&buf_ty);
- return eqlAdvanced(a_val, int_ty, b_val, int_ty, mod, sema_kit);
+ return eqlAdvanced(a_val, int_ty, b_val, int_ty, mod, opt_sema);
},
.Array, .Vector => {
const len = ty.arrayLen();
@@ -2289,7 +2289,7 @@ pub const Value = extern union {
while (i < len) : (i += 1) {
const a_elem = elemValueBuffer(a, mod, i, &a_buf);
const b_elem = elemValueBuffer(b, mod, i, &b_buf);
- if (!(try eqlAdvanced(a_elem, elem_ty, b_elem, elem_ty, mod, sema_kit))) {
+ if (!(try eqlAdvanced(a_elem, elem_ty, b_elem, elem_ty, mod, opt_sema))) {
return false;
}
}
@@ -2313,7 +2313,7 @@ pub const Value = extern union {
.One => a,
else => unreachable,
};
- return try eqlAdvanced(a_ptr, ptr_ty, b.slicePtr(), ptr_ty, mod, sema_kit);
+ return try eqlAdvanced(a_ptr, ptr_ty, b.slicePtr(), ptr_ty, mod, opt_sema);
},
.Many, .C, .One => {},
},
@@ -2346,7 +2346,7 @@ pub const Value = extern union {
const field_tag = Value.initPayload(&field_tag_buf.base);
const tag_matches = tag_and_val.tag.eql(field_tag, union_obj.tag_ty, mod);
if (!tag_matches) return false;
- return eqlAdvanced(tag_and_val.val, union_obj.tag_ty, tuple.values[0], tuple.types[0], mod, sema_kit);
+ return eqlAdvanced(tag_and_val.val, union_obj.tag_ty, tuple.values[0], tuple.types[0], mod, opt_sema);
}
return false;
},
@@ -2377,7 +2377,7 @@ pub const Value = extern union {
.data = a,
};
const sub_val = Value.initPayload(&sub_pl.base);
- return eqlAdvanced(sub_val, ty, b, ty, mod, sema_kit);
+ return eqlAdvanced(sub_val, ty, b, ty, mod, opt_sema);
},
.ErrorUnion => if (a_tag != .@"error" and b_tag == .eu_payload) {
var sub_pl: Payload.SubValue = .{
@@ -2385,12 +2385,12 @@ pub const Value = extern union {
.data = a,
};
const sub_val = Value.initPayload(&sub_pl.base);
- return eqlAdvanced(sub_val, ty, b, ty, mod, sema_kit);
+ return eqlAdvanced(sub_val, ty, b, ty, mod, opt_sema);
},
else => {},
}
if (a_tag == .null_value or a_tag == .@"error") return false;
- return (try orderAdvanced(a, b, target, sema_kit)).compare(.eq);
+ return (try orderAdvanced(a, b, target, opt_sema)).compare(.eq);
}
/// This function is used by hash maps and so treats floating-point NaNs as equal
@@ -3161,18 +3161,18 @@ pub const Value = extern union {
};
}
- pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value {
+ pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target, opt_sema: ?*Sema) !Value {
if (int_ty.zigTypeTag() == .Vector) {
const result_data = try arena.alloc(Value, int_ty.vectorLen());
for (result_data) |*scalar, i| {
- scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target, sema_kit);
+ scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target, opt_sema);
}
return Value.Tag.aggregate.create(arena, result_data);
}
- return intToFloatScalar(val, arena, float_ty, target, sema_kit);
+ return intToFloatScalar(val, arena, float_ty, target, opt_sema);
}
- pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value {
+ pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target, opt_sema: ?*Sema) !Value {
switch (val.tag()) {
.undef, .zero, .one => return val,
.the_only_possible_value => return Value.initTag(.zero), // for i0, u0
@@ -3194,16 +3194,16 @@ pub const Value = extern union {
},
.lazy_align => {
const ty = val.castTag(.lazy_align).?.data;
- if (sema_kit) |sk| {
- return intToFloatInner((try ty.abiAlignmentAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target);
+ if (opt_sema) |sema| {
+ return intToFloatInner((try ty.abiAlignmentAdvanced(target, .{ .sema = sema })).scalar, arena, float_ty, target);
} else {
return intToFloatInner(ty.abiAlignment(target), arena, float_ty, target);
}
},
.lazy_size => {
const ty = val.castTag(.lazy_size).?.data;
- if (sema_kit) |sk| {
- return intToFloatInner((try ty.abiSizeAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target);
+ if (opt_sema) |sema| {
+ return intToFloatInner((try ty.abiSizeAdvanced(target, .{ .sema = sema })).scalar, arena, float_ty, target);
} else {
return intToFloatInner(ty.abiSize(target), arena, float_ty, target);
}