Skip to content

Commit 72de26d

Browse files
authored
fix: Invert reference type null check in makeIsTrueish (#1719)
1 parent 532fddb commit 72de26d

File tree

4 files changed

+161
-23
lines changed

4 files changed

+161
-23
lines changed

Diff for: src/compiler.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -9941,7 +9941,10 @@ export class Compiler extends DiagnosticEmitter {
99419941
case TypeKind.EQREF:
99429942
case TypeKind.DATAREF:
99439943
case TypeKind.I31REF: {
9944-
return module.ref_is(RefIsOp.RefIsNull, expr);
9944+
// Needs to be true (i.e. not zero) when the ref is _not_ null,
9945+
// which means `ref.is_null` returns false (i.e. zero).
9946+
return module.unary(UnaryOp.EqzI32, module.ref_is(RefIsOp.RefIsNull, expr));
9947+
99459948
}
99469949
default: {
99479950
assert(false);

Diff for: tests/compiler/features/reference-types.js

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ exports.preInstantiate = function(imports, exports) {
99
external: function(a) {
1010
return a;
1111
},
12+
somethingReal() {
13+
return {};
14+
},
15+
somethingNull() {
16+
return null;
17+
},
1218
someObject: {
1319
theKey: "Hello world!"
1420
},

Diff for: tests/compiler/features/reference-types.ts

+40
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// can use externref as a parameter or return type
22

33
export declare function external(a: externref): externref;
4+
export declare function somethingReal(): externref;
5+
export declare function somethingNull(): externref;
46

57
export function internal(a: externref): externref {
68
const b = external(a);
@@ -26,6 +28,44 @@ console.log(someObject);
2628
console.log(someKey);
2729
console.log(Reflect.get(someObject, someKey));
2830

31+
// Truthiness conversion
32+
if(!somethingReal()) {
33+
assert(false);
34+
}
35+
if(!somethingNull()) {
36+
// nop
37+
} else {
38+
assert(false);
39+
}
40+
if(somethingReal()) {
41+
// nop
42+
} else {
43+
assert(false);
44+
}
45+
if(somethingNull()) {
46+
assert(false);
47+
}
48+
49+
// Explicit null checks (don’t work yet)
50+
/*
51+
if(somethingReal() !== null) {
52+
// nop
53+
} else {
54+
assert(false);
55+
}
56+
if(somethingReal() === null) {
57+
assert(false);
58+
}
59+
if(somethingNull() === null) {
60+
// nop
61+
} else {
62+
assert(false);
63+
}
64+
if(somethingNull() !== null) {
65+
assert(false);
66+
}
67+
*/
68+
2969
// can represent and recognize 'null'
3070

3171
var funcGlobal: funcref;

0 commit comments

Comments
 (0)