summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-01 19:13:02 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-01 19:13:02 -0800
commitc0a332693eceec4171c4e2fef30924e4f22771fc (patch)
tree3036739162bf2bd1e43143b4d2ecacd87468a352
parent2740fa0342c11481e3dad18c775a1aa0b862e8d8 (diff)
downloadbinaryen-c0a332693eceec4171c4e2fef30924e4f22771fc.tar.gz
binaryen-c0a332693eceec4171c4e2fef30924e4f22771fc.tar.bz2
binaryen-c0a332693eceec4171c4e2fef30924e4f22771fc.zip
handle float and void types in js<->wasm calls
-rw-r--r--src/wasm-js.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp
index 6b5c014c2..4c8e27423 100644
--- a/src/wasm-js.cpp
+++ b/src/wasm-js.cpp
@@ -137,7 +137,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm(char *input) {
abort();
} else {
if (load->bytes == 4) {
- return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF32'][$0] }, addr));
+ return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF32'][$0] }, addr)); // XXX expands into double
} else if (load->bytes == 8) {
return Literal(EM_ASM_DOUBLE({ return Module['info'].parent['HEAPF64'][$0] }, addr));
}
@@ -186,6 +186,8 @@ extern "C" double EMSCRIPTEN_KEEPALIVE call_from_js(const char *target) {
// add the parameter, with a zero value if JS did not provide it.
if (type == i32) {
arguments.push_back(Literal(i < seen ? EM_ASM_INT({ return Module['tempArguments'][$0] }, i) : (int32_t)0));
+ } else if (type == f32) {
+ arguments.push_back(Literal(i < seen ? (float)EM_ASM_DOUBLE({ return Module['tempArguments'][$0] }, i) : (float)0.0));
} else if (type == f64) {
arguments.push_back(Literal(i < seen ? EM_ASM_DOUBLE({ return Module['tempArguments'][$0] }, i) : (double)0.0));
} else {
@@ -194,7 +196,9 @@ extern "C" double EMSCRIPTEN_KEEPALIVE call_from_js(const char *target) {
}
Literal ret = instance->callFunction(name, arguments);
+ if (ret.type == none) return 0;
if (ret.type == i32) return ret.i32;
+ if (ret.type == f32) return ret.f32;
if (ret.type == f64) return ret.f64;
abort();
}