summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Pepyakin <s.pepyakin@gmail.com>2017-09-14 19:12:56 +0300
committerAlon Zakai <alonzakai@gmail.com>2017-09-14 09:12:56 -0700
commit9f4e3288c17a48186b959648fedb93b9a226ef9f (patch)
tree8c25eed9ed13b89b704581980d01d5cb4f240af0
parent5d27b204c39d8adc8f328fbdab1837493804ec71 (diff)
downloadbinaryen-9f4e3288c17a48186b959648fedb93b9a226ef9f.tar.gz
binaryen-9f4e3288c17a48186b959648fedb93b9a226ef9f.tar.bz2
binaryen-9f4e3288c17a48186b959648fedb93b9a226ef9f.zip
Add missing finalize() call to C API for call_indirect (#1184)
-rw-r--r--src/binaryen-c.cpp1
-rw-r--r--test/example/c-api-kitchen-sink.c14
-rw-r--r--test/example/c-api-kitchen-sink.txt10
3 files changed, 25 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 7cbd22a69..038431782 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -475,6 +475,7 @@ BinaryenExpressionRef BinaryenCallIndirect(BinaryenModuleRef module, BinaryenExp
}
ret->fullType = type;
ret->type = wasm->getFunctionType(ret->fullType)->result;
+ ret->finalize();
return static_cast<Expression*>(ret);
}
BinaryenExpressionRef BinaryenGetLocal(BinaryenModuleRef module, BinaryenIndex index, BinaryenType type) {
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index 726dc9ce8..5b5b012e1 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -278,6 +278,19 @@ void test_core() {
BinaryenModuleDispose(module);
}
+void test_unreachable() {
+ BinaryenModuleRef module = BinaryenModuleCreate();
+ BinaryenFunctionTypeRef i = BinaryenAddFunctionType(module, "i", BinaryenInt32(), NULL, 0);
+ BinaryenFunctionTypeRef I = BinaryenAddFunctionType(module, "I", BinaryenInt64(), NULL, 0);
+
+ BinaryenExpressionRef body = BinaryenCallIndirect(module, BinaryenUnreachable(module), NULL, 0, "I");
+ BinaryenFunctionRef fn = BinaryenAddFunction(module, "unreachable-fn", i, NULL, 0, body);
+
+ assert(BinaryenModuleValidate(module));
+ BinaryenModulePrint(module);
+ BinaryenModuleDispose(module);
+}
+
BinaryenExpressionRef makeCallCheck(BinaryenModuleRef module, int x) {
BinaryenExpressionRef callOperands[] = { makeInt32(module, x) };
return BinaryenCallImport(module, "check", callOperands, 1, BinaryenNone());
@@ -556,6 +569,7 @@ void test_tracing() {
int main() {
test_types();
test_core();
+ test_unreachable();
test_relooper();
test_binaries();
test_interpret();
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt
index d366a3c7f..16d48ea5b 100644
--- a/test/example/c-api-kitchen-sink.txt
+++ b/test/example/c-api-kitchen-sink.txt
@@ -536,6 +536,16 @@ BinaryenFloat64: 4
(nop)
)
)
+(module
+ (type $i (func (result i32)))
+ (type $I (func (result i64)))
+ (memory $0 0)
+ (func $unreachable-fn (type $i) (result i32)
+ (call_indirect $I
+ (unreachable)
+ )
+ )
+)
raw:
(module
(type $v (func))