aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-07-30 16:05:46 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-07-30 16:17:59 -0700
commit507dc1f2e7fac212e79f152e557cbec98a3c30e9 (patch)
tree34b057caf8ebadef2d199af39b1b44fca48c1a23 /src/Module.zig
parent84039a57e4684e8df10e657bb76c6acb3fb89238 (diff)
downloadzig-507dc1f2e7fac212e79f152e557cbec98a3c30e9.tar.gz
zig-507dc1f2e7fac212e79f152e557cbec98a3c30e9.zip
stage2: fix hashing and comparison design flaw with Value
* `Value.toType` accepts a buffer parameter instead of an allocator parameter and can no longer fail. * Module: remove the unused `mod: *Module` parameter from various functions. * `Value.compare` now accepts a `Type` parameter which indicates the type of both operands. There is also a `Value.compareHetero` which accepts only Value parameters and supports comparing mixed types. Likewise, `Value.eql` requires a `Type` parameter. * `Value.hash` is removed; instead the hash map context structs now have a `ty: Type` field, and the hash function lives there, where it has access to a Value's Type when it computes a hash. - This allowed the hash function to be greatly simplified and sound in the sense that the same Values, even with different representations, always hash to the same thing. * Sema: Fix source location of zirCmp when an operand is runtime known but needs to be comptime known. * Remove unused target parameter from `Value.floatCast`.
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig11
1 files changed, 2 insertions, 9 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 909e54ffa2..d87f20621c 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -4299,7 +4299,6 @@ pub fn simplePtrType(
}
pub fn ptrType(
- mod: *Module,
arena: *Allocator,
elem_ty: Type,
sentinel: ?Value,
@@ -4311,7 +4310,6 @@ pub fn ptrType(
@"volatile": bool,
size: std.builtin.TypeInfo.Pointer.Size,
) Allocator.Error!Type {
- _ = mod;
assert(host_size == 0 or bit_offset < host_size * 8);
// TODO check if type can be represented by simplePtrType
@@ -4328,8 +4326,7 @@ pub fn ptrType(
});
}
-pub fn optionalType(mod: *Module, arena: *Allocator, child_type: Type) Allocator.Error!Type {
- _ = mod;
+pub fn optionalType(arena: *Allocator, child_type: Type) Allocator.Error!Type {
switch (child_type.tag()) {
.single_const_pointer => return Type.Tag.optional_single_const_pointer.create(
arena,
@@ -4344,16 +4341,14 @@ pub fn optionalType(mod: *Module, arena: *Allocator, child_type: Type) Allocator
}
pub fn arrayType(
- mod: *Module,
arena: *Allocator,
len: u64,
sentinel: ?Value,
elem_type: Type,
) Allocator.Error!Type {
- _ = mod;
if (elem_type.eql(Type.initTag(.u8))) {
if (sentinel) |some| {
- if (some.eql(Value.initTag(.zero))) {
+ if (some.eql(Value.initTag(.zero), elem_type)) {
return Type.Tag.array_u8_sentinel_0.create(arena, len);
}
} else {
@@ -4376,12 +4371,10 @@ pub fn arrayType(
}
pub fn errorUnionType(
- mod: *Module,
arena: *Allocator,
error_set: Type,
payload: Type,
) Allocator.Error!Type {
- _ = mod;
assert(error_set.zigTypeTag() == .ErrorSet);
if (error_set.eql(Type.initTag(.anyerror)) and payload.eql(Type.initTag(.void))) {
return Type.initTag(.anyerror_void_error_union);