diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-12 18:23:40 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-11-13 15:45:25 -0500 |
| commit | 0184c8d86f614a216641039e06e97f08d439fff7 (patch) | |
| tree | 078692e2754178870af16e4316e14e89557555b8 /src/value.zig | |
| parent | b2ffe113d3fd2835b25ddf2de1cc8dd49f5de722 (diff) | |
| download | zig-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.zig | 112 |
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); } |
