Skip to content

Commit ed04c5c

Browse files
authored
Type RefNull as inexact (#7498)
In preparation for disallowing inexact references to abstract heap types, which are no longer allowed by the Custom Descriptors proposal.
1 parent 5dab961 commit ed04c5c

36 files changed

+220
-260
lines changed

scripts/test/fuzzing.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@
118118
'remove-unused-types-exact.wast',
119119
'coalesce-locals-exact.wast',
120120
'remove-unused-brs-exact.wast',
121-
'exact.wast',
122121
# TODO: fuzzer support for custom descriptors
123122
'custom-descriptors.wast',
124123
]

src/ir/manipulation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ template<typename InputType> inline Nop* nop(InputType* target) {
4242
template<typename InputType>
4343
inline RefNull* refNull(InputType* target, HeapType type) {
4444
auto* ret = convert<InputType, RefNull>(target);
45-
ret->finalize(Type(type.getBottom(), Nullable, Exact));
45+
ret->finalize(Type(type.getBottom(), Nullable));
4646
return ret;
4747
}
4848

src/literal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ class Literal {
246246
}
247247
}
248248
static Literal makeNull(HeapType type) {
249-
return Literal(Type(type.getBottom(), Nullable, Exact));
249+
return Literal(Type(type.getBottom(), Nullable));
250250
}
251251
static Literal makeFunc(Name func, HeapType type) {
252252
return Literal(func, type);

src/wasm-builder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ class Builder {
670670
}
671671
RefNull* makeRefNull(HeapType type) {
672672
auto* ret = wasm.allocator.alloc<RefNull>();
673-
ret->finalize(Type(type.getBottom(), Nullable, Exact));
673+
ret->finalize(Type(type.getBottom(), Nullable));
674674
return ret;
675675
}
676676
RefNull* makeRefNull(Type type) {

src/wasm/literal.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Literal::Literal(Type type) : type(type) {
5353
}
5454

5555
if (type.isNull()) {
56-
assert(type.isNullable());
56+
assert(type.isNullable() && !type.isExact());
5757
new (&gcData) std::shared_ptr<GCData>();
5858
return;
5959
}
@@ -72,9 +72,8 @@ Literal::Literal(const uint8_t init[16]) : type(Type::v128) {
7272
}
7373

7474
Literal::Literal(std::shared_ptr<GCData> gcData, HeapType type)
75-
: gcData(gcData),
76-
type(type, gcData ? NonNullable : Nullable, gcData ? Inexact : Exact) {
77-
// TODO: Use exact types for more than just nulls.
75+
: gcData(gcData), type(type, gcData ? NonNullable : Nullable) {
76+
// TODO: Use exact types for gcData.
7877
// The type must be a proper type for GC data: either a struct, array, or
7978
// string; or an externalized version of the same; or a null; or an
8079
// internalized string (which appears as an anyref).

src/wasm/wasm-validator.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,10 +2288,6 @@ void FunctionValidator::visitRefNull(RefNull* curr) {
22882288
curr->type.isNullable(), curr, "ref.null types must be nullable")) {
22892289
return;
22902290
}
2291-
if (!shouldBeTrue(
2292-
curr->type.isExact(), curr, "ref.null types must be exact")) {
2293-
return;
2294-
}
22952291
shouldBeTrue(
22962292
curr->type.isNull(), curr, "ref.null must have a bottom heap type");
22972293
}

test/lit/basic/reference-types.wast

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@
961961
;; CHECK-BIN-NEXT: )
962962
;; CHECK-BIN-NEXT: (drop
963963
;; CHECK-BIN-NEXT: (block $block2 (result eqref)
964-
;; CHECK-BIN-NEXT: (ref.cast (exact nullref)
964+
;; CHECK-BIN-NEXT: (ref.cast nullref
965965
;; CHECK-BIN-NEXT: (br_if $block2
966966
;; CHECK-BIN-NEXT: (ref.null none)
967967
;; CHECK-BIN-NEXT: (i32.const 1)
@@ -987,7 +987,7 @@
987987
;; CHECK-BIN-NEXT: )
988988
;; CHECK-BIN-NEXT: (drop
989989
;; CHECK-BIN-NEXT: (block $block5 (result funcref)
990-
;; CHECK-BIN-NEXT: (ref.cast (exact nullfuncref)
990+
;; CHECK-BIN-NEXT: (ref.cast nullfuncref
991991
;; CHECK-BIN-NEXT: (br_if $block5
992992
;; CHECK-BIN-NEXT: (ref.null nofunc)
993993
;; CHECK-BIN-NEXT: (i32.const 1)
@@ -1023,7 +1023,7 @@
10231023
;; CHECK-BIN-NEXT: )
10241024
;; CHECK-BIN-NEXT: (drop
10251025
;; CHECK-BIN-NEXT: (block $block9 (result anyref)
1026-
;; CHECK-BIN-NEXT: (ref.cast (exact nullref)
1026+
;; CHECK-BIN-NEXT: (ref.cast nullref
10271027
;; CHECK-BIN-NEXT: (br_if $block9
10281028
;; CHECK-BIN-NEXT: (ref.null none)
10291029
;; CHECK-BIN-NEXT: (i32.const 1)
@@ -1043,7 +1043,7 @@
10431043
;; CHECK-BIN-NEXT: )
10441044
;; CHECK-BIN-NEXT: (drop
10451045
;; CHECK-BIN-NEXT: (block $block11 (result anyref)
1046-
;; CHECK-BIN-NEXT: (ref.cast (exact nullref)
1046+
;; CHECK-BIN-NEXT: (ref.cast nullref
10471047
;; CHECK-BIN-NEXT: (br_if $block11
10481048
;; CHECK-BIN-NEXT: (ref.null none)
10491049
;; CHECK-BIN-NEXT: (i32.const 1)
@@ -2298,7 +2298,7 @@
22982298
;; CHECK-BIN-NODEBUG-NEXT: )
22992299
;; CHECK-BIN-NODEBUG-NEXT: (drop
23002300
;; CHECK-BIN-NODEBUG-NEXT: (block $block2 (result eqref)
2301-
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast (exact nullref)
2301+
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast nullref
23022302
;; CHECK-BIN-NODEBUG-NEXT: (br_if $block2
23032303
;; CHECK-BIN-NODEBUG-NEXT: (ref.null none)
23042304
;; CHECK-BIN-NODEBUG-NEXT: (i32.const 1)
@@ -2324,7 +2324,7 @@
23242324
;; CHECK-BIN-NODEBUG-NEXT: )
23252325
;; CHECK-BIN-NODEBUG-NEXT: (drop
23262326
;; CHECK-BIN-NODEBUG-NEXT: (block $block5 (result funcref)
2327-
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast (exact nullfuncref)
2327+
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast nullfuncref
23282328
;; CHECK-BIN-NODEBUG-NEXT: (br_if $block5
23292329
;; CHECK-BIN-NODEBUG-NEXT: (ref.null nofunc)
23302330
;; CHECK-BIN-NODEBUG-NEXT: (i32.const 1)
@@ -2360,7 +2360,7 @@
23602360
;; CHECK-BIN-NODEBUG-NEXT: )
23612361
;; CHECK-BIN-NODEBUG-NEXT: (drop
23622362
;; CHECK-BIN-NODEBUG-NEXT: (block $block9 (result anyref)
2363-
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast (exact nullref)
2363+
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast nullref
23642364
;; CHECK-BIN-NODEBUG-NEXT: (br_if $block9
23652365
;; CHECK-BIN-NODEBUG-NEXT: (ref.null none)
23662366
;; CHECK-BIN-NODEBUG-NEXT: (i32.const 1)
@@ -2380,7 +2380,7 @@
23802380
;; CHECK-BIN-NODEBUG-NEXT: )
23812381
;; CHECK-BIN-NODEBUG-NEXT: (drop
23822382
;; CHECK-BIN-NODEBUG-NEXT: (block $block11 (result anyref)
2383-
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast (exact nullref)
2383+
;; CHECK-BIN-NODEBUG-NEXT: (ref.cast nullref
23842384
;; CHECK-BIN-NODEBUG-NEXT: (br_if $block11
23852385
;; CHECK-BIN-NODEBUG-NEXT: (ref.null none)
23862386
;; CHECK-BIN-NODEBUG-NEXT: (i32.const 1)

test/lit/exec/exact.wast

Lines changed: 0 additions & 21 deletions
This file was deleted.

test/lit/heap-types.wast

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
(type $struct.B (struct i32))
1313
;; CHECK: (func $test (type $0)
1414
;; CHECK-NEXT: (drop
15-
;; CHECK-NEXT: (ref.test (ref exact none)
15+
;; CHECK-NEXT: (ref.test (ref none)
1616
;; CHECK-NEXT: (ref.null none)
1717
;; CHECK-NEXT: )
1818
;; CHECK-NEXT: )
@@ -29,7 +29,7 @@
2929
(type $struct.B (struct i32))
3030
;; CHECK: (func $test (type $0)
3131
;; CHECK-NEXT: (drop
32-
;; CHECK-NEXT: (ref.cast (exact nullref)
32+
;; CHECK-NEXT: (ref.cast nullref
3333
;; CHECK-NEXT: (ref.null none)
3434
;; CHECK-NEXT: )
3535
;; CHECK-NEXT: )

test/lit/passes/cfp.wast

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@
10341034
;; CHECK-NEXT: )
10351035
;; CHECK-NEXT: )
10361036
;; CHECK-NEXT: (drop
1037-
;; CHECK-NEXT: (block (result (exact nullref))
1037+
;; CHECK-NEXT: (block (result nullref)
10381038
;; CHECK-NEXT: (drop
10391039
;; CHECK-NEXT: (ref.as_non_null
10401040
;; CHECK-NEXT: (local.get $struct3)
@@ -1233,7 +1233,7 @@
12331233
;; CHECK-NEXT: )
12341234
;; CHECK-NEXT: )
12351235
;; CHECK-NEXT: (drop
1236-
;; CHECK-NEXT: (block (result (exact nullref))
1236+
;; CHECK-NEXT: (block (result nullref)
12371237
;; CHECK-NEXT: (drop
12381238
;; CHECK-NEXT: (ref.as_non_null
12391239
;; CHECK-NEXT: (local.get $struct3)

test/lit/passes/code-pushing-gc.wast

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
;; CHECK-NEXT: (drop
88
;; CHECK-NEXT: (block $out (result (ref func))
99
;; CHECK-NEXT: (drop
10-
;; CHECK-NEXT: (br_on_cast $out (exact nullfuncref) (ref exact nofunc)
10+
;; CHECK-NEXT: (br_on_cast $out nullfuncref (ref nofunc)
1111
;; CHECK-NEXT: (ref.null nofunc)
1212
;; CHECK-NEXT: )
1313
;; CHECK-NEXT: )
@@ -48,7 +48,7 @@
4848
;; CHECK-NEXT: (ref.func $br_on_no)
4949
;; CHECK-NEXT: )
5050
;; CHECK-NEXT: (drop
51-
;; CHECK-NEXT: (br_on_cast $out (exact nullfuncref) (ref exact nofunc)
51+
;; CHECK-NEXT: (br_on_cast $out nullfuncref (ref nofunc)
5252
;; CHECK-NEXT: (ref.null nofunc)
5353
;; CHECK-NEXT: )
5454
;; CHECK-NEXT: )

test/lit/passes/dae-gc-refine-params.wast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@
262262
)
263263
;; This function is called in ways that allow us to make the first parameter
264264
;; non-nullable.
265-
;; CHECK: (func $various-params-null (type $13) (param $x (ref exact none)) (param $y (ref null $"{i32}"))
265+
;; CHECK: (func $various-params-null (type $13) (param $x (ref none)) (param $y (ref null $"{i32}"))
266266
;; CHECK-NEXT: (local $temp i32)
267267
;; CHECK-NEXT: (drop
268268
;; CHECK-NEXT: (local.get $x)

test/lit/passes/dae-gc.wast

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
)
111111

112112
;; CHECK: (func $bar (type $2) (param $0 i31ref)
113-
;; CHECK-NEXT: (local $1 (exact nullref))
113+
;; CHECK-NEXT: (local $1 nullref)
114114
;; CHECK-NEXT: (local.set $1
115115
;; CHECK-NEXT: (ref.null none)
116116
;; CHECK-NEXT: )

test/lit/passes/flatten_all-features.wast

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3581,8 +3581,8 @@
35813581
;; CHECK: (func $subtype (type $7) (result anyref)
35823582
;; CHECK-NEXT: (local $0 eqref)
35833583
;; CHECK-NEXT: (local $1 anyref)
3584-
;; CHECK-NEXT: (local $2 (exact nullref))
3585-
;; CHECK-NEXT: (local $3 (exact nullref))
3584+
;; CHECK-NEXT: (local $2 nullref)
3585+
;; CHECK-NEXT: (local $3 nullref)
35863586
;; CHECK-NEXT: (local $4 eqref)
35873587
;; CHECK-NEXT: (local $5 eqref)
35883588
;; CHECK-NEXT: (local $6 eqref)
@@ -3680,7 +3680,7 @@
36803680
;; CHECK: (type $0 (func (result funcref)))
36813681

36823682
;; CHECK: (func $0 (type $0) (result funcref)
3683-
;; CHECK-NEXT: (local $0 (ref exact nofunc))
3683+
;; CHECK-NEXT: (local $0 (ref nofunc))
36843684
;; CHECK-NEXT: (local.set $0
36853685
;; CHECK-NEXT: (ref.as_non_null
36863686
;; CHECK-NEXT: (ref.null nofunc)

test/lit/passes/global-refining.wast

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
;; CLOSD: (type $foo_t (func))
1212
(type $foo_t (func))
1313

14-
;; CHECK: (global $func-null-init (mut (exact nullfuncref)) (ref.null nofunc))
15-
;; CLOSD: (global $func-null-init (mut (exact nullfuncref)) (ref.null nofunc))
14+
;; CHECK: (global $func-null-init (mut nullfuncref) (ref.null nofunc))
15+
;; CLOSD: (global $func-null-init (mut nullfuncref) (ref.null nofunc))
1616
(global $func-null-init (mut funcref) (ref.null $foo_t))
1717
;; CHECK: (global $func-func-init (mut (ref $foo_t)) (ref.func $foo))
1818
;; CLOSD: (global $func-func-init (mut (ref $foo_t)) (ref.func $foo))
@@ -32,8 +32,8 @@
3232
;; CLOSD: (type $foo_t (func))
3333
(type $foo_t (func))
3434

35-
;; CHECK: (global $func-null-init (mut (exact nullfuncref)) (ref.null nofunc))
36-
;; CLOSD: (global $func-null-init (mut (exact nullfuncref)) (ref.null nofunc))
35+
;; CHECK: (global $func-null-init (mut nullfuncref) (ref.null nofunc))
36+
;; CLOSD: (global $func-null-init (mut nullfuncref) (ref.null nofunc))
3737
(global $func-null-init (mut funcref) (ref.null $foo_t))
3838
;; CHECK: (global $func-func-init (mut (ref null $foo_t)) (ref.func $foo))
3939
;; CLOSD: (global $func-func-init (mut (ref null $foo_t)) (ref.func $foo))
@@ -202,16 +202,16 @@
202202
;; (ref null func) to nullfuncref only when not exported, and if exported, then
203203
;; only when immutable in open world.
204204
(module
205-
;; CHECK: (global $mut (mut (exact nullfuncref)) (ref.null nofunc))
206-
;; CLOSD: (global $mut (mut (exact nullfuncref)) (ref.null nofunc))
205+
;; CHECK: (global $mut (mut nullfuncref) (ref.null nofunc))
206+
;; CLOSD: (global $mut (mut nullfuncref) (ref.null nofunc))
207207
(global $mut (mut (ref null func)) (ref.null nofunc))
208-
;; CHECK: (global $imm (exact nullfuncref) (ref.null nofunc))
209-
;; CLOSD: (global $imm (exact nullfuncref) (ref.null nofunc))
208+
;; CHECK: (global $imm nullfuncref (ref.null nofunc))
209+
;; CLOSD: (global $imm nullfuncref (ref.null nofunc))
210210
(global $imm (ref null func) (ref.null nofunc))
211211
;; CHECK: (global $mut-exp (mut funcref) (ref.null nofunc))
212212
;; CLOSD: (global $mut-exp (mut funcref) (ref.null nofunc))
213213
(global $mut-exp (mut (ref null func)) (ref.null nofunc))
214-
;; CHECK: (global $imm-exp (exact nullfuncref) (ref.null nofunc))
214+
;; CHECK: (global $imm-exp nullfuncref (ref.null nofunc))
215215
;; CLOSD: (global $imm-exp funcref (ref.null nofunc))
216216
(global $imm-exp (ref null func) (ref.null nofunc))
217217

0 commit comments

Comments
 (0)