Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions auto_update_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@
print s
f = open('a.js', 'w')
f.write(open(os.path.join('bin', 'binaryen.js')).read())
# node/shell test support
f.write(open(os.path.join('test', 'binaryen.js', s)).read())
f.close()
cmd = [MOZJS, 'a.js']
Expand Down
1,045 changes: 204 additions & 841 deletions bin/binaryen.js

Large diffs are not rendered by default.

829 changes: 100 additions & 729 deletions bin/wasm.js

Large diffs are not rendered by default.

17 changes: 10 additions & 7 deletions build-js.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,23 @@ fi
EMCC_ARGS="-std=c++11 --memory-init-file 0"
EMCC_ARGS="$EMCC_ARGS -s ALLOW_MEMORY_GROWTH=1"
EMCC_ARGS="$EMCC_ARGS -s DEMANGLE_SUPPORT=1"
EMCC_ARGS="$EMCC_ARGS -s NO_FILESYSTEM=1"
EMCC_ARGS="$EMCC_ARGS -s DISABLE_EXCEPTION_CATCHING=0" # Exceptions are thrown and caught when optimizing endless loops
OUT_FILE_SUFFIX=

if [ "$1" == "-g" ]; then
EMCC_ARGS="$EMCC_ARGS -O2" # need emcc js opts to be decently fast
EMCC_ARGS="$EMCC_ARGS --llvm-opts 0 --llvm-lto 0"
EMCC_ARGS="$EMCC_ARGS -profiling"
OUT_FILE_SUFFIX=-g
else
EMCC_ARGS="$EMCC_ARGS -Oz"
EMCC_ARGS="$EMCC_ARGS --llvm-lto 1"
EMCC_ARGS="$EMCC_ARGS -s ELIMINATE_DUPLICATE_FUNCTIONS=1"
EMCC_ARGS="$EMCC_ARGS --closure 1"
# Why these settings?
# See https://gist.github.com/rsms/e33c61a25a31c08260161a087be03169
fi

if [ "$1" != "-g" ]; then
EMCC_ARGS="$EMCC_ARGS --closure 1"
fi

echo "building shared bitcode"

"$EMSCRIPTEN/em++" \
Expand Down Expand Up @@ -138,6 +135,7 @@ echo "building wasm.js"
-Isrc/ \
-o bin/wasm${OUT_FILE_SUFFIX}.js \
-s MODULARIZE=1 \
-s 'EXTRA_EXPORTED_RUNTIME_METHODS=["writeAsciiToMemory"]' \
-s 'EXPORT_NAME="WasmJS"'

echo "building binaryen.js"
Expand Down Expand Up @@ -580,5 +578,10 @@ export_function "_BinaryenSetAPITracing"
-Isrc/ \
-s EXPORTED_FUNCTIONS=[${EXPORTED_FUNCTIONS}] \
-o bin/binaryen${OUT_FILE_SUFFIX}.js \
--pre-js src/js/binaryen.js-pre.js \
--post-js src/js/binaryen.js-post.js
--post-js src/js/binaryen.js-post.js \
-s MODULARIZE=1 \
-s 'EXPORT_NAME="Binaryen"'

# Create a singleton instance from the MODULARIZE module
echo "Binaryen = Binaryen();" >> bin/binaryen${OUT_FILE_SUFFIX}.js

27 changes: 13 additions & 14 deletions check.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,25 +358,24 @@ def run_binaryen_js_tests():
if not s.endswith('.js'): continue
print s
f = open('a.js', 'w')
f.write(open(os.path.join(options.binaryen_bin, 'binaryen.js')).read())
# node test support
f.write('\nif (typeof require === "function") var Binaryen = module.exports;\n')
binaryen_js = open(os.path.join(options.binaryen_bin, 'binaryen.js')).read()
f.write(binaryen_js)
test_path = os.path.join(options.binaryen_test, 'binaryen.js', s)
test = open(test_path).read()
need_wasm = 'WebAssembly.' in test # some tests use wasm support in the VM
if MOZJS:
cmd = [MOZJS]
elif NODEJS and not need_wasm: # TODO: check if node is new and has wasm support
cmd = [NODEJS]
else:
continue # we can't run it
cmd += ['a.js']
f.write(test)
f.close()
out = run_command(cmd, stderr=subprocess.STDOUT)
expected = open(os.path.join(options.binaryen_test, 'binaryen.js', s + '.txt')).read()
if expected not in out:
fail(out, expected)
def test(engine):
cmd = [engine, 'a.js']
out = run_command(cmd, stderr=subprocess.STDOUT)
expected = open(os.path.join(options.binaryen_test, 'binaryen.js', s + '.txt')).read()
if expected not in out:
fail(out, expected)
# run in all possible shells
if MOZJS:
test(MOZJS)
if NODEJS and not need_wasm: # TODO: check if node is new and has wasm support
test(NODEJS)

