| #!/usr/bin/env python3 |
| |
| # Copyright 2016 WebAssembly Community Group participants |
| # |
| # 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. |
| |
| import argparse |
| import glob |
| import os |
| import os.path |
| import sys |
| |
| import testing |
| |
| |
| def create_outname(outdir, infile, extras): |
| """Create the output file's name.""" |
| basename = os.path.basename(infile) |
| outname = basename + '.out' |
| return os.path.join(outdir, outname) |
| |
| |
| def execute(infile, outfile, extras): |
| """Create the command-line for an execution.""" |
| runner = extras['runner'] |
| basename = os.path.splitext(os.path.basename(runner))[0] |
| if basename == 'v8': |
| # The d8 installed by JSVU is named 'v8' |
| basename = 'd8' |
| out_opt = ['-o', outfile] if outfile else [] |
| extra_files = extras['extra_files'] |
| config = basename |
| wasmjs = [extras['wasmjs']] if extras['wasmjs'] else [] |
| if basename == 'd8' or basename == 'jsc': |
| config = basename + ('-wasm' if wasmjs else '-asm2wasm') |
| |
| # TODO(jgravelle): Remove --no-wasm-async-compilation by adding |
| # testRunner.waitUntilDone()/.notifyDone(), as used in V8's mjsunit.js: |
| # https://cs.chromium.org/chromium/src/v8/test/mjsunit/mjsunit.js |
| commands = { |
| 'wasm-shell': [runner, '--entry=main', infile] + out_opt, |
| 'd8-wasm': [runner, '--experimental-wasm-bigint', |
| '--no-wasm-async-compilation'] + wasmjs + [ |
| '--', infile] + extra_files, |
| 'd8-asm2wasm': [runner, '--experimental-wasm-bigint', |
| '--no-wasm-async-compilation', infile], |
| 'jsc-wasm': [runner, '--useWebAssembly=1'] + wasmjs + [ |
| '--', infile] + extra_files, |
| 'jsc-asm2wasm': [runner, '--useWebAssembly=1', infile], |
| 'wasm': [runner, infile], |
| 'node': [runner] + wasmjs + [infile] + extra_files, |
| 'wasm-validate': [runner, '--enable-bulk-memory', infile], |
| } |
| return commands[config] |
| |
| |
| def run(runner, files, fails, attributes, out, wasmjs='', extra_files=[]): |
| """Execute all files.""" |
| assert os.path.isfile(runner), 'Cannot find runner at %s' % runner |
| if out: |
| assert os.path.isdir(out), 'Cannot find outdir %s' % out |
| if wasmjs: |
| assert os.path.isfile(wasmjs), 'Cannot find wasm.js %s' % wasmjs |
| executable_files = glob.glob(files) |
| if len(executable_files) == 0: |
| print('No files found by %s' % files) |
| return 1 |
| tester = testing.Tester(command_ctor=execute, |
| outname_ctor=create_outname, |
| outdir=out, |
| extras={ |
| 'runner': runner, |
| 'wasmjs': wasmjs, |
| 'extra_files': |
| extra_files if extra_files else [] |
| }), |
| return testing.execute(tester=tester, |
| inputs=executable_files, |
| fails=fails, |
| attributes=attributes) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Execute .wast or .wasm files.') |
| parser.add_argument('--runner', type=str, required=True, |
| help='Runner path') |
| parser.add_argument('--files', type=str, required=True, |
| help='Glob pattern for .wast / .wasm files') |
| parser.add_argument('--fails', type=str, required=True, |
| help='Expected failures') |
| parser.add_argument('--out', type=str, required=False, |
| help='Output directory') |
| parser.add_argument('--wasmjs', type=str, required=False, |
| help='JavaScript support runtime for WebAssembly') |
| parser.add_argument('--extra', type=str, required=False, action='append', |
| help='Extra files to pass to the runner') |
| args = parser.parse_args() |
| return run(args.runner, [args.files], args.fails, set(), args.out, |
| args.wasmjs, args.extra) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |