diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 1052 | ||||
-rw-r--r-- | src/binaryen-c.h | 794 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 1293 | ||||
-rw-r--r-- | src/mixed_arena.h | 21 | ||||
-rw-r--r-- | src/wasm.h | 2 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 2 |
6 files changed, 3110 insertions, 54 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index f4df69737..517ed42a6 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1167,6 +1167,7 @@ BinaryenExpressionRef BinaryenSIMDShuffle(BinaryenModuleRef module, BinaryenExpressionRef left, BinaryenExpressionRef right, const uint8_t mask_[16]) { + assert(mask_); // nullptr would be wrong std::array<uint8_t, 16> mask; memcpy(mask.data(), mask_, 16); return static_cast<Expression*>( @@ -1307,7 +1308,7 @@ BinaryenExpressionRef BinaryenBrOnExn(BinaryenModuleRef module, const char* eventName, BinaryenExpressionRef exnref) { auto* wasm = (Module*)module; - Event* event = wasm->getEventOrNull(eventName); + auto* event = wasm->getEventOrNull(eventName); assert(event && "br_on_exn's event must exist"); return static_cast<Expression*>( Builder(*wasm).makeBrOnExn(name, event, (Expression*)exnref)); @@ -1321,10 +1322,16 @@ BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr) { BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr) { return ((Expression*)expr)->type.getID(); } +void BinaryenExpressionSetType(BinaryenExpressionRef expr, BinaryenType type) { + ((Expression*)expr)->type = Type(type); +} void BinaryenExpressionPrint(BinaryenExpressionRef expr) { WasmPrinter::printExpression((Expression*)expr, std::cout); std::cout << '\n'; } +void BinaryenExpressionFinalize(BinaryenExpressionRef expr) { + ReFinalizeNode().visit((Expression*)expr); +} BinaryenExpressionRef BinaryenExpressionCopy(BinaryenExpressionRef expr, BinaryenModuleRef module) { @@ -1339,702 +1346,1690 @@ const char* BinaryenBlockGetName(BinaryenExpressionRef expr) { assert(expression->is<Block>()); return static_cast<Block*>(expression)->name.c_str(); } +void BinaryenBlockSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Block>()); + // may be null or empty + static_cast<Block*>(expression)->name = name; +} BinaryenIndex BinaryenBlockGetNumChildren(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Block>()); return static_cast<Block*>(expression)->list.size(); } -BinaryenExpressionRef BinaryenBlockGetChild(BinaryenExpressionRef expr, - BinaryenIndex index) { +BinaryenExpressionRef BinaryenBlockGetChildAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<Block>()); assert(index < static_cast<Block*>(expression)->list.size()); return static_cast<Block*>(expression)->list[index]; } +void BinaryenBlockSetChildAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef childExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Block>()); + assert(childExpr); + auto& list = static_cast<Block*>(expression)->list; + assert(index < list.size()); + list[index] = (Expression*)childExpr; +} +BinaryenIndex BinaryenBlockAppendChild(BinaryenExpressionRef expr, + BinaryenExpressionRef childExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Block>()); + assert(childExpr); + auto& list = static_cast<Block*>(expression)->list; + auto index = list.size(); + list.push_back((Expression*)childExpr); + return index; +} +void BinaryenBlockInsertChildAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef childExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Block>()); + assert(childExpr); + static_cast<Block*>(expression)->list.insertAt(index, (Expression*)childExpr); +} +BinaryenExpressionRef BinaryenBlockRemoveChildAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Block>()); + return static_cast<Block*>(expression)->list.removeAt(index); +} // If BinaryenExpressionRef BinaryenIfGetCondition(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<If>()); return static_cast<If*>(expression)->condition; } +void BinaryenIfSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<If>()); + assert(condExpr); + static_cast<If*>(expression)->condition = (Expression*)condExpr; +} BinaryenExpressionRef BinaryenIfGetIfTrue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<If>()); return static_cast<If*>(expression)->ifTrue; } +void BinaryenIfSetIfTrue(BinaryenExpressionRef expr, + BinaryenExpressionRef ifTrueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<If>()); + assert(ifTrueExpr); + static_cast<If*>(expression)->ifTrue = (Expression*)ifTrueExpr; +} BinaryenExpressionRef BinaryenIfGetIfFalse(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<If>()); return static_cast<If*>(expression)->ifFalse; } +void BinaryenIfSetIfFalse(BinaryenExpressionRef expr, + BinaryenExpressionRef ifFalseExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<If>()); + // may be null + static_cast<If*>(expression)->ifFalse = (Expression*)ifFalseExpr; +} // Loop const char* BinaryenLoopGetName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Loop>()); return static_cast<Loop*>(expression)->name.c_str(); } +void BinaryenLoopSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Loop>()); + // may be null or empty + static_cast<Loop*>(expression)->name = name; +} BinaryenExpressionRef BinaryenLoopGetBody(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Loop>()); return static_cast<Loop*>(expression)->body; } +void BinaryenLoopSetBody(BinaryenExpressionRef expr, + BinaryenExpressionRef bodyExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Loop>()); + assert(bodyExpr); + static_cast<Loop*>(expression)->body = (Expression*)bodyExpr; +} // Break const char* BinaryenBreakGetName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Break>()); return static_cast<Break*>(expression)->name.c_str(); } +void BinaryenBreakSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Break>()); + assert(name); + static_cast<Break*>(expression)->name = name; +} BinaryenExpressionRef BinaryenBreakGetCondition(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Break>()); return static_cast<Break*>(expression)->condition; } +void BinaryenBreakSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Break>()); + // may be null (br) + static_cast<Break*>(expression)->condition = (Expression*)condExpr; +} BinaryenExpressionRef BinaryenBreakGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Break>()); return static_cast<Break*>(expression)->value; } +void BinaryenBreakSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Break>()); + // may be null + static_cast<Break*>(expression)->value = (Expression*)valueExpr; +} // Switch BinaryenIndex BinaryenSwitchGetNumNames(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Switch>()); return static_cast<Switch*>(expression)->targets.size(); } -const char* BinaryenSwitchGetName(BinaryenExpressionRef expr, - BinaryenIndex index) { +const char* BinaryenSwitchGetNameAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<Switch>()); assert(index < static_cast<Switch*>(expression)->targets.size()); return static_cast<Switch*>(expression)->targets[index].c_str(); } +void BinaryenSwitchSetNameAt(BinaryenExpressionRef expr, + BinaryenIndex index, + const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + assert(index < static_cast<Switch*>(expression)->targets.size()); + assert(name); + static_cast<Switch*>(expression)->targets[index] = name; +} +BinaryenIndex BinaryenSwitchAppendName(BinaryenExpressionRef expr, + const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + assert(name); + auto& list = static_cast<Switch*>(expression)->targets; + auto index = list.size(); + list.push_back(name); + return index; +} +void BinaryenSwitchInsertNameAt(BinaryenExpressionRef expr, + BinaryenIndex index, + const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + assert(name); + static_cast<Switch*>(expression)->targets.insertAt(index, name); +} +const char* BinaryenSwitchRemoveNameAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + return static_cast<Switch*>(expression)->targets.removeAt(index).c_str(); +} const char* BinaryenSwitchGetDefaultName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Switch>()); return static_cast<Switch*>(expression)->default_.c_str(); } +void BinaryenSwitchSetDefaultName(BinaryenExpressionRef expr, + const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + // may be null or empty + static_cast<Switch*>(expression)->default_ = name; +} BinaryenExpressionRef BinaryenSwitchGetCondition(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Switch>()); return static_cast<Switch*>(expression)->condition; } +void BinaryenSwitchSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Switch>()); + assert(condExpr); + static_cast<Switch*>(expression)->condition = (Expression*)condExpr; +} BinaryenExpressionRef BinaryenSwitchGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Switch>()); return static_cast<Switch*>(expression)->value; } -// Call -int BinaryenCallIsReturn(BinaryenExpressionRef expr) { +void BinaryenSwitchSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { auto* expression = (Expression*)expr; - assert(expression->is<Call>()); - return static_cast<Call*>(expression)->isReturn; + assert(expression->is<Switch>()); + // may be null + static_cast<Switch*>(expression)->value = (Expression*)valueExpr; } +// Call const char* BinaryenCallGetTarget(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Call>()); return static_cast<Call*>(expression)->target.c_str(); } +void BinaryenCallSetTarget(BinaryenExpressionRef expr, const char* target) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + assert(target); + static_cast<Call*>(expression)->target = target; +} BinaryenIndex BinaryenCallGetNumOperands(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Call>()); return static_cast<Call*>(expression)->operands.size(); } -BinaryenExpressionRef BinaryenCallGetOperand(BinaryenExpressionRef expr, - BinaryenIndex index) { +BinaryenExpressionRef BinaryenCallGetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<Call>()); assert(index < static_cast<Call*>(expression)->operands.size()); return static_cast<Call*>(expression)->operands[index]; } -// CallIndirect -int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr) { +void BinaryenCallSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { auto* expression = (Expression*)expr; - assert(expression->is<CallIndirect>()); - return static_cast<CallIndirect*>(expression)->isReturn; + assert(expression->is<Call>()); + assert(index < static_cast<Call*>(expression)->operands.size()); + assert(operandExpr); + static_cast<Call*>(expression)->operands[index] = (Expression*)operandExpr; +} +BinaryenIndex BinaryenCallAppendOperand(BinaryenExpressionRef expr, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + assert(operandExpr); + auto& list = static_cast<Call*>(expression)->operands; + auto index = list.size(); + list.push_back((Expression*)operandExpr); + return index; +} +void BinaryenCallInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + assert(operandExpr); + static_cast<Call*>(expression) + ->operands.insertAt(index, (Expression*)operandExpr); +} +BinaryenExpressionRef BinaryenCallRemoveOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + return static_cast<Call*>(expression)->operands.removeAt(index); +} +int BinaryenCallIsReturn(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + return static_cast<Call*>(expression)->isReturn; } +void BinaryenCallSetReturn(BinaryenExpressionRef expr, int isReturn) { + auto* expression = (Expression*)expr; + assert(expression->is<Call>()); + static_cast<Call*>(expression)->isReturn = isReturn != 0; +} +// CallIndirect BinaryenExpressionRef BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<CallIndirect>()); return static_cast<CallIndirect*>(expression)->target; } +void BinaryenCallIndirectSetTarget(BinaryenExpressionRef expr, + BinaryenExpressionRef targetExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + assert(targetExpr); + static_cast<CallIndirect*>(expression)->target = (Expression*)targetExpr; +} BinaryenIndex BinaryenCallIndirectGetNumOperands(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<CallIndirect>()); return static_cast<CallIndirect*>(expression)->operands.size(); } -BinaryenExpressionRef BinaryenCallIndirectGetOperand(BinaryenExpressionRef expr, - BinaryenIndex index) { +BinaryenExpressionRef +BinaryenCallIndirectGetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<CallIndirect>()); assert(index < static_cast<CallIndirect*>(expression)->operands.size()); return static_cast<CallIndirect*>(expression)->operands[index]; } +void BinaryenCallIndirectSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + assert(index < static_cast<CallIndirect*>(expression)->operands.size()); + assert(operandExpr); + static_cast<CallIndirect*>(expression)->operands[index] = + (Expression*)operandExpr; +} +BinaryenIndex +BinaryenCallIndirectAppendOperand(BinaryenExpressionRef expr, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + assert(operandExpr); + auto& list = static_cast<CallIndirect*>(expression)->operands; + auto index = list.size(); + list.push_back((Expression*)operandExpr); + return index; +} +void BinaryenCallIndirectInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + assert(operandExpr); + static_cast<CallIndirect*>(expression) + ->operands.insertAt(index, (Expression*)operandExpr); +} +BinaryenExpressionRef +BinaryenCallIndirectRemoveOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + return static_cast<CallIndirect*>(expression)->operands.removeAt(index); +} +int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + return static_cast<CallIndirect*>(expression)->isReturn; +} +void BinaryenCallIndirectSetReturn(BinaryenExpressionRef expr, int isReturn) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + static_cast<CallIndirect*>(expression)->isReturn = isReturn != 0; +} +BinaryenType BinaryenCallIndirectGetParams(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + return static_cast<CallIndirect*>(expression)->sig.params.getID(); +} +void BinaryenCallIndirectSetParams(BinaryenExpressionRef expr, + BinaryenType params) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + static_cast<CallIndirect*>(expression)->sig.params = Type(params); +} +BinaryenType BinaryenCallIndirectGetResults(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + return static_cast<CallIndirect*>(expression)->sig.results.getID(); +} +void BinaryenCallIndirectSetResults(BinaryenExpressionRef expr, + BinaryenType results) { + auto* expression = (Expression*)expr; + assert(expression->is<CallIndirect>()); + static_cast<CallIndirect*>(expression)->sig.results = Type(results); +} // LocalGet BinaryenIndex BinaryenLocalGetGetIndex(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<LocalGet>()); return static_cast<LocalGet*>(expression)->index; } +void BinaryenLocalGetSetIndex(BinaryenExpressionRef expr, BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<LocalGet>()); + static_cast<LocalGet*>(expression)->index = index; +} // LocalSet int BinaryenLocalSetIsTee(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<LocalSet>()); return static_cast<LocalSet*>(expression)->isTee(); + // has no setter } BinaryenIndex BinaryenLocalSetGetIndex(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<LocalSet>()); return static_cast<LocalSet*>(expression)->index; } +void BinaryenLocalSetSetIndex(BinaryenExpressionRef expr, BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<LocalSet>()); + static_cast<LocalSet*>(expression)->index = index; +} BinaryenExpressionRef BinaryenLocalSetGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<LocalSet>()); return static_cast<LocalSet*>(expression)->value; } +void BinaryenLocalSetSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<LocalSet>()); + assert(valueExpr); + static_cast<LocalSet*>(expression)->value = (Expression*)valueExpr; +} // GlobalGet const char* BinaryenGlobalGetGetName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<GlobalGet>()); return static_cast<GlobalGet*>(expression)->name.c_str(); } +void BinaryenGlobalGetSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<GlobalGet>()); + assert(name); + static_cast<GlobalGet*>(expression)->name = name; +} // GlobalSet const char* BinaryenGlobalSetGetName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<GlobalSet>()); return static_cast<GlobalSet*>(expression)->name.c_str(); } +void BinaryenGlobalSetSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<GlobalSet>()); + assert(name); + static_cast<GlobalSet*>(expression)->name = name; +} BinaryenExpressionRef BinaryenGlobalSetGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<GlobalSet>()); return static_cast<GlobalSet*>(expression)->value; } +void BinaryenGlobalSetSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<GlobalSet>()); + assert(valueExpr); + static_cast<GlobalSet*>(expression)->value = (Expression*)valueExpr; +} // Host BinaryenOp BinaryenHostGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Host>()); return static_cast<Host*>(expression)->op; } +void BinaryenHostSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + static_cast<Host*>(expression)->op = (HostOp)op; +} const char* BinaryenHostGetNameOperand(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Host>()); return static_cast<Host*>(expression)->nameOperand.c_str(); } +void BinaryenHostSetNameOperand(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + static_cast<Host*>(expression)->nameOperand = name ? name : ""; +} BinaryenIndex BinaryenHostGetNumOperands(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Host>()); return static_cast<Host*>(expression)->operands.size(); } -BinaryenExpressionRef BinaryenHostGetOperand(BinaryenExpressionRef expr, - BinaryenIndex index) { +BinaryenExpressionRef BinaryenHostGetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<Host>()); assert(index < static_cast<Host*>(expression)->operands.size()); return static_cast<Host*>(expression)->operands[index]; } +void BinaryenHostSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + assert(index < static_cast<Host*>(expression)->operands.size()); + assert(operandExpr); + static_cast<Host*>(expression)->operands[index] = (Expression*)operandExpr; +} +BinaryenIndex BinaryenHostAppendOperand(BinaryenExpressionRef expr, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + assert(operandExpr); + auto& list = static_cast<Host*>(expression)->operands; + auto index = list.size(); + list.push_back((Expression*)operandExpr); + return index; +} +void BinaryenHostInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + assert(operandExpr); + static_cast<Host*>(expression) + ->operands.insertAt(index, (Expression*)operandExpr); +} +BinaryenExpressionRef BinaryenHostRemoveOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Host>()); + return static_cast<Host*>(expression)->operands.removeAt(index); +} // Load int BinaryenLoadIsAtomic(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->isAtomic; } +void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, int isAtomic) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + static_cast<Load*>(expression)->isAtomic = isAtomic != 0; +} int BinaryenLoadIsSigned(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->signed_; } +void BinaryenLoadSetSigned(BinaryenExpressionRef expr, int isSigned) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + static_cast<Load*>(expression)->signed_ = isSigned != 0; +} uint32_t BinaryenLoadGetBytes(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->bytes; } +void BinaryenLoadSetBytes(BinaryenExpressionRef expr, uint32_t bytes) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + static_cast<Load*>(expression)->bytes = bytes; +} uint32_t BinaryenLoadGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->offset; } +void BinaryenLoadSetOffset(BinaryenExpressionRef expr, uint32_t offset) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + static_cast<Load*>(expression)->offset = offset; +} uint32_t BinaryenLoadGetAlign(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->align; } +void BinaryenLoadSetAlign(BinaryenExpressionRef expr, uint32_t align) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + static_cast<Load*>(expression)->align = align; +} BinaryenExpressionRef BinaryenLoadGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Load>()); return static_cast<Load*>(expression)->ptr; } +void BinaryenLoadSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Load>()); + assert(ptrExpr); + static_cast<Load*>(expression)->ptr = (Expression*)ptrExpr; +} // Store int BinaryenStoreIsAtomic(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->isAtomic; } +void BinaryenStoreSetAtomic(BinaryenExpressionRef expr, int isAtomic) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + static_cast<Store*>(expression)->isAtomic = isAtomic != 0; +} uint32_t BinaryenStoreGetBytes(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->bytes; } +void BinaryenStoreSetBytes(BinaryenExpressionRef expr, uint32_t bytes) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + static_cast<Store*>(expression)->bytes = bytes; +} uint32_t BinaryenStoreGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->offset; } +void BinaryenStoreSetOffset(BinaryenExpressionRef expr, uint32_t offset) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + static_cast<Store*>(expression)->offset = offset; +} uint32_t BinaryenStoreGetAlign(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->align; } +void BinaryenStoreSetAlign(BinaryenExpressionRef expr, uint32_t align) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + static_cast<Store*>(expression)->align = align; +} BinaryenExpressionRef BinaryenStoreGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->ptr; } +void BinaryenStoreSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + assert(ptrExpr); + static_cast<Store*>(expression)->ptr = (Expression*)ptrExpr; +} BinaryenExpressionRef BinaryenStoreGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Store>()); return static_cast<Store*>(expression)->value; } +void BinaryenStoreSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + assert(valueExpr); + static_cast<Store*>(expression)->value = (Expression*)valueExpr; +} +BinaryenType BinaryenStoreGetValueType(BinaryenExpressionRef expr) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + return static_cast<Store*>(expression)->valueType.getID(); +} +void BinaryenStoreSetValueType(BinaryenExpressionRef expr, + BinaryenType valueType) { + auto* expression = (Expression*)expr; + assert(expression->is<Store>()); + static_cast<Store*>(expression)->valueType = Type(valueType); +} // Const int32_t BinaryenConstGetValueI32(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return static_cast<Const*>(expression)->value.geti32(); } +void BinaryenConstSetValueI32(BinaryenExpressionRef expr, int32_t value) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + static_cast<Const*>(expression)->value = Literal(value); +} int64_t BinaryenConstGetValueI64(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return static_cast<Const*>(expression)->value.geti64(); } +void BinaryenConstSetValueI64(BinaryenExpressionRef expr, int64_t value) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + static_cast<Const*>(expression)->value = Literal(value); +} int32_t BinaryenConstGetValueI64Low(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return (int32_t)(static_cast<Const*>(expression)->value.geti64() & 0xffffffff); } +void BinaryenConstSetValueI64Low(BinaryenExpressionRef expr, int32_t valueLow) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + auto& value = static_cast<Const*>(expression)->value; + int64_t valueI64 = value.type == Type::i64 ? value.geti64() : 0; + static_cast<Const*>(expression)->value = + Literal((valueI64 & ~0xffffffff) | (int64_t(valueLow) & 0xffffffff)); +} int32_t BinaryenConstGetValueI64High(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return (int32_t)(static_cast<Const*>(expression)->value.geti64() >> 32); } +void BinaryenConstSetValueI64High(BinaryenExpressionRef expr, + int32_t valueHigh) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + auto& value = static_cast<Const*>(expression)->value; + int64_t valueI64 = value.type == Type::i64 ? value.geti64() : 0; + static_cast<Const*>(expression)->value = + Literal((int64_t(valueHigh) << 32) | (valueI64 & 0xffffffff)); +} float BinaryenConstGetValueF32(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return static_cast<Const*>(expression)->value.getf32(); } +void BinaryenConstSetValueF32(BinaryenExpressionRef expr, float value) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + static_cast<Const*>(expression)->value = Literal(value); +} double BinaryenConstGetValueF64(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); return static_cast<Const*>(expression)->value.getf64(); } +void BinaryenConstSetValueF64(BinaryenExpressionRef expr, double value) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + static_cast<Const*>(expression)->value = Literal(value); +} void BinaryenConstGetValueV128(BinaryenExpressionRef expr, uint8_t* out) { auto* expression = (Expression*)expr; assert(expression->is<Const>()); memcpy(out, static_cast<Const*>(expression)->value.getv128().data(), 16); } +void BinaryenConstSetValueV128(BinaryenExpressionRef expr, + const uint8_t value[16]) { + auto* expression = (Expression*)expr; + assert(expression->is<Const>()); + assert(value); // nullptr would be wrong + static_cast<Const*>(expression)->value = Literal(value); +} // Unary BinaryenOp BinaryenUnaryGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Unary>()); return static_cast<Unary*>(expression)->op; } +void BinaryenUnarySetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<Unary>()); + static_cast<Unary*>(expression)->op = UnaryOp(op); +} BinaryenExpressionRef BinaryenUnaryGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Unary>()); return static_cast<Unary*>(expression)->value; } +void BinaryenUnarySetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Unary>()); + assert(valueExpr); + static_cast<Unary*>(expression)->value = (Expression*)valueExpr; +} // Binary BinaryenOp BinaryenBinaryGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Binary>()); return static_cast<Binary*>(expression)->op; } +void BinaryenBinarySetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<Binary>()); + static_cast<Binary*>(expression)->op = BinaryOp(op); +} BinaryenExpressionRef BinaryenBinaryGetLeft(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Binary>()); return static_cast<Binary*>(expression)->left; } +void BinaryenBinarySetLeft(BinaryenExpressionRef expr, + BinaryenExpressionRef leftExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Binary>()); + assert(leftExpr); + static_cast<Binary*>(expression)->left = (Expression*)leftExpr; +} BinaryenExpressionRef BinaryenBinaryGetRight(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Binary>()); return static_cast<Binary*>(expression)->right; } +void BinaryenBinarySetRight(BinaryenExpressionRef expr, + BinaryenExpressionRef rightExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Binary>()); + assert(rightExpr); + static_cast<Binary*>(expression)->right = (Expression*)rightExpr; +} // Select BinaryenExpressionRef BinaryenSelectGetIfTrue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Select>()); return static_cast<Select*>(expression)->ifTrue; } +void BinaryenSelectSetIfTrue(BinaryenExpressionRef expr, + BinaryenExpressionRef ifTrueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Select>()); + assert(ifTrueExpr); + static_cast<Select*>(expression)->ifTrue = (Expression*)ifTrueExpr; +} BinaryenExpressionRef BinaryenSelectGetIfFalse(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Select>()); return static_cast<Select*>(expression)->ifFalse; } +void BinaryenSelectSetIfFalse(BinaryenExpressionRef expr, + BinaryenExpressionRef ifFalseExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Select>()); + assert(ifFalseExpr); + static_cast<Select*>(expression)->ifFalse = (Expression*)ifFalseExpr; +} BinaryenExpressionRef BinaryenSelectGetCondition(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Select>()); return static_cast<Select*>(expression)->condition; } +void BinaryenSelectSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Select>()); + assert(condExpr); + static_cast<Select*>(expression)->condition = (Expression*)condExpr; +} // Drop BinaryenExpressionRef BinaryenDropGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Drop>()); return static_cast<Drop*>(expression)->value; } +void BinaryenDropSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Drop>()); + assert(valueExpr); + static_cast<Drop*>(expression)->value = (Expression*)valueExpr; +} // Return BinaryenExpressionRef BinaryenReturnGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Return>()); return static_cast<Return*>(expression)->value; } +void BinaryenReturnSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Return>()); + // may be null + static_cast<Return*>(expression)->value = (Expression*)valueExpr; +} // AtomicRMW BinaryenOp BinaryenAtomicRMWGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicRMW>()); return static_cast<AtomicRMW*>(expression)->op; } +void BinaryenAtomicRMWSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicRMW>()); + static_cast<AtomicRMW*>(expression)->op = AtomicRMWOp(op); +} uint32_t BinaryenAtomicRMWGetBytes(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicRMW>()); return static_cast<AtomicRMW*>(expression)->bytes; } +void BinaryenAtomicRMWSetBytes(BinaryenExpressionRef expr, uint32_t bytes) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicRMW>()); + static_cast<AtomicRMW*>(expression)->bytes = bytes; +} uint32_t BinaryenAtomicRMWGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicRMW>()); return static_cast<AtomicRMW*>(expression)->offset; } +void BinaryenAtomicRMWSetOffset(BinaryenExpressionRef expr, uint32_t offset) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicRMW>()); + static_cast<AtomicRMW*>(expression)->offset = offset; +} BinaryenExpressionRef BinaryenAtomicRMWGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicRMW>()); return static_cast<AtomicRMW*>(expression)->ptr; } +void BinaryenAtomicRMWSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicRMW>()); + assert(ptrExpr); + static_cast<AtomicRMW*>(expression)->ptr = (Expression*)ptrExpr; +} BinaryenExpressionRef BinaryenAtomicRMWGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicRMW>()); return static_cast<AtomicRMW*>(expression)->value; } +void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicRMW>()); + assert(valueExpr); + static_cast<AtomicRMW*>(expression)->value = (Expression*)valueExpr; +} // AtomicCmpxchg uint32_t BinaryenAtomicCmpxchgGetBytes(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicCmpxchg>()); return static_cast<AtomicCmpxchg*>(expression)->bytes; } +void BinaryenAtomicCmpxchgSetBytes(BinaryenExpressionRef expr, uint32_t bytes) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicCmpxchg>()); + static_cast<AtomicCmpxchg*>(expression)->bytes = bytes; +} uint32_t BinaryenAtomicCmpxchgGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicCmpxchg>()); return static_cast<AtomicCmpxchg*>(expression)->offset; } +void BinaryenAtomicCmpxchgSetOffset(BinaryenExpressionRef expr, + uint32_t offset) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicCmpxchg>()); + static_cast<AtomicCmpxchg*>(expression)->offset = offset; +} BinaryenExpressionRef BinaryenAtomicCmpxchgGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicCmpxchg>()); return static_cast<AtomicCmpxchg*>(expression)->ptr; } +void BinaryenAtomicCmpxchgSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicCmpxchg>()); + assert(ptrExpr); + static_cast<AtomicCmpxchg*>(expression)->ptr = (Expression*)ptrExpr; +} BinaryenExpressionRef BinaryenAtomicCmpxchgGetExpected(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicCmpxchg>()); return static_cast<AtomicCmpxchg*>(expression)->expected; } +void BinaryenAtomicCmpxchgSetExpected(BinaryenExpressionRef expr, + BinaryenExpressionRef expectedExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicCmpxchg>()); + assert(expectedExpr); + static_cast<AtomicCmpxchg*>(expression)->expected = (Expression*)expectedExpr; +} BinaryenExpressionRef BinaryenAtomicCmpxchgGetReplacement(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicCmpxchg>()); return static_cast<AtomicCmpxchg*>(expression)->replacement; } +void BinaryenAtomicCmpxchgSetReplacement( + BinaryenExpressionRef expr, BinaryenExpressionRef replacementExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicCmpxchg>()); + assert(replacementExpr); + static_cast<AtomicCmpxchg*>(expression)->replacement = + (Expression*)replacementExpr; +} // AtomicWait BinaryenExpressionRef BinaryenAtomicWaitGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicWait>()); return static_cast<AtomicWait*>(expression)->ptr; } +void BinaryenAtomicWaitSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicWait>()); + assert(ptrExpr); + static_cast<AtomicWait*>(expression)->ptr = (Expression*)ptrExpr; +} BinaryenExpressionRef BinaryenAtomicWaitGetExpected(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicWait>()); return static_cast<AtomicWait*>(expression)->expected; } +void BinaryenAtomicWaitSetExpected(BinaryenExpressionRef expr, + BinaryenExpressionRef expectedExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicWait>()); + assert(expectedExpr); + static_cast<AtomicWait*>(expression)->expected = (Expression*)expectedExpr; +} BinaryenExpressionRef BinaryenAtomicWaitGetTimeout(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicWait>()); return static_cast<AtomicWait*>(expression)->timeout; } +void BinaryenAtomicWaitSetTimeout(BinaryenExpressionRef expr, + BinaryenExpressionRef timeoutExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicWait>()); + assert(timeoutExpr); + static_cast<AtomicWait*>(expression)->timeout = (Expression*)timeoutExpr; +} BinaryenType BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicWait>()); return static_cast<AtomicWait*>(expression)->expectedType.getID(); } +void BinaryenAtomicWaitSetExpectedType(BinaryenExpressionRef expr, + BinaryenType expectedType) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicWait>()); + static_cast<AtomicWait*>(expression)->expectedType = Type(expectedType); +} // AtomicNotify BinaryenExpressionRef BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicNotify>()); return static_cast<AtomicNotify*>(expression)->ptr; } +void BinaryenAtomicNotifySetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicNotify>()); + assert(ptrExpr); + static_cast<AtomicNotify*>(expression)->ptr = (Expression*)ptrExpr; +} BinaryenExpressionRef BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicNotify>()); return static_cast<AtomicNotify*>(expression)->notifyCount; } +void BinaryenAtomicNotifySetNotifyCount(BinaryenExpressionRef expr, + BinaryenExpressionRef notifyCountExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicNotify>()); + assert(notifyCountExpr); + static_cast<AtomicNotify*>(expression)->notifyCount = + (Expression*)notifyCountExpr; +} // AtomicFence uint8_t BinaryenAtomicFenceGetOrder(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<AtomicFence>()); return static_cast<AtomicFence*>(expression)->order; } +void BinaryenAtomicFenceSetOrder(BinaryenExpressionRef expr, uint8_t order) { + auto* expression = (Expression*)expr; + assert(expression->is<AtomicFence>()); + static_cast<AtomicFence*>(expression)->order = order; +} // SIMDExtract BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDExtract>()); return static_cast<SIMDExtract*>(expression)->op; } +void BinaryenSIMDExtractSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDExtract>()); + static_cast<SIMDExtract*>(expression)->op = SIMDExtractOp(op); +} BinaryenExpressionRef BinaryenSIMDExtractGetVec(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDExtract>()); return static_cast<SIMDExtract*>(expression)->vec; } +void BinaryenSIMDExtractSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDExtract>()); + assert(vecExpr); + static_cast<SIMDExtract*>(expression)->vec = (Expression*)vecExpr; +} uint8_t BinaryenSIMDExtractGetIndex(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDExtract>()); return static_cast<SIMDExtract*>(expression)->index; } +void BinaryenSIMDExtractSetIndex(BinaryenExpressionRef expr, uint8_t index) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDExtract>()); + static_cast<SIMDExtract*>(expression)->index = index; +} // SIMDReplace BinaryenOp BinaryenSIMDReplaceGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDReplace>()); return static_cast<SIMDReplace*>(expression)->op; } +void BinaryenSIMDReplaceSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDReplace>()); + static_cast<SIMDReplace*>(expression)->op = SIMDReplaceOp(op); +} BinaryenExpressionRef BinaryenSIMDReplaceGetVec(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDReplace>()); return static_cast<SIMDReplace*>(expression)->vec; } +void BinaryenSIMDReplaceSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDReplace>()); + assert(vecExpr); + static_cast<SIMDReplace*>(expression)->vec = (Expression*)vecExpr; +} uint8_t BinaryenSIMDReplaceGetIndex(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDReplace>()); return static_cast<SIMDReplace*>(expression)->index; } +void BinaryenSIMDReplaceSetIndex(BinaryenExpressionRef expr, uint8_t index) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDReplace>()); + static_cast<SIMDReplace*>(expression)->index = index; +} BinaryenExpressionRef BinaryenSIMDReplaceGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDReplace>()); return static_cast<SIMDReplace*>(expression)->value; } +void BinaryenSIMDReplaceSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDReplace>()); + assert(valueExpr); + static_cast<SIMDReplace*>(expression)->value = (Expression*)valueExpr; +} // SIMDShuffle BinaryenExpressionRef BinaryenSIMDShuffleGetLeft(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShuffle>()); return static_cast<SIMDShuffle*>(expression)->left; } +void BinaryenSIMDShuffleSetLeft(BinaryenExpressionRef expr, + BinaryenExpressionRef leftExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShuffle>()); + assert(leftExpr); + static_cast<SIMDShuffle*>(expression)->left = (Expression*)leftExpr; +} BinaryenExpressionRef BinaryenSIMDShuffleGetRight(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShuffle>()); return static_cast<SIMDShuffle*>(expression)->right; } +void BinaryenSIMDShuffleSetRight(BinaryenExpressionRef expr, + BinaryenExpressionRef rightExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShuffle>()); + assert(rightExpr); + static_cast<SIMDShuffle*>(expression)->right = (Expression*)rightExpr; +} void BinaryenSIMDShuffleGetMask(BinaryenExpressionRef expr, uint8_t* mask) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShuffle>()); + assert(mask); // nullptr would be wrong memcpy(mask, static_cast<SIMDShuffle*>(expression)->mask.data(), 16); } +void BinaryenSIMDShuffleSetMask(BinaryenExpressionRef expr, + const uint8_t mask_[16]) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShuffle>()); + assert(mask_); // nullptr would be wrong + auto& mask = static_cast<SIMDShuffle*>(expression)->mask; + memcpy(mask.data(), mask_, 16); +} // SIMDTernary BinaryenOp BinaryenSIMDTernaryGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDTernary>()); return static_cast<SIMDTernary*>(expression)->op; } +void BinaryenSIMDTernarySetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDTernary>()); + static_cast<SIMDTernary*>(expression)->op = SIMDTernaryOp(op); +} BinaryenExpressionRef BinaryenSIMDTernaryGetA(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDTernary>()); return static_cast<SIMDTernary*>(expression)->a; } +void BinaryenSIMDTernarySetA(BinaryenExpressionRef expr, + BinaryenExpressionRef aExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDTernary>()); + assert(aExpr); + static_cast<SIMDTernary*>(expression)->a = (Expression*)aExpr; +} BinaryenExpressionRef BinaryenSIMDTernaryGetB(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDTernary>()); return static_cast<SIMDTernary*>(expression)->b; } +void BinaryenSIMDTernarySetB(BinaryenExpressionRef expr, + BinaryenExpressionRef bExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDTernary>()); + assert(bExpr); + static_cast<SIMDTernary*>(expression)->b = (Expression*)bExpr; +} BinaryenExpressionRef BinaryenSIMDTernaryGetC(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDTernary>()); return static_cast<SIMDTernary*>(expression)->c; } +void BinaryenSIMDTernarySetC(BinaryenExpressionRef expr, + BinaryenExpressionRef cExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDTernary>()); + assert(cExpr); + static_cast<SIMDTernary*>(expression)->c = (Expression*)cExpr; +} // SIMDShift BinaryenOp BinaryenSIMDShiftGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShift>()); return static_cast<SIMDShift*>(expression)->op; } +void BinaryenSIMDShiftSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShift>()); + static_cast<SIMDShift*>(expression)->op = SIMDShiftOp(op); +} BinaryenExpressionRef BinaryenSIMDShiftGetVec(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShift>()); return static_cast<SIMDShift*>(expression)->vec; } +void BinaryenSIMDShiftSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShift>()); + assert(vecExpr); + static_cast<SIMDShift*>(expression)->vec = (Expression*)vecExpr; +} BinaryenExpressionRef BinaryenSIMDShiftGetShift(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDShift>()); return static_cast<SIMDShift*>(expression)->shift; } +void BinaryenSIMDShiftSetShift(BinaryenExpressionRef expr, + BinaryenExpressionRef shiftExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDShift>()); + assert(shiftExpr); + static_cast<SIMDShift*>(expression)->shift = (Expression*)shiftExpr; +} // SIMDLoad BinaryenOp BinaryenSIMDLoadGetOp(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDLoad>()); return static_cast<SIMDLoad*>(expression)->op; } +void BinaryenSIMDLoadSetOp(BinaryenExpressionRef expr, BinaryenOp op) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDLoad>()); + static_cast<SIMDLoad*>(expression)->op = SIMDLoadOp(op); +} uint32_t BinaryenSIMDLoadGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDLoad>()); return static_cast<SIMDLoad*>(expression)->offset; } +void BinaryenSIMDLoadSetOffset(BinaryenExpressionRef expr, uint32_t offset) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDLoad>()); + static_cast<SIMDLoad*>(expression)->offset = offset; +} uint32_t BinaryenSIMDLoadGetAlign(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDLoad>()); return static_cast<SIMDLoad*>(expression)->align; } +void BinaryenSIMDLoadSetAlign(BinaryenExpressionRef expr, uint32_t align) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDLoad>()); + static_cast<SIMDLoad*>(expression)->align = align; +} BinaryenExpressionRef BinaryenSIMDLoadGetPtr(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<SIMDLoad>()); return static_cast<SIMDLoad*>(expression)->ptr; } +void BinaryenSIMDLoadSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<SIMDLoad>()); + assert(ptrExpr); + static_cast<SIMDLoad*>(expression)->ptr = (Expression*)ptrExpr; +} // MemoryInit uint32_t BinaryenMemoryInitGetSegment(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryInit>()); return static_cast<MemoryInit*>(expression)->segment; } +void BinaryenMemoryInitSetSegment(BinaryenExpressionRef expr, + uint32_t segment) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryInit>()); + static_cast<MemoryInit*>(expression)->segment = segment; +} BinaryenExpressionRef BinaryenMemoryInitGetDest(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryInit>()); return static_cast<MemoryInit*>(expression)->dest; } +void BinaryenMemoryInitSetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryInit>()); + assert(destExpr); + static_cast<MemoryInit*>(expression)->dest = (Expression*)destExpr; +} BinaryenExpressionRef BinaryenMemoryInitGetOffset(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryInit>()); return static_cast<MemoryInit*>(expression)->offset; } +void BinaryenMemoryInitSetOffset(BinaryenExpressionRef expr, + BinaryenExpressionRef offsetExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryInit>()); + assert(offsetExpr); + static_cast<MemoryInit*>(expression)->offset = (Expression*)offsetExpr; +} BinaryenExpressionRef BinaryenMemoryInitGetSize(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryInit>()); return static_cast<MemoryInit*>(expression)->size; } +void BinaryenMemoryInitSetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryInit>()); + assert(sizeExpr); + static_cast<MemoryInit*>(expression)->size = (Expression*)sizeExpr; +} // DataDrop uint32_t BinaryenDataDropGetSegment(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<DataDrop>()); return static_cast<DataDrop*>(expression)->segment; } +void BinaryenDataDropSetSegment(BinaryenExpressionRef expr, uint32_t segment) { + auto* expression = (Expression*)expr; + assert(expression->is<DataDrop>()); + static_cast<DataDrop*>(expression)->segment = segment; +} // MemoryCopy BinaryenExpressionRef BinaryenMemoryCopyGetDest(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryCopy>()); return static_cast<MemoryCopy*>(expression)->dest; } +void BinaryenMemoryCopySetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryCopy>()); + assert(destExpr); + static_cast<MemoryCopy*>(expression)->dest = (Expression*)destExpr; +} BinaryenExpressionRef BinaryenMemoryCopyGetSource(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryCopy>()); return static_cast<MemoryCopy*>(expression)->source; } +void BinaryenMemoryCopySetSource(BinaryenExpressionRef expr, + BinaryenExpressionRef sourceExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryCopy>()); + assert(sourceExpr); + static_cast<MemoryCopy*>(expression)->source = (Expression*)sourceExpr; +} BinaryenExpressionRef BinaryenMemoryCopyGetSize(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryCopy>()); return static_cast<MemoryCopy*>(expression)->size; } +void BinaryenMemoryCopySetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryCopy>()); + assert(sizeExpr); + static_cast<MemoryCopy*>(expression)->size = (Expression*)sizeExpr; +} // MemoryFill BinaryenExpressionRef BinaryenMemoryFillGetDest(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryFill>()); return static_cast<MemoryFill*>(expression)->dest; } +void BinaryenMemoryFillSetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryFill>()); + assert(destExpr); + static_cast<MemoryFill*>(expression)->dest = (Expression*)destExpr; +} BinaryenExpressionRef BinaryenMemoryFillGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryFill>()); return static_cast<MemoryFill*>(expression)->value; } +void BinaryenMemoryFillSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryFill>()); + assert(valueExpr); + static_cast<MemoryFill*>(expression)->value = (Expression*)valueExpr; +} BinaryenExpressionRef BinaryenMemoryFillGetSize(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<MemoryFill>()); return static_cast<MemoryFill*>(expression)->size; } +void BinaryenMemoryFillSetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<MemoryFill>()); + assert(sizeExpr); + static_cast<MemoryFill*>(expression)->size = (Expression*)sizeExpr; +} // RefIsNull BinaryenExpressionRef BinaryenRefIsNullGetValue(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<RefIsNull>()); return static_cast<RefIsNull*>(expression)->value; } +void BinaryenRefIsNullSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<RefIsNull>()); + assert(valueExpr); + static_cast<RefIsNull*>(expression)->value = (Expression*)valueExpr; +} // RefFunc const char* BinaryenRefFuncGetFunc(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<RefFunc>()); return static_cast<RefFunc*>(expression)->func.c_str(); } +void BinaryenRefFuncSetFunc(BinaryenExpressionRef expr, const char* funcName) { + auto* expression = (Expression*)expr; + assert(expression->is<RefFunc>()); + static_cast<RefFunc*>(expression)->func = funcName; +} // Try BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Try>()); return static_cast<Try*>(expression)->body; } +void BinaryenTrySetBody(BinaryenExpressionRef expr, + BinaryenExpressionRef bodyExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + assert(bodyExpr); + static_cast<Try*>(expression)->body = (Expression*)bodyExpr; +} BinaryenExpressionRef BinaryenTryGetCatchBody(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Try>()); return static_cast<Try*>(expression)->catchBody; } +void BinaryenTrySetCatchBody(BinaryenExpressionRef expr, + BinaryenExpressionRef catchBodyExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Try>()); + assert(catchBodyExpr); + static_cast<Try*>(expression)->catchBody = (Expression*)catchBodyExpr; +} // Throw const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Throw>()); return static_cast<Throw*>(expression)->event.c_str(); } -BinaryenExpressionRef BinaryenThrowGetOperand(BinaryenExpressionRef expr, - BinaryenIndex index) { +void BinaryenThrowSetEvent(BinaryenExpressionRef expr, const char* eventName) { auto* expression = (Expression*)expr; assert(expression->is<Throw>()); - assert(index < static_cast<Throw*>(expression)->operands.size()); - return static_cast<Throw*>(expression)->operands[index]; + static_cast<Throw*>(expression)->event = eventName; } BinaryenIndex BinaryenThrowGetNumOperands(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Throw>()); return static_cast<Throw*>(expression)->operands.size(); } +BinaryenExpressionRef BinaryenThrowGetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Throw>()); + assert(index < static_cast<Throw*>(expression)->operands.size()); + return static_cast<Throw*>(expression)->operands[index]; +} +void BinaryenThrowSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Throw>()); + assert(index < static_cast<Throw*>(expression)->operands.size()); + assert(operandExpr); + static_cast<Throw*>(expression)->operands[index] = (Expression*)operandExpr; +} +BinaryenIndex BinaryenThrowAppendOperand(BinaryenExpressionRef expr, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Throw>()); + assert(operandExpr); + auto& list = static_cast<Throw*>(expression)->operands; + auto index = list.size(); + list.push_back((Expression*)operandExpr); + return index; +} +void BinaryenThrowInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Throw>()); + assert(operandExpr); + static_cast<Throw*>(expression) + ->operands.insertAt(index, (Expression*)operandExpr); +} +BinaryenExpressionRef BinaryenThrowRemoveOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<Throw>()); + return static_cast<Throw*>(expression)->operands.removeAt(index); +} // Rethrow BinaryenExpressionRef BinaryenRethrowGetExnref(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<Rethrow>()); return static_cast<Rethrow*>(expression)->exnref; } +void BinaryenRethrowSetExnref(BinaryenExpressionRef expr, + BinaryenExpressionRef exnrefExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<Rethrow>()); + assert(exnrefExpr); + static_cast<Rethrow*>(expression)->exnref = (Expression*)exnrefExpr; +} // BrOnExn const char* BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<BrOnExn>()); return static_cast<BrOnExn*>(expression)->event.c_str(); } +void BinaryenBrOnExnSetEvent(BinaryenExpressionRef expr, + const char* eventName) { + auto* expression = (Expression*)expr; + assert(expression->is<BrOnExn>()); + static_cast<BrOnExn*>(expression)->event = eventName; +} const char* BinaryenBrOnExnGetName(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<BrOnExn>()); return static_cast<BrOnExn*>(expression)->name.c_str(); } +void BinaryenBrOnExnSetName(BinaryenExpressionRef expr, const char* name) { + auto* expression = (Expression*)expr; + assert(expression->is<BrOnExn>()); + static_cast<BrOnExn*>(expression)->name = name; +} BinaryenExpressionRef BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<BrOnExn>()); return static_cast<BrOnExn*>(expression)->exnref; } +void BinaryenBrOnExnSetExnref(BinaryenExpressionRef expr, + BinaryenExpressionRef exnrefExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<BrOnExn>()); + assert(exnrefExpr); + static_cast<BrOnExn*>(expression)->exnref = (Expression*)exnrefExpr; +} // TupleMake BinaryenIndex BinaryenTupleMakeGetNumOperands(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<TupleMake>()); return static_cast<TupleMake*>(expression)->operands.size(); } -BinaryenExpressionRef BinaryenTupleMakeGetOperand(BinaryenExpressionRef expr, - BinaryenIndex index) { +BinaryenExpressionRef BinaryenTupleMakeGetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { auto* expression = (Expression*)expr; assert(expression->is<TupleMake>()); return static_cast<TupleMake*>(expression)->operands[index]; } +void BinaryenTupleMakeSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleMake>()); + assert(index < static_cast<TupleMake*>(expression)->operands.size()); + assert(operandExpr); + static_cast<TupleMake*>(expression)->operands[index] = + (Expression*)operandExpr; +} +BinaryenIndex +BinaryenTupleMakeAppendOperand(BinaryenExpressionRef expr, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleMake>()); + assert(operandExpr); + auto& list = static_cast<TupleMake*>(expression)->operands; + auto index = list.size(); + list.push_back((Expression*)operandExpr); + return index; +} +void BinaryenTupleMakeInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleMake>()); + assert(operandExpr); + static_cast<TupleMake*>(expression) + ->operands.insertAt(index, (Expression*)operandExpr); +} +BinaryenExpressionRef +BinaryenTupleMakeRemoveOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleMake>()); + return static_cast<TupleMake*>(expression)->operands.removeAt(index); +} + // TupleExtract BinaryenExpressionRef BinaryenTupleExtractGetTuple(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<TupleExtract>()); return static_cast<TupleExtract*>(expression)->tuple; } +void BinaryenTupleExtractSetTuple(BinaryenExpressionRef expr, + BinaryenExpressionRef tupleExpr) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleExtract>()); + assert(tupleExpr); + static_cast<TupleExtract*>(expression)->tuple = (Expression*)tupleExpr; +} BinaryenIndex BinaryenTupleExtractGetIndex(BinaryenExpressionRef expr) { auto* expression = (Expression*)expr; assert(expression->is<TupleExtract>()); return static_cast<TupleExtract*>(expression)->index; } +void BinaryenTupleExtractSetIndex(BinaryenExpressionRef expr, + BinaryenIndex index) { + auto* expression = (Expression*)expr; + assert(expression->is<TupleExtract>()); + static_cast<TupleExtract*>(expression)->index = index; +} // Functions @@ -2440,7 +3435,7 @@ void BinaryenModulePrintAsmjs(BinaryenModuleRef module) { auto* wasm = (Module*)module; Wasm2JSBuilder::Flags flags; Wasm2JSBuilder wasm2js(flags, globalPassOptions); - Ref asmjs = wasm2js.processWasm(wasm); + auto asmjs = wasm2js.processWasm(wasm); JSPrinter jser(true, true, asmjs); Output out("", Flags::Text); // stdout Wasm2JSGlue glue(*wasm, out, flags, "asmFunc"); @@ -2700,6 +3695,11 @@ BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, BinaryenExpressionRef BinaryenFunctionGetBody(BinaryenFunctionRef func) { return ((Function*)func)->body; } +void BinaryenFunctionSetBody(BinaryenFunctionRef func, + BinaryenExpressionRef body) { + assert(body); + ((Function*)func)->body = (Expression*)body; +} void BinaryenFunctionOptimize(BinaryenFunctionRef func, BinaryenModuleRef module) { PassRunner passRunner((Module*)module); diff --git a/src/binaryen-c.h b/src/binaryen-c.h index b153a28e9..b74993780 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -854,261 +854,1010 @@ BINARYEN_API BinaryenExpressionRef BinaryenTupleExtract( BINARYEN_API BinaryenExpressionRef BinaryenPop(BinaryenModuleRef module, BinaryenType type); +// Expression + +// Gets the id (kind) of the given expression. BINARYEN_API BinaryenExpressionId BinaryenExpressionGetId(BinaryenExpressionRef expr); +// Gets the type of the given expression. BINARYEN_API BinaryenType BinaryenExpressionGetType(BinaryenExpressionRef expr); +// Sets the type of the given expression. +BINARYEN_API void BinaryenExpressionSetType(BinaryenExpressionRef expr, + BinaryenType type); +// Prints text format of the given expression to stdout. BINARYEN_API void BinaryenExpressionPrint(BinaryenExpressionRef expr); +// Re-finalizes an expression after it has been modified. +BINARYEN_API void BinaryenExpressionFinalize(BinaryenExpressionRef expr); +// Makes a deep copy of the given expression. BINARYEN_API BinaryenExpressionRef BinaryenExpressionCopy(BinaryenExpressionRef expr, BinaryenModuleRef module); +// Block + +// Gets the name (label) of a `block` expression. BINARYEN_API const char* BinaryenBlockGetName(BinaryenExpressionRef expr); +// Sets the name (label) of a `block` expression. +BINARYEN_API void BinaryenBlockSetName(BinaryenExpressionRef expr, + const char* name); +// Gets the number of child expressions of a `block` expression. BINARYEN_API BinaryenIndex BinaryenBlockGetNumChildren(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenBlockGetChild(BinaryenExpressionRef expr, BinaryenIndex index); - +// Gets the child expression at the specified index of a `block` expression. +BINARYEN_API BinaryenExpressionRef +BinaryenBlockGetChildAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets (replaces) the child expression at the specified index of a `block` +// expression. +BINARYEN_API void BinaryenBlockSetChildAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef childExpr); +// Appends a child expression to a `block` expression, returning its insertion +// index. +BINARYEN_API BinaryenIndex BinaryenBlockAppendChild( + BinaryenExpressionRef expr, BinaryenExpressionRef childExpr); +// Inserts a child expression at the specified index of a `block` expression, +// moving existing children including the one previously at that index one index +// up. +BINARYEN_API void BinaryenBlockInsertChildAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef childExpr); +// Removes the child expression at the specified index of a `block` expression, +// moving all subsequent children one index down. Returns the child expression. +BINARYEN_API BinaryenExpressionRef +BinaryenBlockRemoveChildAt(BinaryenExpressionRef expr, BinaryenIndex index); + +// If + +// Gets the condition expression of an `if` expression. BINARYEN_API BinaryenExpressionRef BinaryenIfGetCondition(BinaryenExpressionRef expr); +// Sets the condition expression of an `if` expression. +BINARYEN_API void BinaryenIfSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr); +// Gets the ifTrue (then) expression of an `if` expression. BINARYEN_API BinaryenExpressionRef BinaryenIfGetIfTrue(BinaryenExpressionRef expr); +// Sets the ifTrue (then) expression of an `if` expression. +BINARYEN_API void BinaryenIfSetIfTrue(BinaryenExpressionRef expr, + BinaryenExpressionRef ifTrueExpr); +// Gets the ifFalse (else) expression, if any, of an `if` expression. BINARYEN_API BinaryenExpressionRef BinaryenIfGetIfFalse(BinaryenExpressionRef expr); +// Sets the ifFalse (else) expression, if any, of an `if` expression. +BINARYEN_API void BinaryenIfSetIfFalse(BinaryenExpressionRef expr, + BinaryenExpressionRef ifFalseExpr); + +// Loop +// Gets the name (label) of a `loop` expression. BINARYEN_API const char* BinaryenLoopGetName(BinaryenExpressionRef expr); +// Sets the name (label) of a `loop` expression. +BINARYEN_API void BinaryenLoopSetName(BinaryenExpressionRef expr, + const char* name); +// Gets the body expression of a `loop` expression. BINARYEN_API BinaryenExpressionRef BinaryenLoopGetBody(BinaryenExpressionRef expr); +// Sets the body expression of a `loop` expression. +BINARYEN_API void BinaryenLoopSetBody(BinaryenExpressionRef expr, + BinaryenExpressionRef bodyExpr); + +// Break +// Gets the name (target label) of a `br` or `br_if` expression. BINARYEN_API const char* BinaryenBreakGetName(BinaryenExpressionRef expr); +// Sets the name (target label) of a `br` or `br_if` expression. +BINARYEN_API void BinaryenBreakSetName(BinaryenExpressionRef expr, + const char* name); +// Gets the condition expression, if any, of a `br_if` expression. No condition +// indicates a `br` expression. BINARYEN_API BinaryenExpressionRef BinaryenBreakGetCondition(BinaryenExpressionRef expr); +// Sets the condition expression, if any, of a `br_if` expression. No condition +// makes it a `br` expression. +BINARYEN_API void BinaryenBreakSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr); +// Gets the value expression, if any, of a `br` or `br_if` expression. BINARYEN_API BinaryenExpressionRef BinaryenBreakGetValue(BinaryenExpressionRef expr); +// Sets the value expression, if any, of a `br` or `br_if` expression. +BINARYEN_API void BinaryenBreakSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// Switch +// Gets the number of names (target labels) of a `br_table` expression. BINARYEN_API BinaryenIndex BinaryenSwitchGetNumNames(BinaryenExpressionRef expr); -BINARYEN_API const char* BinaryenSwitchGetName(BinaryenExpressionRef expr, - BinaryenIndex index); +// Gets the name (target label) at the specified index of a `br_table` +// expression. +BINARYEN_API const char* BinaryenSwitchGetNameAt(BinaryenExpressionRef expr, + BinaryenIndex index); +// Sets the name (target label) at the specified index of a `br_table` +// expression. +BINARYEN_API void BinaryenSwitchSetNameAt(BinaryenExpressionRef expr, + BinaryenIndex index, + const char* name); +// Appends a name to a `br_table` expression, returning its insertion index. +BINARYEN_API BinaryenIndex BinaryenSwitchAppendName(BinaryenExpressionRef expr, + const char* name); +// Inserts a name at the specified index of a `br_table` expression, moving +// existing names including the one previously at that index one index up. +BINARYEN_API void BinaryenSwitchInsertNameAt(BinaryenExpressionRef expr, + BinaryenIndex index, + const char* name); +// Removes the name at the specified index of a `br_table` expression, moving +// all subsequent names one index down. Returns the name. +BINARYEN_API const char* BinaryenSwitchRemoveNameAt(BinaryenExpressionRef expr, + BinaryenIndex index); +// Gets the default name (target label), if any, of a `br_table` expression. BINARYEN_API const char* BinaryenSwitchGetDefaultName(BinaryenExpressionRef expr); +// Sets the default name (target label), if any, of a `br_table` expression. +BINARYEN_API void BinaryenSwitchSetDefaultName(BinaryenExpressionRef expr, + const char* name); +// Gets the condition expression of a `br_table` expression. BINARYEN_API BinaryenExpressionRef BinaryenSwitchGetCondition(BinaryenExpressionRef expr); +// Sets the condition expression of a `br_table` expression. +BINARYEN_API void BinaryenSwitchSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr); +// Gets the value expression, if any, of a `br_table` expression. BINARYEN_API BinaryenExpressionRef BinaryenSwitchGetValue(BinaryenExpressionRef expr); +// Sets the value expression, if any, of a `br_table` expression. +BINARYEN_API void BinaryenSwitchSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); -BINARYEN_API int BinaryenCallIsReturn(BinaryenExpressionRef expr); +// Call + +// Gets the target function name of a `call` expression. BINARYEN_API const char* BinaryenCallGetTarget(BinaryenExpressionRef expr); +// Sets the target function name of a `call` expression. +BINARYEN_API void BinaryenCallSetTarget(BinaryenExpressionRef expr, + const char* target); +// Gets the number of operands of a `call` expression. BINARYEN_API BinaryenIndex BinaryenCallGetNumOperands(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenCallGetOperand(BinaryenExpressionRef expr, BinaryenIndex index); +// Gets the operand expression at the specified index of a `call` expression. +BINARYEN_API BinaryenExpressionRef +BinaryenCallGetOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the operand expression at the specified index of a `call` expression. +BINARYEN_API void BinaryenCallSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Appends an operand expression to a `call` expression, returning its insertion +// index. +BINARYEN_API BinaryenIndex BinaryenCallAppendOperand( + BinaryenExpressionRef expr, BinaryenExpressionRef operandExpr); +// Inserts an operand expression at the specified index of a `call` expression, +// moving existing operands including the one previously at that index one index +// up. +BINARYEN_API void +BinaryenCallInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Removes the operand expression at the specified index of a `call` expression, +// moving all subsequent operands one index down. Returns the operand +// expression. +BINARYEN_API BinaryenExpressionRef +BinaryenCallRemoveOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Gets whether the specified `call` expression is a tail call. +BINARYEN_API int BinaryenCallIsReturn(BinaryenExpressionRef expr); +// Sets whether the specified `call` expression is a tail call. +BINARYEN_API void BinaryenCallSetReturn(BinaryenExpressionRef expr, + int isReturn); -BINARYEN_API int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr); +// CallIndirect + +// Gets the target expression of a `call_indirect` expression. BINARYEN_API BinaryenExpressionRef BinaryenCallIndirectGetTarget(BinaryenExpressionRef expr); +// Sets the target expression of a `call_indirect` expression. +BINARYEN_API void +BinaryenCallIndirectSetTarget(BinaryenExpressionRef expr, + BinaryenExpressionRef targetExpr); +// Gets the number of operands of a `call_indirect` expression. BINARYEN_API BinaryenIndex BinaryenCallIndirectGetNumOperands(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenCallIndirectGetOperand(BinaryenExpressionRef expr, BinaryenIndex index); +// Gets the operand expression at the specified index of a `call_indirect` +// expression. +BINARYEN_API BinaryenExpressionRef BinaryenCallIndirectGetOperandAt( + BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the operand expression at the specified index of a `call_indirect` +// expression. +BINARYEN_API void +BinaryenCallIndirectSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Appends an operand expression to a `call_indirect` expression, returning its +// insertion index. +BINARYEN_API BinaryenIndex BinaryenCallIndirectAppendOperand( + BinaryenExpressionRef expr, BinaryenExpressionRef operandExpr); +// Inserts an operand expression at the specified index of a `call_indirect` +// expression, moving existing operands including the one previously at that +// index one index up. +BINARYEN_API void +BinaryenCallIndirectInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Removes the operand expression at the specified index of a `call_indirect` +// expression, moving all subsequent operands one index down. Returns the +// operand expression. +BINARYEN_API BinaryenExpressionRef BinaryenCallIndirectRemoveOperandAt( + BinaryenExpressionRef expr, BinaryenIndex index); +// Gets whether the specified `call_indirect` expression is a tail call. +BINARYEN_API int BinaryenCallIndirectIsReturn(BinaryenExpressionRef expr); +// Sets whether the specified `call_indirect` expression is a tail call. +BINARYEN_API void BinaryenCallIndirectSetReturn(BinaryenExpressionRef expr, + int isReturn); +// Gets the parameter types of the specified `call_indirect` expression. +BINARYEN_API BinaryenType +BinaryenCallIndirectGetParams(BinaryenExpressionRef expr); +// Sets the parameter types of the specified `call_indirect` expression. +BINARYEN_API void BinaryenCallIndirectSetParams(BinaryenExpressionRef expr, + BinaryenType params); +// Gets the result types of the specified `call_indirect` expression. +BINARYEN_API BinaryenType +BinaryenCallIndirectGetResults(BinaryenExpressionRef expr); +// Sets the result types of the specified `call_indirect` expression. +BINARYEN_API void BinaryenCallIndirectSetResults(BinaryenExpressionRef expr, + BinaryenType params); + +// LocalGet +// Gets the local index of a `local.get` expression. BINARYEN_API BinaryenIndex BinaryenLocalGetGetIndex(BinaryenExpressionRef expr); +// Sets the local index of a `local.get` expression. +BINARYEN_API void BinaryenLocalGetSetIndex(BinaryenExpressionRef expr, + BinaryenIndex index); +// LocalSet + +// Gets whether a `local.set` tees its value (is a `local.tee`). True if the +// expression has a type other than `none`. BINARYEN_API int BinaryenLocalSetIsTee(BinaryenExpressionRef expr); +// Gets the local index of a `local.set` or `local.tee` expression. BINARYEN_API BinaryenIndex BinaryenLocalSetGetIndex(BinaryenExpressionRef expr); +// Sets the local index of a `local.set` or `local.tee` expression. +BINARYEN_API void BinaryenLocalSetSetIndex(BinaryenExpressionRef expr, + BinaryenIndex index); +// Gets the value expression of a `local.set` or `local.tee` expression. BINARYEN_API BinaryenExpressionRef BinaryenLocalSetGetValue(BinaryenExpressionRef expr); +// Sets the value expression of a `local.set` or `local.tee` expression. +BINARYEN_API void BinaryenLocalSetSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// GlobalGet +// Gets the name of the global being accessed by a `global.get` expression. BINARYEN_API const char* BinaryenGlobalGetGetName(BinaryenExpressionRef expr); +// Sets the name of the global being accessed by a `global.get` expression. +BINARYEN_API void BinaryenGlobalGetSetName(BinaryenExpressionRef expr, + const char* name); +// GlobalSet + +// Gets the name of the global being accessed by a `global.set` expression. BINARYEN_API const char* BinaryenGlobalSetGetName(BinaryenExpressionRef expr); +// Sets the name of the global being accessed by a `global.set` expression. +BINARYEN_API void BinaryenGlobalSetSetName(BinaryenExpressionRef expr, + const char* name); +// Gets the value expression of a `global.set` expression. BINARYEN_API BinaryenExpressionRef BinaryenGlobalSetGetValue(BinaryenExpressionRef expr); +// Sets the value expression of a `global.set` expression. +BINARYEN_API void BinaryenGlobalSetSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// Host +// Gets the operation being performed by a host expression. BINARYEN_API BinaryenOp BinaryenHostGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a host expression. +BINARYEN_API void BinaryenHostSetOp(BinaryenExpressionRef expr, BinaryenOp op); +// Gets the name operand, if any, of a host expression. BINARYEN_API const char* BinaryenHostGetNameOperand(BinaryenExpressionRef expr); +// Sets the name operand, if any, of a host expression. +BINARYEN_API void BinaryenHostSetNameOperand(BinaryenExpressionRef expr, + const char* nameOperand); +// Gets the number of operands of a host expression. BINARYEN_API BinaryenIndex BinaryenHostGetNumOperands(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenHostGetOperand(BinaryenExpressionRef expr, BinaryenIndex index); - +// Gets the operand at the specified index of a host expression. +BINARYEN_API BinaryenExpressionRef +BinaryenHostGetOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the operand at the specified index of a host expression. +BINARYEN_API void BinaryenHostSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Appends an operand expression to a host expression, returning its insertion +// index. +BINARYEN_API BinaryenIndex BinaryenHostAppendOperand( + BinaryenExpressionRef expr, BinaryenExpressionRef operandExpr); +// Inserts an operand expression at the specified index of a host expression, +// moving existing operands including the one previously at that index one index +// up. +BINARYEN_API void +BinaryenHostInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Removes the operand expression at the specified index of a host expression, +// moving all subsequent operands one index down. Returns the operand +// expression. +BINARYEN_API BinaryenExpressionRef +BinaryenHostRemoveOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); + +// Load + +// Gets whether a `load` expression is atomic (is an `atomic.load`). BINARYEN_API int BinaryenLoadIsAtomic(BinaryenExpressionRef expr); +// Sets whether a `load` expression is atomic (is an `atomic.load`). +BINARYEN_API void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, + int isAtomic); +// Gets whether a `load` expression operates on a signed value (`_s`). BINARYEN_API int BinaryenLoadIsSigned(BinaryenExpressionRef expr); +// Sets whether a `load` expression operates on a signed value (`_s`). +BINARYEN_API void BinaryenLoadSetSigned(BinaryenExpressionRef expr, + int isSigned); +// Gets the constant offset of a `load` expression. BINARYEN_API uint32_t BinaryenLoadGetOffset(BinaryenExpressionRef expr); +// Sets the constant offset of a `load` expression. +BINARYEN_API void BinaryenLoadSetOffset(BinaryenExpressionRef expr, + uint32_t offset); +// Gets the number of bytes loaded by a `load` expression. BINARYEN_API uint32_t BinaryenLoadGetBytes(BinaryenExpressionRef expr); +// Sets the number of bytes loaded by a `load` expression. +BINARYEN_API void BinaryenLoadSetBytes(BinaryenExpressionRef expr, + uint32_t bytes); +// Gets the byte alignment of a `load` expression. BINARYEN_API uint32_t BinaryenLoadGetAlign(BinaryenExpressionRef expr); +// Sets the byte alignment of a `load` expression. +BINARYEN_API void BinaryenLoadSetAlign(BinaryenExpressionRef expr, + uint32_t align); +// Gets the pointer expression of a `load` expression. BINARYEN_API BinaryenExpressionRef BinaryenLoadGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of a `load` expression. +BINARYEN_API void BinaryenLoadSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Store + +// Gets whether a `store` expression is atomic (is an `atomic.store`). BINARYEN_API int BinaryenStoreIsAtomic(BinaryenExpressionRef expr); +// Sets whether a `store` expression is atomic (is an `atomic.store`). +BINARYEN_API void BinaryenStoreSetAtomic(BinaryenExpressionRef expr, + int isAtomic); +// Gets the number of bytes stored by a `store` expression. BINARYEN_API uint32_t BinaryenStoreGetBytes(BinaryenExpressionRef expr); +// Sets the number of bytes stored by a `store` expression. +BINARYEN_API void BinaryenStoreSetBytes(BinaryenExpressionRef expr, + uint32_t bytes); +// Gets the constant offset of a `store` expression. BINARYEN_API uint32_t BinaryenStoreGetOffset(BinaryenExpressionRef expr); +// Sets the constant offset of a `store` expression. +BINARYEN_API void BinaryenStoreSetOffset(BinaryenExpressionRef expr, + uint32_t offset); +// Gets the byte alignment of a `store` expression. BINARYEN_API uint32_t BinaryenStoreGetAlign(BinaryenExpressionRef expr); +// Sets the byte alignment of a `store` expression. +BINARYEN_API void BinaryenStoreSetAlign(BinaryenExpressionRef expr, + uint32_t align); +// Gets the pointer expression of a `store` expression. BINARYEN_API BinaryenExpressionRef BinaryenStoreGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of a `store` expression. +BINARYEN_API void BinaryenStoreSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Gets the value expression of a `store` expression. BINARYEN_API BinaryenExpressionRef BinaryenStoreGetValue(BinaryenExpressionRef expr); - +// Sets the value expression of a `store` expression. +BINARYEN_API void BinaryenStoreSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); +// Gets the value type of a `store` expression. +BINARYEN_API BinaryenType BinaryenStoreGetValueType(BinaryenExpressionRef expr); +// Sets the value type of a `store` expression. +BINARYEN_API void BinaryenStoreSetValueType(BinaryenExpressionRef expr, + BinaryenType valueType); + +// Const + +// Gets the 32-bit integer value of an `i32.const` expression. BINARYEN_API int32_t BinaryenConstGetValueI32(BinaryenExpressionRef expr); +// Sets the 32-bit integer value of an `i32.const` expression. +BINARYEN_API void BinaryenConstSetValueI32(BinaryenExpressionRef expr, + int32_t value); +// Gets the 64-bit integer value of an `i64.const` expression. BINARYEN_API int64_t BinaryenConstGetValueI64(BinaryenExpressionRef expr); +// Sets the 64-bit integer value of an `i64.const` expression. +BINARYEN_API void BinaryenConstSetValueI64(BinaryenExpressionRef expr, + int64_t value); +// Gets the low 32-bits of the 64-bit integer value of an `i64.const` +// expression. BINARYEN_API int32_t BinaryenConstGetValueI64Low(BinaryenExpressionRef expr); +// Sets the low 32-bits of the 64-bit integer value of an `i64.const` +// expression. +BINARYEN_API void BinaryenConstSetValueI64Low(BinaryenExpressionRef expr, + int32_t valueLow); +// Gets the high 32-bits of the 64-bit integer value of an `i64.const` +// expression. BINARYEN_API int32_t BinaryenConstGetValueI64High(BinaryenExpressionRef expr); +// Sets the high 32-bits of the 64-bit integer value of an `i64.const` +// expression. +BINARYEN_API void BinaryenConstSetValueI64High(BinaryenExpressionRef expr, + int32_t valueHigh); +// Gets the 32-bit float value of a `f32.const` expression. BINARYEN_API float BinaryenConstGetValueF32(BinaryenExpressionRef expr); +// Sets the 32-bit float value of a `f32.const` expression. +BINARYEN_API void BinaryenConstSetValueF32(BinaryenExpressionRef expr, + float value); +// Gets the 64-bit float (double) value of a `f64.const` expression. BINARYEN_API double BinaryenConstGetValueF64(BinaryenExpressionRef expr); +// Sets the 64-bit float (double) value of a `f64.const` expression. +BINARYEN_API void BinaryenConstSetValueF64(BinaryenExpressionRef expr, + double value); +// Reads the 128-bit vector value of a `v128.const` expression. BINARYEN_API void BinaryenConstGetValueV128(BinaryenExpressionRef expr, uint8_t* out); +// Sets the 128-bit vector value of a `v128.const` expression. +BINARYEN_API void BinaryenConstSetValueV128(BinaryenExpressionRef expr, + const uint8_t value[16]); +// Unary + +// Gets the operation being performed by a unary expression. BINARYEN_API BinaryenOp BinaryenUnaryGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a unary expression. +BINARYEN_API void BinaryenUnarySetOp(BinaryenExpressionRef expr, BinaryenOp op); +// Gets the value expression of a unary expression. BINARYEN_API BinaryenExpressionRef BinaryenUnaryGetValue(BinaryenExpressionRef expr); +// Sets the value expression of a unary expression. +BINARYEN_API void BinaryenUnarySetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// Binary +// Gets the operation being performed by a binary expression. BINARYEN_API BinaryenOp BinaryenBinaryGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a binary expression. +BINARYEN_API void BinaryenBinarySetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the left expression of a binary expression. BINARYEN_API BinaryenExpressionRef BinaryenBinaryGetLeft(BinaryenExpressionRef expr); +// Sets the left expression of a binary expression. +BINARYEN_API void BinaryenBinarySetLeft(BinaryenExpressionRef expr, + BinaryenExpressionRef leftExpr); +// Gets the right expression of a binary expression. BINARYEN_API BinaryenExpressionRef BinaryenBinaryGetRight(BinaryenExpressionRef expr); +// Sets the right expression of a binary expression. +BINARYEN_API void BinaryenBinarySetRight(BinaryenExpressionRef expr, + BinaryenExpressionRef rightExpr); +// Select + +// Gets the expression becoming selected by a `select` expression if the +// condition turns out true. BINARYEN_API BinaryenExpressionRef BinaryenSelectGetIfTrue(BinaryenExpressionRef expr); +// Sets the expression becoming selected by a `select` expression if the +// condition turns out true. +BINARYEN_API void BinaryenSelectSetIfTrue(BinaryenExpressionRef expr, + BinaryenExpressionRef ifTrueExpr); +// Gets the expression becoming selected by a `select` expression if the +// condition turns out false. BINARYEN_API BinaryenExpressionRef BinaryenSelectGetIfFalse(BinaryenExpressionRef expr); +// Sets the expression becoming selected by a `select` expression if the +// condition turns out false. +BINARYEN_API void BinaryenSelectSetIfFalse(BinaryenExpressionRef expr, + BinaryenExpressionRef ifFalseExpr); +// Gets the condition expression of a `select` expression. BINARYEN_API BinaryenExpressionRef BinaryenSelectGetCondition(BinaryenExpressionRef expr); +// Sets the condition expression of a `select` expression. +BINARYEN_API void BinaryenSelectSetCondition(BinaryenExpressionRef expr, + BinaryenExpressionRef condExpr); + +// Drop +// Gets the value expression being dropped by a `drop` expression. BINARYEN_API BinaryenExpressionRef BinaryenDropGetValue(BinaryenExpressionRef expr); +// Sets the value expression being dropped by a `drop` expression. +BINARYEN_API void BinaryenDropSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); +// Return + +// Gets the value expression, if any, being returned by a `return` expression. BINARYEN_API BinaryenExpressionRef BinaryenReturnGetValue(BinaryenExpressionRef expr); +// Sets the value expression, if any, being returned by a `return` expression. +BINARYEN_API void BinaryenReturnSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// AtomicRMW +// Gets the operation being performed by an atomic read-modify-write expression. BINARYEN_API BinaryenOp BinaryenAtomicRMWGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by an atomic read-modify-write expression. +BINARYEN_API void BinaryenAtomicRMWSetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the number of bytes affected by an atomic read-modify-write expression. BINARYEN_API uint32_t BinaryenAtomicRMWGetBytes(BinaryenExpressionRef expr); +// Sets the number of bytes affected by an atomic read-modify-write expression. +BINARYEN_API void BinaryenAtomicRMWSetBytes(BinaryenExpressionRef expr, + uint32_t bytes); +// Gets the constant offset of an atomic read-modify-write expression. BINARYEN_API uint32_t BinaryenAtomicRMWGetOffset(BinaryenExpressionRef expr); +// Sets the constant offset of an atomic read-modify-write expression. +BINARYEN_API void BinaryenAtomicRMWSetOffset(BinaryenExpressionRef expr, + uint32_t offset); +// Gets the pointer expression of an atomic read-modify-write expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicRMWGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of an atomic read-modify-write expression. +BINARYEN_API void BinaryenAtomicRMWSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Gets the value expression of an atomic read-modify-write expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicRMWGetValue(BinaryenExpressionRef expr); +// Sets the value expression of an atomic read-modify-write expression. +BINARYEN_API void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); +// AtomicCmpxchg + +// Gets the number of bytes affected by an atomic compare and exchange +// expression. BINARYEN_API uint32_t BinaryenAtomicCmpxchgGetBytes(BinaryenExpressionRef expr); +// Sets the number of bytes affected by an atomic compare and exchange +// expression. +BINARYEN_API void BinaryenAtomicCmpxchgSetBytes(BinaryenExpressionRef expr, + uint32_t bytes); +// Gets the constant offset of an atomic compare and exchange expression. BINARYEN_API uint32_t BinaryenAtomicCmpxchgGetOffset(BinaryenExpressionRef expr); +// Sets the constant offset of an atomic compare and exchange expression. +BINARYEN_API void BinaryenAtomicCmpxchgSetOffset(BinaryenExpressionRef expr, + uint32_t offset); +// Gets the pointer expression of an atomic compare and exchange expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicCmpxchgGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of an atomic compare and exchange expression. +BINARYEN_API void BinaryenAtomicCmpxchgSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Gets the expression representing the expected value of an atomic compare and +// exchange expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicCmpxchgGetExpected(BinaryenExpressionRef expr); +// Sets the expression representing the expected value of an atomic compare and +// exchange expression. +BINARYEN_API void +BinaryenAtomicCmpxchgSetExpected(BinaryenExpressionRef expr, + BinaryenExpressionRef expectedExpr); +// Gets the replacement expression of an atomic compare and exchange expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicCmpxchgGetReplacement(BinaryenExpressionRef expr); +// Sets the replacement expression of an atomic compare and exchange expression. +BINARYEN_API void +BinaryenAtomicCmpxchgSetReplacement(BinaryenExpressionRef expr, + BinaryenExpressionRef replacementExpr); + +// AtomicWait +// Gets the pointer expression of an `atomic.wait` expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicWaitGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of an `atomic.wait` expression. +BINARYEN_API void BinaryenAtomicWaitSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Gets the expression representing the expected value of an `atomic.wait` +// expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicWaitGetExpected(BinaryenExpressionRef expr); +// Sets the expression representing the expected value of an `atomic.wait` +// expression. +BINARYEN_API void +BinaryenAtomicWaitSetExpected(BinaryenExpressionRef expr, + BinaryenExpressionRef expectedExpr); +// Gets the timeout expression of an `atomic.wait` expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicWaitGetTimeout(BinaryenExpressionRef expr); +// Sets the timeout expression of an `atomic.wait` expression. +BINARYEN_API void +BinaryenAtomicWaitSetTimeout(BinaryenExpressionRef expr, + BinaryenExpressionRef timeoutExpr); +// Gets the expected type of an `atomic.wait` expression. BINARYEN_API BinaryenType BinaryenAtomicWaitGetExpectedType(BinaryenExpressionRef expr); +// Sets the expected type of an `atomic.wait` expression. +BINARYEN_API void BinaryenAtomicWaitSetExpectedType(BinaryenExpressionRef expr, + BinaryenType expectedType); +// AtomicNotify + +// Gets the pointer expression of an `atomic.notify` expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicNotifyGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of an `atomic.notify` expression. +BINARYEN_API void BinaryenAtomicNotifySetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// Gets the notify count expression of an `atomic.notify` expression. BINARYEN_API BinaryenExpressionRef BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr); +// Sets the notify count expression of an `atomic.notify` expression. +BINARYEN_API void +BinaryenAtomicNotifySetNotifyCount(BinaryenExpressionRef expr, + BinaryenExpressionRef notifyCountExpr); + +// AtomicFence +// Gets the order of an `atomic.fence` expression. BINARYEN_API uint8_t BinaryenAtomicFenceGetOrder(BinaryenExpressionRef expr); +// Sets the order of an `atomic.fence` expression. +BINARYEN_API void BinaryenAtomicFenceSetOrder(BinaryenExpressionRef expr, + uint8_t order); +// SIMDExtract + +// Gets the operation being performed by a SIMD extract expression. BINARYEN_API BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a SIMD extract expression. +BINARYEN_API void BinaryenSIMDExtractSetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the vector expression a SIMD extract expression extracts from. BINARYEN_API BinaryenExpressionRef BinaryenSIMDExtractGetVec(BinaryenExpressionRef expr); +// Sets the vector expression a SIMD extract expression extracts from. +BINARYEN_API void BinaryenSIMDExtractSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr); +// Gets the index of the extracted lane of a SIMD extract expression. BINARYEN_API uint8_t BinaryenSIMDExtractGetIndex(BinaryenExpressionRef expr); +// Sets the index of the extracted lane of a SIMD extract expression. +BINARYEN_API void BinaryenSIMDExtractSetIndex(BinaryenExpressionRef expr, + uint8_t index); + +// SIMDReplace +// Gets the operation being performed by a SIMD replace expression. BINARYEN_API BinaryenOp BinaryenSIMDReplaceGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a SIMD replace expression. +BINARYEN_API void BinaryenSIMDReplaceSetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the vector expression a SIMD replace expression replaces in. BINARYEN_API BinaryenExpressionRef BinaryenSIMDReplaceGetVec(BinaryenExpressionRef expr); +// Sets the vector expression a SIMD replace expression replaces in. +BINARYEN_API void BinaryenSIMDReplaceSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr); +// Gets the index of the replaced lane of a SIMD replace expression. BINARYEN_API uint8_t BinaryenSIMDReplaceGetIndex(BinaryenExpressionRef expr); +// Sets the index of the replaced lane of a SIMD replace expression. +BINARYEN_API void BinaryenSIMDReplaceSetIndex(BinaryenExpressionRef expr, + uint8_t index); +// Gets the value expression a SIMD replace expression replaces with. BINARYEN_API BinaryenExpressionRef BinaryenSIMDReplaceGetValue(BinaryenExpressionRef expr); +// Sets the value expression a SIMD replace expression replaces with. +BINARYEN_API void BinaryenSIMDReplaceSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); +// SIMDShuffle + +// Gets the left expression of a SIMD shuffle expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDShuffleGetLeft(BinaryenExpressionRef expr); +// Sets the left expression of a SIMD shuffle expression. +BINARYEN_API void BinaryenSIMDShuffleSetLeft(BinaryenExpressionRef expr, + BinaryenExpressionRef leftExpr); +// Gets the right expression of a SIMD shuffle expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDShuffleGetRight(BinaryenExpressionRef expr); +// Sets the right expression of a SIMD shuffle expression. +BINARYEN_API void BinaryenSIMDShuffleSetRight(BinaryenExpressionRef expr, + BinaryenExpressionRef rightExpr); +// Gets the 128-bit mask of a SIMD shuffle expression. BINARYEN_API void BinaryenSIMDShuffleGetMask(BinaryenExpressionRef expr, uint8_t* mask); +// Sets the 128-bit mask of a SIMD shuffle expression. +BINARYEN_API void BinaryenSIMDShuffleSetMask(BinaryenExpressionRef expr, + const uint8_t mask[16]); + +// SIMDTernary +// Gets the operation being performed by a SIMD ternary expression. BINARYEN_API BinaryenOp BinaryenSIMDTernaryGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a SIMD ternary expression. +BINARYEN_API void BinaryenSIMDTernarySetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the first operand expression of a SIMD ternary expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDTernaryGetA(BinaryenExpressionRef expr); +// Sets the first operand expression of a SIMD ternary expression. +BINARYEN_API void BinaryenSIMDTernarySetA(BinaryenExpressionRef expr, + BinaryenExpressionRef aExpr); +// Gets the second operand expression of a SIMD ternary expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDTernaryGetB(BinaryenExpressionRef expr); +// Sets the second operand expression of a SIMD ternary expression. +BINARYEN_API void BinaryenSIMDTernarySetB(BinaryenExpressionRef expr, + BinaryenExpressionRef bExpr); +// Gets the third operand expression of a SIMD ternary expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDTernaryGetC(BinaryenExpressionRef expr); +// Sets the third operand expression of a SIMD ternary expression. +BINARYEN_API void BinaryenSIMDTernarySetC(BinaryenExpressionRef expr, + BinaryenExpressionRef cExpr); +// SIMDShift + +// Gets the operation being performed by a SIMD shift expression. BINARYEN_API BinaryenOp BinaryenSIMDShiftGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a SIMD shift expression. +BINARYEN_API void BinaryenSIMDShiftSetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the expression being shifted by a SIMD shift expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDShiftGetVec(BinaryenExpressionRef expr); +// Sets the expression being shifted by a SIMD shift expression. +BINARYEN_API void BinaryenSIMDShiftSetVec(BinaryenExpressionRef expr, + BinaryenExpressionRef vecExpr); +// Gets the expression representing the shift of a SIMD shift expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDShiftGetShift(BinaryenExpressionRef expr); +// Sets the expression representing the shift of a SIMD shift expression. +BINARYEN_API void BinaryenSIMDShiftSetShift(BinaryenExpressionRef expr, + BinaryenExpressionRef shiftExpr); + +// SIMDLoad +// Gets the operation being performed by a SIMD load expression. BINARYEN_API BinaryenOp BinaryenSIMDLoadGetOp(BinaryenExpressionRef expr); +// Sets the operation being performed by a SIMD load expression. +BINARYEN_API void BinaryenSIMDLoadSetOp(BinaryenExpressionRef expr, + BinaryenOp op); +// Gets the constant offset of a SIMD load expression. BINARYEN_API uint32_t BinaryenSIMDLoadGetOffset(BinaryenExpressionRef expr); +// Sets the constant offset of a SIMD load expression. +BINARYEN_API void BinaryenSIMDLoadSetOffset(BinaryenExpressionRef expr, + uint32_t offset); +// Gets the byte alignment of a SIMD load expression. BINARYEN_API uint32_t BinaryenSIMDLoadGetAlign(BinaryenExpressionRef expr); +// Sets the byte alignment of a SIMD load expression. +BINARYEN_API void BinaryenSIMDLoadSetAlign(BinaryenExpressionRef expr, + uint32_t align); +// Gets the pointer expression of a SIMD load expression. BINARYEN_API BinaryenExpressionRef BinaryenSIMDLoadGetPtr(BinaryenExpressionRef expr); +// Sets the pointer expression of a SIMD load expression. +BINARYEN_API void BinaryenSIMDLoadSetPtr(BinaryenExpressionRef expr, + BinaryenExpressionRef ptrExpr); +// MemoryInit + +// Gets the index of the segment being initialized by a `memory.init` +// expression. BINARYEN_API uint32_t BinaryenMemoryInitGetSegment(BinaryenExpressionRef expr); +// Sets the index of the segment being initialized by a `memory.init` +// expression. +BINARYEN_API void BinaryenMemoryInitSetSegment(BinaryenExpressionRef expr, + uint32_t segmentIndex); +// Gets the destination expression of a `memory.init` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryInitGetDest(BinaryenExpressionRef expr); +// Sets the destination expression of a `memory.init` expression. +BINARYEN_API void BinaryenMemoryInitSetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr); +// Gets the offset expression of a `memory.init` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryInitGetOffset(BinaryenExpressionRef expr); +// Sets the offset expression of a `memory.init` expression. +BINARYEN_API void BinaryenMemoryInitSetOffset(BinaryenExpressionRef expr, + BinaryenExpressionRef offsetExpr); +// Gets the size expression of a `memory.init` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryInitGetSize(BinaryenExpressionRef expr); +// Sets the size expression of a `memory.init` expression. +BINARYEN_API void BinaryenMemoryInitSetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr); + +// DataDrop +// Gets the index of the segment being dropped by a `memory.drop` expression. BINARYEN_API uint32_t BinaryenDataDropGetSegment(BinaryenExpressionRef expr); +// Sets the index of the segment being dropped by a `memory.drop` expression. +BINARYEN_API void BinaryenDataDropSetSegment(BinaryenExpressionRef expr, + uint32_t segmentIndex); +// MemoryCopy + +// Gets the destination expression of a `memory.copy` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryCopyGetDest(BinaryenExpressionRef expr); +// Sets the destination expression of a `memory.copy` expression. +BINARYEN_API void BinaryenMemoryCopySetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr); +// Gets the source expression of a `memory.copy` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryCopyGetSource(BinaryenExpressionRef expr); +// Sets the source expression of a `memory.copy` expression. +BINARYEN_API void BinaryenMemoryCopySetSource(BinaryenExpressionRef expr, + BinaryenExpressionRef sourceExpr); +// Gets the size expression (number of bytes copied) of a `memory.copy` +// expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryCopyGetSize(BinaryenExpressionRef expr); +// Sets the size expression (number of bytes copied) of a `memory.copy` +// expression. +BINARYEN_API void BinaryenMemoryCopySetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr); + +// MemoryFill +// Gets the destination expression of a `memory.fill` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryFillGetDest(BinaryenExpressionRef expr); +// Sets the destination expression of a `memory.fill` expression. +BINARYEN_API void BinaryenMemoryFillSetDest(BinaryenExpressionRef expr, + BinaryenExpressionRef destExpr); +// Gets the value expression of a `memory.fill` expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryFillGetValue(BinaryenExpressionRef expr); +// Sets the value expression of a `memory.fill` expression. +BINARYEN_API void BinaryenMemoryFillSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); +// Gets the size expression (number of bytes filled) of a `memory.fill` +// expression. BINARYEN_API BinaryenExpressionRef BinaryenMemoryFillGetSize(BinaryenExpressionRef expr); +// Sets the size expression (number of bytes filled) of a `memory.fill` +// expression. +BINARYEN_API void BinaryenMemoryFillSetSize(BinaryenExpressionRef expr, + BinaryenExpressionRef sizeExpr); +// RefIsNull + +// Gets the value expression tested to be null of a `ref.is_null` expression. BINARYEN_API BinaryenExpressionRef BinaryenRefIsNullGetValue(BinaryenExpressionRef expr); +// Sets the value expression tested to be null of a `ref.is_null` expression. +BINARYEN_API void BinaryenRefIsNullSetValue(BinaryenExpressionRef expr, + BinaryenExpressionRef valueExpr); + +// RefFunc +// Gets the name of the function being wrapped by a `ref.func` expression. BINARYEN_API const char* BinaryenRefFuncGetFunc(BinaryenExpressionRef expr); +// Sets the name of the function being wrapped by a `ref.func` expression. +BINARYEN_API void BinaryenRefFuncSetFunc(BinaryenExpressionRef expr, + const char* funcName); +// Try + +// Gets the body expression of a `try` expression. BINARYEN_API BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr); +// Sets the body expression of a `try` expression. +BINARYEN_API void BinaryenTrySetBody(BinaryenExpressionRef expr, + BinaryenExpressionRef bodyExpr); +// Gets the catch body expression of a `try` expression. BINARYEN_API BinaryenExpressionRef BinaryenTryGetCatchBody(BinaryenExpressionRef expr); +// Sets the catch body expression of a `try` expression. +BINARYEN_API void BinaryenTrySetCatchBody(BinaryenExpressionRef expr, + BinaryenExpressionRef catchBodyExpr); + +// Throw +// Gets the name of the event being thrown by a `throw` expression. BINARYEN_API const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenThrowGetOperand(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the name of the event being thrown by a `throw` expression. +BINARYEN_API void BinaryenThrowSetEvent(BinaryenExpressionRef expr, + const char* eventName); +// Gets the number of operands of a `throw` expression. BINARYEN_API BinaryenIndex BinaryenThrowGetNumOperands(BinaryenExpressionRef expr); - +// Gets the operand at the specified index of a `throw` expression. +BINARYEN_API BinaryenExpressionRef +BinaryenThrowGetOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the operand at the specified index of a `throw` expression. +BINARYEN_API void BinaryenThrowSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Appends an operand expression to a `throw` expression, returning its +// insertion index. +BINARYEN_API BinaryenIndex BinaryenThrowAppendOperand( + BinaryenExpressionRef expr, BinaryenExpressionRef operandExpr); +// Inserts an operand expression at the specified index of a `throw` expression, +// moving existing operands including the one previously at that index one index +// up. +BINARYEN_API void +BinaryenThrowInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Removes the operand expression at the specified index of a `throw` +// expression, moving all subsequent operands one index down. Returns the +// operand expression. +BINARYEN_API BinaryenExpressionRef +BinaryenThrowRemoveOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); + +// Rethrow + +// Gets the exception reference expression of a `rethrow` expression. BINARYEN_API BinaryenExpressionRef BinaryenRethrowGetExnref(BinaryenExpressionRef expr); +// Sets the exception reference expression of a `rethrow` expression. +BINARYEN_API void BinaryenRethrowSetExnref(BinaryenExpressionRef expr, + BinaryenExpressionRef exnrefExpr); +// BrOnExn + +// Gets the name of the event triggering a `br_on_exn` expression. BINARYEN_API const char* BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr); +// Sets the name of the event triggering a `br_on_exn` expression. +BINARYEN_API void BinaryenBrOnExnSetEvent(BinaryenExpressionRef expr, + const char* eventName); +// Gets the name (target label) of a `br_on_exn` expression. BINARYEN_API const char* BinaryenBrOnExnGetName(BinaryenExpressionRef expr); +// Sets the name (target label) of a `br_on_exn` expression. +BINARYEN_API void BinaryenBrOnExnSetName(BinaryenExpressionRef expr, + const char* name); +// Gets the expression reference expression of a `br_on_exn` expression. BINARYEN_API BinaryenExpressionRef BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr); +// Sets the expression reference expression of a `br_on_exn` expression. +BINARYEN_API void BinaryenBrOnExnSetExnref(BinaryenExpressionRef expr, + BinaryenExpressionRef exnrefExpr); +// TupleMake + +// Gets the number of operands of a `tuple.make` expression. BINARYEN_API BinaryenIndex BinaryenTupleMakeGetNumOperands(BinaryenExpressionRef expr); -BINARYEN_API BinaryenExpressionRef -BinaryenTupleMakeGetOperand(BinaryenExpressionRef expr, BinaryenIndex index); - +// Gets the operand at the specified index of a `tuple.make` expression. +BINARYEN_API BinaryenExpressionRef +BinaryenTupleMakeGetOperandAt(BinaryenExpressionRef expr, BinaryenIndex index); +// Sets the operand at the specified index of a `tuple.make` expression. +BINARYEN_API void +BinaryenTupleMakeSetOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Appends an operand expression to a `tuple.make` expression, returning its +// insertion index. +BINARYEN_API BinaryenIndex BinaryenTupleMakeAppendOperand( + BinaryenExpressionRef expr, BinaryenExpressionRef operandExpr); +// Inserts an operand expression at the specified index of a `tuple.make` +// expression, moving existing operands including the one previously at that +// index one index up. +BINARYEN_API void +BinaryenTupleMakeInsertOperandAt(BinaryenExpressionRef expr, + BinaryenIndex index, + BinaryenExpressionRef operandExpr); +// Removes the operand expression at the specified index of a `tuple.make` +// expression, moving all subsequent operands one index down. Returns the +// operand expression. +BINARYEN_API BinaryenExpressionRef BinaryenTupleMakeRemoveOperandAt( + BinaryenExpressionRef expr, BinaryenIndex index); + +// TupleExtract + +// Gets the tuple extracted from of a `tuple.extract` expression. BINARYEN_API BinaryenExpressionRef BinaryenTupleExtractGetTuple(BinaryenExpressionRef expr); +// Sets the tuple extracted from of a `tuple.extract` expression. +BINARYEN_API void BinaryenTupleExtractSetTuple(BinaryenExpressionRef expr, + BinaryenExpressionRef tupleExpr); +// Gets the index extracted at of a `tuple.extract` expression. BINARYEN_API BinaryenIndex BinaryenTupleExtractGetIndex(BinaryenExpressionRef expr); +// Sets the index extracted at of a `tuple.extract` expression. +BINARYEN_API void BinaryenTupleExtractSetIndex(BinaryenExpressionRef expr, + BinaryenIndex index); // Functions @@ -1479,6 +2228,9 @@ BINARYEN_API BinaryenType BinaryenFunctionGetVar(BinaryenFunctionRef func, // Gets the body of the specified `Function`. BINARYEN_API BinaryenExpressionRef BinaryenFunctionGetBody(BinaryenFunctionRef func); +// Sets the body of the specified `Function`. +BINARYEN_API void BinaryenFunctionSetBody(BinaryenFunctionRef func, + BinaryenExpressionRef body); // Runs the standard optimization passes on the function. Uses the currently set // global optimize and shrink level. diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 99fb54350..123bf4a1a 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2534,7 +2534,7 @@ Module['getExpressionInfo'] = function(expr) { 'id': id, 'type': type, 'name': UTF8ToString(Module['_BinaryenBlockGetName'](expr)), - 'children': getAllNested(expr, Module['_BinaryenBlockGetNumChildren'], Module['_BinaryenBlockGetChild']) + 'children': getAllNested(expr, Module['_BinaryenBlockGetNumChildren'], Module['_BinaryenBlockGetChildAt']) }; case Module['IfId']: return { @@ -2563,7 +2563,7 @@ Module['getExpressionInfo'] = function(expr) { return { 'id': id, 'type': type, - 'names': getAllNested(expr, Module['_BinaryenSwitchGetNumNames'], Module['_BinaryenSwitchGetName']).map(function (p) { + 'names': getAllNested(expr, Module['_BinaryenSwitchGetNumNames'], Module['_BinaryenSwitchGetNameAt']).map(function (p) { // Do not pass the index as the second parameter to UTF8ToString as that will cut off the string. return UTF8ToString(p); }), @@ -2577,7 +2577,7 @@ Module['getExpressionInfo'] = function(expr) { 'type': type, 'isReturn': Boolean(Module['_BinaryenCallIsReturn'](expr)), 'target': UTF8ToString(Module['_BinaryenCallGetTarget'](expr)), - 'operands': getAllNested(expr, Module[ '_BinaryenCallGetNumOperands'], Module['_BinaryenCallGetOperand']) + 'operands': getAllNested(expr, Module[ '_BinaryenCallGetNumOperands'], Module['_BinaryenCallGetOperandAt']) }; case Module['CallIndirectId']: return { @@ -2585,7 +2585,7 @@ Module['getExpressionInfo'] = function(expr) { 'type': type, 'isReturn': Boolean(Module['_BinaryenCallIndirectIsReturn'](expr)), 'target': Module['_BinaryenCallIndirectGetTarget'](expr), - 'operands': getAllNested(expr, Module['_BinaryenCallIndirectGetNumOperands'], Module['_BinaryenCallIndirectGetOperand']) + 'operands': getAllNested(expr, Module['_BinaryenCallIndirectGetNumOperands'], Module['_BinaryenCallIndirectGetOperandAt']) }; case Module['LocalGetId']: return { @@ -2710,7 +2710,7 @@ Module['getExpressionInfo'] = function(expr) { 'type': type, 'op': Module['_BinaryenHostGetOp'](expr), 'nameOperand': UTF8ToString(Module['_BinaryenHostGetNameOperand'](expr)), - 'operands': getAllNested(expr, Module['_BinaryenHostGetNumOperands'], Module['_BinaryenHostGetOperand']) + 'operands': getAllNested(expr, Module['_BinaryenHostGetNumOperands'], Module['_BinaryenHostGetOperandAt']) }; case Module['AtomicRMWId']: return { @@ -2869,7 +2869,7 @@ Module['getExpressionInfo'] = function(expr) { 'id': id, 'type': type, 'event': UTF8ToString(Module['_BinaryenThrowGetEvent'](expr)), - 'operands': getAllNested(expr, Module['_BinaryenThrowGetNumOperands'], Module['_BinaryenThrowGetOperand']) + 'operands': getAllNested(expr, Module['_BinaryenThrowGetNumOperands'], Module['_BinaryenThrowGetOperandAt']) }; case Module['RethrowId']: return { @@ -2889,7 +2889,7 @@ Module['getExpressionInfo'] = function(expr) { return { 'id': id, 'type': type, - 'operands': getAllNested(expr, Module['_BinaryenTupleMakeGetNumOperands'], Module['_BinaryenTupleMakeGetOperand']) + 'operands': getAllNested(expr, Module['_BinaryenTupleMakeGetNumOperands'], Module['_BinaryenTupleMakeGetOperandAt']) }; case Module['TupleExtractId']: return { @@ -3103,6 +3103,1285 @@ Module['setOneCallerInlineMaxSize'] = function(size) { Module['_BinaryenSetOneCallerInlineMaxSize'](size); }; +// Expression wrappers + +// Makes a wrapper class with the specified static members while +// automatically deriving instance methods and accessors. +function makeExpressionWrapper(ownStaticMembers) { + function SpecificExpression(expr) { + // can call the constructor without `new` + if (!(this instanceof SpecificExpression)) { + if (!expr) return null; + return new SpecificExpression(expr); + } + Expression.call(this, expr); + } + // inherit static members of Expression + Object.assign(SpecificExpression, Expression); + // add own static members + Object.assign(SpecificExpression, ownStaticMembers); + // inherit from Expression + (SpecificExpression.prototype = Object.create(Expression.prototype)).constructor = SpecificExpression; + // make own instance members + makeExpressionWrapperInstanceMembers(SpecificExpression.prototype, ownStaticMembers); + return SpecificExpression; +} + +// Makes instance members from the given static members +function makeExpressionWrapperInstanceMembers(prototype, staticMembers) { + Object.keys(staticMembers).forEach(function(memberName) { + var member = staticMembers[memberName]; + if (typeof member === "function") { + // Instance method calls the respective static method + prototype[memberName] = function(/* arguments */) { + var numArgs = arguments.length; + var args = new Array(1 + numArgs); + args[0] = this['expr']; + for (var i = 0; i < numArgs; ++i) { + args[1 + i] = arguments[i]; + } + return this.constructor[memberName].apply(null, args); + }; + // Instance accessor calls the respective static methods + var match; + if (member.length === 1 && (match = memberName.match(/^(get|is)/))) { + (function(propertyName, getter, setterIfAny) { + Object.defineProperty(prototype, propertyName, { + get: function() { + return getter(this['expr']); + }, + set: function(value) { + if (setterIfAny) setterIfAny(this['expr'], value); + else throw Error("property '" + propertyName + "' has no setter"); + } + }); + })( + memberName.charAt(match[1].length).toLowerCase() + memberName.substring(match[1].length + 1), + staticMembers[memberName], + staticMembers["set" + memberName.substring(match[1].length)] + ); + } + } + }); +} + +// Base class of all expression wrappers +function Expression(expr) { + if (!expr) throw Error("expression reference must not be null"); + this['expr'] = expr; +} +Expression['getId'] = function(expr) { + return Module['_BinaryenExpressionGetId'](expr); +}; +Expression['getType'] = function(expr) { + return Module['_BinaryenExpressionGetType'](expr); +}; +Expression['setType'] = function(expr, type) { + Module['_BinaryenExpressionSetType'](expr, type); +}; +Expression['finalize'] = function(expr) { + return Module['_BinaryenExpressionFinalize'](expr); +}; +Expression['toText'] = function(expr) { + return Module['emitText'](expr); +}; +makeExpressionWrapperInstanceMembers(Expression.prototype, Expression); +Expression.prototype['valueOf'] = function() { + return this['expr']; +}; + +Module['Expression'] = Expression; + +Module['Block'] = makeExpressionWrapper({ + 'getName': function(expr) { + var name = Module['_BinaryenBlockGetName'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenBlockSetName'](expr, strToStack(name)); + }); + }, + 'getNumChildren': function(expr) { + return Module['_BinaryenBlockGetNumChildren'](expr); + }, + 'getChildren': function(expr) { + var numChildren = Module['_BinaryenBlockGetNumChildren'](expr); + var children = new Array(numChildren); + var index = 0; + while (index < numChildren) { + children[index] = Module['_BinaryenBlockGetChildAt'](expr, index++); + } + return children; + }, + 'setChildren': function(expr, children) { + var numChildren = children.length; + var prevNumChildren = Module['_BinaryenBlockGetNumChildren'](expr); + var index = 0; + while (index < numChildren) { + if (index < prevNumChildren) { + Module['_BinaryenBlockSetChildAt'](expr, index, children[index]); + } else { + Module['_BinaryenBlockAppendChild'](expr, children[index]); + } + ++index; + } + while (prevNumChildren > index) { + Module['_BinaryenBlockRemoveChildAt'](expr, --prevNumChildren); + } + }, + 'getChildAt': function(expr, index) { + return Module['_BinaryenBlockGetChildAt'](expr, index); + }, + 'setChildAt': function(expr, index, childExpr) { + Module['_BinaryenBlockSetChildAt'](expr, index, childExpr); + }, + 'appendChild': function(expr, childExpr) { + return Module['_BinaryenBlockAppendChild'](expr, childExpr); + }, + 'insertChildAt': function(expr, index, childExpr) { + Module['_BinaryenBlockInsertChildAt'](expr, index, childExpr); + }, + 'removeChildAt': function(expr, index) { + return Module['_BinaryenBlockRemoveChildAt'](expr, index); + } +}); + +Module['If'] = makeExpressionWrapper({ + 'getCondition': function(expr) { + return Module['_BinaryenIfGetCondition'](expr); + }, + 'setCondition': function(expr, condExpr) { + Module['_BinaryenIfSetCondition'](expr, condExpr); + }, + 'getIfTrue': function(expr) { + return Module['_BinaryenIfGetIfTrue'](expr); + }, + 'setIfTrue': function(expr, ifTrueExpr) { + Module['_BinaryenIfSetIfTrue'](expr, ifTrueExpr); + }, + 'getIfFalse': function(expr) { + return Module['_BinaryenIfGetIfFalse'](expr); + }, + 'setIfFalse': function(expr, ifFalseExpr) { + Module['_BinaryenIfSetIfFalse'](expr, ifFalseExpr); + } +}); + +Module['Loop'] = makeExpressionWrapper({ + 'getName': function(expr) { + var name = Module['_BinaryenLoopGetName'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenLoopSetName'](expr, strToStack(name)); + }); + }, + 'getBody': function(expr) { + return Module['_BinaryenLoopGetBody'](expr); + }, + 'setBody': function(expr, bodyExpr) { + Module['_BinaryenLoopSetBody'](expr, bodyExpr); + } +}); + +Module['Break'] = makeExpressionWrapper({ + 'getName': function(expr) { + var name = Module['_BinaryenBreakGetName'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenBreakSetName'](expr, strToStack(name)); + }); + }, + 'getCondition': function(expr) { + return Module['_BinaryenBreakGetCondition'](expr); + }, + 'setCondition': function(expr, condExpr) { + Module['_BinaryenBreakSetCondition'](expr, condExpr); + }, + 'getValue': function(expr) { + return Module['_BinaryenBreakGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenBreakSetValue'](expr, valueExpr); + } +}); + +Module['Switch'] = makeExpressionWrapper({ + 'getNumNames': function(expr) { + return Module['_BinaryenSwitchGetNumNames'](expr); + }, + 'getNames': function(expr) { + var numNames = Module['_BinaryenSwitchGetNumNames'](expr); + var names = new Array(numNames); + var index = 0; + while (index < numNames) { + names[index] = UTF8ToString(Module['_BinaryenSwitchGetNameAt'](expr, index++)); + } + return names; + }, + 'setNames': function(expr, names) { + var numNames = names.length; + var prevNumNames = Module['_BinaryenSwitchGetNumNames'](expr); + var index = 0; + while (index < numNames) { + preserveStack(function() { + if (index < prevNumNames) { + Module['_BinaryenSwitchSetNameAt'](expr, index, strToStack(names[index])); + } else { + Module['_BinaryenSwitchAppendName'](expr, strToStack(names[index])); + } + }); + ++index; + } + while (prevNumNames > index) { + Module['_BinaryenSwitchRemoveNameAt'](expr, --prevNumNames); + } + }, + 'getDefaultName': function(expr) { + var name = Module['_BinaryenSwitchGetDefaultName'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setDefaultName': function(expr, defaultName) { + preserveStack(function() { + Module['_BinaryenSwitchSetDefaultName'](expr, strToStack(defaultName)); + }); + }, + 'getCondition': function(expr) { + return Module['_BinaryenSwitchGetCondition'](expr); + }, + 'setCondition': function(expr, condExpr) { + Module['_BinaryenSwitchSetCondition'](expr, condExpr); + }, + 'getValue': function(expr) { + return Module['_BinaryenSwitchGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenSwitchSetValue'](expr, valueExpr); + }, + 'getNameAt': function(expr, index) { + return UTF8ToString(Module['_BinaryenSwitchGetNameAt'](expr, index)); + }, + 'setNameAt': function(expr, index, name) { + preserveStack(function() { + Module['_BinaryenSwitchSetNameAt'](expr, index, strToStack(name)); + }); + }, + 'appendName': function(expr, name) { + preserveStack(function() { + return Module['_BinaryenSwitchAppendName'](expr, strToStack(name)); + }); + }, + 'insertNameAt': function(expr, index, name) { + preserveStack(function() { + Module['_BinaryenSwitchInsertNameAt'](expr, index, strToStack(name)); + }); + }, + 'removeNameAt': function(expr, index) { + return UTF8ToString(Module['_BinaryenSwitchRemoveNameAt'](expr, index)); + }, +}); + +Module['Call'] = makeExpressionWrapper({ + 'getTarget': function(expr) { + return UTF8ToString(Module['_BinaryenCallGetTarget'](expr)); + }, + 'setTarget': function(expr, targetName) { + preserveStack(function() { + Module['_BinaryenCallSetTarget'](expr, strToStack(targetName)); + }); + }, + 'getNumOperands': function(expr) { + return Module['_BinaryenCallGetNumOperands'](expr); + }, + 'getOperands': function(expr) { + var numOperands = Module['_BinaryenCallGetNumOperands'](expr); + var operands = new Array(numOperands); + var index = 0; + while (index < numOperands) { + operands[index] = Module['_BinaryenCallGetOperandAt'](expr, index++); + } + return operands; + }, + 'setOperands': function(expr, operands) { + var numOperands = operands.length; + var prevNumOperands = Module['_BinaryenCallGetNumOperands'](expr); + var index = 0; + while (index < numOperands) { + if (index < prevNumOperands) { + Module['_BinaryenCallSetOperandAt'](expr, index, operands[index]); + } else { + Module['_BinaryenCallAppendOperand'](expr, operands[index]); + } + ++index; + } + while (prevNumOperands > index) { + Module['_BinaryenCallRemoveOperandAt'](expr, --prevNumOperands); + } + }, + 'getOperandAt': function(expr, index) { + return Module['_BinaryenCallGetOperandAt'](expr, index); + }, + 'setOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenCallSetOperandAt'](expr, index, operandExpr); + }, + 'appendOperand': function(expr, operandExpr) { + return Module['_BinaryenCallAppendOperand'](expr, operandExpr); + }, + 'insertOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenCallInsertOperandAt'](expr, index, operandExpr); + }, + 'removeOperandAt': function(expr, index) { + return Module['_BinaryenCallRemoveOperandAt'](expr, index); + }, + 'isReturn': function(expr) { + return Boolean(Module['_BinaryenCallIsReturn'](expr)); + }, + 'setReturn': function(expr, isReturn) { + Module['_BinaryenCallSetReturn'](expr, isReturn); + } +}); + +Module['CallIndirect'] = makeExpressionWrapper({ + 'getTarget': function(expr) { + return Module['_BinaryenCallIndirectGetTarget'](expr); + }, + 'setTarget': function(expr, targetExpr) { + Module['_BinaryenCallIndirectSetTarget'](expr, targetExpr); + }, + 'getNumOperands': function(expr) { + return Module['_BinaryenCallIndirectGetNumOperands'](expr); + }, + 'getOperands': function(expr) { + var numOperands = Module['_BinaryenCallIndirectGetNumOperands'](expr); + var operands = new Array(numOperands); + var index = 0; + while (index < numOperands) { + operands[index] = Module['_BinaryenCallIndirectGetOperandAt'](expr, index++); + } + return operands; + }, + 'setOperands': function(expr, operands) { + var numOperands = operands.length; + var prevNumOperands = Module['_BinaryenCallIndirectGetNumOperands'](expr); + var index = 0; + while (index < numOperands) { + if (index < prevNumOperands) { + Module['_BinaryenCallIndirectSetOperandAt'](expr, index, operands[index]); + } else { + Module['_BinaryenCallIndirectAppendOperand'](expr, operands[index]); + } + ++index; + } + while (prevNumOperands > index) { + Module['_BinaryenCallIndirectRemoveOperandAt'](expr, --prevNumOperands); + } + }, + 'getOperandAt': function(expr, index) { + return Module['_BinaryenCallIndirectGetOperandAt'](expr, index); + }, + 'setOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenCallIndirectSetOperandAt'](expr, index, operandExpr); + }, + 'appendOperand': function(expr, operandExpr) { + return Module['_BinaryenCallIndirectAppendOperand'](expr, operandExpr); + }, + 'insertOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenCallIndirectInsertOperandAt'](expr, index, operandExpr); + }, + 'removeOperandAt': function(expr, index) { + return Module['_BinaryenCallIndirectRemoveOperandAt'](expr, index); + }, + 'isReturn': function(expr) { + return Boolean(Module['_BinaryenCallIndirectIsReturn'](expr)); + }, + 'setReturn': function(expr, isReturn) { + Module['_BinaryenCallIndirectSetReturn'](expr, isReturn); + }, + 'getParams': function(expr) { + return Module['_BinaryenCallIndirectGetParams'](expr); + }, + 'setParams': function(expr, params) { + Module['_BinaryenCallIndirectSetParams'](expr, params); + }, + 'getResults': function(expr) { + return Module['_BinaryenCallIndirectGetResults'](expr); + }, + 'setResults': function(expr, results) { + Module['_BinaryenCallIndirectSetResults'](expr, results); + } +}); + +Module['LocalGet'] = makeExpressionWrapper({ + 'getIndex': function(expr) { + return Module['_BinaryenLocalGetGetIndex'](expr); + }, + 'setIndex': function(expr, index) { + Module['_BinaryenLocalGetSetIndex'](expr, index); + } +}); + +Module['LocalSet'] = makeExpressionWrapper({ + 'getIndex': function(expr) { + return Module['_BinaryenLocalSetGetIndex'](expr); + }, + 'setIndex': function(expr, index) { + Module['_BinaryenLocalSetSetIndex'](expr, index); + }, + 'isTee': function(expr) { + return Boolean(Module['_BinaryenLocalSetIsTee'](expr)); + }, + 'getValue': function(expr) { + return Module['_BinaryenLocalSetGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenLocalSetSetValue'](expr, valueExpr); + } +}); + +Module['GlobalGet'] = makeExpressionWrapper({ + 'getName': function(expr) { + return UTF8ToString(Module['_BinaryenGlobalGetGetName'](expr)); + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenGlobalGetSetName'](expr, strToStack(name)); + }); + } +}); + +Module['GlobalSet'] = makeExpressionWrapper({ + 'getName': function(expr) { + return UTF8ToString(Module['_BinaryenGlobalSetGetName'](expr)); + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenGlobalSetSetName'](expr, strToStack(name)); + }); + }, + 'getValue': function(expr) { + return Module['_BinaryenGlobalSetGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenGlobalSetSetValue'](expr, valueExpr); + } +}); + +Module['Host'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenHostGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenHostSetOp'](expr, op); + }, + 'getNameOperand': function(expr) { + var name = Module['_BinaryenHostGetNameOperand'](expr); + return name ? UTF8ToString(name) : null; + }, + 'setNameOperand': function(expr, name) { + preserveStack(function() { + Module['_BinaryenHostSetNameOperand'](expr, strToStack(name)); + }); + }, + 'getNumOperands': function(expr) { + return Module['_BinaryenHostGetNumOperands'](expr); + }, + 'getOperands': function(expr) { + var numOperands = Module['_BinaryenHostGetNumOperands'](expr); + var operands = new Array(numOperands); + var index = 0; + while (index < numOperands) { + operands[index] = Module['_BinaryenHostGetOperandAt'](expr, index++); + } + return operands; + }, + 'setOperands': function(expr, operands) { + var numOperands = operands.length; + var prevNumOperands = Module['_BinaryenHostGetNumOperands'](expr); + var index = 0; + while (index < numOperands) { + if (index < prevNumOperands) { + Module['_BinaryenHostSetOperandAt'](expr, index, operands[index]); + } else { + Module['_BinaryenHostAppendOperand'](expr, operands[index]); + } + ++index; + } + while (prevNumOperands > index) { + Module['_BinaryenHostRemoveOperandAt'](expr, --prevNumOperands); + } + }, + 'getOperandAt': function(expr, index) { + return Module['_BinaryenHostGetOperandAt'](expr, index); + }, + 'setOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenHostSetOperandAt'](expr, index, operandExpr); + }, + 'appendOperand': function(expr, operandExpr) { + return Module['_BinaryenHostAppendOperand'](expr, operandExpr); + }, + 'insertOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenHostInsertOperandAt'](expr, index, operandExpr); + }, + 'removeOperandAt': function(expr, index) { + return Module['_BinaryenHostRemoveOperandAt'](expr, index); + }, +}); + +Module['Load'] = makeExpressionWrapper({ + 'isAtomic': function(expr) { + return Boolean(Module['_BinaryenLoadIsAtomic'](expr)); + }, + 'setAtomic': function(expr, isAtomic) { + Module['_BinaryenLoadSetAtomic'](expr, isAtomic); + }, + 'isSigned': function(expr) { + return Boolean(Module['_BinaryenLoadIsSigned'](expr)); + }, + 'setSigned': function(expr, isSigned) { + Module['_BinaryenLoadSetSigned'](expr, isSigned); + }, + 'getOffset': function(expr) { + return Module['_BinaryenLoadGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenLoadSetOffset'](expr, offset); + }, + 'getBytes': function(expr) { + return Module['_BinaryenLoadGetBytes'](expr); + }, + 'setBytes': function(expr, bytes) { + Module['_BinaryenLoadSetBytes'](expr, bytes); + }, + 'getAlign': function(expr) { + return Module['_BinaryenLoadGetAlign'](expr); + }, + 'setAlign': function(expr, align) { + Module['_BinaryenLoadSetAlign'](expr, align); + }, + 'getPtr': function(expr) { + return Module['_BinaryenLoadGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenLoadSetPtr'](expr, ptrExpr); + } +}); + +Module['Store'] = makeExpressionWrapper({ + 'isAtomic': function(expr) { + return Boolean(Module['_BinaryenStoreIsAtomic'](expr)); + }, + 'setAtomic': function(expr, isAtomic) { + Module['_BinaryenStoreSetAtomic'](expr, isAtomic); + }, + 'getBytes': function(expr) { + return Module['_BinaryenStoreGetBytes'](expr); + }, + 'setBytes': function(expr, bytes) { + Module['_BinaryenStoreSetBytes'](expr, bytes); + }, + 'getOffset': function(expr) { + return Module['_BinaryenStoreGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenStoreSetOffset'](expr, offset); + }, + 'getAlign': function(expr) { + return Module['_BinaryenStoreGetAlign'](expr); + }, + 'setAlign': function(expr, align) { + Module['_BinaryenStoreSetAlign'](expr, align); + }, + 'getPtr': function(expr) { + return Module['_BinaryenStoreGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenStoreSetPtr'](expr, ptrExpr); + }, + 'getValue': function(expr) { + return Module['_BinaryenStoreGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenStoreSetValue'](expr, valueExpr); + }, + 'getValueType': function(expr) { + return Module['_BinaryenStoreGetValueType'](expr); + }, + 'setValueType': function(expr, valueType) { + Module['_BinaryenStoreSetValueType'](expr, valueType); + } +}); + +Module['Const'] = makeExpressionWrapper({ + 'getValueI32': function(expr) { + return Module['_BinaryenConstGetValueI32'](expr); + }, + 'setValueI32': function(expr, value) { + Module['_BinaryenConstSetValueI32'](expr, value); + }, + 'getValueI64Low': function(expr) { + return Module['_BinaryenConstGetValueI64Low'](expr); + }, + 'setValueI64Low': function(expr, value) { + Module['_BinaryenConstSetValueI64Low'](expr, value); + }, + 'getValueI64High': function(expr) { + return Module['_BinaryenConstGetValueI64High'](expr); + }, + 'setValueI64High': function(expr, value) { + Module['_BinaryenConstSetValueI64High'](expr, value); + }, + 'getValueF32': function(expr) { + return Module['_BinaryenConstGetValueF32'](expr); + }, + 'setValueF32': function(expr, value) { + Module['_BinaryenConstSetValueF32'](expr, value); + }, + 'getValueF64': function(expr) { + return Module['_BinaryenConstGetValueF64'](expr); + }, + 'setValueF64': function(expr, value) { + Module['_BinaryenConstSetValueF64'](expr, value); + }, + 'getValueV128': function(expr) { + var value; + preserveStack(function() { + var tempBuffer = stackAlloc(16); + Module['_BinaryenConstGetValueV128'](expr, tempBuffer); + value = new Array(16); + for (var i = 0 ; i < 16; ++i) { + value[i] = HEAPU8[tempBuffer + i]; + } + }); + return value; + }, + 'setValueV128': function(expr, value) { + preserveStack(function() { + var tempBuffer = stackAlloc(16); + for (var i = 0 ; i < 16; ++i) { + HEAPU8[tempBuffer + i] = value[i]; + } + Module['_BinaryenConstSetValueV128'](expr, tempBuffer); + }); + } +}); + +Module['Unary'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenUnaryGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenUnarySetOp'](expr, op); + }, + 'getValue': function(expr) { + return Module['_BinaryenUnaryGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenUnarySetValue'](expr, valueExpr); + } +}); + +Module['Binary'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenBinaryGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenBinarySetOp'](expr, op); + }, + 'getLeft': function(expr) { + return Module['_BinaryenBinaryGetLeft'](expr); + }, + 'setLeft': function(expr, leftExpr) { + Module['_BinaryenBinarySetLeft'](expr, leftExpr); + }, + 'getRight': function(expr) { + return Module['_BinaryenBinaryGetRight'](expr); + }, + 'setRight': function(expr, rightExpr) { + Module['_BinaryenBinarySetRight'](expr, rightExpr); + } +}); + +Module['Select'] = makeExpressionWrapper({ + 'getIfTrue': function(expr) { + return Module['_BinaryenSelectGetIfTrue'](expr); + }, + 'setIfTrue': function(expr, ifTrueExpr) { + Module['_BinaryenSelectSetIfTrue'](expr, ifTrueExpr); + }, + 'getIfFalse': function(expr) { + return Module['_BinaryenSelectGetIfFalse'](expr); + }, + 'setIfFalse': function(expr, ifFalseExpr) { + Module['_BinaryenSelectSetIfFalse'](expr, ifFalseExpr); + }, + 'getCondition': function(expr) { + return Module['_BinaryenSelectGetCondition'](expr); + }, + 'setCondition': function(expr, condExpr) { + Module['_BinaryenSelectSetCondition'](expr, condExpr); + } +}); + +Module['Drop'] = makeExpressionWrapper({ + 'getValue': function(expr) { + return Module['_BinaryenDropGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenDropSetValue'](expr, valueExpr); + } +}); + +Module['Return'] = makeExpressionWrapper({ + 'getValue': function(expr) { + return Module['_BinaryenReturnGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenReturnSetValue'](expr, valueExpr); + } +}); + +Module['AtomicRMW'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenAtomicRMWGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenAtomicRMWSetOp'](expr, op); + }, + 'getBytes': function(expr) { + return Module['_BinaryenAtomicRMWGetBytes'](expr); + }, + 'setBytes': function(expr, bytes) { + Module['_BinaryenAtomicRMWSetBytes'](expr, bytes); + }, + 'getOffset': function(expr) { + return Module['_BinaryenAtomicRMWGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenAtomicRMWSetOffset'](expr, offset); + }, + 'getPtr': function(expr) { + return Module['_BinaryenAtomicRMWGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenAtomicRMWSetPtr'](expr, ptrExpr); + }, + 'getValue': function(expr) { + return Module['_BinaryenAtomicRMWGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenAtomicRMWSetValue'](expr, valueExpr); + } +}); + +Module['AtomicCmpxchg'] = makeExpressionWrapper({ + 'getBytes': function(expr) { + return Module['_BinaryenAtomicCmpxchgGetBytes'](expr); + }, + 'setBytes': function(expr, bytes) { + Module['_BinaryenAtomicCmpxchgSetBytes'](expr, bytes); + }, + 'getOffset': function(expr) { + return Module['_BinaryenAtomicCmpxchgGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenAtomicCmpxchgSetOffset'](expr, offset); + }, + 'getPtr': function(expr) { + return Module['_BinaryenAtomicCmpxchgGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenAtomicCmpxchgSetPtr'](expr, ptrExpr); + }, + 'getExpected': function(expr) { + return Module['_BinaryenAtomicCmpxchgGetExpected'](expr); + }, + 'setExpected': function(expr, expectedExpr) { + Module['_BinaryenAtomicCmpxchgSetExpected'](expr, expectedExpr); + }, + 'getReplacement': function(expr) { + return Module['_BinaryenAtomicCmpxchgGetReplacement'](expr); + }, + 'setReplacement': function(expr, replacementExpr) { + Module['_BinaryenAtomicCmpxchgSetReplacement'](expr, replacementExpr); + } +}); + +Module['AtomicWait'] = makeExpressionWrapper({ + 'getPtr': function(expr) { + return Module['_BinaryenAtomicWaitGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenAtomicWaitSetPtr'](expr, ptrExpr); + }, + 'getExpected': function(expr) { + return Module['_BinaryenAtomicWaitGetExpected'](expr); + }, + 'setExpected': function(expr, expectedExpr) { + Module['_BinaryenAtomicWaitSetExpected'](expr, expectedExpr); + }, + 'getTimeout': function(expr) { + return Module['_BinaryenAtomicWaitGetTimeout'](expr); + }, + 'setTimeout': function(expr, timeoutExpr) { + Module['_BinaryenAtomicWaitSetTimeout'](expr, timeoutExpr); + }, + 'getExpectedType': function(expr) { + return Module['_BinaryenAtomicWaitGetExpectedType'](expr); + }, + 'setExpectedType': function(expr, expectedType) { + Module['_BinaryenAtomicWaitSetExpectedType'](expr, expectedType); + } +}); + +Module['AtomicNotify'] = makeExpressionWrapper({ + 'getPtr': function(expr) { + return Module['_BinaryenAtomicNotifyGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenAtomicNotifySetPtr'](expr, ptrExpr); + }, + 'getNotifyCount': function(expr) { + return Module['_BinaryenAtomicNotifyGetNotifyCount'](expr); + }, + 'setNotifyCount': function(expr, notifyCountExpr) { + Module['_BinaryenAtomicNotifySetNotifyCount'](expr, notifyCountExpr); + } +}); + +Module['AtomicFence'] = makeExpressionWrapper({ + 'getOrder': function(expr) { + return Module['_BinaryenAtomicFenceGetOrder'](expr); + }, + 'setOrder': function(expr, order) { + Module['_BinaryenAtomicFenceSetOrder'](expr, order); + } +}); + +Module['SIMDExtract'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenSIMDExtractGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenSIMDExtractSetOp'](expr, op); + }, + 'getVec': function(expr) { + return Module['_BinaryenSIMDExtractGetVec'](expr); + }, + 'setVec': function(expr, vecExpr) { + Module['_BinaryenSIMDExtractSetVec'](expr, vecExpr); + }, + 'getIndex': function(expr) { + return Module['_BinaryenSIMDExtractGetIndex'](expr); + }, + 'setIndex': function(expr, index) { + Module['_BinaryenSIMDExtractSetIndex'](expr, index) + } +}); + +Module['SIMDReplace'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenSIMDReplaceGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenSIMDReplaceSetOp'](expr, op); + }, + 'getVec': function(expr) { + return Module['_BinaryenSIMDReplaceGetVec'](expr); + }, + 'setVec': function(expr, vecExpr) { + Module['_BinaryenSIMDReplaceSetVec'](expr, vecExpr); + }, + 'getIndex': function(expr) { + return Module['_BinaryenSIMDReplaceGetIndex'](expr); + }, + 'setIndex': function(expr, index) { + Module['_BinaryenSIMDReplaceSetIndex'](expr, index); + }, + 'getValue': function(expr) { + return Module['_BinaryenSIMDReplaceGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenSIMDReplaceSetValue'](expr, valueExpr); + } +}); + +Module['SIMDShuffle'] = makeExpressionWrapper({ + 'getLeft': function(expr) { + return Module['_BinaryenSIMDShuffleGetLeft'](expr); + }, + 'setLeft': function(expr, leftExpr) { + Module['_BinaryenSIMDShuffleSetLeft'](expr, leftExpr) + }, + 'getRight': function(expr) { + return Module['_BinaryenSIMDShuffleGetRight'](expr); + }, + 'setRight': function(expr, rightExpr) { + Module['_BinaryenSIMDShuffleSetRight'](expr, rightExpr); + }, + 'getMask': function(expr) { + var mask; + preserveStack(function() { + var tempBuffer = stackAlloc(16); + Module['_BinaryenSIMDShuffleGetMask'](expr, tempBuffer); + mask = new Array(16); + for (var i = 0 ; i < 16; ++i) { + mask[i] = HEAPU8[tempBuffer + i]; + } + }); + return mask; + }, + 'setMask': function(expr, mask) { + preserveStack(function() { + var tempBuffer = stackAlloc(16); + for (var i = 0 ; i < 16; ++i) { + HEAPU8[tempBuffer + i] = mask[i]; + } + Module['_BinaryenSIMDShuffleSetMask'](expr, tempBuffer); + }); + } +}); + +Module['SIMDTernary'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenSIMDTernaryGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenSIMDTernarySetOp'](expr, op); + }, + 'getA': function(expr) { + return Module['_BinaryenSIMDTernaryGetA'](expr); + }, + 'setA': function(expr, aExpr) { + Module['_BinaryenSIMDTernarySetA'](expr, aExpr); + }, + 'getB': function(expr) { + return Module['_BinaryenSIMDTernaryGetB'](expr); + }, + 'setB': function(expr, bExpr) { + Module['_BinaryenSIMDTernarySetB'](expr, bExpr); + }, + 'getC': function(expr) { + return Module['_BinaryenSIMDTernaryGetC'](expr); + }, + 'setC': function(expr, cExpr) { + Module['_BinaryenSIMDTernarySetC'](expr, cExpr); + } +}); + +Module['SIMDShift'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenSIMDShiftGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenSIMDShiftSetOp'](expr, op); + }, + 'getVec': function(expr) { + return Module['_BinaryenSIMDShiftGetVec'](expr); + }, + 'setVec': function(expr, vecExpr) { + Module['_BinaryenSIMDShiftSetVec'](expr, vecExpr); + }, + 'getShift': function(expr) { + return Module['_BinaryenSIMDShiftGetShift'](expr); + }, + 'setShift': function(expr, shiftExpr) { + Module['_BinaryenSIMDShiftSetShift'](expr, shiftExpr); + } +}); + +Module['SIMDLoad'] = makeExpressionWrapper({ + 'getOp': function(expr) { + return Module['_BinaryenSIMDLoadGetOp'](expr); + }, + 'setOp': function(expr, op) { + Module['_BinaryenSIMDLoadSetOp'](expr, op); + }, + 'getOffset': function(expr) { + return Module['_BinaryenSIMDLoadGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenSIMDLoadSetOffset'](expr, offset); + }, + 'getAlign': function(expr) { + return Module['_BinaryenSIMDLoadGetAlign'](expr); + }, + 'setAlign': function(expr, align) { + Module['_BinaryenSIMDLoadSetAlign'](expr, align); + }, + 'getPtr': function(expr) { + return Module['_BinaryenSIMDLoadGetPtr'](expr); + }, + 'setPtr': function(expr, ptrExpr) { + Module['_BinaryenSIMDLoadSetPtr'](expr, ptrExpr); + } +}); + +Module['MemoryInit'] = makeExpressionWrapper({ + 'getSegment': function(expr) { + return Module['_BinaryenMemoryInitGetSegment'](expr); + }, + 'setSegment': function(expr, segmentIndex) { + Module['_BinaryenMemoryInitSetSegment'](expr, segmentIndex); + }, + 'getDest': function(expr) { + return Module['_BinaryenMemoryInitGetDest'](expr); + }, + 'setDest': function(expr, destExpr) { + Module['_BinaryenMemoryInitSetDest'](expr, destExpr); + }, + 'getOffset': function(expr) { + return Module['_BinaryenMemoryInitGetOffset'](expr); + }, + 'setOffset': function(expr, offset) { + Module['_BinaryenMemoryInitSetOffset'](expr, offset); + }, + 'getSize': function(expr) { + return Module['_BinaryenMemoryInitGetSize'](expr); + }, + 'setSize': function(expr, sizeExpr) { + Module['_BinaryenMemoryInitSetSize'](expr, sizeExpr); + } +}); + +Module['DataDrop'] = makeExpressionWrapper({ + 'getSegment': function(expr) { + return Module['_BinaryenDataDropGetSegment'](expr); + }, + 'setSegment': function(expr, segmentIndex) { + Module['_BinaryenDataDropSetSegment'](expr, segmentIndex); + } +}); + +Module['MemoryCopy'] = makeExpressionWrapper({ + 'getDest': function(expr) { + return Module['_BinaryenMemoryCopyGetDest'](expr); + }, + 'setDest': function(expr, destExpr) { + Module['_BinaryenMemoryCopySetDest'](expr, destExpr); + }, + 'getSource': function(expr) { + return Module['_BinaryenMemoryCopyGetSource'](expr); + }, + 'setSource': function(expr, sourceExpr) { + Module['_BinaryenMemoryCopySetSource'](expr, sourceExpr); + }, + 'getSize': function(expr) { + return Module['_BinaryenMemoryCopyGetSize'](expr); + }, + 'setSize': function(expr, sizeExpr) { + Module['_BinaryenMemoryCopySetSize'](expr, sizeExpr); + } +}); + +Module['MemoryFill'] = makeExpressionWrapper({ + 'getDest': function(expr) { + return Module['_BinaryenMemoryFillGetDest'](expr); + }, + 'setDest': function(expr, destExpr) { + Module['_BinaryenMemoryFillSetDest'](expr, destExpr); + }, + 'getValue': function(expr) { + return Module['_BinaryenMemoryFillGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenMemoryFillSetValue'](expr, valueExpr); + }, + 'getSize': function(expr) { + return Module['_BinaryenMemoryFillGetSize'](expr); + }, + 'setSize': function(expr, sizeExpr) { + Module['_BinaryenMemoryFillSetSize'](expr, sizeExpr); + } +}); + +Module['RefIsNull'] = makeExpressionWrapper({ + 'getValue': function(expr) { + return Module['_BinaryenRefIsNullGetValue'](expr); + }, + 'setValue': function(expr, valueExpr) { + Module['_BinaryenRefIsNullSetValue'](expr, valueExpr); + } +}); + +Module['RefFunc'] = makeExpressionWrapper({ + 'getFunc': function(expr) { + return UTF8ToString(Module['_BinaryenRefFuncGetFunc'](expr)); + }, + 'setFunc': function(expr, funcName) { + preserveStack(function() { + Module['_BinaryenRefFuncSetFunc'](expr, strToStack(funcName)); + }); + } +}); + +Module['Try'] = makeExpressionWrapper({ + 'getBody': function(expr) { + return Module['_BinaryenTryGetBody'](expr); + }, + 'setBody': function(expr, bodyExpr) { + Module['_BinaryenTrySetBody'](expr, bodyExpr); + }, + 'getCatchBody': function(expr) { + return Module['_BinaryenTryGetCatchBody'](expr); + }, + 'setCatchBody': function(expr, catchBodyExpr) { + Module['_BinaryenTrySetCatchBody'](expr, catchBodyExpr); + } +}); + +Module['Throw'] = makeExpressionWrapper({ + 'getEvent': function(expr) { + return UTF8ToString(Module['_BinaryenThrowGetEvent'](expr)); + }, + 'setEvent': function(expr, eventName) { + preserveStack(function() { + Module['_BinaryenThrowSetEvent'](expr, strToStack(eventName)); + }); + }, + 'getNumOperands': function(expr) { + return Module['_BinaryenThrowGetNumOperands'](expr); + }, + 'getOperands': function(expr) { + var numOperands = Module['_BinaryenThrowGetNumOperands'](expr); + var operands = new Array(numOperands); + var index = 0; + while (index < numOperands) { + operands[index] = Module['_BinaryenThrowGetOperandAt'](expr, index++); + } + return operands; + }, + 'setOperands': function(expr, operands) { + var numOperands = operands.length; + var prevNumOperands = Module['_BinaryenThrowGetNumOperands'](expr); + var index = 0; + while (index < numOperands) { + if (index < prevNumOperands) { + Module['_BinaryenThrowSetOperandAt'](expr, index, operands[index]); + } else { + Module['_BinaryenThrowAppendOperand'](expr, operands[index]); + } + ++index; + } + while (prevNumOperands > index) { + Module['_BinaryenThrowRemoveOperandAt'](expr, --prevNumOperands); + } + }, + 'getOperandAt': function(expr, index) { + return Module['_BinaryenThrowGetOperandAt'](expr, index); + }, + 'setOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenThrowSetOperandAt'](expr, index, operandExpr); + }, + 'appendOperand': function(expr, operandExpr) { + return Module['_BinaryenThrowAppendOperand'](expr, operandExpr); + }, + 'insertOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenThrowInsertOperandAt'](expr, index, operandExpr); + }, + 'removeOperandAt': function(expr, index) { + return Module['_BinaryenThrowRemoveOperandAt'](expr, index); + }, +}); + +Module['Rethrow'] = makeExpressionWrapper({ + 'getExnref': function(expr) { + return Module['_BinaryenRethrowGetExnref'](expr); + }, + 'setExnref': function(expr, exnrefExpr) { + Module['_BinaryenRethrowSetExnref'](expr, exnrefExpr); + } +}); + +Module['BrOnExn'] = makeExpressionWrapper({ + 'getEvent': function(expr) { + return UTF8ToString(Module['_BinaryenBrOnExnGetEvent'](expr)); + }, + 'setEvent': function(expr, eventName) { + preserveStack(function() { + Module['_BinaryenBrOnExnSetEvent'](expr, strToStack(eventName)); + }); + }, + 'getName': function(expr) { + return UTF8ToString(Module['_BinaryenBrOnExnGetName'](expr)); + }, + 'setName': function(expr, name) { + preserveStack(function() { + Module['_BinaryenBrOnExnSetName'](expr, strToStack(name)); + }); + }, + 'getExnref': function(expr) { + return Module['_BinaryenBrOnExnGetExnref'](expr); + }, + 'setExnref': function(expr, exnrefExpr) { + Module['_BinaryenBrOnExnSetExnref'](expr, exnrefExpr); + } +}); + +Module['TupleMake'] = makeExpressionWrapper({ + 'getNumOperands': function(expr) { + return Module['_BinaryenTupleMakeGetNumOperands'](expr); + }, + 'getOperands': function(expr) { + var numOperands = Module['_BinaryenTupleMakeGetNumOperands'](expr); + var operands = new Array(numOperands); + var index = 0; + while (index < numOperands) { + operands[index] = Module['_BinaryenTupleMakeGetOperandAt'](expr, index++); + } + return operands; + }, + 'setOperands': function(expr, operands) { + var numOperands = operands.length; + var prevNumOperands = Module['_BinaryenTupleMakeGetNumOperands'](expr); + var index = 0; + while (index < numOperands) { + if (index < prevNumOperands) { + Module['_BinaryenTupleMakeSetOperandAt'](expr, index, operands[index]); + } else { + Module['_BinaryenTupleMakeAppendOperand'](expr, operands[index]); + } + ++index; + } + while (prevNumOperands > index) { + Module['_BinaryenTupleMakeRemoveOperandAt'](expr, --prevNumOperands); + } + }, + 'getOperandAt': function(expr, index) { + return Module['_BinaryenTupleMakeGetOperandAt'](expr, index); + }, + 'setOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenTupleMakeSetOperandAt'](expr, index, operandExpr); + }, + 'appendOperand': function(expr, operandExpr) { + return Module['_BinaryenTupleMakeAppendOperand'](expr, operandExpr); + }, + 'insertOperandAt': function(expr, index, operandExpr) { + Module['_BinaryenTupleMakeInsertOperandAt'](expr, index, operandExpr); + }, + 'removeOperandAt': function(expr, index) { + return Module['_BinaryenTupleMakeRemoveOperandAt'](expr, index); + } +}); + +Module['TupleExtract'] = makeExpressionWrapper({ + 'getTuple': function(expr) { + return Module['_BinaryenTupleExtractGetTuple'](expr); + }, + 'setTuple': function(expr, tupleExpr) { + Module['_BinaryenTupleExtractSetTuple'](expr, tupleExpr); + }, + 'getIndex': function(expr) { + return Module['_BinaryenTupleExtractGetIndex'](expr); + }, + 'setIndex': function(expr, index) { + Module['_BinaryenTupleExtractSetIndex'](expr, index); + } +}); + // Additional customizations Module['exit'] = function(status) { diff --git a/src/mixed_arena.h b/src/mixed_arena.h index 079ce9028..9ae19f94d 100644 --- a/src/mixed_arena.h +++ b/src/mixed_arena.h @@ -364,6 +364,27 @@ public: void allocate(size_t size) { abort(); // must be implemented in children } + + // C-API + + void insertAt(size_t index, T item) { + assert(index <= usedElements); // appending is ok + resize(usedElements + 1); + for (auto i = usedElements; i > index; --i) { + data[i] = data[i - 1]; + } + data[index] = item; + } + + T removeAt(size_t index) { + assert(index < usedElements); + auto item = data[index]; + for (auto i = index; i < usedElements - 1; ++i) { + data[i] = data[i + 1]; + } + resize(usedElements - 1); + return item; + } }; // A vector that has an allocator for arena allocation diff --git a/src/wasm.h b/src/wasm.h index b52e7539b..fafb03d41 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -862,6 +862,8 @@ public: // other orderings may be added in the future. This field is reserved for // that, and currently set to 0. uint8_t order = 0; + + void finalize(); }; class SIMDExtract : public SpecificExpression<Expression::SIMDExtractId> { diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index f1d51bbca..adaa81838 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -522,6 +522,8 @@ void AtomicNotify::finalize() { } } +void AtomicFence::finalize() { type = Type::none; } + void SIMDExtract::finalize() { assert(vec); switch (op) { |