def run_validator_tests():
print '\n[ running validation tests... ]\n'
Expand Down
2,914 changes: 1,449 additions & 1,465 deletions src/js/binaryen.js-post.js

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions src/js/binaryen.js-pre.js

This file was deleted.

24 changes: 18 additions & 6 deletions test/binaryen.js/functions.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
function cleanInfo(info) {
var ret = {};
for (var x in info) {
if (x !== 'name' && x !== 'body' && x !== 'type') {
ret[x] = info[x];
}
}
return ret;
}

var module = new Binaryen.Module();

var signature = module.addFunctionType("i", Binaryen.i32, []);
Expand All @@ -13,15 +23,17 @@ console.log("GetFunction is equal: " + (func === module.getFunction("a-function"

module.runPassesOnFunction(func, ["precompute"]);

console.log("getFunctionTypeInfo=" + JSON.stringify(Binaryen.getFunctionTypeInfo(signature)));
var info = Binaryen.getFunctionInfo(func);
console.log("getFunctionInfo=" + JSON.stringify(info));
console.log("getExpressionInfo(body)=" + JSON.stringify(Binaryen.getExpressionInfo(info.body)));
console.log(Binaryen.emitText(info.body));
var sigInfo = Binaryen.getFunctionTypeInfo(signature);
console.log("getFunctionTypeInfo=" + JSON.stringify(cleanInfo(sigInfo)));
var funcInfo = Binaryen.getFunctionInfo(func);
console.log("getFunctionInfo=" + JSON.stringify(cleanInfo(funcInfo)));
var expInfo = Binaryen.getExpressionInfo(funcInfo.body);
console.log("getExpressionInfo(body)=" + JSON.stringify(cleanInfo(expInfo)));
console.log(Binaryen.emitText(funcInfo.body));

module.removeFunction("a-function");

module.addGlobal("a-global", Binaryen.i32, false, info.body);
module.addGlobal("a-global", Binaryen.i32, false, funcInfo.body);

module.validate();

Expand Down
6 changes: 3 additions & 3 deletions test/binaryen.js/functions.js.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
GetFunction is equal: true
getFunctionTypeInfo={"name":5366144,"params":[],"result":1}
getFunctionInfo={"name":5399120,"type":5366144,"params":[],"result":1,"vars":[],"body":5366312}
getExpressionInfo(body)={"id":15,"type":1,"value":3}
getFunctionTypeInfo={"params":[],"result":1}
getFunctionInfo={"params":[],"result":1,"vars":[]}
getExpressionInfo(body)={"id":15,"value":3}
(i32.const 3)

(module
Expand Down
12 changes: 11 additions & 1 deletion test/binaryen.js/kitchen-sink.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@

// kitchen sink, tests the full API

function cleanInfo(info) {
var ret = {};
for (var x in info) {
if (x !== 'value') {
ret[x] = info[x];
}
}
return ret;
}

var module;

// helpers
Expand Down Expand Up @@ -212,7 +222,7 @@ function test_core() {
];

// Test expression utility
console.log("getExpressionInfo=" + JSON.stringify(Binaryen.getExpressionInfo(valueList[3])));
console.log("getExpressionInfo=" + JSON.stringify(cleanInfo(Binaryen.getExpressionInfo(valueList[3]))));
console.log(Binaryen.emitText(valueList[3])); // test printing a standalone expression

console.log("getExpressionInfo(i32.const)=" + JSON.stringify(Binaryen.getExpressionInfo(module.i32.const(5))));
Expand Down
6 changes: 3 additions & 3 deletions test/binaryen.js/kitchen-sink.js.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ BinaryenAtomicCmpxchgId: 24
BinaryenAtomicRMWId: 25
BinaryenAtomicWaitId: 26
BinaryenAtomicWakeId: 27
getExpressionInfo={"id":16,"type":3,"op":6,"value":5366768}
getExpressionInfo={"id":16,"type":3,"op":6}
(f32.neg
(f32.const -33.61199951171875)
)
Expand Down Expand Up @@ -1395,7 +1395,7 @@ int main() {
BinaryenExpressionGetType(expressions[30]);
BinaryenUnaryGetOp(expressions[30]);
BinaryenUnaryGetValue(expressions[30]);
getExpressionInfo={"id":16,"type":3,"op":6,"value":5401832}
getExpressionInfo={"id":16,"type":3,"op":6}
BinaryenExpressionPrint(expressions[30]);
(f32.neg
(f32.const -33.61199951171875)
Expand Down Expand Up @@ -1423,7 +1423,7 @@ getExpressionInfo(f32.const)={"id":15,"type":3,"value":8.5}
BinaryenConstGetValueF64(expressions[250]);
getExpressionInfo(f64.const)={"id":15,"type":4,"value":9.5}
{
BinaryenExpressionRef children[] = { expressions[24], expressions[26], expressions[28], expressions[30], expressions[32], expressions[34], expressions[36], expressions[38], expressions[40], expressions[42], expressions[44], expressions[46], expressions[48], expressions[50], expressions[52], expressions[54], expressions[56], expressions[58], expressions[60], expressions[62], expressions[64], expressions[66], expressions[68], expressions[70], expressions[72], expressions[74], expressions[76], expressions[78], expressions[80], expressions[82], expressions[84], expressions[86], expressions[88], expressions[90], expressions[92], expressions[94], expressions[97], expressions[100], expressions[103], expressions[106], expressions[109], expressions[112], expressions[115], expressions[118], expressions[121], expressions[124], expressions[127], expressions[130], expressions[133], expressions[136], expressions[139], expressions[142], expressions[145], expressions[148], expressions[151], expressions[154], expressions[157], expressions[160], expressions[163], expressions[166], expressions[169], expressions[172], expressions[175], expressions[178], expressions[181], expressions[184], expressions[187], expressions[190], expressions[191], expressions[192], expressions[193], expressions[195], expressions[197], expressions[198], expressions[200], expressions[202], expressions[203], expressions[204], expressions[206], expressions[212], expressions[217], expressions[224], expressions[226], expressions[228], expressions[231], expressions[233], expressions[235], expressions[237], expressions[239], expressions[240], expressions[241], expressions[242], expressions[244], expressions[245], expressions[246] };
], expressions[160], expressions[163], expressions[166], expressions[169], expressions[172], expressions[175], expressions[178], expressions[181], expressions[184], expressions[187], expressions[190], expressions[191], expressions[192], expressions[193], expressions[195], expressions[197], expressions[198], expressions[200], expressions[202], expressions[203], expressions[204], expressions[206], expressions[212], expressions[217], expressions[224], expressions[226], expressions[228], expressions[231], expressions[233], expressions[235], expressions[237], expressions[239], expressions[240], expressions[241], expressions[242], expressions[244], expressions[245], expressions[246] };
expressions[251] = BinaryenBlock(the_module, "the-value", children, 95, 0);
}
expressions[252] = BinaryenDrop(the_module, expressions[251]);
Expand Down
2 changes: 2 additions & 0 deletions travis-emcc-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ set -e
echo "travis-test pre-test"
python -c "import check ; check.run_binaryen_js_tests() ; check.run_emscripten_tests()"
echo "travis-test build"
ls -al bin/
./build-js.sh -g
ls -al bin/
echo "travis-test post-test"
python -c "import check ; check.run_binaryen_js_tests() ; check.run_emscripten_tests()"
echo "travis-test yay!"
Expand Down