diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-10-31 13:54:50 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-10-31 13:54:50 -0700 |
commit | 547867eb0e78cac6be7f35bbd80c6582224df807 (patch) | |
tree | df3a39f1016a454cf745466ef25c83fe66e5b7f2 | |
parent | 39db17f164e21473d839272db2271791259666d7 (diff) | |
download | binaryen-547867eb0e78cac6be7f35bbd80c6582224df807.tar.gz binaryen-547867eb0e78cac6be7f35bbd80c6582224df807.tar.bz2 binaryen-547867eb0e78cac6be7f35bbd80c6582224df807.zip |
JSExternalInterface::callImport
-rw-r--r-- | src/wasm-js.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index c0b2aadc2..8305cb4a9 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -56,6 +56,25 @@ extern "C" ModuleInstance* EMSCRIPTEN_KEEPALIVE load_asm(char *input) { struct JSExternalInterface : ModuleInstance::ExternalInterface { Literal callImport(Import *import, ModuleInstance::LiteralList& arguments) override { + EM_ASM({ + Module['tempArguments'] = []; + }); + for (auto& argument : arguments) { + if (argument.type == i32) { + EM_ASM({ Module['tempArguments'].push($0) }, argument.geti32()); + } else if (argument.type == f64) { + EM_ASM({ Module['tempArguments'].push($0) }, argument.getf64()); + } else { + abort(); + } + } + return Literal(EM_ASM_DOUBLE({ + var mod = Pointer_stringify($0); + var base = Pointer_stringify($1); + var tempArguments = Module['tempArguments']; + Module['tempArguments'] = null; + return Module['instance'][mod][base].apply(null, tempArguments); + }, import->module.str, import->base.str)); } Literal load(Load* load, Literal ptr) override { |