diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 52 | ||||
-rw-r--r-- | src/binaryen-c.h | 20 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 26 | ||||
-rw-r--r-- | src/wasm-builder.h | 58 |
4 files changed, 133 insertions, 23 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 1015e41c0..f4d93afa1 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1210,21 +1210,29 @@ BinaryenExpressionRef BinaryenRefEq(BinaryenModuleRef module, } BinaryenExpressionRef BinaryenTry(BinaryenModuleRef module, + const char* name, BinaryenExpressionRef body, - const char** catchEvents_, + const char** catchEvents, BinaryenIndex numCatchEvents, - BinaryenExpressionRef* catchBodies_, - BinaryenIndex numCatchBodies) { - std::vector<Name> catchEvents; - std::vector<Expression*> catchBodies; + BinaryenExpressionRef* catchBodies, + BinaryenIndex numCatchBodies, + const char* delegateTarget) { + auto* ret = ((Module*)module)->allocator.alloc<Try>(); + if (name) { + ret->name = name; + } + ret->body = (Expression*)body; for (BinaryenIndex i = 0; i < numCatchEvents; i++) { - catchEvents.push_back(catchEvents_[i]); + ret->catchEvents.push_back(catchEvents[i]); } for (BinaryenIndex i = 0; i < numCatchBodies; i++) { - catchBodies.push_back((Expression*)catchBodies_[i]); + ret->catchBodies.push_back((Expression*)catchBodies[i]); } - return static_cast<Expression*>( - Builder(*(Module*)module).makeTry(body, catchEvents, catchBodies)); + if (delegateTarget) { + ret->delegateTarget = delegateTarget; + } + ret->finalize(); + return static_cast<Expression*>(ret); } BinaryenExpressionRef BinaryenThrow(BinaryenModuleRef module, @@ -2765,6 +2773,16 @@ void BinaryenRefEqSetRight(BinaryenExpressionRef expr, static_cast<RefEq*>(expression)->right = (Expression*)right; } // Try +const char* BinaryenTryGetName(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + return static_cast<Try*>(expression)->name.c_str(); +} +void BinaryenTrySetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + static_cast<Try*>(expression)->name = name; +} BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Try>()); @@ -2873,6 +2891,22 @@ int BinaryenTryHasCatchAll(BinaryenExpressionRef expr) { assert(expression->is<Try>()); return static_cast<Try*>(expression)->hasCatchAll(); } +const char* BinaryenTryGetDelegateTarget(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + return static_cast<Try*>(expression)->delegateTarget.c_str(); +} +void BinaryenTrySetDelegateTarget(BinaryenExpressionRef expr, + const char* delegateTarget) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + static_cast<Try*>(expression)->delegateTarget = delegateTarget; +} +int BinaryenTryIsDelegate(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + return static_cast<Try*>(expression)->isDelegate(); +} // Throw const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; diff --git a/src/binaryen-c.h b/src/binaryen-c.h index eb0cfc6e1..967bb547f 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -802,13 +802,16 @@ BINARYEN_API BinaryenExpressionRef BinaryenRefFunc(BinaryenModuleRef module, BINARYEN_API BinaryenExpressionRef BinaryenRefEq(BinaryenModuleRef module, BinaryenExpressionRef left, BinaryenExpressionRef right); +// Try: name can be NULL. delegateTarget should be NULL in try-catch. BINARYEN_API BinaryenExpressionRef BinaryenTry(BinaryenModuleRef module, + const char* name, BinaryenExpressionRef body, const char** catchEvents, BinaryenIndex numCatchEvents, BinaryenExpressionRef* catchBodies, - BinaryenIndex numCatchBodies); + BinaryenIndex numCatchBodies, + const char* delegateTarget); BINARYEN_API BinaryenExpressionRef BinaryenThrow(BinaryenModuleRef module, const char* event, @@ -1719,6 +1722,11 @@ BINARYEN_API void BinaryenRefEqSetRight(BinaryenExpressionRef expr, // Try +// Gets the name (label) of a `try` expression. +BINARYEN_API const char* BinaryenTryGetName(BinaryenExpressionRef expr); +// Sets the name (label) of a `try` expression. +BINARYEN_API void BinaryenTrySetName(BinaryenExpressionRef expr, + const char* name); // Gets the body expression of a `try` expression. BINARYEN_API BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr); @@ -1774,8 +1782,16 @@ BINARYEN_API void BinaryenTryInsertCatchBodyAt(BinaryenExpressionRef expr, // expression. BINARYEN_API BinaryenExpressionRef BinaryenTryRemoveCatchBodyAt(BinaryenExpressionRef expr, BinaryenIndex index); -// Gets whether an `try` expression has a catch_all clause. +// Gets whether a `try` expression has a catch_all clause. BINARYEN_API int BinaryenTryHasCatchAll(BinaryenExpressionRef expr); +// Gets the target label of a `delegate`. +BINARYEN_API const char* +BinaryenTryGetDelegateTarget(BinaryenExpressionRef expr); +// Sets the target label of a `delegate`. +BINARYEN_API void BinaryenTrySetDelegateTarget(BinaryenExpressionRef expr, + const char* delegateTarget); +// Gets whether a `try` expression is a try-delegate. +BINARYEN_API int BinaryenTryIsDelegate(BinaryenExpressionRef expr); // Throw diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 2ac2605fa..63be4d446 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2147,9 +2147,9 @@ function wrapModule(module, self = {}) { } }; - self['try'] = function(body, catchEvents, catchBodies) { + self['try'] = function(name, body, catchEvents, catchBodies, delegateTarget) { return preserveStack(() => - Module['_BinaryenTry'](module, body, i32sToStack(catchEvents.map(strToStack)), catchEvents.length, i32sToStack(catchBodies), catchBodies.length)); + Module['_BinaryenTry'](module, name ? strToStack(name) : 0, body, i32sToStack(catchEvents.map(strToStack)), catchEvents.length, i32sToStack(catchBodies), catchBodies.length, delegateTarget ? strToStack(delegateTarget) : 0)); }; self['throw'] = function(event_, operands) { return preserveStack(() => Module['_BinaryenThrow'](module, strToStack(event_), i32sToStack(operands), operands.length)); @@ -2897,10 +2897,13 @@ Module['getExpressionInfo'] = function(expr) { return { 'id': id, 'type': type, + 'name': UTF8ToString(Module['_BinaryenTryGetName'](expr)), 'body': Module['_BinaryenTryGetBody'](expr), 'catchEvents': getAllNested(expr, Module['_BinaryenTryGetNumCatchEvents'], Module['_BinaryenTryGetCatchEventAt']), 'catchBodies': getAllNested(expr, Module['_BinaryenTryGetNumCatchBodies'], Module['_BinaryenTryGetCatchBodyAt']), - 'hasCatchAll': Module['_BinaryenTryHasCatchAll'](expr) + 'hasCatchAll': Module['_BinaryenTryHasCatchAll'](expr), + 'delegateTarget': UTF8ToString(Module['_BinaryenTryGetDelegateTarget'](expr)), + 'isDelegate': Module['_BinaryenTryIsDelegate'](expr) }; case Module['ThrowId']: return { @@ -4172,6 +4175,13 @@ Module['RefEq'] = makeExpressionWrapper({ }); Module['Try'] = makeExpressionWrapper({ + 'getName'(expr) { + const name = Module['_BinaryenTryGetName'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setName'(expr, name) { + preserveStack(() => { Module['_BinaryenTrySetName'](expr, strToStack(name)) }); + }, 'getBody'(expr) { return Module['_BinaryenTryGetBody'](expr); }, @@ -4231,6 +4241,16 @@ Module['Try'] = makeExpressionWrapper({ 'hasCatchAll'(expr) { return Boolean(Module['_BinaryenTryHasCatchAll'](expr)); }, + 'getDelegateTarget'(expr) { + const name = Module['_BinaryenTryGetDelegateTarget'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setDelegateTarget'(expr, name) { + preserveStack(() => { Module['_BinaryenTrySetDelegateTarget'](expr, strToStack(name)) }); + }, + 'isDelegate'(expr) { + return Boolean(Module['_BinaryenTryIsDelegate'](expr)); + } }); Module['Throw'] = makeExpressionWrapper({ diff --git a/src/wasm-builder.h b/src/wasm-builder.h index 3a4ae97c1..fb67597b9 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -637,26 +637,66 @@ public: ret->finalize(); return ret; } - Try* makeTry(Expression* body, + +private: + Try* makeTry(Name name, + Expression* body, const std::vector<Name>& catchEvents, - const std::vector<Expression*>& catchBodies) { + const std::vector<Expression*>& catchBodies, + Name delegateTarget, + Type type, + bool hasType) { // differentiate whether a type was passed in auto* ret = wasm.allocator.alloc<Try>(); + ret->name = name; ret->body = body; ret->catchEvents.set(catchEvents); ret->catchBodies.set(catchBodies); - ret->finalize(); + if (hasType) { + ret->finalize(type); + } else { + ret->finalize(); + } return ret; } + +public: + Try* makeTry(Expression* body, + const std::vector<Name>& catchEvents, + const std::vector<Expression*>& catchBodies) { + return makeTry( + Name(), body, catchEvents, catchBodies, Name(), Type::none, false); + } Try* makeTry(Expression* body, const std::vector<Name>& catchEvents, const std::vector<Expression*>& catchBodies, Type type) { - auto* ret = wasm.allocator.alloc<Try>(); - ret->body = body; - ret->catchEvents.set(catchEvents); - ret->catchBodies.set(catchBodies); - ret->finalize(type); - return ret; + return makeTry(Name(), body, catchEvents, catchBodies, Name(), type, true); + } + Try* makeTry(Name name, + Expression* body, + const std::vector<Name>& catchEvents, + const std::vector<Expression*>& catchBodies) { + return makeTry( + name, body, catchEvents, catchBodies, Name(), Type::none, false); + } + Try* makeTry(Name name, + Expression* body, + const std::vector<Name>& catchEvents, + const std::vector<Expression*>& catchBodies, + Type type) { + return makeTry(name, body, catchEvents, catchBodies, Name(), type, true); + } + Try* makeTry(Expression* body, Name delegateTarget) { + return makeTry(Name(), body, {}, {}, delegateTarget, Type::none, false); + } + Try* makeTry(Expression* body, Name delegateTarget, Type type) { + return makeTry(Name(), body, {}, {}, delegateTarget, type, true); + } + Try* makeTry(Name name, Expression* body, Name delegateTarget) { + return makeTry(name, body, {}, {}, delegateTarget, Type::none, false); + } + Try* makeTry(Name name, Expression* body, Name delegateTarget, Type type) { + return makeTry(name, body, {}, {}, delegateTarget, type, true); } Throw* makeThrow(Event* event, const std::vector<Expression*>& args) { return makeThrow(event->name, args); |