diff options
-rw-r--r-- | src/binaryen-c.cpp | 20 | ||||
-rw-r--r-- | src/binaryen-c.h | 2 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 2 | ||||
-rw-r--r-- | test/binaryen.js/tail_calls.js | 36 | ||||
-rw-r--r-- | test/binaryen.js/tail_calls.js.txt | 2 |
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 |