/* 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/call_ref.wast
// ./test/core/call_ref.wast:1
let $0 = instantiate(`(module
(type $$ii (func (param i32) (result i32)))
(func $$apply (param $$f (ref $$ii)) (param $$x i32) (result i32)
(call_ref $$ii (local.get $$x) (local.get $$f))
)
(func $$f (type $$ii) (i32.mul (local.get 0 ) (local.get 0 )))
(func $$g (type $$ii) (i32.sub (i32.const 0 ) (local.get 0 )))
(elem declare func $$f $$g)
(func (export "run" ) (param $$x i32) (result i32)
(local $$rf (ref null $$ii))
(local $$rg (ref null $$ii))
(local.set $$rf (ref.func $$f))
(local.set $$rg (ref.func $$g))
(call_ref $$ii (call_ref $$ii (local.get $$x) (local.get $$rf)) (local.get $$rg))
)
(func (export "null" ) (result i32)
(call_ref $$ii (i32.const 1 ) (ref.null $$ii))
)
;; Recursion
(type $$ll (func (param i64) (result i64)))
(type $$lll (func (param i64 i64) (result i64)))
(elem declare func $$fac)
(global $$fac (ref $$ll) (ref.func $$fac))
(func $$fac (export "fac" ) (type $$ll)
(if (result i64) (i64.eqz (local.get 0 ))
(then (i64.const 1 ))
(else
(i64.mul
(local.get 0 )
(call_ref $$ll (i64.sub (local.get 0 ) (i64.const 1 )) (global.get $$fac))
)
)
)
)
(elem declare func $$fac-acc)
(global $$fac-acc (ref $$lll) (ref.func $$fac-acc))
(func $$fac-acc (export "fac-acc" ) (type $$lll)
(if (result i64) (i64.eqz (local.get 0 ))
(then (local.get 1 ))
(else
(call_ref $$lll
(i64.sub (local.get 0 ) (i64.const 1 ))
(i64.mul (local.get 0 ) (local.get 1 ))
(global.get $$fac-acc)
)
)
)
)
(elem declare func $$fib)
(global $$fib (ref $$ll) (ref.func $$fib))
(func $$fib (export "fib" ) (type $$ll)
(if (result i64) (i64.le_u (local.get 0 ) (i64.const 1 ))
(then (i64.const 1 ))
(else
(i64.add
(call_ref $$ll (i64.sub (local.get 0 ) (i64.const 2 )) (global.get $$fib))
(call_ref $$ll (i64.sub (local.get 0 ) (i64.const 1 )) (global.get $$fib))
)
)
)
)
(elem declare func $$even $$odd)
(global $$even (ref $$ll) (ref.func $$even))
(global $$odd (ref $$ll) (ref.func $$odd))
(func $$even (export "even" ) (type $$ll)
(if (result i64) (i64.eqz (local.get 0 ))
(then (i64.const 44 ))
(else (call_ref $$ll (i64.sub (local.get 0 ) (i64.const 1 )) (global.get $$odd)))
)
)
(func $$odd (export "odd" ) (type $$ll)
(if (result i64) (i64.eqz (local.get 0 ))
(then (i64.const 99 ))
(else (call_ref $$ll (i64.sub (local.get 0 ) (i64.const 1 )) (global.get $$even)))
)
)
)`);
// ./test/core/call_ref.wast:94
assert_return(() => invoke($0 , `run`, [0 ]), [value("i32" , 0 )]);
// ./test/core/call_ref.wast:95
assert_return(() => invoke($0 , `run`, [3 ]), [value("i32" , -9 )]);
// ./test/core/call_ref.wast:97
assert_trap(() => invoke($0 , `null `, []), `null function reference`);
// ./test/core/call_ref.wast:99
assert_return(() => invoke($0 , `fac`, [0 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:100
assert_return(() => invoke($0 , `fac`, [1 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:101
assert_return(() => invoke($0 , `fac`, [5 n]), [value("i64" , 120 n)]);
// ./test/core/call_ref.wast:102
assert_return(() => invoke($0 , `fac`, [25 n]), [value("i64" , 7034535277573963776 n)]);
// ./test/core/call_ref.wast:103
assert_return(() => invoke($0 , `fac-acc`, [0 n, 1 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:104
assert_return(() => invoke($0 , `fac-acc`, [1 n, 1 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:105
assert_return(() => invoke($0 , `fac-acc`, [5 n, 1 n]), [value("i64" , 120 n)]);
// ./test/core/call_ref.wast:106
assert_return(() => invoke($0 , `fac-acc`, [25 n, 1 n]), [value("i64" , 7034535277573963776 n)]);
// ./test/core/call_ref.wast:111
assert_return(() => invoke($0 , `fib`, [0 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:112
assert_return(() => invoke($0 , `fib`, [1 n]), [value("i64" , 1 n)]);
// ./test/core/call_ref.wast:113
assert_return(() => invoke($0 , `fib`, [2 n]), [value("i64" , 2 n)]);
// ./test/core/call_ref.wast:114
assert_return(() => invoke($0 , `fib`, [5 n]), [value("i64" , 8 n)]);
// ./test/core/call_ref.wast:115
assert_return(() => invoke($0 , `fib`, [20 n]), [value("i64" , 10946 n)]);
// ./test/core/call_ref.wast:117
assert_return(() => invoke($0 , `even`, [0 n]), [value("i64" , 44 n)]);
// ./test/core/call_ref.wast:118
assert_return(() => invoke($0 , `even`, [1 n]), [value("i64" , 99 n)]);
// ./test/core/call_ref.wast:119
assert_return(() => invoke($0 , `even`, [100 n]), [value("i64" , 44 n)]);
// ./test/core/call_ref.wast:120
assert_return(() => invoke($0 , `even`, [77 n]), [value("i64" , 99 n)]);
// ./test/core/call_ref.wast:121
assert_return(() => invoke($0 , `odd`, [0 n]), [value("i64" , 99 n)]);
// ./test/core/call_ref.wast:122
assert_return(() => invoke($0 , `odd`, [1 n]), [value("i64" , 44 n)]);
// ./test/core/call_ref.wast:123
assert_return(() => invoke($0 , `odd`, [200 n]), [value("i64" , 99 n)]);
// ./test/core/call_ref.wast:124
assert_return(() => invoke($0 , `odd`, [77 n]), [value("i64" , 44 n)]);
// ./test/core/call_ref.wast:129
let $1 = instantiate(`(module
(type $$t (func))
(func (export "unreachable" ) (result i32)
(unreachable)
(call_ref $$t)
)
)`);
// ./test/core/call_ref.wast:136
assert_trap(() => invoke($1 , `unreachable`, []), `unreachable`);
// ./test/core/call_ref.wast:138
let $2 = instantiate(`(module
(elem declare func $$f)
(type $$t (func (param i32) (result i32)))
(func $$f (param i32) (result i32) (local.get 0 ))
(func (export "unreachable" ) (result i32)
(unreachable)
(ref.func $$f)
(call_ref $$t)
)
)`);
// ./test/core/call_ref.wast:149
assert_trap(() => invoke($2 , `unreachable`, []), `unreachable`);
// ./test/core/call_ref.wast:151
let $3 = instantiate(`(module
(elem declare func $$f)
(type $$t (func (param i32) (result i32)))
(func $$f (param i32) (result i32) (local.get 0 ))
(func (export "unreachable" ) (result i32)
(unreachable)
(i32.const 0 )
(ref.func $$f)
(call_ref $$t)
(drop)
(i32.const 0 )
)
)`);
// ./test/core/call_ref.wast:165
assert_trap(() => invoke($3 , `unreachable`, []), `unreachable`);
// ./test/core/call_ref.wast:167
assert_invalid(
() => instantiate(`(module
(elem declare func $$f)
(type $$t (func (param i32) (result i32)))
(func $$f (param i32) (result i32) (local.get 0 ))
(func (export "unreachable" ) (result i32)
(unreachable)
(i64.const 0 )
(ref.func $$f)
(call_ref $$t)
)
)`),
`type mismatch`,
);
// ./test/core/call_ref.wast:183
assert_invalid(
() => instantiate(`(module
(elem declare func $$f)
(type $$t (func (param i32) (result i32)))
(func $$f (param i32) (result i32) (local.get 0 ))
(func (export "unreachable" ) (result i32)
(unreachable)
(ref.func $$f)
(call_ref $$t)
(drop)
(i64.const 0 )
)
)`),
`type mismatch`,
);
// ./test/core/call_ref.wast:200
assert_invalid(
() => instantiate(`(module
(type $$t (func))
(func $$f (param $$r externref)
(call_ref $$t (local.get $$r))
)
)`),
`type mismatch`,
);
// ./test/core/call_ref.wast:210
assert_invalid(
() => instantiate(`(module
(type $$t (func))
(func $$f (param $$r funcref)
(call_ref $$t (local.get $$r))
)
)`),
`type mismatch`,
);
Messung V0.5 in Prozent C=82 H=100 G=91
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland