/* 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
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* 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/ref_func.wast
// ./test/core/ref_func.wast:1
let $0 = instantiate(`(module
(func (export "f" ) (param \$x i32) (result i32) (local.get \$x))
)`);
// ./test/core/ref_func.wast:4
register($0 , `M`);
// ./test/core/ref_func.wast:6
let $1 = instantiate(`(module
(func \$f (import "M" "f" ) (param i32) (result i32))
(func \$g (param \$x i32) (result i32)
(i32.add (local.get \$x) (i32.const 1 ))
)
(global funcref (ref.func \$f))
(global funcref (ref.func \$g))
(global \$v (mut funcref) (ref.func \$f))
(global funcref (ref.func \$gf1))
(global funcref (ref.func \$gf2))
(func (drop (ref.func \$ff1)) (drop (ref.func \$ff2)))
(elem declare func \$gf1 \$ff1)
(elem declare funcref (ref.func \$gf2) (ref.func \$ff2))
(func \$gf1)
(func \$gf2)
(func \$ff1)
(func \$ff2)
(func (export "is_null-f" ) (result i32)
(ref.is_null (ref.func \$f))
)
(func (export "is_null-g" ) (result i32)
(ref.is_null (ref.func \$g))
)
(func (export "is_null-v" ) (result i32)
(ref.is_null (global.get \$v))
)
(func (export "set-f" ) (global.set \$v (ref.func \$f)))
(func (export "set-g" ) (global.set \$v (ref.func \$g)))
(table \$t 1 funcref)
(elem declare func \$f \$g)
(func (export "call-f" ) (param \$x i32) (result i32)
(table.set \$t (i32.const 0 ) (ref.func \$f))
(call_indirect \$t (param i32) (result i32) (local.get \$x) (i32.const 0 ))
)
(func (export "call-g" ) (param \$x i32) (result i32)
(table.set \$t (i32.const 0 ) (ref.func \$g))
(call_indirect \$t (param i32) (result i32) (local.get \$x) (i32.const 0 ))
)
(func (export "call-v" ) (param \$x i32) (result i32)
(table.set \$t (i32.const 0 ) (global.get \$v))
(call_indirect \$t (param i32) (result i32) (local.get \$x) (i32.const 0 ))
)
)`);
// ./test/core/ref_func.wast:56
assert_return(() => invoke($1 , `is_null-f`, []), [value("i32" , 0 )]);
// ./test/core/ref_func.wast:57
assert_return(() => invoke($1 , `is_null-g`, []), [value("i32" , 0 )]);
// ./test/core/ref_func.wast:58
assert_return(() => invoke($1 , `is_null-v`, []), [value("i32" , 0 )]);
// ./test/core/ref_func.wast:60
assert_return(() => invoke($1 , `call-f`, [4 ]), [value("i32" , 4 )]);
// ./test/core/ref_func.wast:61
assert_return(() => invoke($1 , `call-g`, [4 ]), [value("i32" , 5 )]);
// ./test/core/ref_func.wast:62
assert_return(() => invoke($1 , `call-v`, [4 ]), [value("i32" , 4 )]);
// ./test/core/ref_func.wast:63
invoke($1 , `set-g`, []);
// ./test/core/ref_func.wast:64
assert_return(() => invoke($1 , `call-v`, [4 ]), [value("i32" , 5 )]);
// ./test/core/ref_func.wast:65
invoke($1 , `set-f`, []);
// ./test/core/ref_func.wast:66
assert_return(() => invoke($1 , `call-v`, [4 ]), [value("i32" , 4 )]);
// ./test/core/ref_func.wast:68
assert_invalid(
() => instantiate(`(module
(func \$f (import "M" "f" ) (param i32) (result i32))
(func \$g (import "M" "g" ) (param i32) (result i32))
(global funcref (ref.func 7 ))
)`),
`unknown function 7 `,
);
// ./test/core/ref_func.wast:80
let $2 = instantiate(`(module
(func \$f1)
(func \$f2)
(func \$f3)
(func \$f4)
(func \$f5)
(func \$f6)
(table \$t 1 funcref)
(global funcref (ref.func \$f1))
(export "f" (func \$f2))
(elem (table \$t) (i32.const 0 ) func \$f3)
(elem (table \$t) (i32.const 0 ) funcref (ref.func \$f4))
(elem func \$f5)
(elem funcref (ref.func \$f6))
(func
(ref.func \$f1)
(ref.func \$f2)
(ref.func \$f3)
(ref.func \$f4)
(ref.func \$f5)
(ref.func \$f6)
(return )
)
)`);
// ./test/core/ref_func.wast:108
assert_invalid(
() => instantiate(`(module (func \$f (drop (ref.func \$f))))`),
`undeclared function reference`,
);
// ./test/core/ref_func.wast:112
assert_invalid(
() => instantiate(`(module (start \$f) (func \$f (drop (ref.func \$f))))`),
`undeclared function reference`,
);
Messung V0.5 in Prozent C=92 H=98 G=94
¤ Dauer der Verarbeitung: 0.4 Sekunden
¤
*© Formatika GbR, Deutschland