diff options
-rwxr-xr-x | build.sh | 6 | ||||
-rw-r--r-- | src/binaryen-js.cpp | 30 | ||||
-rw-r--r-- | src/js/binaryen.idl | 51 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 3 | ||||
-rw-r--r-- | test/binaryen.js/test.js | 27 |
5 files changed, 115 insertions, 2 deletions
@@ -10,6 +10,8 @@ make -j #g++ -O2 -std=c++11 src/wasm2asm-main.cpp src/emscripten-optimizer/parser.cpp src/emscripten-optimizer/simple_ast.cpp src/emscripten-optimizer/optimizer-shared.cpp src/support/colors.cpp -Isrc/ -o bin/wasm2asm #echo "building s2wasm" #g++ -O2 -std=c++11 src/s2wasm-main.cpp src/support/command-line.cpp src/support/file.cpp src/support/colors.cpp -Isrc/ -o bin/s2wasm -echo "building interpreter/js" +echo "building wasm.js" em++ -std=c++11 src/wasm-js.cpp src/pass.cpp src/passes/MergeBlocks.cpp src/passes/Print.cpp src/passes/RemoveUnusedBrs.cpp src/passes/RemoveUnusedNames.cpp src/passes/PostEmscripten.cpp src/passes/SimplifyLocals.cpp src/passes/ReorderLocals.cpp src/emscripten-optimizer/parser.cpp src/emscripten-optimizer/simple_ast.cpp src/emscripten-optimizer/optimizer-shared.cpp src/support/colors.cpp src/support/safe_integer.cpp src/support/bits.cpp -Isrc/ -o bin/wasm.js -s MODULARIZE=1 -s 'EXPORT_NAME="WasmJS"' --memory-init-file 0 -Oz -s ALLOW_MEMORY_GROWTH=1 -profiling -s DEMANGLE_SUPPORT=1 #-DWASM_JS_DEBUG -DWASM_INTERPRETER_DEBUG=2 - +echo "building binaryen.js" +python ~/Dev/emscripten/tools/webidl_binder.py src/js/binaryen.idl glue +em++ -std=c++11 src/binaryen-js.cpp src/binaryen-shell.cpp src/pass.cpp src/passes/MergeBlocks.cpp src/passes/Print.cpp src/passes/RemoveUnusedBrs.cpp src/passes/RemoveUnusedNames.cpp src/passes/PostEmscripten.cpp src/passes/SimplifyLocals.cpp src/passes/ReorderLocals.cpp src/emscripten-optimizer/parser.cpp src/emscripten-optimizer/simple_ast.cpp src/emscripten-optimizer/optimizer-shared.cpp src/support/colors.cpp src/support/safe_integer.cpp src/support/bits.cpp -Isrc/ -o bin/binaryen.js -s MODULARIZE=1 -s 'EXPORT_NAME="Binaryen"' --memory-init-file 0 -Oz -s ALLOW_MEMORY_GROWTH=1 -profiling -s DEMANGLE_SUPPORT=1 -s INVOKE_RUN=0 --post-js glue.js diff --git a/src/binaryen-js.cpp b/src/binaryen-js.cpp new file mode 100644 index 000000000..3112fe703 --- /dev/null +++ b/src/binaryen-js.cpp @@ -0,0 +1,30 @@ +/* + * 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. + */ + +#include <memory> + +#include "pass.h" +#include "support/command-line.h" +#include "support/file.h" +#include "wasm-interpreter.h" +#include "wasm-printing.h" +#include "wasm-s-parser.h" +#include "wasm-validator.h" + +using namespace wasm; + +#include "../glue.cpp" + diff --git a/src/js/binaryen.idl b/src/js/binaryen.idl new file mode 100644 index 000000000..2297cfd5f --- /dev/null +++ b/src/js/binaryen.idl @@ -0,0 +1,51 @@ + +interface Literal { + void Literal(double x); +}; + +interface Name { + void Name(DOMString x); +}; + +interface Module { +}; + +interface AllocatingModule { +}; + +AllocatingModule implements Module; + +[Prefix="ModuleInstance::", NoDelete] +interface ExternalInterface { +}; + +interface ShellExternalInterface { +}; + +ShellExternalInterface implements ExternalInterface; + +interface ModuleInstance { + void ModuleInstance([Ref] Module m, ExternalInterface i); + + [Value] Literal callExport([Ref] Name name, [Ref] LiteralList arguments); +}; + +[Prefix="ModuleInstance::"] +interface LiteralList { + void push_back([Ref] Literal l); +}; + +// S-Expressions + +interface Element { +}; + +interface SExpressionParser { + void SExpressionParser(DOMString input); + attribute Element root; +}; + +interface SExpressionWasmBuilder { + void SExpressionWasmBuilder([Ref] AllocatingModule wasm, [Ref] Element input, boolean debug); +}; + diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index c13cd3512..fb3268877 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -255,6 +255,9 @@ public: } } + // constructor without onError + SExpressionWasmBuilder(AllocatingModule& wasm, Element& module, bool debug=false) : SExpressionWasmBuilder(wasm, module, [&]() { abort(); }, debug) {} + private: // pre-parse types and function definitions, so we know function return types before parsing their contents diff --git a/test/binaryen.js/test.js b/test/binaryen.js/test.js new file mode 100644 index 000000000..c090d94b2 --- /dev/null +++ b/test/binaryen.js/test.js @@ -0,0 +1,27 @@ + +var input = + '(module\n' + + ' (export "add" $add)\n' + + ' (func $add (param $x f64) (param $y f64) (result f64)\n' + + ' (f64.add\n' + + ' (get_local $x)\n' + + ' (get_local $y)\n' + + ' )\n' + + ' )\n' + + ')\n'; + +var module = new Binaryen.AllocatingModule(); +var parser = new Binaryen.SExpressionParser(input); +var builder = new Binaryen.SExpressionWasmBuilder(module, parser.get_root(), false); + +var interface_ = new Binaryen.ShellExternalInterface(); +var instance = new Binaryen.ModuleInstance(module, interface_); + +var name = Binaryen.Name('add'); + +var args = new Binaryen.LiteralList(); +args.push_back(new Binaryen.Literal(40)); +args.push_back(new Binaryen.Literal(2)); + +console.log('answer is ' + instance.callExport(name, args).getf64() + '.'); + |