summaryrefslogtreecommitdiff
path: root/src/wasm-js.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-03-13 22:05:35 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-03-13 22:05:35 -0700
commit48a12f0cf134a15434432954c56c893ea1fc6eca (patch)
treeeceaab691e14a7a88f2d2c532a87d589f3dcff19 /src/wasm-js.cpp
parenta1287af38f12b5ba3d2874424f67289fe1ea49e7 (diff)
parent8de76ffa8588a72788f3967806df43d4d4e43453 (diff)
downloadbinaryen-48a12f0cf134a15434432954c56c893ea1fc6eca.tar.gz
binaryen-48a12f0cf134a15434432954c56c893ea1fc6eca.tar.bz2
binaryen-48a12f0cf134a15434432954c56c893ea1fc6eca.zip
Merge pull request #244 from WebAssembly/interpret-binary
wasm-binary method
Diffstat (limited to 'src/wasm-js.cpp')
-rw-r--r--src/wasm-js.cpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp
index 000092da8..3083b3b9e 100644
--- a/src/wasm-js.cpp
+++ b/src/wasm-js.cpp
@@ -26,6 +26,7 @@
#include "asm2wasm.h"
#include "wasm-interpreter.h"
#include "wasm-s-parser.h"
+#include "wasm-binary.h"
#include "wasm-printing.h"
using namespace cashew;
@@ -100,8 +101,22 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm2wasm(char *input) {
}
}
+void finalizeModule() {
+ uint32_t providedMemory = EM_ASM_INT_V({
+ return Module['providedTotalMemory']; // we receive the size of memory from emscripten
+ });
+ if (providedMemory & ~Memory::kPageMask) {
+ std::cerr << "Error: provided memory is not a multiple of the 64k wasm page size\n";
+ exit(EXIT_FAILURE);
+ }
+ module->memory.initial = providedMemory / Memory::kPageSize;
+ module->memory.max = (module->exportsMap.find(GROW_WASM_MEMORY) != module->exportsMap.end()) ? -1 : module->memory.initial;
+
+ // global mapping is done in js in post.js
+}
+
// loads wasm code in s-expression format
-extern "C" void EMSCRIPTEN_KEEPALIVE load_s_expr2wasm(char *input, char *mappedGlobals) {
+extern "C" void EMSCRIPTEN_KEEPALIVE load_s_expr2wasm(char *input) {
prepare2wasm();
if (wasmJSDebug) std::cerr << "wasm-s-expression parsing...\n";
@@ -119,17 +134,25 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_s_expr2wasm(char *input, char *mappedG
abort();
});
- uint32_t providedMemory = EM_ASM_INT_V({
- return Module['providedTotalMemory']; // we receive the size of memory from emscripten
- });
- if (providedMemory & ~Memory::kPageMask) {
- std::cerr << "Error: provided memory is not a multiple of the 64k wasm page size\n";
- exit(EXIT_FAILURE);
+ finalizeModule();
+}
+
+// loads wasm code in binary format
+extern "C" void EMSCRIPTEN_KEEPALIVE load_binary2wasm(char *raw, int32_t size) {
+ prepare2wasm();
+
+ if (wasmJSDebug) std::cerr << "wasm-binary parsing...\n";
+
+ module = new AllocatingModule();
+ std::vector<char> input;
+ input.resize(size);
+ for (int32_t i = 0; i < size; i++) {
+ input[i] = raw[i];
}
- module->memory.initial = providedMemory / Memory::kPageSize;
- module->memory.max = (module->exportsMap.find(GROW_WASM_MEMORY) != module->exportsMap.end()) ? -1 : module->memory.initial;
+ WasmBinaryBuilder parser(*module, input, debug);
+ parser.read();
- // global mapping is done in js in post.js
+ finalizeModule();
}
// instantiates the loaded wasm (which might be from asm2wasm, or