diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-07-30 16:05:46 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-07-30 16:17:59 -0700 |
| commit | 507dc1f2e7fac212e79f152e557cbec98a3c30e9 (patch) | |
| tree | 34b057caf8ebadef2d199af39b1b44fca48c1a23 /src/Module.zig | |
| parent | 84039a57e4684e8df10e657bb76c6acb3fb89238 (diff) | |
| download | zig-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.zig | 11 |
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); |
