diff options
author | Daniel Wirtz <dcode@dcode.io> | 2020-07-22 21:42:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-22 12:42:34 -0700 |
commit | d406654f7cd6249277a2eef542c883603b4b3b53 (patch) | |
tree | e12f298fe16438a1522980ca16b588de5b4fa00d /test/binaryen.js/expressions.js | |
parent | c9ef77622de3bc0112fafd5ef0fd6f2eab8fe4fe (diff) | |
download | binaryen-d406654f7cd6249277a2eef542c883603b4b3b53.tar.gz binaryen-d406654f7cd6249277a2eef542c883603b4b3b53.tar.bz2 binaryen-d406654f7cd6249277a2eef542c883603b4b3b53.zip |
Extend the C- and JS-APIs (#2586)
Renames the following C-API functions
BinaryenBlockGetChild to BinaryenBlockGetChildAt
BinaryenSwitchGetName to BinaryenSwitchGetNameAt
BinaryenCallGetOperand to BinaryenCallGetOperandAt
BinaryenCallIndirectGetOperand to BinaryenCallIndirectGetOperandAt
BinaryenHostGetOperand to BinaryenHostGetOperandAt
BinaryenThrowGetOperand to BinaryenThrowGetOperandAt
BinaryenTupleMakeGetOperand to BinaryenTupleMakeGetOperandAt
Adds the following C-API functions
BinaryenExpressionSetType
BinaryenExpressionFinalize
BinaryenBlockSetName
BinaryenBlockSetChildAt
BinaryenBlockAppendChild
BinaryenBlockInsertChildAt
BinaryenBlockRemoveChildAt
BinaryenIfSetCondition
BinaryenIfSetIfTrue
BinaryenIfSetIfFalse
BinaryenLoopSetName
BinaryenLoopSetBody
BinaryenBreakSetName
BinaryenBreakSetCondition
BinaryenBreakSetValue
BinaryenSwitchSetNameAt
BinaryenSwitchAppendName
BinaryenSwitchInsertNameAt
BinaryenSwitchRemoveNameAt
BinaryenSwitchSetDefaultName
BinaryenSwitchSetCondition
BinaryenSwitchSetValue
BinaryenCallSetTarget
BinaryenCallSetOperandAt
BinaryenCallAppendOperand
BinaryenCallInsertOperandAt
BinaryenCallRemoveOperandAt
BinaryenCallSetReturn
BinaryenCallIndirectSetTarget
BinaryenCallIndirectSetOperandAt
BinaryenCallIndirectAppendOperand
BinaryenCallIndirectInsertOperandAt
BinaryenCallIndirectRemoveOperandAt
BinaryenCallIndirectSetReturn
BinaryenCallIndirectGetParams
BinaryenCallIndirectSetParams
BinaryenCallIndirectGetResults
BinaryenCallIndirectSetResults
BinaryenLocalGetSetIndex
BinaryenLocalSetSetIndex
BinaryenLocalSetSetValue
BinaryenGlobalGetSetName
BinaryenGlobalSetSetName
BinaryenGlobalSetSetValue
BinaryenHostSetOp
BinaryenHostSetNameOperand
BinaryenHostSetOperandAt
BinaryenHostAppendOperand
BinaryenHostInsertOperandAt
BinaryenHostRemoveOperandAt
BinaryenLoadSetAtomic
BinaryenLoadSetSigned
BinaryenLoadSetOffset
BinaryenLoadSetBytes
BinaryenLoadSetAlign
BinaryenLoadSetPtr
BinaryenStoreSetAtomic
BinaryenStoreSetBytes
BinaryenStoreSetOffset
BinaryenStoreSetAlign
BinaryenStoreSetPtr
BinaryenStoreSetValue
BinaryenStoreGetValueType
BinaryenStoreSetValueType
BinaryenConstSetValueI32
BinaryenConstSetValueI64
BinaryenConstSetValueI64Low
BinaryenConstSetValueI64High
BinaryenConstSetValueF32
BinaryenConstSetValueF64
BinaryenConstSetValueV128
BinaryenUnarySetOp
BinaryenUnarySetValue
BinaryenBinarySetOp
BinaryenBinarySetLeft
BinaryenBinarySetRight
BinaryenSelectSetIfTrue
BinaryenSelectSetIfFalse
BinaryenSelectSetCondition
BinaryenDropSetValue
BinaryenReturnSetValue
BinaryenAtomicRMWSetOp
BinaryenAtomicRMWSetBytes
BinaryenAtomicRMWSetOffset
BinaryenAtomicRMWSetPtr
BinaryenAtomicRMWSetValue
BinaryenAtomicCmpxchgSetBytes
BinaryenAtomicCmpxchgSetOffset
BinaryenAtomicCmpxchgSetPtr
BinaryenAtomicCmpxchgSetExpected
BinaryenAtomicCmpxchgSetReplacement
BinaryenAtomicWaitSetPtr
BinaryenAtomicWaitSetExpected
BinaryenAtomicWaitSetTimeout
BinaryenAtomicWaitSetExpectedType
BinaryenAtomicNotifySetPtr
BinaryenAtomicNotifySetNotifyCount
BinaryenAtomicFenceSetOrder
BinaryenSIMDExtractSetOp
BinaryenSIMDExtractSetVec
BinaryenSIMDExtractSetIndex
BinaryenSIMDReplaceSetOp
BinaryenSIMDReplaceSetVec
BinaryenSIMDReplaceSetIndex
BinaryenSIMDReplaceSetValue
BinaryenSIMDShuffleSetLeft
BinaryenSIMDShuffleSetRight
BinaryenSIMDShuffleSetMask
BinaryenSIMDTernarySetOp
BinaryenSIMDTernarySetA
BinaryenSIMDTernarySetB
BinaryenSIMDTernarySetC
BinaryenSIMDShiftSetOp
BinaryenSIMDShiftSetVec
BinaryenSIMDShiftSetShift
BinaryenSIMDLoadSetOp
BinaryenSIMDLoadSetOffset
BinaryenSIMDLoadSetAlign
BinaryenSIMDLoadSetPtr
BinaryenMemoryInitSetSegment
BinaryenMemoryInitSetDest
BinaryenMemoryInitSetOffset
BinaryenMemoryInitSetSize
BinaryenDataDropSetSegment
BinaryenMemoryCopySetDest
BinaryenMemoryCopySetSource
BinaryenMemoryCopySetSize
BinaryenMemoryFillSetDest
BinaryenMemoryFillSetValue
BinaryenMemoryFillSetSize
BinaryenRefIsNullSetValue
BinaryenRefFuncSetFunc
BinaryenTrySetBody
BinaryenTrySetCatchBody
BinaryenThrowSetEvent
BinaryenThrowSetOperandAt
BinaryenThrowAppendOperand
BinaryenThrowInsertOperandAt
BinaryenThrowRemoveOperandAt
BinaryenRethrowSetExnref
BinaryenBrOnExnSetEvent
BinaryenBrOnExnSetName
BinaryenBrOnExnSetExnref
BinaryenTupleMakeSetOperandAt
BinaryenTupleMakeAppendOperand
BinaryenTupleMakeInsertOperandAt
BinaryenTupleMakeRemoveOperandAt
BinaryenTupleExtractSetTuple
BinaryenTupleExtractSetIndex
BinaryenFunctionSetBody
Also introduces wrappers to the JS-API resembling the classes in C++
to perform the above operations on an expression. For example:
var unary = binaryen.Unary(module.i32.eqz(1));
unary.getOp(...) / .op
unary.setOp(...) / .op = ...
unary.getValue(...) / .value
unary.setValue(...) / .value = ...
unary.getType(...) / .type
unary.finalize()
...
Usage of wrappers is optional, and one can also use plain functions:
var unary = module.i32.eqz(1);
binaryen.Unary.getOp(unary, ...)
...
Also adds comments to all affected functions in case we'd like to generate
API documentation at some point.
Diffstat (limited to 'test/binaryen.js/expressions.js')
-rw-r--r-- | test/binaryen.js/expressions.js | 1605 |
1 files changed, 1605 insertions, 0 deletions
diff --git a/test/binaryen.js/expressions.js b/test/binaryen.js/expressions.js new file mode 100644 index 000000000..a0f3e6d4b --- /dev/null +++ b/test/binaryen.js/expressions.js @@ -0,0 +1,1605 @@ +function assertDeepEqual(x, y) { + if (typeof x === "object") { + for (let i in x) assertDeepEqual(x[i], y[i]); + for (let i in y) assertDeepEqual(x[i], y[i]); + } else { + assert(x === y); + } +} + +console.log("# Expression"); +(function testWrapper() { + var theExpression = binaryen.Block(42); // works without new + assert(theExpression instanceof binaryen.Block); + assert(theExpression instanceof binaryen.Expression); + assert(theExpression.constructor === binaryen.Block); + assert(typeof binaryen.Block.getId === "function"); // proto + assert(typeof binaryen.Block.getName === "function"); // own + assert(typeof theExpression.getId === "function"); // proto + assert(typeof theExpression.getName === "function"); // own + assert(theExpression.expr === 42); + assert((theExpression | 0) === 42); // via valueOf +})(); + +console.log("# Block"); +(function testBlock() { + const module = new binaryen.Module(); + + const theBlock = binaryen.Block(module.block(null, [])); + assert(theBlock instanceof binaryen.Block); + assert(theBlock instanceof binaryen.Expression); + assert(theBlock.id === binaryen.BlockId); + assert(theBlock.name === null); + assert(theBlock.type === binaryen.none); + + theBlock.name ="theName"; + assert(theBlock.name === "theName"); + theBlock.type = binaryen.i32; + assert(theBlock.type === binaryen.i32); + assert(theBlock.numChildren === 0); + assertDeepEqual(theBlock.children, []); + + var child1 = module.i32.const(1); + theBlock.appendChild(child1); + assert(theBlock.numChildren === 1); + assert(theBlock.getChildAt(0) === child1); + var child2 = module.i32.const(2); + theBlock.insertChildAt(1, child2); + assert(theBlock.numChildren === 2); + assert(theBlock.getChildAt(0) === child1); + assert(theBlock.getChildAt(1) === child2); + var child0 = module.i32.const(0); + theBlock.insertChildAt(0, child0); + assert(theBlock.numChildren === 3); + assert(theBlock.getChildAt(0) === child0); + assert(theBlock.getChildAt(1) === child1); + assert(theBlock.getChildAt(2) === child2); + var newChild1 = module.i32.const(11); + theBlock.setChildAt(1, newChild1); + assert(theBlock.numChildren === 3); + assert(theBlock.getChildAt(0) === child0); + assert(theBlock.getChildAt(1) === newChild1); + assert(theBlock.getChildAt(2) === child2); + theBlock.removeChildAt(1); + assert(theBlock.numChildren === 2); + assert(theBlock.getChildAt(0) === child0); + assert(theBlock.getChildAt(1) === child2); + theBlock.removeChildAt(1); + assert(theBlock.numChildren === 1); + assert(theBlock.getChildAt(0) === child0); + theBlock.finalize(); + + console.log(theBlock.toText()); + assert( + theBlock.toText() + == + "(block $theName (result i32)\n (i32.const 0)\n)\n" + ); + theBlock.removeChildAt(0); + assert(theBlock.numChildren === 0); + + module.dispose(); +})(); + +console.log("# If"); +(function testIf() { + const module = new binaryen.Module(); + + var condition = module.i32.const(1); + var ifTrue = module.i32.const(2); + var ifFalse = module.i32.const(3); + const theIf = binaryen.If(module.if(condition, ifTrue, ifFalse)); + assert(theIf instanceof binaryen.If); + assert(theIf instanceof binaryen.Expression); + assert(theIf.id === binaryen.IfId); + assert(theIf.condition === condition); + assert(theIf.ifTrue === ifTrue); + assert(theIf.ifFalse === ifFalse); + assert(theIf.type == binaryen.i32); + + theIf.condition = condition = module.i32.const(4); + assert(theIf.condition === condition); + theIf.ifTrue = ifTrue = module.i32.const(5); + assert(theIf.ifTrue === ifTrue); + theIf.ifFalse = ifFalse = module.i32.const(6); + assert(theIf.ifFalse === ifFalse); + theIf.finalize(); + + console.log(theIf.toText()); + assert( + theIf.toText() + == + "(if (result i32)\n (i32.const 4)\n (i32.const 5)\n (i32.const 6)\n)\n" + ); + + theIf.ifFalse = null; + assert(!theIf.ifFalse); + console.log(theIf.toText()); + assert( + theIf.toText() + == + "(if (result i32)\n (i32.const 4)\n (i32.const 5)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Loop"); +(function testLoop() { + const module = new binaryen.Module(); + + var name = null; + var body = module.i32.const(1); + const theLoop = binaryen.Loop(module.loop(name, body)); + assert(theLoop instanceof binaryen.Loop); + assert(theLoop instanceof binaryen.Expression); + assert(theLoop.id === binaryen.LoopId); + assert(theLoop.name === name); + assert(theLoop.body === body); + assert(theLoop.type === binaryen.i32); + + theLoop.name = name = "theName"; + assert(theLoop.name === name); + theLoop.body = body = module.drop(body); + assert(theLoop.body === body); + theLoop.finalize(); + assert(theLoop.type === binaryen.none); + + console.log(theLoop.toText()); + assert( + theLoop.toText() + == + "(loop $theName\n (drop\n (i32.const 1)\n )\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Break"); +(function testBreak() { + const module = new binaryen.Module(); + + var name = "theName"; + var condition = module.i32.const(1); + var value = module.i32.const(2); + const theBreak = binaryen.Break(module.br(name, condition, value)); + assert(theBreak instanceof binaryen.Break); + assert(theBreak instanceof binaryen.Expression); + assert(theBreak.name === name); + assert(theBreak.condition === condition); + assert(theBreak.value === value); + assert(theBreak.type === binaryen.i32); + + theBreak.name = name = "theNewName"; + assert(theBreak.name === "theNewName"); + theBreak.condition = condition = module.i32.const(3); + assert(theBreak.condition === condition); + theBreak.value = value = module.i32.const(4); + assert(theBreak.value === value); + theBreak.finalize(); + + console.log(theBreak.toText()); + assert( + theBreak.toText() + == + "(br_if $theNewName\n (i32.const 4)\n (i32.const 3)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Switch"); +(function testSwitch() { + const module = new binaryen.Module(); + + var names = ["a", "b"]; + var defaultName = "c"; + var condition = module.i32.const(1); + var value = module.i32.const(2); + const theSwitch = binaryen.Switch(module.switch(names, defaultName, condition, value)); + assert(theSwitch instanceof binaryen.Switch); + assert(theSwitch instanceof binaryen.Expression); + assert(theSwitch.numNames === 2); + assertDeepEqual(theSwitch.names, names); + assert(theSwitch.defaultName === defaultName); + assert(theSwitch.condition === condition); + assert(theSwitch.value === value); + assert(theSwitch.type === binaryen.unreachable); + + theSwitch.names = names = [ + "1", // set + "2", // set + "3" // append + ]; + assertDeepEqual(theSwitch.names, names); + theSwitch.names = names = [ + "x", // set + // remove + // remove + ]; + assertDeepEqual(theSwitch.names, names); + theSwitch.insertNameAt(1, "y"); + theSwitch.condition = condition = module.i32.const(3); + assert(theSwitch.condition === condition); + theSwitch.value = value = module.i32.const(4); + assert(theSwitch.value === value); + theSwitch.finalize(); + + console.log(theSwitch.toText()); + assert( + theSwitch.toText() + == + "(br_table $x $y $c\n (i32.const 4)\n (i32.const 3)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Call"); +(function testCall() { + const module = new binaryen.Module(); + + var target = "foo"; + var operands = [ + module.i32.const(1), + module.i32.const(2) + ]; + const theCall = binaryen.Call(module.call(target, operands, binaryen.i32)); + assert(theCall instanceof binaryen.Call); + assert(theCall instanceof binaryen.Expression); + assert(theCall.target === target); + assertDeepEqual(theCall.operands, operands); + assert(theCall.return === false); + assert(theCall.type === binaryen.i32); + + theCall.target = "bar"; + assert(theCall.target === "bar"); + theCall.operands = operands = [ + module.i32.const(3), // set + module.i32.const(4), // set + module.i32.const(5) // append + ]; + assertDeepEqual(theCall.operands, operands); + theCall.operands = operands = [ + module.i32.const(6) // set + // remove + // remove + ]; + assertDeepEqual(theCall.operands, operands); + theCall.insertOperandAt(0, module.i32.const(7)); + theCall.return = true; + assert(theCall.return === true); + theCall.finalize(); + assert(theCall.type === binaryen.unreachable); // finalized tail call + + theCall.return = false; + theCall.type = binaryen.i32; + theCall.finalize(); + assert(theCall.type === binaryen.i32); // finalized call + + console.log(theCall.toText()); + assert( + theCall.toText() + == + "(call $bar\n (i32.const 7)\n (i32.const 6)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# CallIndirect"); +(function testCallIndirect() { + const module = new binaryen.Module(); + + var target = module.i32.const(42); + var params = binaryen.none; + var results = binaryen.none; + var operands = [ + module.i32.const(1), + module.i32.const(2) + ]; + const theCallIndirect = binaryen.CallIndirect(module.call_indirect(target, operands, params, results)); + assert(theCallIndirect instanceof binaryen.CallIndirect); + assert(theCallIndirect instanceof binaryen.Expression); + assert(theCallIndirect.target === target); + assertDeepEqual(theCallIndirect.operands, operands); + assert(theCallIndirect.params === params); + assert(theCallIndirect.results === results); + assert(theCallIndirect.return === false); + assert(theCallIndirect.type === theCallIndirect.results); + + theCallIndirect.target = target = module.i32.const(9000); + assert(theCallIndirect.target === target); + theCallIndirect.operands = operands = [ + module.i32.const(3), // set + module.i32.const(4), // set + module.i32.const(5) // append + ]; + assertDeepEqual(theCallIndirect.operands, operands); + theCallIndirect.operands = operands = [ + module.i32.const(6) // set + // remove + // remove + ]; + assertDeepEqual(theCallIndirect.operands, operands); + theCallIndirect.insertOperandAt(0, module.i32.const(7)); + theCallIndirect.return = true; + assert(theCallIndirect.return === true); + theCallIndirect.params = params = binaryen.createType([ binaryen.i32, binaryen.i32 ]); + assert(theCallIndirect.params === params); + theCallIndirect.results = results = binaryen.i32; + assert(theCallIndirect.results === results); + theCallIndirect.finalize(); + assert(theCallIndirect.type === binaryen.unreachable); // finalized tail call + + theCallIndirect.return = false; + theCallIndirect.finalize(); + assert(theCallIndirect.type === results); // finalized call + + console.log(theCallIndirect.toText()); + assert( + theCallIndirect.toText() + == + "(call_indirect (type $i32_i32_=>_i32)\n (i32.const 7)\n (i32.const 6)\n (i32.const 9000)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# LocalGet"); +(function testLocalGet() { + const module = new binaryen.Module(); + + var index = 1; + var type = binaryen.i32; + const theLocalGet = binaryen.LocalGet(module.local.get(index, type)); + assert(theLocalGet instanceof binaryen.LocalGet); + assert(theLocalGet instanceof binaryen.Expression); + assert(theLocalGet.index === index); + assert(theLocalGet.type === type); + + theLocalGet.index = index = 2; + assert(theLocalGet.index === index); + theLocalGet.type = type = binaryen.f64; + assert(theLocalGet.type === type); + theLocalGet.finalize(); + + console.log(theLocalGet.toText()); + assert( + theLocalGet.toText() + == + "(local.get $2)\n" + ); + + module.dispose(); +})(); + +console.log("# LocalSet"); +(function testLocalSet() { + const module = new binaryen.Module(); + + var index = 1; + var value = module.i32.const(1); + const theLocalSet = binaryen.LocalSet(module.local.set(index, value)); + assert(theLocalSet instanceof binaryen.LocalSet); + assert(theLocalSet instanceof binaryen.Expression); + assert(theLocalSet.index === index); + assert(theLocalSet.value === value); + assert(theLocalSet.tee === false); + assert(theLocalSet.type == binaryen.none); + + theLocalSet.index = index = 2; + assert(theLocalSet.index === index); + theLocalSet.value = value = module.i32.const(3); + assert(theLocalSet.value === value); + theLocalSet.type = binaryen.i32; + assert(theLocalSet.type === binaryen.i32); + assert(theLocalSet.tee === true); + theLocalSet.type = binaryen.none; + theLocalSet.finalize(); + + console.log(theLocalSet.toText()); + assert( + theLocalSet.toText() + == + "(local.set $2\n (i32.const 3)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# GlobalGet"); +(function testGlobalGet() { + const module = new binaryen.Module(); + + var name = "a"; + var type = binaryen.i32; + const theGlobalGet = binaryen.GlobalGet(module.global.get(name, type)); + assert(theGlobalGet instanceof binaryen.GlobalGet); + assert(theGlobalGet instanceof binaryen.Expression); + assert(theGlobalGet.name === name); + assert(theGlobalGet.type === type); + + theGlobalGet.name = name = "b"; + assert(theGlobalGet.name === name); + theGlobalGet.type = type = binaryen.f64; + assert(theGlobalGet.type === type); + theGlobalGet.finalize(); + + console.log(theGlobalGet.toText()); + assert( + theGlobalGet.toText() + == + "(global.get $b)\n" + ); + + module.dispose(); +})(); + +console.log("# GlobalSet"); +(function testGlobalSet() { + const module = new binaryen.Module(); + + var name = "a"; + var value = module.i32.const(1); + const theGlobalSet = binaryen.GlobalSet(module.global.set(name, value)); + assert(theGlobalSet instanceof binaryen.GlobalSet); + assert(theGlobalSet instanceof binaryen.Expression); + assert(theGlobalSet.name === name); + assert(theGlobalSet.value === value); + assert(theGlobalSet.type == binaryen.none); + + theGlobalSet.name = name = "b"; + assert(theGlobalSet.name === name); + theGlobalSet.value = value = module.f64.const(3); + assert(theGlobalSet.value === value); + theGlobalSet.finalize(); + + console.log(theGlobalSet.toText()); + assert( + theGlobalSet.toText() + == + "(global.set $b\n (f64.const 3)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Host"); +(function testHost() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.MemorySize; + var nameOp = null; + var operands = []; + const theHost = binaryen.Host(module.memory.size()); + assert(theHost instanceof binaryen.Host); + assert(theHost instanceof binaryen.Expression); + assert(theHost.op === op); + assert(theHost.nameOperand === nameOp); + assertDeepEqual(theHost.operands, operands); + assert(theHost.type === binaryen.i32); + + theHost.op = op = binaryen.Operations.MemoryGrow; + assert(theHost.op === op); + theHost.nameOperand = nameOp = "a"; + assert(theHost.nameOperand === nameOp); + theHost.nameOperand = null; + theHost.operands = operands = [ + module.i32.const(1) + ]; + assertDeepEqual(theHost.operands, operands); + theHost.type = binaryen.f64; + theHost.finalize(); + assert(theHost.type === binaryen.i32); + + console.log(theHost.toText()); + assert( + theHost.toText() + == + "(memory.grow\n (i32.const 1)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Load"); +(function testLoad() { + const module = new binaryen.Module(); + + var offset = 16; + var align = 2; + var ptr = module.i32.const(64); + const theLoad = binaryen.Load(module.i32.load(offset, align, ptr)); + assert(theLoad instanceof binaryen.Load); + assert(theLoad instanceof binaryen.Expression); + assert(theLoad.offset === offset); + assert(theLoad.align === align); + assert(theLoad.ptr === ptr); + assert(theLoad.bytes === 4); + assert(theLoad.signed === true); + assert(theLoad.atomic === false); + assert(theLoad.type == binaryen.i32); + + theLoad.offset = offset = 32; + assert(theLoad.offset === offset); + theLoad.align = align = 4; + assert(theLoad.align === align); + theLoad.ptr = ptr = module.i32.const(128); + assert(theLoad.ptr === ptr); + theLoad.type = binaryen.i64; + assert(theLoad.type === binaryen.i64); + theLoad.signed = false; + assert(theLoad.signed === false); + theLoad.bytes = 8; + assert(theLoad.bytes === 8); + theLoad.atomic = true; + assert(theLoad.atomic === true); + theLoad.finalize(); + assert(theLoad.align === 4); + + console.log(theLoad.toText()); + assert( + theLoad.toText() + == + "(i64.atomic.load offset=32 align=4\n (i32.const 128)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Store"); +(function testStore() { + const module = new binaryen.Module(); + + var offset = 16; + var align = 2; + var ptr = module.i32.const(64); + var value = module.i32.const(1); + const theStore = binaryen.Store(module.i32.store(offset, align, ptr, value)); + assert(theStore instanceof binaryen.Store); + assert(theStore instanceof binaryen.Expression); + assert(theStore.offset === offset); + assert(theStore.align === align); + assert(theStore.ptr === ptr); + assert(theStore.value === value); + assert(theStore.bytes === 4); + assert(theStore.atomic === false); + assert(theStore.valueType === binaryen.i32); + assert(theStore.type === binaryen.none); + + theStore.offset = offset = 32; + assert(theStore.offset === offset); + theStore.align = align = 4; + assert(theStore.align === align); + theStore.ptr = ptr = module.i32.const(128); + assert(theStore.ptr === ptr); + theStore.value = value = module.i32.const(2); + assert(theStore.value === value); + theStore.signed = false; + assert(theStore.signed === false); + theStore.valueType = binaryen.i64; + assert(theStore.valueType === binaryen.i64); + theStore.bytes = 8; + assert(theStore.bytes === 8); + theStore.atomic = true; + assert(theStore.atomic === true); + theStore.finalize(); + assert(theStore.align === 4); + + console.log(theStore.toText()); + assert( + theStore.toText() + == + "(i64.atomic.store offset=32 align=4\n (i32.const 128)\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Const"); +(function testConst() { + const module = new binaryen.Module(); + + const theConst = binaryen.Const(module.i32.const(1)); + assert(theConst instanceof binaryen.Const); + assert(theConst instanceof binaryen.Expression); + assert(theConst.valueI32 === 1); + theConst.valueI32 = 2; + assert(theConst.valueI32 === 2); + assert(theConst.type === binaryen.i32); + + theConst.valueI64Low = 3; + assert(theConst.valueI64Low === 3); + theConst.valueI64High = 4; + assert(theConst.valueI64High === 4); + theConst.finalize(); + assert(theConst.type == binaryen.i64); + + theConst.valueF32 = 5; + assert(theConst.valueF32 === 5); + theConst.finalize(); + assert(theConst.type === binaryen.f32); + + theConst.valueF64 = 6; + assert(theConst.valueF64 === 6); + theConst.finalize(); + assert(theConst.type === binaryen.f64); + + theConst.valueV128 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; + assertDeepEqual(theConst.valueV128, [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + theConst.finalize(); + assert(theConst.type === binaryen.v128); + + console.log(theConst.toText()); + assert( + theConst.toText() + == + "(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)\n" + ); + + module.dispose(); +})(); + +console.log("# Unary"); +(function testUnary() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.EqZInt32; + var value = module.i32.const(1); + const theUnary = binaryen.Unary(module.i32.eqz(value)); + assert(theUnary instanceof binaryen.Unary); + assert(theUnary instanceof binaryen.Expression); + assert(theUnary.op === op); + assert(theUnary.value === value); + assert(theUnary.type === binaryen.i32); + + theUnary.op = op = binaryen.Operations.EqZInt64; + assert(theUnary.op === op); + theUnary.value = value = module.i64.const(2); + assert(theUnary.value === value); + theUnary.type = binaryen.f32; + theUnary.finalize(); + assert(theUnary.type === binaryen.i32); + + console.log(theUnary.toText()); + assert( + theUnary.toText() + == + "(i64.eqz\n (i64.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Binary"); +(function testBinary() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.AddInt32; + var left = module.i32.const(1); + var right = module.i32.const(2); + const theBinary = binaryen.Binary(module.i32.add(left, right)); + assert(theBinary instanceof binaryen.Binary); + assert(theBinary instanceof binaryen.Expression); + assert(theBinary.op === op); + assert(theBinary.left === left); + assert(theBinary.right === right); + assert(theBinary.type === binaryen.i32); + + theBinary.op = op = binaryen.Operations.AddInt64; + assert(theBinary.op === op); + theBinary.left = left = module.i64.const(3); + assert(theBinary.left === left); + theBinary.right = right = module.i64.const(4); + assert(theBinary.right === right); + theBinary.type = binaryen.f32; + theBinary.finalize(); + assert(theBinary.type === binaryen.i64); + + console.log(theBinary.toText()); + assert( + theBinary.toText() + == + "(i64.add\n (i64.const 3)\n (i64.const 4)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Select"); +(function testSelect() { + const module = new binaryen.Module(); + + var condition = module.i32.const(1); + var ifTrue = module.i32.const(2); + var ifFalse = module.i32.const(3); + const theSelect = binaryen.Select(module.select(condition, ifTrue, ifFalse)); assert(theSelect.ifTrue === ifTrue); + assert(theSelect instanceof binaryen.Select); + assert(theSelect instanceof binaryen.Expression); + assert(theSelect.condition === condition); + assert(theSelect.ifTrue === ifTrue); + assert(theSelect.ifFalse === ifFalse); + assert(theSelect.type === binaryen.i32); + + theSelect.condition = condition = module.i32.const(4); + assert(theSelect.condition === condition); + theSelect.ifTrue = ifTrue = module.i64.const(5); + assert(theSelect.ifTrue === ifTrue); + theSelect.ifFalse = ifFalse = module.i64.const(6); + assert(theSelect.ifFalse === ifFalse); + theSelect.finalize(); + assert(theSelect.type === binaryen.i64); + + console.log(theSelect.toText()); + assert( + theSelect.toText() + == + "(select\n (i64.const 5)\n (i64.const 6)\n (i32.const 4)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Drop"); +(function testDrop() { + const module = new binaryen.Module(); + + var value = module.i32.const(1); + const theDrop = binaryen.Drop(module.drop(value)); + assert(theDrop instanceof binaryen.Drop); + assert(theDrop instanceof binaryen.Expression); + assert(theDrop.value === value); + assert(theDrop.type === binaryen.none); + + theDrop.value = value = module.i32.const(2); + assert(theDrop.value === value); + + theDrop.finalize(); + assert(theDrop.type === binaryen.none); + + console.log(theDrop.toText()); + assert( + theDrop.toText() + == + "(drop\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Return"); +(function testReturn() { + const module = new binaryen.Module(); + + var value = module.i32.const(1); + const theReturn = binaryen.Return(module.return(value)); + assert(theReturn instanceof binaryen.Return); + assert(theReturn instanceof binaryen.Expression); + assert(theReturn.value === value); + assert(theReturn.type === binaryen.unreachable); + + theReturn.value = value = module.i32.const(2); + assert(theReturn.value === value); + + theReturn.finalize(); + assert(theReturn.type === binaryen.unreachable); + + console.log(theReturn.toText()); + assert( + theReturn.toText() + == + "(return\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# AtomicRMW"); +(function testAtomicRMW() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.AtomicRMWAdd; + var offset = 8; + var ptr = module.i32.const(2); + var value = module.i32.const(3); + const theAtomicRMW = binaryen.AtomicRMW(module.i32.atomic.rmw.add(offset, ptr, value)); + assert(theAtomicRMW instanceof binaryen.AtomicRMW); + assert(theAtomicRMW instanceof binaryen.Expression); + assert(theAtomicRMW.op === op); + assert(theAtomicRMW.bytes === 4); + assert(theAtomicRMW.offset === offset); + assert(theAtomicRMW.ptr === ptr); + assert(theAtomicRMW.value === value); + assert(theAtomicRMW.type === binaryen.i32); + + theAtomicRMW.op = op = binaryen.Operations.AtomicRMWSub; + assert(theAtomicRMW.op === op); + theAtomicRMW.bytes = 2; + assert(theAtomicRMW.bytes === 2); + theAtomicRMW.offset = offset = 16; + assert(theAtomicRMW.offset === offset); + theAtomicRMW.ptr = ptr = module.i32.const(4); + assert(theAtomicRMW.ptr === ptr); + theAtomicRMW.value = value = module.i64.const(5); + assert(theAtomicRMW.value === value); + theAtomicRMW.type = binaryen.i64; + theAtomicRMW.finalize(); + assert(theAtomicRMW.type === binaryen.i64); + + console.log(theAtomicRMW.toText()); + assert( + theAtomicRMW.toText() + == + "(i64.atomic.rmw16.sub_u offset=16\n (i32.const 4)\n (i64.const 5)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# AtomicCmpxchg"); +(function testAtomicCmpxchg() { + const module = new binaryen.Module(); + + var offset = 8; + var ptr = module.i32.const(2); + var expected = module.i32.const(3); + var replacement = module.i32.const(4); + const theAtomicCmpxchg = binaryen.AtomicCmpxchg(module.i32.atomic.rmw.cmpxchg(offset, ptr, expected, replacement)); + assert(theAtomicCmpxchg instanceof binaryen.AtomicCmpxchg); + assert(theAtomicCmpxchg instanceof binaryen.Expression); + assert(theAtomicCmpxchg.bytes === 4); + assert(theAtomicCmpxchg.offset === offset); + assert(theAtomicCmpxchg.ptr === ptr); + assert(theAtomicCmpxchg.expected === expected); + assert(theAtomicCmpxchg.replacement === replacement); + assert(theAtomicCmpxchg.type === binaryen.i32); + + theAtomicCmpxchg.bytes = 2; + assert(theAtomicCmpxchg.bytes === 2); + theAtomicCmpxchg.offset = offset = 16; + assert(theAtomicCmpxchg.offset === offset); + theAtomicCmpxchg.ptr = ptr = module.i32.const(5); + assert(theAtomicCmpxchg.ptr === ptr); + theAtomicCmpxchg.expected = expected = module.i64.const(6); + assert(theAtomicCmpxchg.expected === expected); + theAtomicCmpxchg.replacement = replacement = module.i64.const(7); + assert(theAtomicCmpxchg.replacement === replacement); + theAtomicCmpxchg.type = binaryen.i64; + theAtomicCmpxchg.finalize(); + assert(theAtomicCmpxchg.type === binaryen.i64); + + console.log(theAtomicCmpxchg.toText()); + assert( + theAtomicCmpxchg.toText() + == + "(i64.atomic.rmw16.cmpxchg_u offset=16\n (i32.const 5)\n (i64.const 6)\n (i64.const 7)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# AtomicWait"); +(function testAtomicWait() { + const module = new binaryen.Module(); + + var ptr = module.i32.const(2); + var expected = module.i32.const(3); + var timeout = module.i64.const(4); + const theAtomicWait = binaryen.AtomicWait(module.i32.atomic.wait(ptr, expected, timeout)); + assert(theAtomicWait instanceof binaryen.AtomicWait); + assert(theAtomicWait instanceof binaryen.Expression); + assert(theAtomicWait.ptr === ptr); + assert(theAtomicWait.expected === expected); + assert(theAtomicWait.expectedType === binaryen.i32); + assert(theAtomicWait.timeout === timeout); + assert(theAtomicWait.type === binaryen.i32); + + theAtomicWait.ptr = ptr = module.i32.const(5); + assert(theAtomicWait.ptr === ptr); + theAtomicWait.expected = expected = module.i32.const(6); + assert(theAtomicWait.expected === expected); + theAtomicWait.expectedType = binaryen.i64; + assert(theAtomicWait.expectedType === binaryen.i64); + theAtomicWait.timeout = timeout = module.i64.const(7); + assert(theAtomicWait.timeout === timeout); + theAtomicWait.type = binaryen.f64; + theAtomicWait.finalize(); + assert(theAtomicWait.type === binaryen.i32); + + console.log(theAtomicWait.toText()); + assert( + theAtomicWait.toText() + == + "(i64.atomic.wait\n (i32.const 5)\n (i32.const 6)\n (i64.const 7)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# AtomicNotify"); +(function testAtomicNotify() { + const module = new binaryen.Module(); + + var ptr = module.i32.const(1); + var notifyCount = module.i32.const(2); + const theAtomicNotify = binaryen.AtomicNotify(module.atomic.notify(ptr, notifyCount)); + assert(theAtomicNotify instanceof binaryen.AtomicNotify); + assert(theAtomicNotify instanceof binaryen.Expression); + assert(theAtomicNotify.ptr === ptr); + assert(theAtomicNotify.notifyCount === notifyCount); + assert(theAtomicNotify.type === binaryen.i32); + + theAtomicNotify.ptr = ptr = module.i32.const(3); + assert(theAtomicNotify.ptr === ptr); + theAtomicNotify.notifyCount = notifyCount = module.i32.const(4); + assert(theAtomicNotify.notifyCount === notifyCount); + theAtomicNotify.type = binaryen.f64; + theAtomicNotify.finalize(); + assert(theAtomicNotify.type === binaryen.i32); + + console.log(theAtomicNotify.toText()); + assert( + theAtomicNotify.toText() + == + "(atomic.notify\n (i32.const 3)\n (i32.const 4)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# AtomicFence"); +(function testAtomicFence() { + const module = new binaryen.Module(); + + const theAtomicFence = binaryen.AtomicFence(module.atomic.fence()); + assert(theAtomicFence instanceof binaryen.AtomicFence); + assert(theAtomicFence instanceof binaryen.Expression); + assert(theAtomicFence.order === 0); // reserved, not yet used + assert(theAtomicFence.type === binaryen.none); + + theAtomicFence.order = 1; + assert(theAtomicFence.order === 1); + theAtomicFence.type = binaryen.f64; + theAtomicFence.finalize(); + assert(theAtomicFence.type === binaryen.none); + + console.log(theAtomicFence.toText()); + assert( + theAtomicFence.toText() + == + "(atomic.fence)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDExtract"); +(function testSIMDExtract() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.ExtractLaneSVecI8x16; + var vec = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + var index = 0; + const theSIMDExtract = binaryen.SIMDExtract(module.i8x16.extract_lane_s(vec, index)); + assert(theSIMDExtract instanceof binaryen.SIMDExtract); + assert(theSIMDExtract instanceof binaryen.Expression); + assert(theSIMDExtract.op === op); + assert(theSIMDExtract.vec === vec); + assert(theSIMDExtract.index === index); + assert(theSIMDExtract.type === binaryen.i32); + + theSIMDExtract.op = op = binaryen.Operations.ExtractLaneSVecI16x8; + assert(theSIMDExtract.op === op); + theSIMDExtract.vec = vec = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + assert(theSIMDExtract.vec === vec); + theSIMDExtract.index = index = 1; + assert(theSIMDExtract.index === index); + theSIMDExtract.type = binaryen.f64; + theSIMDExtract.finalize(); + assert(theSIMDExtract.type === binaryen.i32); + + console.log(theSIMDExtract.toText()); + assert( + theSIMDExtract.toText() + == + "(i16x8.extract_lane_s 1\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDReplace"); +(function testSIMDReplace() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.ReplaceLaneVecI8x16; + var vec = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + var index = 0; + var value = module.i32.const(1); + const theSIMDReplace = binaryen.SIMDReplace(module.i8x16.replace_lane(vec, index, value)); + assert(theSIMDReplace instanceof binaryen.SIMDReplace); + assert(theSIMDReplace instanceof binaryen.Expression); + assert(theSIMDReplace.op === op); + assert(theSIMDReplace.vec === vec); + assert(theSIMDReplace.index === index); + assert(theSIMDReplace.value === value); + assert(theSIMDReplace.type === binaryen.v128); + + theSIMDReplace.op = op = binaryen.Operations.ReplaceLaneVecI16x8; + assert(theSIMDReplace.op === op); + theSIMDReplace.vec = vec = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + assert(theSIMDReplace.vec === vec); + theSIMDReplace.index = index = 1; + assert(theSIMDReplace.index === index); + theSIMDReplace.value = value = module.i32.const(2); + assert(theSIMDReplace.value === value); + theSIMDReplace.type = binaryen.f64; + theSIMDReplace.finalize(); + assert(theSIMDReplace.type === binaryen.v128); + + console.log(theSIMDReplace.toText()); + assert( + theSIMDReplace.toText() + == + "(i16x8.replace_lane 1\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDShuffle"); +(function testSIMDShuffle() { + const module = new binaryen.Module(); + + var left = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + var right = module.v128.const([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]); + var mask = [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]; + const theSIMDShuffle = binaryen.SIMDShuffle(module.v8x16.shuffle(left, right, mask)); + assert(theSIMDShuffle instanceof binaryen.SIMDShuffle); + assert(theSIMDShuffle instanceof binaryen.Expression); + assert(theSIMDShuffle.left === left); + assert(theSIMDShuffle.right === right); + assertDeepEqual(theSIMDShuffle.mask, mask); + assert(theSIMDShuffle.type === binaryen.v128); + + theSIMDShuffle.left = left = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + assert(theSIMDShuffle.left === left); + theSIMDShuffle.right = right = module.v128.const([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]); + assert(theSIMDShuffle.right === right); + theSIMDShuffle.mask = mask = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]; + assertDeepEqual(theSIMDShuffle.mask, mask); + theSIMDShuffle.type = binaryen.f64; + theSIMDShuffle.finalize(); + assert(theSIMDShuffle.type === binaryen.v128); + + console.log(theSIMDShuffle.toText()); + assert( + theSIMDShuffle.toText() + == + "(v8x16.shuffle 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n (v128.const i32x4 0x02020202 0x02020202 0x02020202 0x02020202)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDTernary"); +(function testSIMDTernary() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.BitselectVec128; + var a = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + var b = module.v128.const([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]); + var c = module.v128.const([3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]); + const theSIMDTernary = binaryen.SIMDTernary(module.v128.bitselect(a, b, c)); + assert(theSIMDTernary instanceof binaryen.SIMDTernary); + assert(theSIMDTernary instanceof binaryen.Expression); + assert(theSIMDTernary.op === op); + assert(theSIMDTernary.a === a); + assert(theSIMDTernary.b === b); + assert(theSIMDTernary.c === c); + assert(theSIMDTernary.type === binaryen.v128); + + theSIMDTernary.op = op = binaryen.Operations.QFMAVecF64x2; + assert(theSIMDTernary.op === op); + theSIMDTernary.a = a = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + assert(theSIMDTernary.a === a); + theSIMDTernary.b = b = module.v128.const([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]); + assert(theSIMDTernary.b === b); + theSIMDTernary.c = c = module.v128.const([3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]); + assert(theSIMDTernary.c === c); + theSIMDTernary.type = binaryen.f64; + theSIMDTernary.finalize(); + assert(theSIMDTernary.type === binaryen.v128); + + console.log(theSIMDTernary.toText()); + assert( + theSIMDTernary.toText() + == + "(f64x2.qfma\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n (v128.const i32x4 0x02020202 0x02020202 0x02020202 0x02020202)\n (v128.const i32x4 0x03030303 0x03030303 0x03030303 0x03030303)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDShift"); +(function testSIMDShift() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.BitselectVec128; + var vec = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + var shift = module.i32.const(1); + const theSIMDShift = binaryen.SIMDShift(module.i8x16.shl(vec, shift)); + assert(theSIMDShift instanceof binaryen.SIMDShift); + assert(theSIMDShift instanceof binaryen.Expression); + assert(theSIMDShift.op === op); + assert(theSIMDShift.vec === vec); + assert(theSIMDShift.shift === shift); + assert(theSIMDShift.type === binaryen.v128); + + theSIMDShift.op = op = binaryen.Operations.ShrSVecI8x16; + assert(theSIMDShift.op === op); + theSIMDShift.vec = vec = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); + assert(theSIMDShift.vec === vec); + theSIMDShift.shift = shift = module.i32.const(2); + assert(theSIMDShift.shift === shift); + theSIMDShift.type = binaryen.f64; + theSIMDShift.finalize(); + assert(theSIMDShift.type === binaryen.v128); + + console.log(theSIMDShift.toText()); + assert( + theSIMDShift.toText() + == + "(i8x16.shr_s\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# SIMDLoad"); +(function testSIMDLoad() { + const module = new binaryen.Module(); + + var op = binaryen.Operations.LoadExtSVec8x8ToVecI16x8; + var offset = 16; + var align = 2; + var ptr = module.i32.const(1); + const theSIMDLoad = binaryen.SIMDLoad(module.i16x8.load8x8_s(offset, align, ptr)); + assert(theSIMDLoad instanceof binaryen.SIMDLoad); + assert(theSIMDLoad instanceof binaryen.Expression); + assert(theSIMDLoad.offset === offset); + assert(theSIMDLoad.align === align); + assert(theSIMDLoad.ptr === ptr); + assert(theSIMDLoad.type === binaryen.v128); + + theSIMDLoad.op = op = binaryen.Operations.LoadSplatVec8x16; + assert(theSIMDLoad.op === op); + theSIMDLoad.offset = offset = 32; + assert(theSIMDLoad.offset === offset); + theSIMDLoad.align = align = 4; + assert(theSIMDLoad.align === align); + theSIMDLoad.ptr = ptr = module.i32.const(2); + assert(theSIMDLoad.ptr === ptr); + theSIMDLoad.type = binaryen.f64; + theSIMDLoad.finalize(); + assert(theSIMDLoad.type === binaryen.v128); + + console.log(theSIMDLoad.toText()); + assert( + theSIMDLoad.toText() + == + "(v8x16.load_splat offset=32 align=4\n (i32.const 2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# MemoryInit"); +(function testMemoryInit() { + const module = new binaryen.Module(); + + var segment = 1; + var dest = module.i32.const(2); + var offset = module.i32.const(3); + var size = module.i32.const(4); + const theMemoryInit = binaryen.MemoryInit(module.memory.init(segment, dest, offset, size)); + assert(theMemoryInit instanceof binaryen.MemoryInit); + assert(theMemoryInit instanceof binaryen.Expression); + assert(theMemoryInit.segment === segment); + assert(theMemoryInit.dest === dest); + assert(theMemoryInit.offset === offset); + assert(theMemoryInit.size === size); + assert(theMemoryInit.type === binaryen.none); + + theMemoryInit.segment = segment = 5; + assert(theMemoryInit.segment === 5); + theMemoryInit.dest = dest = module.i32.const(6); + assert(theMemoryInit.dest === dest); + theMemoryInit.offset = offset = module.i32.const(7); + assert(theMemoryInit.offset === offset); + theMemoryInit.size = size = module.i32.const(8); + assert(theMemoryInit.size === size); + theMemoryInit.type = binaryen.f64; + theMemoryInit.finalize(); + assert(theMemoryInit.type === binaryen.none); + + console.log(theMemoryInit.toText()); + assert( + theMemoryInit.toText() + == + "(memory.init 5\n (i32.const 6)\n (i32.const 7)\n (i32.const 8)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# DataDrop"); +(function testDataDrop() { + const module = new binaryen.Module(); + + var segment = 1; + const theDataDrop = binaryen.DataDrop(module.data.drop(segment)); + assert(theDataDrop instanceof binaryen.DataDrop); + assert(theDataDrop instanceof binaryen.Expression); + assert(theDataDrop.segment === segment); + assert(theDataDrop.type === binaryen.none); + + theDataDrop.segment = segment = 2; + assert(theDataDrop.segment === 2); + theDataDrop.type = binaryen.f64; + theDataDrop.finalize(); + assert(theDataDrop.type === binaryen.none); + + console.log(theDataDrop.toText()); + assert( + theDataDrop.toText() + == + "(data.drop 2)\n" + ); + + module.dispose(); +})(); + +console.log("# MemoryCopy"); +(function testMemoryCopy() { + const module = new binaryen.Module(); + + var dest = module.i32.const(1); + var source = module.i32.const(2); + var size = module.i32.const(3); + const theMemoryCopy = binaryen.MemoryCopy(module.memory.copy(dest, source, size)); + assert(theMemoryCopy instanceof binaryen.MemoryCopy); + assert(theMemoryCopy instanceof binaryen.Expression); + assert(theMemoryCopy.dest === dest); + assert(theMemoryCopy.source === source); + assert(theMemoryCopy.size === size); + assert(theMemoryCopy.type === binaryen.none); + + theMemoryCopy.dest = dest = module.i32.const(4); + assert(theMemoryCopy.dest === dest); + theMemoryCopy.source = source = module.i32.const(5); + assert(theMemoryCopy.source === source); + theMemoryCopy.size = size = module.i32.const(6); + assert(theMemoryCopy.size === size); + theMemoryCopy.type = binaryen.f64; + theMemoryCopy.finalize(); + assert(theMemoryCopy.type === binaryen.none); + + console.log(theMemoryCopy.toText()); + assert( + theMemoryCopy.toText() + == + "(memory.copy\n (i32.const 4)\n (i32.const 5)\n (i32.const 6)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# MemoryFill"); +(function testMemoryFill() { + const module = new binaryen.Module(); + + var dest = module.i32.const(1); + var value = module.i32.const(2); + var size = module.i32.const(3); + const theMemoryFill = binaryen.MemoryFill(module.memory.fill(dest, value, size)); + assert(theMemoryFill instanceof binaryen.MemoryFill); + assert(theMemoryFill instanceof binaryen.Expression); + assert(theMemoryFill.dest === dest); + assert(theMemoryFill.value === value); + assert(theMemoryFill.size === size); + assert(theMemoryFill.type === binaryen.none); + + theMemoryFill.dest = dest = module.i32.const(4); + assert(theMemoryFill.dest === dest); + theMemoryFill.value = value = module.i32.const(5); + assert(theMemoryFill.value === value); + theMemoryFill.size = size = module.i32.const(6); + assert(theMemoryFill.size === size); + theMemoryFill.type = binaryen.f64; + theMemoryFill.finalize(); + assert(theMemoryFill.type === binaryen.none); + + console.log(theMemoryFill.toText()); + assert( + theMemoryFill.toText() + == + "(memory.fill\n (i32.const 4)\n (i32.const 5)\n (i32.const 6)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# RefIsNull"); +(function testRefIsNull() { + const module = new binaryen.Module(); + + var value = module.local.get(1, binaryen.externref); + const theRefIsNull = binaryen.RefIsNull(module.ref.is_null(value)); + assert(theRefIsNull instanceof binaryen.RefIsNull); + assert(theRefIsNull instanceof binaryen.Expression); + assert(theRefIsNull.value === value); + assert(theRefIsNull.type === binaryen.i32); + + theRefIsNull.value = value = module.local.get(2, binaryen.externref); + assert(theRefIsNull.value === value); + theRefIsNull.type = binaryen.f64; + theRefIsNull.finalize(); + assert(theRefIsNull.type === binaryen.i32); + + console.log(theRefIsNull.toText()); + assert( + theRefIsNull.toText() + == + "(ref.is_null\n (local.get $2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# RefFunc"); +(function testRefFunc() { + const module = new binaryen.Module(); + + var func = "a"; + const theRefFunc = binaryen.RefFunc(module.ref.func(func)); + assert(theRefFunc instanceof binaryen.RefFunc); + assert(theRefFunc instanceof binaryen.Expression); + assert(theRefFunc.func === func); + assert(theRefFunc.type === binaryen.funcref); + + theRefFunc.func = func = "b"; + assert(theRefFunc.func === func); + theRefFunc.type = binaryen.f64; + theRefFunc.finalize(); + assert(theRefFunc.type === binaryen.funcref); + + console.log(theRefFunc.toText()); + assert( + theRefFunc.toText() + == + "(ref.func $b)\n" + ); + + module.dispose(); +})(); + +console.log("# Try"); +(function testTry() { + const module = new binaryen.Module(); + + var body = module.i32.const(1); + var catchBody = module.i32.const(2); + const theTry = binaryen.Try(module.try(body, catchBody)); + assert(theTry instanceof binaryen.Try); + assert(theTry instanceof binaryen.Expression); + assert(theTry.body === body); + assert(theTry.catchBody === catchBody); + assert(theTry.type === binaryen.i32); + + theTry.body = body = module.i32.const(3); + assert(theTry.body === body); + theTry.catchBody = catchBody = module.i32.const(4); + assert(theTry.catchBody === catchBody); + theTry.type = binaryen.f64; + theTry.finalize(); + assert(theTry.type === binaryen.i32); + + console.log(theTry.toText()); + assert( + theTry.toText() + == + "(try (result i32)\n (do\n (i32.const 3)\n )\n (catch\n (i32.const 4)\n )\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Throw"); +(function testThrow() { + const module = new binaryen.Module(); + + var event = "foo"; + var operands = [ + module.i32.const(1), + module.i32.const(2) + ]; + const theThrow = binaryen.Throw(module.throw(event, operands)); + assert(theThrow instanceof binaryen.Throw); + assert(theThrow instanceof binaryen.Expression); + assert(theThrow.event === event); + assertDeepEqual(theThrow.operands, operands); + assert(theThrow.type === binaryen.unreachable); + + theThrow.event = "bar"; + assert(theThrow.event === "bar"); + theThrow.operands = operands = [ + module.i32.const(3), // set + module.i32.const(4), // set + module.i32.const(5) // append + ]; + assertDeepEqual(theThrow.operands, operands); + theThrow.operands = operands = [ + module.i32.const(6) // set + // remove + // remove + ]; + assertDeepEqual(theThrow.operands, operands); + theThrow.insertOperandAt(1, module.i32.const(7)); + theThrow.type = binaryen.f64; + theThrow.finalize(); + assert(theThrow.type === binaryen.unreachable); + + console.log(theThrow.toText()); + assert( + theThrow.toText() + == + "(throw $bar\n (i32.const 6)\n (i32.const 7)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# Rethrow"); +(function testRethrow() { + const module = new binaryen.Module(); + + var exnref = module.local.get(1, binaryen.exnref); + const theRethrow = binaryen.Rethrow(module.rethrow(exnref)); + assert(theRethrow instanceof binaryen.Rethrow); + assert(theRethrow instanceof binaryen.Expression); + assert(theRethrow.exnref === exnref); + assert(theRethrow.type === binaryen.unreachable); + + theRethrow.exnref = exnref = module.local.get(2, binaryen.exnref); + assert(theRethrow.exnref === exnref); + theRethrow.type = binaryen.f64; + theRethrow.finalize(); + assert(theRethrow.type === binaryen.unreachable); + + console.log(theRethrow.toText()); + assert( + theRethrow.toText() + == + "(rethrow\n (local.get $2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# BrOnExn"); +(function testBrOnExn() { + const module = new binaryen.Module(); + module.addEvent("event1", 0, binaryen.none, binaryen.none); + module.addEvent("event2", 0, binaryen.none, binaryen.none); + + var name = "foo"; + var event = "event1"; + var exnref = module.local.get(1, binaryen.exnref); + const theBrOnExn = binaryen.BrOnExn(module.br_on_exn(name, event, exnref)); + assert(theBrOnExn instanceof binaryen.BrOnExn); + assert(theBrOnExn instanceof binaryen.Expression); + assert(theBrOnExn.name === name); + assert(theBrOnExn.event === event); + assert(theBrOnExn.exnref === exnref); + assert(theBrOnExn.type === binaryen.exnref); + + theBrOnExn.name = name = "bar"; + assert(theBrOnExn.name === name); + theBrOnExn.event = event = "event2"; + assert(theBrOnExn.event === event); + theBrOnExn.exnref = exnref = module.local.get(2, binaryen.exnref); + assert(theBrOnExn.exnref === exnref); + theBrOnExn.type = binaryen.f64; + theBrOnExn.finalize(); + assert(theBrOnExn.type === binaryen.exnref); + + console.log(theBrOnExn.toText()); + assert( + theBrOnExn.toText() + == + "(br_on_exn $bar $event2\n (local.get $2)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# TupleMake"); +(function testTupleMake() { + const module = new binaryen.Module(); + + var operands = [ + module.i32.const(1), + module.i32.const(2) + ]; + var type = binaryen.createType([ binaryen.i32, binaryen.i32 ]); + const theTupleMake = binaryen.TupleMake(module.tuple.make(operands)); + assert(theTupleMake instanceof binaryen.TupleMake); + assert(theTupleMake instanceof binaryen.Expression); + assertDeepEqual(theTupleMake.operands, operands); + assert(theTupleMake.type === type); + + theTupleMake.operands = operands = [ + module.i32.const(3), // set + module.i32.const(4), // set + module.i32.const(5) // append + ]; + assertDeepEqual(theTupleMake.operands, operands); + theTupleMake.operands = operands = [ + module.i32.const(6) // set + // remove + // remove + ]; + assertDeepEqual(theTupleMake.operands, operands); + theTupleMake.insertOperandAt(1, module.i32.const(7)); + theTupleMake.type = binaryen.f64; + theTupleMake.finalize(); + assert(theTupleMake.type === type); + + console.log(theTupleMake.toText()); + assert( + theTupleMake.toText() + == + "(tuple.make\n (i32.const 6)\n (i32.const 7)\n)\n" + ); + + module.dispose(); +})(); + +console.log("# TupleExtract"); +(function testTupleExtract() { + const module = new binaryen.Module(); + + var tuple = module.tuple.make([ + module.i32.const(1), + module.i32.const(2) + ]); + var index = 1; + const theTupleExtract = binaryen.TupleExtract(module.tuple.extract(tuple, index)); + assert(theTupleExtract instanceof binaryen.TupleExtract); + assert(theTupleExtract instanceof binaryen.Expression); + assert(theTupleExtract.tuple === tuple); + assert(theTupleExtract.index === index); + assert(theTupleExtract.type === binaryen.i32); + + theTupleExtract.tuple = tuple = module.tuple.make([ + module.f64.const(3), + module.f64.const(4) + ]); + assert(theTupleExtract.tuple === tuple); + theTupleExtract.index = index = 0; + assert(theTupleExtract.index === index); + theTupleExtract.type = binaryen.i32; + theTupleExtract.finalize(); + assert(theTupleExtract.type === binaryen.f64); + + console.log(theTupleExtract.toText()); + assert( + theTupleExtract.toText() + == + "(tuple.extract 0\n (tuple.make\n (f64.const 3)\n (f64.const 4)\n )\n)\n" + ); + + module.dispose(); +})(); |