Skip to content

Commit

Permalink
Bug 1668375 - wasm: Decode ref.null in element segments as heap type.…
Browse files Browse the repository at this point in the history
… r=lth

Because we special case the decoding code for element segments, the change
to use heap types for ref.null wasn't propagated from OpIter. We should
decode as a heap type here.

Differential Revision: https://phabricator.services.mozilla.com/D91997
  • Loading branch information
eqrion committed Oct 5, 2020
1 parent fb950b7 commit 0cdf64b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
14 changes: 14 additions & 0 deletions js/src/jit-test/lib/wasm-binary.js
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,20 @@ function dataCountSection(count) {
return { name: dataCountId, body };
}

function globalSection(globalArray) {
var body = [];
body.push(...varU32(globalArray.length));
for (let globalObj of globalArray) {
// Value type
body.push(...varU32(globalObj.valType));
// Flags
body.push(globalObj.flags & 255);
// Initializer expression
body.push(...globalObj.initExpr);
}
return { name: globalId, body };
}

function elemSection(elemArrays) {
var body = [];
body.push(...varU32(elemArrays.length));
Expand Down
52 changes: 52 additions & 0 deletions js/src/jit-test/tests/wasm/function-references/binary.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// |jit-test| skip-if: !wasmFunctionReferencesEnabled()

load(libdir + "wasm-binary.js");

const v2vSig = {args:[], ret:VoidCode};
const v2vSigSection = sigSection([v2vSig]);

function checkInvalid(binary, errorMessage) {
assertErrorMessage(() => new WebAssembly.Module(binary),
WebAssembly.CompileError,
errorMessage);
}

// The immediate of ref.null is a heap type, not a general reference type

const invalidRefNullHeapBody = moduleWithSections([
v2vSigSection,
declSection([0]),
bodySection([
funcBody({locals:[], body:[
RefNullCode,
OptRefCode,
AnyFuncCode,
DropCode,
]})
])
]);
checkInvalid(invalidRefNullHeapBody, /invalid heap type/);

const invalidRefNullHeapElem = moduleWithSections([
generalElemSection([
{
flag: PassiveElemExpr,
typeCode: AnyFuncCode,
elems: [
[RefNullCode, OptRefCode, AnyFuncCode, EndCode]
]
}
])
]);
checkInvalid(invalidRefNullHeapElem, /invalid heap type/);

const invalidRefNullHeapGlobal = moduleWithSections([
globalSection([
{
valType: AnyFuncCode,
flag: 0,
initExpr: [RefNullCode, OptRefCode, AnyFuncCode, EndCode]
}
])
]);
checkInvalid(invalidRefNullHeapGlobal, /invalid heap type/);
2 changes: 1 addition & 1 deletion js/src/wasm/WasmValidate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2770,7 +2770,7 @@ static bool DecodeElemSection(Decoder& d, ModuleEnvironment* env) {
initType = RefType::func();
break;
case uint16_t(Op::RefNull):
if (!d.readRefType(env->types, env->features, &initType)) {
if (!d.readHeapType(env->types, env->features, true, &initType)) {
return false;
}
needIndex = false;
Expand Down

0 comments on commit 0cdf64b

Please sign in to comment.