|
| 1 | +import argparse |
| 2 | +import sys |
| 3 | + |
| 4 | +import pywasm |
| 5 | + |
| 6 | +parser = argparse.ArgumentParser() |
| 7 | +parser.add_argument('--version', '-v', action='version', version=f'pywasm {pywasm.version}') |
| 8 | +parser.add_argument('--func', default='_start', help='set func name') |
| 9 | +parser.add_argument('--func-args', action='append', default=[], help='set func args, like arg') |
| 10 | +parser.add_argument('--wasi-envs', action='append', default=[], help='set wasi envs, like key=val') |
| 11 | +parser.add_argument('--wasi-dirs', action='append', default=[], help='set wasi dirs, like dir:dir(host)') |
| 12 | +parser.add_argument('--wasi-args', action='append', default=[], help='set wasi args, like arg') |
| 13 | +parser.add_argument('--wasi', choices=['preview1'], help='set wasi version') |
| 14 | +parser.add_argument('file', help='wasm file') |
| 15 | +args = parser.parse_args() |
| 16 | + |
| 17 | + |
| 18 | +def main_wasi(): |
| 19 | + wasi_args = [args.file] + args.wasi_args |
| 20 | + wasi_dirs = {} |
| 21 | + wasi_envs = {} |
| 22 | + for e in args.wasi_dirs: |
| 23 | + spes = e.split(':', 1) |
| 24 | + wasi_dirs[spes[0]] = spes[1] |
| 25 | + for e in args.wasi_envs: |
| 26 | + spes = e.split('=', 1) |
| 27 | + wasi_envs[spes[0]] = spes[1] |
| 28 | + if args.wasi == 'preview1': |
| 29 | + runtime = pywasm.core.Runtime() |
| 30 | + wasi = pywasm.wasi.Preview1(wasi_args, wasi_dirs, wasi_envs) |
| 31 | + wasi.bind(runtime) |
| 32 | + inst = runtime.instance_from_file(args.file) |
| 33 | + code = wasi.main(runtime, inst) |
| 34 | + sys.exit(code) |
| 35 | + |
| 36 | + |
| 37 | +def main_wasm(): |
| 38 | + runtime = pywasm.core.Runtime() |
| 39 | + inst = runtime.instance_from_file(args.file) |
| 40 | + addr = [e for e in inst.exps if e.name == args.func][0].data.data |
| 41 | + func = runtime.machine.store.func[addr] |
| 42 | + assert len(func.type.args) == len(args.func_args) |
| 43 | + func_args = [] |
| 44 | + for e in zip(func.type.args, args.func_args): |
| 45 | + if e[0] in [pywasm.ValType.i32(), pywasm.ValType.i64()]: |
| 46 | + func_args.append(int(e[1])) |
| 47 | + continue |
| 48 | + if e[0] in [pywasm.ValType.f32(), pywasm.ValType.f64()]: |
| 49 | + func_args.append(float(e[1])) |
| 50 | + continue |
| 51 | + if e[0] == pywasm.ValType.v128(): |
| 52 | + func_args.append(bytearray.fromhex(e[1][2:])) |
| 53 | + continue |
| 54 | + assert 0 |
| 55 | + rets = runtime.invocate(inst, args.func, func_args) |
| 56 | + print(rets) |
| 57 | + |
| 58 | + |
| 59 | +if args.wasi: |
| 60 | + main_wasi() |
| 61 | +main_wasm() |
0 commit comments