summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binaryen-c.cpp20
-rw-r--r--src/binaryen-c.h2
-rw-r--r--src/js/binaryen.js-post.js2
-rw-r--r--test/binaryen.js/tail_calls.js36
-rw-r--r--test/binaryen.js/tail_calls.js.txt2
5 files changed, 62 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index d9d330082..51a401a3c 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -2134,6 +2134,16 @@ BinaryenExpressionRef BinaryenSwitchGetValue(BinaryenExpressionRef expr) {
return static_cast<Switch*>(expression)->value;
}
// Call
+int BinaryenCallIsReturn(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenCallIsReturn(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Call>());
+ return static_cast<Call*>(expression)->isReturn;
+}
const char* BinaryenCallGetTarget(BinaryenExpressionRef expr) {
if (tracing) {
std::cout << " BinaryenCallGetTarget(expressions[" << expressions[expr]
@@ -2167,6 +2177,16 @@ BinaryenExpressionRef BinaryenCallGetOperand(BinaryenExpressionRef expr,
return static_cast<Call*>(expression)->operands[index];
}
// CallIndirect
+int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenCallIndirectIsReturn(expressions["
+ << expressions[expr] << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<CallIndirect>());
+ return static_cast<CallIndirect*>(expression)->isReturn;
+}
BinaryenExpressionRef
BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr) {
if (tracing) {
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index c4956b423..b8cd3c37d 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -883,12 +883,14 @@ BinaryenSwitchGetCondition(BinaryenExpressionRef expr);
BINARYEN_API BinaryenExpressionRef
BinaryenSwitchGetValue(BinaryenExpressionRef expr);
+BINARYEN_API int BinaryenCallIsReturn(BinaryenExpressionRef expr);
BINARYEN_API const char* BinaryenCallGetTarget(BinaryenExpressionRef expr);
BINARYEN_API BinaryenIndex
BinaryenCallGetNumOperands(BinaryenExpressionRef expr);
BINARYEN_API BinaryenExpressionRef
BinaryenCallGetOperand(BinaryenExpressionRef expr, BinaryenIndex index);
+BINARYEN_API int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr);
BINARYEN_API BinaryenExpressionRef
BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr);
BINARYEN_API BinaryenIndex
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 7bd88fadc..955d80f1d 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2520,6 +2520,7 @@ Module['getExpressionInfo'] = function(expr) {
return {
'id': id,
'type': type,
+ 'isReturn': Boolean(Module['_BinaryenCallIsReturn'](expr)),
'target': UTF8ToString(Module['_BinaryenCallGetTarget'](expr)),
'operands': getAllNested(expr, Module[ '_BinaryenCallGetNumOperands'], Module['_BinaryenCallGetOperand'])
};
@@ -2527,6 +2528,7 @@ Module['getExpressionInfo'] = function(expr) {
return {
'id': id,
'type': type,
+ 'isReturn': Boolean(Module['_BinaryenCallIndirectIsReturn'](expr)),
'target': Module['_BinaryenCallIndirectGetTarget'](expr),
'operands': getAllNested(expr, Module['_BinaryenCallIndirectGetNumOperands'], Module['_BinaryenCallIndirectGetOperand'])
};
diff --git a/test/binaryen.js/tail_calls.js b/test/binaryen.js/tail_calls.js
new file mode 100644
index 000000000..7ad0bfddd
--- /dev/null
+++ b/test/binaryen.js/tail_calls.js
@@ -0,0 +1,36 @@
+var module = new binaryen.Module();
+
+module.setFeatures(binaryen.Features.TailCall);
+
+module.addTableImport("0", "env", "table");
+
+var foo = module.addFunction(
+ "foo",
+ binaryen.none,
+ binaryen.none,
+ [],
+ module.returnCall("foo", [], binaryen.none, binaryen.none)
+);
+
+var bar = module.addFunction(
+ "bar",
+ binaryen.none,
+ binaryen.none,
+ [],
+ module.returnCallIndirect(
+ module.i32.const(0),
+ [],
+ binaryen.none,
+ binaryen.none
+ )
+);
+
+assert(module.validate());
+
+console.log(
+ binaryen.getExpressionInfo(binaryen.getFunctionInfo(foo).body).isReturn
+);
+
+console.log(
+ binaryen.getExpressionInfo(binaryen.getFunctionInfo(bar).body).isReturn
+);
diff --git a/test/binaryen.js/tail_calls.js.txt b/test/binaryen.js/tail_calls.js.txt
new file mode 100644
index 000000000..bb101b641
--- /dev/null
+++ b/test/binaryen.js/tail_calls.js.txt
@@ -0,0 +1,2 @@
+true
+true