Source code

Revision control

Copy as Markdown

Other Tools

/* Copyright 2021 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// ./test/core/type-rec.wast
// ./test/core/type-rec.wast:3
let $0 = instantiate(`(module
(rec (type $$f1 (func)) (type (struct (field (ref $$f1)))))
(rec (type $$f2 (func)) (type (struct (field (ref $$f2)))))
(func $$f (type $$f2))
(global (ref $$f1) (ref.func $$f))
)`);
// ./test/core/type-rec.wast:10
let $1 = instantiate(`(module
(rec (type $$f1 (func)) (type (struct (field (ref $$f1)))))
(rec (type $$f2 (func)) (type (struct (field (ref $$f2)))))
(rec
(type $$g1 (func))
(type (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1))))
)
(rec
(type $$g2 (func))
(type (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2))))
)
(func $$g (type $$g2))
(global (ref $$g1) (ref.func $$g))
)`);
// ./test/core/type-rec.wast:25
assert_invalid(
() => instantiate(`(module
(rec (type $$f1 (func)) (type (struct (field (ref $$f1)))))
(rec (type $$f2 (func)) (type (struct (field (ref $$f1)))))
(func $$f (type $$f2))
(global (ref $$f1) (ref.func $$f))
)`),
`type mismatch`,
);
// ./test/core/type-rec.wast:35
assert_invalid(
() => instantiate(`(module
(rec (type $$f0 (func)) (type (struct (field (ref $$f0)))))
(rec (type $$f1 (func)) (type (struct (field (ref $$f0)))))
(rec (type $$f2 (func)) (type (struct (field (ref $$f1)))))
(func $$f (type $$f2))
(global (ref $$f1) (ref.func $$f))
)`),
`type mismatch`,
);
// ./test/core/type-rec.wast:46
assert_invalid(
() => instantiate(`(module
(rec (type $$f1 (func)) (type (struct)))
(rec (type (struct)) (type $$f2 (func)))
(global (ref $$f1) (ref.func $$f))
(func $$f (type $$f2))
)`),
`type mismatch`,
);
// ./test/core/type-rec.wast:56
assert_invalid(
() => instantiate(`(module
(rec (type $$f1 (func)) (type (struct)))
(rec (type $$f2 (func)) (type (struct)) (type (func)))
(global (ref $$f1) (ref.func $$f))
(func $$f (type $$f2))
)`),
`type mismatch`,
);
// ./test/core/type-rec.wast:69
let $2 = instantiate(`(module $$M
(rec (type $$f1 (func)) (type (struct)))
(func (export "f") (type $$f1))
)`);
register($2, `M`);
// ./test/core/type-rec.wast:73
register(`M`, `M`);
// ./test/core/type-rec.wast:75
let $3 = instantiate(`(module
(rec (type $$f2 (func)) (type (struct)))
(func (import "M" "f") (type $$f2))
)`);
// ./test/core/type-rec.wast:80
assert_unlinkable(
() => instantiate(`(module
(rec (type (struct)) (type $$f2 (func)))
(func (import "M" "f") (type $$f2))
)`),
`incompatible import type`,
);
// ./test/core/type-rec.wast:88
assert_unlinkable(
() => instantiate(`(module
(rec (type $$f2 (func)))
(func (import "M" "f") (type $$f2))
)`),
`incompatible import type`,
);
// ./test/core/type-rec.wast:99
let $4 = instantiate(`(module
(rec (type $$f1 (func)) (type (struct)))
(rec (type $$f2 (func)) (type (struct)))
(table funcref (elem $$f1))
(func $$f1 (type $$f1))
(func (export "run") (call_indirect (type $$f2) (i32.const 0)))
)`);
// ./test/core/type-rec.wast:106
assert_return(() => invoke($4, `run`, []), []);
// ./test/core/type-rec.wast:108
let $5 = instantiate(`(module
(rec (type $$f1 (func)) (type (struct)))
(rec (type (struct)) (type $$f2 (func)))
(table funcref (elem $$f1))
(func $$f1 (type $$f1))
(func (export "run") (call_indirect (type $$f2) (i32.const 0)))
)`);
// ./test/core/type-rec.wast:115
assert_trap(() => invoke($5, `run`, []), `indirect call type mismatch`);
// ./test/core/type-rec.wast:117
let $6 = instantiate(`(module
(rec (type $$f1 (func)) (type (struct)))
(rec (type $$f2 (func)))
(table funcref (elem $$f1))
(func $$f1 (type $$f1))
(func (export "run") (call_indirect (type $$f2) (i32.const 0)))
)`);
// ./test/core/type-rec.wast:124
assert_trap(() => invoke($6, `run`, []), `indirect call type mismatch`);
// ./test/core/type-rec.wast:129
let $7 = instantiate(`(module
(rec (type $$s (struct)))
(rec (type $$t (func (param (ref $$s)))))
(func $$f (param (ref $$s))) ;; okay, type is equivalent to $$t
(global (ref $$t) (ref.func $$f))
)`);
// ./test/core/type-rec.wast:136
assert_invalid(
() => instantiate(`(module
(rec
(type $$s (struct))
(type $$t (func (param (ref $$s))))
)
(func $$f (param (ref $$s))) ;; type is not equivalent to $$t
(global (ref $$t) (ref.func $$f))
)`),
`type mismatch`,
);
// ./test/core/type-rec.wast:148
assert_invalid(
() => instantiate(`(module
(rec
(type (struct))
(type $$t (func))
)
(func $$f) ;; type is not equivalent to $$t
(global (ref $$t) (ref.func $$f))
)`),
`type mismatch`,
);