summaryrefslogtreecommitdiff
path: root/scripts/test
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-08-30 16:10:26 -0700
committerAlon Zakai <alonzakai@gmail.com>2018-08-30 16:10:26 -0700
commitf109f3cae1cd81db22ba490a4da17a7a4c495047 (patch)
treefd7307a567505a28f879ccce00a30d2d0d27b848 /scripts/test
parent3976440ccb2c3ab9d67af7239f87ae04ebdeda1e (diff)
downloadbinaryen-f109f3cae1cd81db22ba490a4da17a7a4c495047.tar.gz
binaryen-f109f3cae1cd81db22ba490a4da17a7a4c495047.tar.bz2
binaryen-f109f3cae1cd81db22ba490a4da17a7a4c495047.zip
Rename `wasm2asm` to `wasm2js`, emit ESM by default (#1642)
* Rename the `wasm2asm` tool to `wasm2js` This commit performs a relatively simple rename of the `wasm2asm` tool to `wasm2js`. The functionality of the tool doesn't change just yet but it's intended that we'll start generating an ES module instead of just an `asm.js` function soon. * wasm2js: Support `*.wasm` input files Previously `wasm2js` only supported `*.wast` files but to make it a bit easier to use in tooling pipelines this commit adds support for reading in a `*.wasm` file directly. Determining which parser to use depends on the input filename, where the binary parser is used with `*.wasm` files and the wast parser is used for all other files. * wasm2js: Emit ESM imports/exports by default This commit alters the default behavior of `wasm2js` to emit an ESM by default, either importing items from the environment or exporting. Items like initialization of memory are also handled here.
Diffstat (limited to 'scripts/test')
-rw-r--r--scripts/test/node-esm-loader.mjs32
-rw-r--r--scripts/test/shared.py2
-rw-r--r--scripts/test/spectest.js3
-rw-r--r--scripts/test/support.py14
-rwxr-xr-xscripts/test/wasm2js.py (renamed from scripts/test/wasm2asm.py)66
5 files changed, 77 insertions, 40 deletions
diff --git a/scripts/test/node-esm-loader.mjs b/scripts/test/node-esm-loader.mjs
new file mode 100644
index 000000000..73ff47800
--- /dev/null
+++ b/scripts/test/node-esm-loader.mjs
@@ -0,0 +1,32 @@
+// originally lifted from https://nodejs.org/api/esm.html
+
+import path from 'path';
+import process from 'process';
+import Module from 'module';
+
+const builtins = Module.builtinModules;
+
+const baseURL = new URL('file://');
+baseURL.pathname = `${process.cwd()}/`;
+
+export function resolve(specifier, parentModuleURL = baseURL, defaultResolve) {
+ if (builtins.includes(specifier)) {
+ return {
+ url: specifier,
+ format: 'builtin'
+ };
+ }
+ // Resolve the 'spectest' module to our special module which has some builtins
+ if (specifier == 'spectest') {
+ const resolved = new URL('./scripts/test/spectest.js', parentModuleURL);
+ return {
+ url: resolved.href,
+ format: 'esm'
+ };
+ }
+ const resolved = new URL(specifier, parentModuleURL);
+ return {
+ url: resolved.href,
+ format: 'esm'
+ };
+}
diff --git a/scripts/test/shared.py b/scripts/test/shared.py
index 309f3b59a..a7bdda085 100644
--- a/scripts/test/shared.py
+++ b/scripts/test/shared.py
@@ -166,7 +166,7 @@ WASM_OPT = [os.path.join(options.binaryen_bin, 'wasm-opt')]
WASM_AS = [os.path.join(options.binaryen_bin, 'wasm-as')]
WASM_DIS = [os.path.join(options.binaryen_bin, 'wasm-dis')]
ASM2WASM = [os.path.join(options.binaryen_bin, 'asm2wasm')]
-WASM2ASM = [os.path.join(options.binaryen_bin, 'wasm2asm')]
+WASM2JS = [os.path.join(options.binaryen_bin, 'wasm2js')]
WASM_CTOR_EVAL = [os.path.join(options.binaryen_bin, 'wasm-ctor-eval')]
WASM_SHELL = [os.path.join(options.binaryen_bin, 'wasm-shell')]
WASM_MERGE = [os.path.join(options.binaryen_bin, 'wasm-merge')]
diff --git a/scripts/test/spectest.js b/scripts/test/spectest.js
new file mode 100644
index 000000000..0756209b6
--- /dev/null
+++ b/scripts/test/spectest.js
@@ -0,0 +1,3 @@
+export function print(...args) {
+ console.log(...args);
+}
diff --git a/scripts/test/support.py b/scripts/test/support.py
index d04a85c59..5d03419b9 100644
--- a/scripts/test/support.py
+++ b/scripts/test/support.py
@@ -147,7 +147,7 @@ def split_wast(wastFile):
def run_command(cmd, expected_status=0, stderr=None,
- expected_err=None, err_contains=False):
+ expected_err=None, err_contains=False, err_ignore=None):
if expected_err is not None:
assert stderr == subprocess.PIPE or stderr is None,\
"Can't redirect stderr if using expected_err"
@@ -158,11 +158,13 @@ def run_command(cmd, expected_status=0, stderr=None,
code = proc.returncode
if expected_status is not None and code != expected_status:
raise Exception(('run_command failed (%s)' % code, out + str(err or '')))
- err_correct = expected_err is None or \
- (expected_err in err if err_contains else expected_err == err)
- if not err_correct:
- raise Exception(('run_command unexpected stderr',
- "expected '%s', actual '%s'" % (expected_err, err)))
+ if expected_err is not None:
+ if err_ignore is not None:
+ err = "\n".join([line for line in err.split('\n') if err_ignore not in line])
+ err_correct = expected_err in err if err_contains else expected_err == err
+ if not err_correct:
+ raise Exception(('run_command unexpected stderr',
+ "expected '%s', actual '%s'" % (expected_err, err)))
return out
diff --git a/scripts/test/wasm2asm.py b/scripts/test/wasm2js.py
index 41fdaf9b7..9a72895c1 100755
--- a/scripts/test/wasm2asm.py
+++ b/scripts/test/wasm2js.py
@@ -18,7 +18,7 @@ import os
from support import run_command
from shared import (
- WASM2ASM, MOZJS, NODEJS, fail_if_not_identical, options, tests,
+ WASM2JS, MOZJS, NODEJS, fail_if_not_identical, options, tests,
fail_if_not_identical_to_file
)
@@ -27,26 +27,31 @@ spec_dir = os.path.join(options.binaryen_test, 'spec')
spec_tests = [os.path.join(spec_dir, t)
for t in sorted(os.listdir(spec_dir))
if '.fail' not in t]
-wasm2asm_dir = os.path.join(options.binaryen_test, 'wasm2asm')
-extra_wasm2asm_tests = [os.path.join(wasm2asm_dir, t) for t in
- sorted(os.listdir(wasm2asm_dir))]
-assert_tests = ['wasm2asm.wast.asserts']
+wasm2js_dir = os.path.join(options.binaryen_test, 'wasm2js')
+extra_wasm2js_tests = [os.path.join(wasm2js_dir, t) for t in
+ sorted(os.listdir(wasm2js_dir))]
+assert_tests = ['wasm2js.wast.asserts']
+# These tests exercise functionality not supported by wasm2js
+wasm2js_blacklist = ['empty_imported_table.wast']
-def test_wasm2asm_output():
- for wasm in tests + spec_tests + extra_wasm2asm_tests:
+def test_wasm2js_output():
+ for wasm in tests + spec_tests + extra_wasm2js_tests:
if not wasm.endswith('.wast'):
continue
+ basename = os.path.basename(wasm)
+ if basename in wasm2js_blacklist:
+ continue
- asm = os.path.basename(wasm).replace('.wast', '.2asm.js')
- expected_file = os.path.join(wasm2asm_dir, asm)
+ asm = basename.replace('.wast', '.2asm.js')
+ expected_file = os.path.join(wasm2js_dir, asm)
if not os.path.exists(expected_file):
continue
print '..', wasm
- cmd = WASM2ASM + [os.path.join(options.binaryen_test, wasm)]
+ cmd = WASM2JS + [os.path.join(options.binaryen_test, wasm)]
out = run_command(cmd)
fail_if_not_identical_to_file(out, expected_file)
@@ -54,32 +59,27 @@ def test_wasm2asm_output():
print 'No JS interpreters. Skipping spec tests.'
continue
- open('a.2asm.js', 'w').write(out)
+ open('a.2asm.mjs', 'w').write(out)
cmd += ['--allow-asserts']
out = run_command(cmd)
- open('a.2asm.asserts.js', 'w').write(out)
+ open('a.2asm.asserts.mjs', 'w').write(out)
- # verify asm.js is valid js
+ # verify asm.js is valid js, note that we're using --experimental-modules
+ # to enable ESM syntax and we're also passing a custom loader to handle the
+ # `spectest` module in our tests.
if NODEJS:
- out = run_command([NODEJS, 'a.2asm.js'])
+ node = [NODEJS, '--experimental-modules', '--loader', './scripts/test/node-esm-loader.mjs']
+ cmd = node[:]
+ cmd.append('a.2asm.mjs')
+ out = run_command(cmd)
fail_if_not_identical(out, '')
- out = run_command([NODEJS, 'a.2asm.asserts.js'], expected_err='')
+ cmd = node[:]
+ cmd.append('a.2asm.asserts.mjs')
+ out = run_command(cmd, expected_err='', err_ignore='The ESM module loader is experimental')
fail_if_not_identical(out, '')
- if MOZJS:
- # verify asm.js validates, if this is asm.js code (we emit
- # almost-asm instead when we need to)
- if 'use asm' in open('a.2asm.js').read():
- # check only subset of err because mozjs emits timing info
- out = run_command([MOZJS, '-w', 'a.2asm.js'],
- expected_err='Successfully compiled asm.js code',
- err_contains=True)
- fail_if_not_identical(out, '')
- out = run_command([MOZJS, 'a.2asm.asserts.js'], expected_err='')
- fail_if_not_identical(out, '')
-
def test_asserts_output():
for wasm in assert_tests:
@@ -90,8 +90,8 @@ def test_asserts_output():
asserts_expected_file = os.path.join(options.binaryen_test, asserts)
traps_expected_file = os.path.join(options.binaryen_test, traps)
- wasm = os.path.join(wasm2asm_dir, wasm)
- cmd = WASM2ASM + [wasm, '--allow-asserts']
+ wasm = os.path.join(wasm2js_dir, wasm)
+ cmd = WASM2JS + [wasm, '--allow-asserts']
out = run_command(cmd)
fail_if_not_identical_to_file(out, asserts_expected_file)
@@ -100,11 +100,11 @@ def test_asserts_output():
fail_if_not_identical_to_file(out, traps_expected_file)
-def test_wasm2asm():
- print '\n[ checking wasm2asm testcases... ]\n'
- test_wasm2asm_output()
+def test_wasm2js():
+ print '\n[ checking wasm2js testcases... ]\n'
+ test_wasm2js_output()
test_asserts_output()
if __name__ == "__main__":
- test_wasm2asm()
+ test_wasm2js()