summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r--src/binaryen-c.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 81eff0c8a..5d7566e4a 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -354,6 +354,14 @@ BinaryenExpressionId BinaryenMemoryCopyId(void) {
BinaryenExpressionId BinaryenMemoryFillId(void) {
return Expression::Id::MemoryFillId;
}
+BinaryenExpressionId BinaryenTryId(void) { return Expression::Id::TryId; }
+BinaryenExpressionId BinaryenThrowId(void) { return Expression::Id::ThrowId; }
+BinaryenExpressionId BinaryenRethrowId(void) {
+ return Expression::Id::RethrowId;
+}
+BinaryenExpressionId BinaryenBrOnExnId(void) {
+ return Expression::Id::BrOnExnId;
+}
BinaryenExpressionId BinaryenPushId(void) { return Expression::Id::PushId; }
BinaryenExpressionId BinaryenPopId(void) { return Expression::Id::PopId; }
@@ -1591,6 +1599,73 @@ BinaryenExpressionRef BinaryenPop(BinaryenModuleRef module, BinaryenType type) {
return static_cast<Expression*>(ret);
}
+BinaryenExpressionRef BinaryenTry(BinaryenModuleRef module,
+ BinaryenExpressionRef body,
+ BinaryenExpressionRef catchBody) {
+ auto* ret = Builder(*(Module*)module)
+ .makeTry((Expression*)body, (Expression*)catchBody);
+ if (tracing) {
+ traceExpression(ret, "BinaryenTry", body, catchBody);
+ }
+ return static_cast<Expression*>(ret);
+}
+
+BinaryenExpressionRef BinaryenThrow(BinaryenModuleRef module,
+ const char* event,
+ BinaryenExpressionRef* operands,
+ BinaryenIndex numOperands) {
+ std::vector<Expression*> args;
+ for (BinaryenIndex i = 0; i < numOperands; i++) {
+ args.push_back((Expression*)operands[i]);
+ }
+ auto* ret = Builder(*(Module*)module).makeThrow(event, args);
+
+ if (tracing) {
+ std::cout << " {\n";
+ std::cout << " BinaryenExpressionRef operands[] = { ";
+ for (BinaryenIndex i = 0; i < numOperands; i++) {
+ if (i > 0) {
+ std::cout << ", ";
+ }
+ std::cout << "expressions[" << expressions[operands[i]] << "]";
+ }
+ if (numOperands == 0) {
+ // ensure the array is not empty, otherwise a compiler error on VS
+ std::cout << "0";
+ }
+ std::cout << " };\n ";
+ traceExpression(
+ ret, "BinaryenThrow", StringLit(event), "operands", numOperands);
+ std::cout << " }\n";
+ }
+ return static_cast<Expression*>(ret);
+}
+
+BinaryenExpressionRef BinaryenRethrow(BinaryenModuleRef module,
+ BinaryenExpressionRef exnref) {
+ auto* ret = Builder(*(Module*)module).makeRethrow((Expression*)exnref);
+ if (tracing) {
+ traceExpression(ret, "BinaryenRethrow", exnref);
+ }
+ return static_cast<Expression*>(ret);
+}
+
+BinaryenExpressionRef BinaryenBrOnExn(BinaryenModuleRef module,
+ const char* name,
+ const char* eventName,
+ BinaryenExpressionRef exnref) {
+ Module* wasm = (Module*)module;
+ Event* event = wasm->getEventOrNull(eventName);
+ assert(event && "br_on_exn's event must exist");
+ auto* ret = Builder(*wasm).makeBrOnExn(name, event, (Expression*)exnref);
+
+ if (tracing) {
+ traceExpression(
+ ret, "BinaryenBrOnExn", StringLit(name), StringLit(eventName), exnref);
+ }
+ return static_cast<Expression*>(ret);
+}
+
// Expression utility
BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr) {
@@ -2721,6 +2796,7 @@ BinaryenExpressionRef BinaryenMemoryFillGetSize(BinaryenExpressionRef expr) {
assert(expression->is<MemoryFill>());
return static_cast<MemoryFill*>(expression)->size;
}
+// Push
BinaryenExpressionRef BinaryenPushGetValue(BinaryenExpressionRef expr) {
if (tracing) {
std::cout << " BinaryenPushGetValue(expressions[" << expressions[expr]
@@ -2731,6 +2807,102 @@ BinaryenExpressionRef BinaryenPushGetValue(BinaryenExpressionRef expr) {
assert(expression->is<Push>());
return static_cast<Push*>(expression)->value;
}
+// Try
+BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenTryGetBody(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Try>());
+ return static_cast<Try*>(expression)->body;
+}
+BinaryenExpressionRef BinaryenTryGetCatchBody(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenTryGetCatchBody(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Try>());
+ return static_cast<Try*>(expression)->catchBody;
+}
+// Throw
+const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenThrowGetEvent(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Throw>());
+ return static_cast<Throw*>(expression)->event.c_str();
+}
+BinaryenExpressionRef BinaryenThrowGetOperand(BinaryenExpressionRef expr,
+ BinaryenIndex index) {
+ if (tracing) {
+ std::cout << " BinaryenThrowGetOperand(expressions[" << expressions[expr]
+ << "], " << index << ");\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Throw>());
+ assert(index < static_cast<Throw*>(expression)->operands.size());
+ return static_cast<Throw*>(expression)->operands[index];
+}
+BinaryenIndex BinaryenThrowGetNumOperands(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenThrowGetNumOperands(expressions["
+ << expressions[expr] << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Throw>());
+ return static_cast<Throw*>(expression)->operands.size();
+}
+// Rethrow
+BinaryenExpressionRef BinaryenRethrowGetExnref(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenRethrowGetExnref(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<Rethrow>());
+ return static_cast<Rethrow*>(expression)->exnref;
+}
+// BrOnExn
+const char* BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenBrOnExnGetEvent(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<BrOnExn>());
+ return static_cast<BrOnExn*>(expression)->event.c_str();
+}
+const char* BinaryenBrOnExnGetName(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenBrOnExnGetName(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<BrOnExn>());
+ return static_cast<BrOnExn*>(expression)->name.c_str();
+}
+BinaryenExpressionRef BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenBrOnExnGetExnref(expressions[" << expressions[expr]
+ << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<BrOnExn>());
+ return static_cast<BrOnExn*>(expression)->exnref;
+}
// Functions