Source code

Revision control

Copy as Markdown

Other Tools

let defaultableTypes = [
['i32', 'i32.const 0 i32.eq'],
['i64', 'i64.const 0 i64.eq'],
['f32', 'f32.const 0 f32.eq'],
['f64', 'f64.const 0 f64.eq'],
['anyref', 'ref.is_null'],
['funcref', 'ref.is_null'],
['externref', 'ref.is_null'],
['(ref null $type)', 'ref.is_null'],
];
if (wasmSimdEnabled()) {
defaultableTypes.push(['v128', 'v128.const i64x2 0 0 i8x16.eq v128.any_true']);
}
for (let [type, isDefault] of defaultableTypes) {
let {testStruct, testArray} = wasmEvalText(`(module
(type $type (struct))
(type $struct (struct (field ${type})))
(type $array (array ${type}))
(func (export "testStruct") (result i32)
(struct.get $struct 0
struct.new_default $struct)
${isDefault}
)
(func (export "testArray") (result i32)
(array.get $array
(array.new_default $array i32.const 1)
i32.const 0
)
${isDefault}
)
)`).exports;
assertEq(testStruct(), 1);
assertEq(testArray(), 1);
}
let nonDefaultableTypes = ['(ref any)', '(ref func)', '(ref extern)', '(ref $type)'];
for (let type of nonDefaultableTypes) {
wasmFailValidateText(`(module
(type $type (struct))
(type $struct (struct (field ${type})))
(func
struct.new_default $struct
drop
)
)`, /defaultable/);
wasmFailValidateText(`(module
(type $type (struct))
(type $array (array ${type}))
(func
i32.const 1
array.new_default $array
drop
)
)`, /defaultable/);
}