| 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() { | |
| const module = new binaryen.Module(); | |
| const ptr = module.block(null, []); | |
| var theExpression = binaryen.Expression(ptr); // 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 | 0) === ptr); // via valueOf | |
| module.dispose(); | |
| })(); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theBlock); | |
| assert(info.id === theBlock.id); | |
| assert(info.type === theBlock.type); | |
| assert(info.name === theBlock.name); | |
| assertDeepEqual(info.children, theBlock.children); | |
| theBlock.name ="theName"; | |
| assert(theBlock.name === "theName"); | |
| theBlock.type = binaryen.i32; | |
| assert(theBlock.type === binaryen.i32); | |
| assert(theBlock.numChildren === 0); | |
| assertDeepEqual(theBlock.children, []); | |
| assertDeepEqual(theBlock.getChildren(), []); | |
| 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(); | |
| info = binaryen.getExpressionInfo(theBlock); | |
| assert(info.name === theBlock.name); | |
| assertDeepEqual(info.children, theBlock.children); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theIf); | |
| assert(info.id === theIf.id); | |
| assert(info.type === theIf.type); | |
| assert(info.condition === theIf.condition); | |
| assert(info.ifTrue === theIf.ifTrue); | |
| assert(info.ifFalse === theIf.ifFalse); | |
| 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(); | |
| info = binaryen.getExpressionInfo(theIf); | |
| assert(info.condition === theIf.condition); | |
| assert(info.ifTrue === theIf.ifTrue); | |
| assert(info.ifFalse === theIf.ifFalse); | |
| console.log(theIf.toText()); | |
| assert( | |
| theIf.toText() | |
| == | |
| "(if (result i32)\n (i32.const 4)\n (then\n (i32.const 5)\n )\n (else\n (i32.const 6)\n )\n)\n" | |
| ); | |
| theIf.ifFalse = null; | |
| assert(!theIf.ifFalse); | |
| info = binaryen.getExpressionInfo(theIf); | |
| assert(info.ifFalse === theIf.ifFalse); | |
| console.log(theIf.toText()); | |
| assert( | |
| theIf.toText() | |
| == | |
| "(if (result i32)\n (i32.const 4)\n (then\n (i32.const 5)\n )\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); | |
| var info = binaryen.getExpressionInfo(theLoop); | |
| assert(info.id === theLoop.id); | |
| assert(info.type === theLoop.type); | |
| assert(info.name === theLoop.name); | |
| assert(info.body === theLoop.body); | |
| 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); | |
| info = binaryen.getExpressionInfo(theLoop); | |
| assert(info.type === theLoop.type); | |
| assert(info.name === theLoop.name); | |
| assert(info.body === theLoop.body); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theBreak); | |
| assert(info.id === theBreak.id); | |
| assert(info.type === theBreak.type); | |
| assert(info.name === theBreak.name); | |
| assert(info.condition === theBreak.condition); | |
| assert(info.value === theBreak.value); | |
| 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(); | |
| info = binaryen.getExpressionInfo(theBreak); | |
| assert(info.name === theBreak.name); | |
| assert(info.condition === theBreak.condition); | |
| assert(info.value === theBreak.value); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theSwitch); | |
| assert(info.id === theSwitch.id); | |
| assert(info.type === theSwitch.type); | |
| assertDeepEqual(info.names, theSwitch.names); | |
| assert(info.defaultName === theSwitch.defaultName); | |
| assert(info.condition === theSwitch.condition); | |
| assert(info.value === theSwitch.value); | |
| names = [ | |
| "1", // set | |
| "2", //set | |
| "3" // append | |
| ] | |
| theSwitch.setNames(names); | |
| assertDeepEqual(theSwitch.names, names); | |
| theSwitch.names = names = [ | |
| "x", // set | |
| // remove | |
| // remove | |
| ]; | |
| assertDeepEqual(theSwitch.names, names); | |
| assertDeepEqual(theSwitch.getNames(), 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(); | |
| info = binaryen.getExpressionInfo(theSwitch); | |
| assertDeepEqual(info.names, theSwitch.names); | |
| assert(info.defaultName === theSwitch.defaultName); | |
| assert(info.condition === theSwitch.condition); | |
| assert(info.value === theSwitch.value); | |
| 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); | |
| assertDeepEqual(theCall.getOperands(), operands); | |
| assert(theCall.return === false); | |
| assert(theCall.type === binaryen.i32); | |
| var info = binaryen.getExpressionInfo(theCall); | |
| assert(info.id === theCall.id); | |
| assert(info.type === theCall.type); | |
| assert(info.target === theCall.target); | |
| assertDeepEqual(info.operands, theCall.operands); | |
| assert(info.isReturn === theCall.return); | |
| 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); | |
| operands = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theCall.setOperands(operands); | |
| 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 | |
| info = binaryen.getExpressionInfo(theCall); | |
| assert(info.type === theCall.type); | |
| assert(info.target === theCall.target); | |
| assertDeepEqual(info.operands, theCall.operands); | |
| assert(info.isReturn === theCall.return); | |
| theCall.return = false; | |
| theCall.type = binaryen.i32; | |
| theCall.finalize(); | |
| assert(theCall.type === binaryen.i32); // finalized call | |
| info = binaryen.getExpressionInfo(theCall); | |
| assert(info.type === theCall.type); | |
| assert(info.isReturn === theCall.return); | |
| 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 table = "0"; | |
| 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(table, target, operands, params, results)); | |
| assert(theCallIndirect instanceof binaryen.CallIndirect); | |
| assert(theCallIndirect instanceof binaryen.Expression); | |
| assert(theCallIndirect.table === table); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theCallIndirect); | |
| assert(info.id === theCallIndirect.id); | |
| assert(info.type === theCallIndirect.type); | |
| assert(info.table === theCallIndirect.table); | |
| assert(info.target === theCallIndirect.target); | |
| assertDeepEqual(info.operands, theCallIndirect.operands); | |
| assert(info.params === theCallIndirect.params); | |
| assert(info.results === theCallIndirect.results); | |
| assert(info.isReturn === theCallIndirect.return); | |
| 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); | |
| operands = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theCallIndirect.setOperands(operands); | |
| assertDeepEqual(theCallIndirect.operands, operands); | |
| assertDeepEqual(theCallIndirect.getOperands(), 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 | |
| info = binaryen.getExpressionInfo(theCallIndirect); | |
| assert(info.type === theCallIndirect.type); | |
| assert(info.target === theCallIndirect.target); | |
| assertDeepEqual(info.operands, theCallIndirect.operands); | |
| assert(info.params === theCallIndirect.params); | |
| assert(info.results === theCallIndirect.results); | |
| assert(info.isReturn === theCallIndirect.return); | |
| theCallIndirect.return = false; | |
| theCallIndirect.finalize(); | |
| assert(theCallIndirect.type === results); // finalized call | |
| info = binaryen.getExpressionInfo(theCallIndirect); | |
| assert(info.isReturn === theCallIndirect.return); | |
| console.log(theCallIndirect.toText()); | |
| assert( | |
| theCallIndirect.toText() | |
| == | |
| "(call_indirect $0 (type $func.0)\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); | |
| var info = binaryen.getExpressionInfo(theLocalGet); | |
| assert(info.id === theLocalGet.id); | |
| assert(info.type === theLocalGet.type); | |
| assert(info.index === theLocalGet.index); | |
| theLocalGet.index = index = 2; | |
| assert(theLocalGet.index === index); | |
| theLocalGet.type = type = binaryen.f64; | |
| assert(theLocalGet.type === type); | |
| theLocalGet.finalize(); | |
| info = binaryen.getExpressionInfo(theLocalGet); | |
| assert(info.type === theLocalGet.type); | |
| assert(info.index === theLocalGet.index); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theLocalSet); | |
| assert(info.id === theLocalSet.id); | |
| assert(info.type === theLocalSet.type); | |
| assert(info.index === theLocalSet.index); | |
| assert(info.value === theLocalSet.value); | |
| assert(info.isTee === theLocalSet.tee) | |
| 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(); | |
| info = binaryen.getExpressionInfo(theLocalSet); | |
| assert(info.type === theLocalSet.type); | |
| assert(info.index === theLocalSet.index); | |
| assert(info.value === theLocalSet.value); | |
| assert(info.isTee === theLocalSet.tee) | |
| 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); | |
| var info = binaryen.getExpressionInfo(theGlobalGet); | |
| assert(info.id === theGlobalGet.id); | |
| assert(info.type === theGlobalGet.type); | |
| assert(info.name === theGlobalGet.name); | |
| theGlobalGet.name = name = "b"; | |
| assert(theGlobalGet.name === name); | |
| theGlobalGet.type = type = binaryen.f64; | |
| assert(theGlobalGet.type === type); | |
| theGlobalGet.finalize(); | |
| info = binaryen.getExpressionInfo(theGlobalGet); | |
| assert(info.type === theGlobalGet.type); | |
| assert(info.name === theGlobalGet.name); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theGlobalSet); | |
| assert(info.id === theGlobalSet.id); | |
| assert(info.type === theGlobalSet.type); | |
| assert(info.name === theGlobalSet.name); | |
| assert(info.value === theGlobalSet.value); | |
| theGlobalSet.name = name = "b"; | |
| assert(theGlobalSet.name === name); | |
| theGlobalSet.value = value = module.f64.const(3); | |
| assert(theGlobalSet.value === value); | |
| theGlobalSet.finalize(); | |
| info = binaryen.getExpressionInfo(theGlobalSet); | |
| assert(info.name === theGlobalSet.name); | |
| assert(info.value === theGlobalSet.value); | |
| console.log(theGlobalSet.toText()); | |
| assert( | |
| theGlobalSet.toText() | |
| == | |
| "(global.set $b\n (f64.const 3)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# MemorySize"); | |
| (function testMemorySize() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| var type = binaryen.i32; | |
| const theMemorySize = binaryen.MemorySize(module.memory.size()); | |
| assert(theMemorySize instanceof binaryen.MemorySize); | |
| assert(theMemorySize instanceof binaryen.Expression); | |
| assert(theMemorySize.type === type); | |
| theMemorySize.finalize(); | |
| var info = binaryen.getExpressionInfo(theMemorySize); | |
| assert(info.id === theMemorySize.id); | |
| assert(info.type === theMemorySize.type); | |
| console.log(theMemorySize.toText()); | |
| assert( | |
| theMemorySize.toText() | |
| == | |
| "(memory.size $0)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# MemoryGrow"); | |
| (function testMemoryGrow() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| var type = binaryen.i32; | |
| var delta = module.i32.const(1); | |
| const theMemoryGrow = binaryen.MemoryGrow(module.memory.grow(delta)); | |
| assert(theMemoryGrow instanceof binaryen.MemoryGrow); | |
| assert(theMemoryGrow instanceof binaryen.Expression); | |
| assert(theMemoryGrow.delta === delta); | |
| assert(theMemoryGrow.type === type); | |
| var info = binaryen.getExpressionInfo(theMemoryGrow); | |
| assert(info.id === theMemoryGrow.id); | |
| assert(info.type === theMemoryGrow.type); | |
| assert(info.delta === theMemoryGrow.delta); | |
| theMemoryGrow.delta = delta = module.i32.const(2); | |
| assert(theMemoryGrow.delta === delta); | |
| theMemoryGrow.finalize(); | |
| info = binaryen.getExpressionInfo(theMemoryGrow); | |
| assert(info.delta === theMemoryGrow.delta); | |
| console.log(theMemoryGrow.toText()); | |
| assert( | |
| theMemoryGrow.toText() | |
| == | |
| "(memory.grow $0\n (i32.const 2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# Load"); | |
| (function testLoad() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theLoad); | |
| assert(info.id === theLoad.id); | |
| assert(info.type === theLoad.type); | |
| assert(info.offset === theLoad.offset); | |
| assert(info.align === theLoad.align); | |
| assert(info.ptr === theLoad.ptr); | |
| assert(info.bytes === theLoad.bytes); | |
| assert(info.isSigned === theLoad.signed); | |
| assert(info.isAtomic === theLoad.atomic); | |
| 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.memoryOrder = binaryen.MemoryOrder.seqcst; | |
| assert(theLoad.atomic === true); | |
| theLoad.finalize(); | |
| assert(theLoad.align === 4); | |
| info = binaryen.getExpressionInfo(theLoad); | |
| assert(info.offset === theLoad.offset); | |
| assert(info.align === theLoad.align); | |
| assert(info.ptr === theLoad.ptr); | |
| assert(info.bytes === theLoad.bytes); | |
| assert(info.isSigned === theLoad.signed); | |
| assert(info.isAtomic === theLoad.atomic); | |
| console.log(theLoad.toText()); | |
| assert( | |
| theLoad.toText() | |
| == | |
| "(i64.atomic.load $0 offset=32 align=4\n (i32.const 128)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# Store"); | |
| (function testStore() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theStore); | |
| assert(info.id === theStore.id); | |
| assert(info.type === theStore.type); | |
| assert(info.offset === theStore.offset); | |
| assert(info.align === theStore.align); | |
| assert(info.ptr === theStore.ptr); | |
| assert(info.value === theStore.value); | |
| assert(info.bytes === theStore.bytes); | |
| assert(info.isAtomic === theStore.atomic); | |
| assert(info.valueType === theStore.valueType); | |
| 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.memoryOrder = binaryen.MemoryOrder.seqcst; | |
| assert(theStore.atomic === true); | |
| theStore.finalize(); | |
| assert(theStore.align === 4); | |
| info = binaryen.getExpressionInfo(theStore); | |
| assert(info.offset === theStore.offset); | |
| assert(info.align === theStore.align); | |
| assert(info.ptr === theStore.ptr); | |
| assert(info.value === theStore.value); | |
| assert(info.bytes === theStore.bytes); | |
| assert(info.isAtomic === theStore.atomic); | |
| assert(info.valueType === theStore.valueType); | |
| console.log(theStore.toText()); | |
| assert( | |
| theStore.toText() | |
| == | |
| "(i64.atomic.store $0 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); | |
| var info = binaryen.getExpressionInfo(theConst); | |
| assert(info.id === theConst.id); | |
| assert(info.type === theConst.type); | |
| assert(info.value === theConst.valueI32); | |
| theConst.valueI64 = 3; | |
| assert(theConst.valueI64 === 3n); | |
| theConst.finalize(); | |
| assert(theConst.type == binaryen.i64); | |
| info = binaryen.getExpressionInfo(theConst); | |
| assert(info.type === theConst.type); | |
| assert(info.value === theConst.valueI64); | |
| theConst.valueF32 = 5; | |
| assert(theConst.valueF32 === 5); | |
| theConst.finalize(); | |
| assert(theConst.type === binaryen.f32); | |
| info = binaryen.getExpressionInfo(theConst); | |
| assert(info.type === theConst.type); | |
| assert(info.value === theConst.valueF32); | |
| theConst.valueF64 = 6; | |
| assert(theConst.valueF64 === 6); | |
| theConst.finalize(); | |
| assert(theConst.type === binaryen.f64); | |
| info = binaryen.getExpressionInfo(theConst); | |
| assert(info.type === theConst.type); | |
| assert(info.value === theConst.valueF64); | |
| 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); | |
| info = binaryen.getExpressionInfo(theConst); | |
| assert(info.type === theConst.type); | |
| assertDeepEqual(info.value, theConst.valueV128); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theUnary); | |
| assert(info.id === theUnary.id); | |
| assert(info.type === theUnary.type); | |
| assert(info.op === theUnary.op); | |
| assert(info.value === theUnary.value); | |
| 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); | |
| info = binaryen.getExpressionInfo(theUnary); | |
| assert(info.type === theUnary.type); | |
| assert(info.op === theUnary.op); | |
| assert(info.value === theUnary.value); | |
| 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) | |
| var info = binaryen.getExpressionInfo(theBinary); | |
| assert(info.id === theBinary.id); | |
| assert(info.type === theBinary.type); | |
| assert(info.op === theBinary.op); | |
| assert(info.left === theBinary.left); | |
| assert(info.right === theBinary.right); | |
| 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); | |
| info = binaryen.getExpressionInfo(theBinary); | |
| assert(info.type === theBinary.type); | |
| assert(info.op === theBinary.op); | |
| assert(info.left === theBinary.left); | |
| assert(info.right === theBinary.right); | |
| console.log(theBinary.toText()); | |
| assert( | |
| theBinary.toText() | |
| == | |
| "(i64.add\n (i64.const 3)\n (i64.const 4)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# WideIntAddSub"); | |
| (function testWideIntAddSub() { | |
| const module = new binaryen.Module(); | |
| var leftLow = module.i64.const(1); | |
| var leftHigh = module.i64.const(2); | |
| var rightLow = module.i64.const(3); | |
| var rightHigh = module.i64.const(4); | |
| const theWideAdd = binaryen.WideIntAddSub(module.i64.add128(leftLow, leftHigh, rightLow, rightHigh)); | |
| assert(theWideAdd instanceof binaryen.WideIntAddSub); | |
| assert(theWideAdd instanceof binaryen.Expression); | |
| assert(theWideAdd.op === binaryen.Operations.AddInt128); | |
| assert(theWideAdd.leftLow === leftLow); | |
| assert(theWideAdd.leftHigh === leftHigh); | |
| assert(theWideAdd.rightLow === rightLow); | |
| assert(theWideAdd.rightHigh === rightHigh); | |
| theWideAdd.op = binaryen.Operations.SubInt128; | |
| assert(theWideAdd.op === binaryen.Operations.SubInt128); | |
| theWideAdd.leftLow = module.i64.const(5); | |
| theWideAdd.leftHigh = module.i64.const(6); | |
| theWideAdd.rightLow = module.i64.const(7); | |
| theWideAdd.rightHigh = module.i64.const(8); | |
| theWideAdd.finalize(); | |
| console.log(theWideAdd.toText()); | |
| assert( | |
| theWideAdd.toText() | |
| == | |
| "(i64.sub128\n (i64.const 5)\n (i64.const 6)\n (i64.const 7)\n (i64.const 8)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# WideIntMul"); | |
| (function testWideIntMul() { | |
| const module = new binaryen.Module(); | |
| var left = module.i64.const(1); | |
| var right = module.i64.const(2); | |
| const theWideMul = binaryen.WideIntMul(module.i64.mul_wide_s(left, right)); | |
| assert(theWideMul instanceof binaryen.WideIntMul); | |
| assert(theWideMul instanceof binaryen.Expression); | |
| assert(theWideMul.op === binaryen.Operations.MulWideSInt64); | |
| assert(theWideMul.left === left); | |
| assert(theWideMul.right === right); | |
| theWideMul.op = binaryen.Operations.MulWideUInt64; | |
| assert(theWideMul.op === binaryen.Operations.MulWideUInt64); | |
| theWideMul.left = module.i64.const(3); | |
| theWideMul.right = module.i64.const(4); | |
| theWideMul.finalize(); | |
| console.log(theWideMul.toText()); | |
| assert( | |
| theWideMul.toText() | |
| == | |
| "(i64.mul_wide_u\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); | |
| var info = binaryen.getExpressionInfo(theSelect); | |
| assert(info.id === theSelect.id); | |
| assert(info.type === theSelect.type); | |
| assert(info.condition === theSelect.condition); | |
| assert(info.ifTrue === theSelect.ifTrue); | |
| assert(info.ifFalse === theSelect.ifFalse); | |
| 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); | |
| info = binaryen.getExpressionInfo(theSelect); | |
| assert(info.type === theSelect.type); | |
| assert(info.condition === theSelect.condition); | |
| assert(info.ifTrue === theSelect.ifTrue); | |
| assert(info.ifFalse === theSelect.ifFalse); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theDrop); | |
| assert(info.id === theDrop.id); | |
| assert(info.type === theDrop.type); | |
| assert(info.value === theDrop.value); | |
| theDrop.value = value = module.i32.const(2); | |
| assert(theDrop.value === value); | |
| theDrop.finalize(); | |
| assert(theDrop.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theDrop); | |
| assert(info.type === theDrop.type); | |
| assert(info.value === theDrop.value); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theReturn); | |
| assert(info.id === theReturn.id); | |
| assert(info.type === theReturn.type); | |
| assert(info.value === theReturn.value); | |
| theReturn.value = value = module.i32.const(2); | |
| assert(theReturn.value === value); | |
| theReturn.finalize(); | |
| assert(theReturn.type === binaryen.unreachable); | |
| info = binaryen.getExpressionInfo(theReturn); | |
| assert(info.type === theReturn.type); | |
| assert(info.value === theReturn.value); | |
| 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(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theAtomicRMW); | |
| assert(info.id === theAtomicRMW.id); | |
| assert(info.type === theAtomicRMW.type); | |
| assert(info.op === theAtomicRMW.op); | |
| assert(info.bytes === theAtomicRMW.bytes); | |
| assert(info.offset === theAtomicRMW.offset); | |
| assert(info.ptr === theAtomicRMW.ptr); | |
| assert(info.value === theAtomicRMW.value); | |
| 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); | |
| info = binaryen.getExpressionInfo(theAtomicRMW); | |
| assert(info.type === theAtomicRMW.type); | |
| assert(info.op === theAtomicRMW.op); | |
| assert(info.bytes === theAtomicRMW.bytes); | |
| assert(info.offset === theAtomicRMW.offset); | |
| assert(info.ptr === theAtomicRMW.ptr); | |
| assert(info.value === theAtomicRMW.value); | |
| console.log(theAtomicRMW.toText()); | |
| assert( | |
| theAtomicRMW.toText() | |
| == | |
| "(i64.atomic.rmw16.sub_u $0 offset=16\n (i32.const 4)\n (i64.const 5)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# AtomicCmpxchg"); | |
| (function testAtomicCmpxchg() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theAtomicCmpxchg); | |
| assert(info.id === theAtomicCmpxchg.id); | |
| assert(info.type === theAtomicCmpxchg.type); | |
| assert(info.bytes === theAtomicCmpxchg.bytes); | |
| assert(info.offset === theAtomicCmpxchg.offset); | |
| assert(info.ptr === theAtomicCmpxchg.ptr); | |
| assert(info.expected === theAtomicCmpxchg.expected); | |
| assert(info.replacement === theAtomicCmpxchg.replacement); | |
| 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); | |
| info = binaryen.getExpressionInfo(theAtomicCmpxchg); | |
| assert(info.type === theAtomicCmpxchg.type); | |
| assert(info.bytes === theAtomicCmpxchg.bytes); | |
| assert(info.offset === theAtomicCmpxchg.offset); | |
| assert(info.ptr === theAtomicCmpxchg.ptr); | |
| assert(info.expected === theAtomicCmpxchg.expected); | |
| assert(info.replacement === theAtomicCmpxchg.replacement); | |
| console.log(theAtomicCmpxchg.toText()); | |
| assert( | |
| theAtomicCmpxchg.toText() | |
| == | |
| "(i64.atomic.rmw16.cmpxchg_u $0 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(); | |
| module.setMemory(1, 1, null); | |
| var ptr = module.i32.const(2); | |
| var expected = module.i32.const(3); | |
| var timeout = module.i64.const(4); | |
| const theAtomicWait = binaryen.AtomicWait(module.memory.atomic.wait32(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); | |
| var info = binaryen.getExpressionInfo(theAtomicWait); | |
| assert(info.id === theAtomicWait.id); | |
| assert(info.type === theAtomicWait.type); | |
| assert(info.ptr === theAtomicWait.ptr); | |
| assert(info.expected === theAtomicWait.expected); | |
| assert(info.expectedType === theAtomicWait.expectedType); | |
| assert(info.timeout === theAtomicWait.timeout); | |
| 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); | |
| info = binaryen.getExpressionInfo(theAtomicWait); | |
| assert(info.type === theAtomicWait.type); | |
| assert(info.ptr === theAtomicWait.ptr); | |
| assert(info.expected === theAtomicWait.expected); | |
| assert(info.expectedType === theAtomicWait.expectedType); | |
| assert(info.timeout === theAtomicWait.timeout); | |
| console.log(theAtomicWait.toText()); | |
| assert( | |
| theAtomicWait.toText() | |
| == | |
| "(memory.atomic.wait64 $0\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(); | |
| module.setMemory(1, 1, null); | |
| var ptr = module.i32.const(1); | |
| var notifyCount = module.i32.const(2); | |
| const theAtomicNotify = binaryen.AtomicNotify(module.memory.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); | |
| var info = binaryen.getExpressionInfo(theAtomicNotify); | |
| assert(info.id === theAtomicNotify.id); | |
| assert(info.type === theAtomicNotify.type); | |
| assert(info.ptr === theAtomicNotify.ptr); | |
| assert(info.notifyCount === theAtomicNotify.notifyCount); | |
| 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); | |
| info = binaryen.getExpressionInfo(theAtomicNotify); | |
| assert(info.type === theAtomicNotify.type); | |
| assert(info.ptr === theAtomicNotify.ptr); | |
| assert(info.notifyCount === theAtomicNotify.notifyCount); | |
| console.log(theAtomicNotify.toText()); | |
| assert( | |
| theAtomicNotify.toText() | |
| == | |
| "(memory.atomic.notify $0\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 === binaryen.MemoryOrder.seqcst); | |
| assert(theAtomicFence.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theAtomicFence); | |
| assert(info.id === theAtomicFence.id); | |
| assert(info.type === theAtomicFence.type); | |
| assert(info.order === theAtomicFence.order); | |
| theAtomicFence.order = binaryen.MemoryOrder.acqrel; | |
| assert(theAtomicFence.order === binaryen.MemoryOrder.acqrel); | |
| info = binaryen.getExpressionInfo(theAtomicFence); | |
| assert(info.type === theAtomicFence.type); | |
| assert(info.order === theAtomicFence.order); | |
| console.log(theAtomicFence.toText()); | |
| assert( | |
| theAtomicFence.toText() | |
| == | |
| "(atomic.fence acqrel)\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); | |
| var info = binaryen.getExpressionInfo(theSIMDExtract); | |
| assert(info.id === theSIMDExtract.id); | |
| assert(info.type === theSIMDExtract.type); | |
| assert(info.op === theSIMDExtract.op); | |
| assert(info.vec === theSIMDExtract.vec); | |
| assert(info.index === theSIMDExtract.index); | |
| 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); | |
| info = binaryen.getExpressionInfo(theSIMDExtract); | |
| assert(info.type === theSIMDExtract.type); | |
| assert(info.op === theSIMDExtract.op); | |
| assert(info.vec === theSIMDExtract.vec); | |
| assert(info.index === theSIMDExtract.index); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theSIMDReplace); | |
| assert(info.id === theSIMDReplace.id); | |
| assert(info.type === theSIMDReplace.type); | |
| assert(info.op === theSIMDReplace.op); | |
| assert(info.vec === theSIMDReplace.vec); | |
| assert(info.index === theSIMDReplace.index); | |
| assert(info.value === theSIMDReplace.value); | |
| 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); | |
| info = binaryen.getExpressionInfo(theSIMDReplace); | |
| assert(info.type === theSIMDReplace.type); | |
| assert(info.op === theSIMDReplace.op); | |
| assert(info.vec === theSIMDReplace.vec); | |
| assert(info.index === theSIMDReplace.index); | |
| assert(info.value === theSIMDReplace.value); | |
| 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.i8x16.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); | |
| var info = binaryen.getExpressionInfo(theSIMDShuffle); | |
| assert(info.id === theSIMDShuffle.id); | |
| assert(info.type === theSIMDShuffle.type); | |
| assert(info.left === theSIMDShuffle.left); | |
| assert(info.right === theSIMDShuffle.right); | |
| assertDeepEqual(info.mask, theSIMDShuffle.mask); | |
| 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); | |
| info = binaryen.getExpressionInfo(theSIMDShuffle); | |
| assert(info.type === theSIMDShuffle.type); | |
| assert(info.left === theSIMDShuffle.left); | |
| assert(info.right === theSIMDShuffle.right); | |
| assertDeepEqual(info.mask, theSIMDShuffle.mask); | |
| console.log(theSIMDShuffle.toText()); | |
| assert( | |
| theSIMDShuffle.toText() | |
| == | |
| "(i8x16.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); | |
| var info = binaryen.getExpressionInfo(theSIMDTernary); | |
| assert(info.id === theSIMDTernary.id); | |
| assert(info.type === theSIMDTernary.type); | |
| assert(info.op === theSIMDTernary.op); | |
| assert(info.a === theSIMDTernary.a); | |
| assert(info.b === theSIMDTernary.b); | |
| assert(info.c === theSIMDTernary.c); | |
| console.log(theSIMDTernary.toText() + "\n"); | |
| assert( | |
| theSIMDTernary.toText() | |
| == | |
| "(v128.bitselect\n (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)\n (v128.const i32x4 0x05040302 0x09080706 0x0d0c0b0a 0x11100f0e)\n (v128.const i32x4 0x06050403 0x0a090807 0x0e0d0c0b 0x1211100f)\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); | |
| var info = binaryen.getExpressionInfo(theSIMDShift); | |
| assert(info.id === theSIMDShift.id); | |
| assert(info.type === theSIMDShift.type); | |
| assert(info.op === theSIMDShift.op); | |
| assert(info.vec === theSIMDShift.vec); | |
| assert(info.shift === theSIMDShift.shift); | |
| 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); | |
| info = binaryen.getExpressionInfo(theSIMDShift); | |
| assert(info.type === theSIMDShift.type); | |
| assert(info.op === theSIMDShift.op); | |
| assert(info.vec === theSIMDShift.vec); | |
| assert(info.shift === theSIMDShift.shift); | |
| 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(); | |
| module.setMemory(1, 1, null); | |
| var op = binaryen.Operations.Load8x8SVec128; | |
| var offset = 16; | |
| var align = 2; | |
| var ptr = module.i32.const(1); | |
| const theSIMDLoad = binaryen.SIMDLoad(module.v128.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); | |
| var info = binaryen.getExpressionInfo(theSIMDLoad); | |
| assert(info.id === theSIMDLoad.id); | |
| assert(info.type === theSIMDLoad.type); | |
| assert(info.offset === theSIMDLoad.offset); | |
| assert(info.align === theSIMDLoad.align); | |
| assert(info.ptr === theSIMDLoad.ptr); | |
| theSIMDLoad.op = op = binaryen.Operations.Load8SplatVec128; | |
| 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); | |
| info = binaryen.getExpressionInfo(theSIMDLoad); | |
| assert(info.type === theSIMDLoad.type); | |
| assert(info.offset === theSIMDLoad.offset); | |
| assert(info.align === theSIMDLoad.align); | |
| assert(info.ptr === theSIMDLoad.ptr); | |
| console.log(theSIMDLoad.toText()); | |
| assert( | |
| theSIMDLoad.toText() | |
| == | |
| "(v128.load8_splat $0 offset=32 align=4\n (i32.const 2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# SIMDLoadStoreLane"); | |
| (function testSIMDLoadStoreLane() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| var op = binaryen.Operations.Load8LaneVec128; | |
| var offset = 16; | |
| var index = 1; | |
| var align = 1; | |
| var ptr = module.i32.const(1); | |
| var vec = module.v128.const([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); | |
| const theSIMDLoadStoreLane = binaryen.SIMDLoadStoreLane(module.v128.load8_lane(offset, align, index, ptr, vec)); | |
| assert(theSIMDLoadStoreLane instanceof binaryen.SIMDLoadStoreLane); | |
| assert(theSIMDLoadStoreLane instanceof binaryen.Expression); | |
| assert(theSIMDLoadStoreLane.op === op); | |
| assert(theSIMDLoadStoreLane.offset === offset); | |
| assert(theSIMDLoadStoreLane.align === align); | |
| assert(theSIMDLoadStoreLane.index === index); | |
| assert(theSIMDLoadStoreLane.ptr === ptr); | |
| assert(theSIMDLoadStoreLane.vec === vec); | |
| assert(theSIMDLoadStoreLane.type === binaryen.v128); | |
| assert(theSIMDLoadStoreLane.store === false); | |
| var info = binaryen.getExpressionInfo(theSIMDLoadStoreLane); | |
| assert(info.id === theSIMDLoadStoreLane.id); | |
| assert(info.type === theSIMDLoadStoreLane.type); | |
| assert(info.op === theSIMDLoadStoreLane.op); | |
| assert(info.offset === theSIMDLoadStoreLane.offset); | |
| assert(info.align === theSIMDLoadStoreLane.align); | |
| assert(info.index === theSIMDLoadStoreLane.index); | |
| assert(info.ptr === theSIMDLoadStoreLane.ptr); | |
| assert(info.vec === theSIMDLoadStoreLane.vec); | |
| assert(info.isStore === theSIMDLoadStoreLane.store); | |
| theSIMDLoadStoreLane.op = op = binaryen.Operations.Load16LaneVec128; | |
| assert(theSIMDLoadStoreLane.op === op); | |
| theSIMDLoadStoreLane.offset = offset = 32; | |
| assert(theSIMDLoadStoreLane.offset === offset); | |
| theSIMDLoadStoreLane.align = align = 2; | |
| assert(theSIMDLoadStoreLane.align === align); | |
| theSIMDLoadStoreLane.index = index = 2; | |
| assert(theSIMDLoadStoreLane.index === index); | |
| theSIMDLoadStoreLane.ptr = ptr = module.i32.const(2); | |
| assert(theSIMDLoadStoreLane.ptr === ptr); | |
| theSIMDLoadStoreLane.vec = vec = module.v128.const([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]); | |
| assert(theSIMDLoadStoreLane.vec === vec); | |
| theSIMDLoadStoreLane.type = binaryen.f64; | |
| theSIMDLoadStoreLane.finalize(); | |
| assert(theSIMDLoadStoreLane.type === binaryen.v128); | |
| info = binaryen.getExpressionInfo(theSIMDLoadStoreLane); | |
| assert(info.type === theSIMDLoadStoreLane.type); | |
| assert(info.op === theSIMDLoadStoreLane.op); | |
| assert(info.offset === theSIMDLoadStoreLane.offset); | |
| assert(info.align === theSIMDLoadStoreLane.align); | |
| assert(info.index === theSIMDLoadStoreLane.index); | |
| assert(info.ptr === theSIMDLoadStoreLane.ptr); | |
| assert(info.vec === theSIMDLoadStoreLane.vec); | |
| console.log(theSIMDLoadStoreLane.toText()); | |
| assert( | |
| theSIMDLoadStoreLane.toText() | |
| == | |
| "(v128.load16_lane $0 offset=32 2\n (i32.const 2)\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n)\n" | |
| ); | |
| theSIMDLoadStoreLane.op = op = binaryen.Operations.Store16LaneVec128; | |
| assert(theSIMDLoadStoreLane.op === op); | |
| theSIMDLoadStoreLane.type = binaryen.f64; | |
| assert(theSIMDLoadStoreLane.store === true); | |
| theSIMDLoadStoreLane.finalize(); | |
| assert(theSIMDLoadStoreLane.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theSIMDLoadStoreLane); | |
| assert(info.type === theSIMDLoadStoreLane.type); | |
| assert(info.op === theSIMDLoadStoreLane.op); | |
| assert(info.isStore === theSIMDLoadStoreLane.store); | |
| console.log(theSIMDLoadStoreLane.toText()); | |
| assert( | |
| theSIMDLoadStoreLane.toText() | |
| == | |
| "(v128.store16_lane $0 offset=32 2\n (i32.const 2)\n (v128.const i32x4 0x01010101 0x01010101 0x01010101 0x01010101)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# MemoryInit"); | |
| (function testMemoryInit() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theMemoryInit); | |
| assert(info.id === theMemoryInit.id); | |
| assert(info.type === theMemoryInit.type); | |
| assert(info.segment === theMemoryInit.segment); | |
| assert(info.dest === theMemoryInit.dest); | |
| assert(info.offset === theMemoryInit.offset); | |
| assert(info.size === theMemoryInit.size); | |
| 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); | |
| info = binaryen.getExpressionInfo(theMemoryInit); | |
| assert(info.type === theMemoryInit.type); | |
| assert(info.segment === theMemoryInit.segment); | |
| assert(info.dest === theMemoryInit.dest); | |
| assert(info.offset === theMemoryInit.offset); | |
| assert(info.size === theMemoryInit.size); | |
| console.log(theMemoryInit.toText()); | |
| assert( | |
| theMemoryInit.toText() | |
| == | |
| "(memory.init $0 $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); | |
| var info = binaryen.getExpressionInfo(theDataDrop); | |
| assert(info.id === theDataDrop.id); | |
| assert(info.type === theDataDrop.type); | |
| assert(info.segment === theDataDrop.segment); | |
| theDataDrop.segment = segment = "2"; | |
| assert(theDataDrop.segment === "2"); | |
| theDataDrop.type = binaryen.f64; | |
| theDataDrop.finalize(); | |
| assert(theDataDrop.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theDataDrop); | |
| assert(info.type === theDataDrop.type); | |
| assert(info.segment === theDataDrop.segment); | |
| console.log(theDataDrop.toText()); | |
| assert( | |
| theDataDrop.toText() | |
| == | |
| "(data.drop $2)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# MemoryCopy"); | |
| (function testMemoryCopy() { | |
| const module = new binaryen.Module(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theMemoryCopy); | |
| assert(info.id === theMemoryCopy.id); | |
| assert(info.type === theMemoryCopy.type); | |
| assert(info.dest === theMemoryCopy.dest); | |
| assert(info.source === theMemoryCopy.source); | |
| assert(info.size === theMemoryCopy.size); | |
| 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); | |
| info = binaryen.getExpressionInfo(theMemoryCopy); | |
| assert(info.type === theMemoryCopy.type); | |
| assert(info.dest === theMemoryCopy.dest); | |
| assert(info.source === theMemoryCopy.source); | |
| assert(info.size === theMemoryCopy.size); | |
| console.log(theMemoryCopy.toText()); | |
| assert( | |
| theMemoryCopy.toText() | |
| == | |
| "(memory.copy $0 $0\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(); | |
| module.setMemory(1, 1, null); | |
| 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); | |
| var info = binaryen.getExpressionInfo(theMemoryFill); | |
| assert(info.id === theMemoryFill.id); | |
| assert(info.type === theMemoryFill.type); | |
| assert(info.dest === theMemoryFill.dest); | |
| assert(info.value === theMemoryFill.value); | |
| assert(info.size === theMemoryFill.size); | |
| 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); | |
| info = binaryen.getExpressionInfo(theMemoryFill); | |
| assert(info.type === theMemoryFill.type); | |
| assert(info.dest === theMemoryFill.dest); | |
| assert(info.value === theMemoryFill.value); | |
| assert(info.size === theMemoryFill.size); | |
| console.log(theMemoryFill.toText()); | |
| assert( | |
| theMemoryFill.toText() | |
| == | |
| "(memory.fill $0\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); | |
| var info = binaryen.getExpressionInfo(theRefIsNull); | |
| assert(info.id === theRefIsNull.id); | |
| assert(info.type === theRefIsNull.type); | |
| assert(info.value === theRefIsNull.value); | |
| theRefIsNull.value = value = module.local.get(2, binaryen.externref); | |
| assert(theRefIsNull.value === value); | |
| theRefIsNull.type = binaryen.f64; | |
| theRefIsNull.finalize(); | |
| assert(theRefIsNull.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theRefIsNull); | |
| assert(info.type === theRefIsNull.type); | |
| assert(info.value === theRefIsNull.value); | |
| console.log(theRefIsNull.toText()); | |
| assert( | |
| theRefIsNull.toText() | |
| == | |
| "(ref.is_null\n (local.get $2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# RefAs"); | |
| (function testRefAs() { | |
| const module = new binaryen.Module(); | |
| var op = binaryen.Operations.RefAsNonNull; | |
| var value = module.local.get(1, binaryen.anyref); | |
| var externref = module.local.get(3, binaryen.externref); | |
| const theRefAs = binaryen.RefAs(module.ref.as_non_null(value)); | |
| assert(theRefAs instanceof binaryen.RefAs); | |
| assert(theRefAs instanceof binaryen.Expression); | |
| assert(theRefAs.op === op); | |
| assert(theRefAs.value === value); | |
| assert(theRefAs.type !== binaryen.i32); // TODO: === (ref any) | |
| var info = binaryen.getExpressionInfo(theRefAs); | |
| assert(info.id === theRefAs.id); | |
| assert(info.type === theRefAs.type); | |
| assert(info.op === theRefAs.op); | |
| assert(info.value === theRefAs.value); | |
| theRefAs.op = op = binaryen.Operations.RefAsExternConvertAny; | |
| assert(theRefAs.op === op); | |
| theRefAs.op = op = binaryen.Operations.RefAsNonNull; | |
| theRefAs.value = value = module.local.get(2, binaryen.anyref); | |
| assert(theRefAs.value === value); | |
| theRefAs.type = binaryen.f64; | |
| theRefAs.finalize(); | |
| assert(theRefAs.type !== binaryen.f64); // TODO: === (ref any) | |
| info = binaryen.getExpressionInfo(theRefAs); | |
| assert(info.type === theRefAs.type); | |
| assert(info.op === theRefAs.op); | |
| assert(info.value === theRefAs.value); | |
| console.log(theRefAs.toText()); | |
| assert( | |
| theRefAs.toText() | |
| == | |
| "(ref.as_non_null\n (local.get $2)\n)\n" | |
| ); | |
| // TODO: extern.convert_any and any.convert_extern | |
| module.dispose(); | |
| })(); | |
| console.log("# RefFunc"); | |
| (function testRefFunc() { | |
| const module = new binaryen.Module(); | |
| module.addFunction("a", binaryen.none, binaryen.none, [], module.nop()); | |
| var type = binaryen.Function(module.getFunction("a")).type; | |
| var func = "a"; | |
| const theRefFunc = binaryen.RefFunc(module.ref.func(func, type)); | |
| assert(theRefFunc instanceof binaryen.RefFunc); | |
| assert(theRefFunc instanceof binaryen.Expression); | |
| assert(theRefFunc.func === func); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theRefFunc); | |
| assert(info.id === theRefFunc.id); | |
| assert(info.type === theRefFunc.type); | |
| assert(info.func === theRefFunc.func); | |
| theRefFunc.func = func = "b"; | |
| assert(theRefFunc.func === func); | |
| theRefFunc.finalize(); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| info = binaryen.getExpressionInfo(theRefFunc); | |
| assert(info.type === theRefFunc.type); | |
| assert(info.func === theRefFunc.func); | |
| console.log(theRefFunc.toText()); | |
| assert( | |
| theRefFunc.toText() | |
| == | |
| "(ref.func $b)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# RefEq"); | |
| (function testRefEq() { | |
| const module = new binaryen.Module(); | |
| var left = module.local.get(0, binaryen.eqref); | |
| var right = module.local.get(1, binaryen.eqref); | |
| const theRefEq = binaryen.RefEq(module.ref.eq(left, right)); | |
| assert(theRefEq instanceof binaryen.RefEq); | |
| assert(theRefEq instanceof binaryen.Expression); | |
| assert(theRefEq.left === left); | |
| assert(theRefEq.right === right); | |
| assert(theRefEq.type === binaryen.i32); | |
| var info = binaryen.getExpressionInfo(theRefEq); | |
| assert(info.id === theRefEq.id); | |
| assert(info.type === theRefEq.type); | |
| assert(info.left === theRefEq.left); | |
| assert(info.right === theRefEq.right); | |
| theRefEq.left = left = module.local.get(2, binaryen.eqref); | |
| assert(theRefEq.left === left); | |
| theRefEq.right = right = module.local.get(3, binaryen.eqref); | |
| assert(theRefEq.right === right); | |
| theRefEq.type = binaryen.f64; | |
| theRefEq.finalize(); | |
| assert(theRefEq.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theRefEq); | |
| assert(info.type === theRefEq.type); | |
| assert(info.left === theRefEq.left); | |
| assert(info.right === theRefEq.right); | |
| console.log(theRefEq.toText()); | |
| assert( | |
| theRefEq.toText() | |
| == | |
| "(ref.eq\n (local.get $2)\n (local.get $3)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# RefTest"); | |
| (function testRefTest() { | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, binaryen.anyref); | |
| var castType = binaryen.anyref; | |
| const theRefTest = binaryen.RefTest(module.ref.test(ref, castType)); | |
| assert(theRefTest instanceof binaryen.RefTest); | |
| assert(theRefTest instanceof binaryen.Expression); | |
| assert(theRefTest.ref === ref); | |
| assert(theRefTest.castType === castType); | |
| assert(theRefTest.type === binaryen.i32); | |
| var info = binaryen.getExpressionInfo(theRefTest); | |
| assert(info.id === theRefTest.id); | |
| assert(info.type === theRefTest.type); | |
| assert(info.ref === theRefTest.ref); | |
| assert(info.castType === theRefTest.castType); | |
| theRefTest.ref = ref = module.local.get(2, binaryen.externref); | |
| assert(theRefTest.ref === ref); | |
| theRefTest.castType = castType = binaryen.externref; | |
| assert(theRefTest.castType === castType); | |
| theRefTest.type = binaryen.f64; | |
| theRefTest.finalize(); | |
| assert(theRefTest.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theRefTest); | |
| assert(info.type === theRefTest.type); | |
| assert(info.ref === theRefTest.ref); | |
| assert(info.castType === theRefTest.castType); | |
| console.log(theRefTest.toText()); | |
| assert( | |
| theRefTest.toText() | |
| == | |
| "(ref.test externref\n (local.get $2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# RefCast"); | |
| (function testRefCast() { | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, binaryen.anyref); | |
| var type = binaryen.anyref; | |
| const theRefCast = binaryen.RefCast(module.ref.cast(ref, type)); | |
| assert(theRefCast instanceof binaryen.RefCast); | |
| assert(theRefCast instanceof binaryen.Expression); | |
| assert(theRefCast.ref === ref); | |
| assert(theRefCast.type === type); | |
| var info = binaryen.getExpressionInfo(theRefCast); | |
| assert(info.id === theRefCast.id); | |
| assert(info.type === theRefCast.type); | |
| assert(info.ref === theRefCast.ref); | |
| theRefCast.ref = ref = module.local.get(2, binaryen.externref); | |
| assert(theRefCast.ref === ref); | |
| theRefCast.type = type = binaryen.externref; | |
| theRefCast.finalize(); | |
| assert(theRefCast.type === type); | |
| info = binaryen.getExpressionInfo(theRefCast); | |
| assert(info.type === theRefCast.type); | |
| assert(info.ref === theRefCast.ref); | |
| console.log(theRefCast.toText()); | |
| assert( | |
| theRefCast.toText() | |
| == | |
| "(ref.cast externref\n (local.get $2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# BrOn"); | |
| (function testBrOn() { | |
| const module = new binaryen.Module(); | |
| var name = "br"; | |
| var ref = module.local.get(0, binaryen.externref); | |
| var op = binaryen.Operations.BrOnNull; | |
| var castType = binaryen.unreachable; | |
| const theBrOn = binaryen.BrOn(module.br_on_null(name, ref)); | |
| assert(theBrOn instanceof binaryen.BrOn); | |
| assert(theBrOn instanceof binaryen.Expression); | |
| assert(theBrOn.name === name); | |
| assert(theBrOn.ref === ref); | |
| assert(theBrOn.op === op); | |
| assert(theBrOn.castType === castType); | |
| // TODO: What should theBrOn.type be equal to? | |
| var info = binaryen.getExpressionInfo(theBrOn); | |
| assert(info.id === theBrOn.id); | |
| assert(info.type === theBrOn.type); | |
| assert(info.name === theBrOn.name); | |
| assert(info.ref === theBrOn.ref); | |
| assert(info.op === theBrOn.op); | |
| assert(info.castType === theBrOn.castType); | |
| theBrOn.name = name = "br2"; | |
| assert(theBrOn.name === name); | |
| theBrOn.ref = ref = module.local.get(1, binaryen.anyref); | |
| assert(theBrOn.ref === ref); | |
| theBrOn.op = op = binaryen.Operations.BrOnCast; | |
| assert(theBrOn.op === op); | |
| theBrOn.castType = castType = binaryen.i31ref; | |
| assert(theBrOn.castType === castType); | |
| theBrOn.finalize(); | |
| info = binaryen.getExpressionInfo(theBrOn); | |
| assert(info.name === theBrOn.name); | |
| assert(info.ref === theBrOn.ref); | |
| assert(info.op === theBrOn.op); | |
| assert(info.castType === theBrOn.castType); | |
| console.log(theBrOn.toText()); | |
| assert( | |
| theBrOn.toText() | |
| == | |
| "(br_on_cast $br2 anyref i31ref\n (local.get $1)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# StructNew"); | |
| (function testStructNew() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setStructType(0, [ | |
| { type: binaryen.i32, packedType: binaryen.notPacked, mutable: true }, | |
| ]); | |
| builder.setStructType(1, [ | |
| { type: binaryen.i32, packedType: binaryen.i16, mutable: true }, | |
| { type: binaryen.i64, packedType: binaryen.notPacked, mutable: true } | |
| ]); | |
| var [ | |
| struct0Type, | |
| struct1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var operands = [ | |
| module.i32.const(1), | |
| module.i32.const(2) | |
| ]; | |
| var type = struct0Type; | |
| const theStructNew = binaryen.StructNew(module.struct.new(operands, type)); | |
| assert(theStructNew instanceof binaryen.StructNew); | |
| assert(theStructNew instanceof binaryen.Expression); | |
| assertDeepEqual(theStructNew.operands, operands); | |
| assertDeepEqual(theStructNew.getOperands(), operands); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theStructNew); | |
| assert(info.id === theStructNew.id); | |
| assert(info.type === theStructNew.type); | |
| assertDeepEqual(info.operands, theStructNew.operands); | |
| theStructNew.operands = operands = [ | |
| module.i32.const(3), // set | |
| module.i32.const(4), // set | |
| module.i32.const(5) // append | |
| ]; | |
| assertDeepEqual(theStructNew.operands, operands); | |
| operands = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theStructNew.setOperands(operands); | |
| assertDeepEqual(theStructNew.operands, operands); | |
| theStructNew.insertOperandAt(0, module.i32.const(7)); | |
| theStructNew.type = type = struct1Type; | |
| theStructNew.finalize(); | |
| assert(theStructNew.type === type); | |
| info = binaryen.getExpressionInfo(theStructNew); | |
| assert(info.type === theStructNew.type); | |
| assertDeepEqual(info.operands, theStructNew.operands); | |
| console.log(theStructNew.toText()); | |
| assert( | |
| theStructNew.toText() | |
| == | |
| "(struct.new $struct.0\n (i32.const 7)\n (i32.const 6)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# StructGet"); | |
| (function testStructGet() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setStructType(0, [ | |
| { type: binaryen.i32, packedType: binaryen.notPacked, mutable: true }, | |
| ]); | |
| builder.setStructType(1, [ | |
| { type: binaryen.i32, packedType: binaryen.i16, mutable: true }, | |
| { type: binaryen.i64, packedType: binaryen.notPacked, mutable: true } | |
| ]); | |
| var [ | |
| struct0Type, | |
| struct1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var index = 0; | |
| var ref = module.local.get(0, struct0Type); | |
| var type = binaryen.i32; | |
| var signed = false; | |
| const theStructGet = binaryen.StructGet(module.struct.get(index, ref, type, signed)); | |
| assert(theStructGet instanceof binaryen.StructGet); | |
| assert(theStructGet instanceof binaryen.Expression); | |
| assert(theStructGet.index === index); | |
| assert(theStructGet.ref === ref); | |
| assert(theStructGet.signed === signed); | |
| assert(theStructGet.type === type); | |
| var info = binaryen.getExpressionInfo(theStructGet); | |
| assert(info.id === theStructGet.id); | |
| assert(info.type === theStructGet.type); | |
| assert(info.index === theStructGet.index); | |
| assert(info.ref === theStructGet.ref); | |
| assert(info.isSigned === theStructGet.signed); | |
| theStructGet.index = index = 1; | |
| assert(theStructGet.index === index); | |
| theStructGet.ref = ref = module.local.get(1, struct1Type); | |
| assert(theStructGet.ref === ref); | |
| theStructGet.signed = signed = true; | |
| assert(theStructGet.signed === signed); | |
| theStructGet.type = type = binaryen.i64; | |
| theStructGet.finalize(); | |
| assert(theStructGet.type === type); | |
| info = binaryen.getExpressionInfo(theStructGet); | |
| assert(info.type === theStructGet.type); | |
| assert(info.index === theStructGet.index); | |
| assert(info.ref === theStructGet.ref); | |
| assert(info.isSigned === theStructGet.signed); | |
| console.log(theStructGet.toText()); | |
| assert( | |
| theStructGet.toText() | |
| == | |
| "(struct.get $struct.0 1\n (local.get $1)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# StructSet"); | |
| (function testStructSet() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setStructType(0, [ | |
| { type: binaryen.i32, packedType: binaryen.notPacked, mutable: true }, | |
| ]); | |
| builder.setStructType(1, [ | |
| { type: binaryen.i32, packedType: binaryen.i16, mutable: true }, | |
| { type: binaryen.i64, packedType: binaryen.notPacked, mutable: true } | |
| ]); | |
| var [ | |
| struct0Type, | |
| struct1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var index = 0; | |
| var ref = module.local.get(0, struct0Type); | |
| var value = module.local.get(1, binaryen.i32); | |
| const theStructSet = binaryen.StructSet(module.struct.set(index, ref, value)); | |
| assert(theStructSet instanceof binaryen.StructSet); | |
| assert(theStructSet instanceof binaryen.Expression); | |
| assert(theStructSet.index === index); | |
| assert(theStructSet.ref === ref); | |
| assert(theStructSet.value === value); | |
| assert(theStructSet.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theStructSet); | |
| assert(info.id === theStructSet.id); | |
| assert(info.type === theStructSet.type); | |
| assert(info.index === theStructSet.index); | |
| assert(info.ref === theStructSet.ref); | |
| assert(info.value === theStructSet.value); | |
| theStructSet.index = index = 1; | |
| assert(theStructSet.index === index); | |
| theStructSet.ref = ref = module.local.get(2, struct1Type); | |
| assert(theStructSet.ref === ref); | |
| theStructSet.value = value = module.local.get(3, binaryen.i64); | |
| assert(theStructSet.value === value); | |
| theStructSet.type = binaryen.f64; | |
| theStructSet.finalize(); | |
| assert(theStructSet.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theStructSet); | |
| assert(info.type === theStructSet.type); | |
| assert(info.index === theStructSet.index); | |
| assert(info.ref === theStructSet.ref); | |
| assert(info.value === theStructSet.value); | |
| console.log(theStructSet.toText()); | |
| assert( | |
| theStructSet.toText() | |
| == | |
| "(struct.set $struct.0 1\n (local.get $2)\n (local.get $3)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayNew"); | |
| (function testArrayNew() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var type = array0Type; | |
| var size = module.i32.const(2); | |
| var init = module.i32.const(1); | |
| const theArrayNew = binaryen.ArrayNew(module.array.new(type, size, init)); | |
| assert(theArrayNew instanceof binaryen.ArrayNew); | |
| assert(theArrayNew instanceof binaryen.Expression); | |
| assert(theArrayNew.size === size); | |
| assert(theArrayNew.init === init); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theArrayNew); | |
| assert(info.id === theArrayNew.id); | |
| assert(info.type === theArrayNew.type); | |
| assert(info.size === theArrayNew.size); | |
| assert(info.init === theArrayNew.init); | |
| theArrayNew.size = size = module.i32.const(4); | |
| assert(theArrayNew.size === size); | |
| theArrayNew.init = init = module.i32.const(3); | |
| assert(theArrayNew.init === init); | |
| theArrayNew.type = type = array1Type; | |
| theArrayNew.finalize(); | |
| assert(theArrayNew.type === type); | |
| info = binaryen.getExpressionInfo(theArrayNew); | |
| assert(info.type === theArrayNew.type); | |
| assert(info.size === theArrayNew.size); | |
| assert(info.init === theArrayNew.init); | |
| console.log(theArrayNew.toText()); | |
| assert( | |
| theArrayNew.toText() | |
| == | |
| "(array.new $array.0\n (i32.const 3)\n (i32.const 4)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayNewFixed"); | |
| (function testArrayNewFixed() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var type = array0Type; | |
| var values = [ | |
| module.i32.const(1), | |
| module.i32.const(2) | |
| ]; | |
| const theArrayNewFixed = binaryen.ArrayNewFixed(module.array.new_fixed(type, values)); | |
| assert(theArrayNewFixed instanceof binaryen.ArrayNewFixed); | |
| assert(theArrayNewFixed instanceof binaryen.Expression); | |
| assertDeepEqual(theArrayNewFixed.values, values); | |
| assertDeepEqual(theArrayNewFixed.getValues(), values); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theArrayNewFixed); | |
| assert(info.id === theArrayNewFixed.id); | |
| assert(info.type === theArrayNewFixed.type); | |
| assertDeepEqual(info.values, theArrayNewFixed.values); | |
| theArrayNewFixed.values = values = [ | |
| module.i32.const(3), // set | |
| module.i32.const(4), // set | |
| module.i32.const(5) // append | |
| ]; | |
| assertDeepEqual(theArrayNewFixed.values, values); | |
| values = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theArrayNewFixed.setValues(values); | |
| assertDeepEqual(theArrayNewFixed.values, values); | |
| theArrayNewFixed.insertValueAt(0, module.i32.const(7)); | |
| theArrayNewFixed.type = type = array1Type; | |
| theArrayNewFixed.finalize(); | |
| assert(theArrayNewFixed.type === type); | |
| info = binaryen.getExpressionInfo(theArrayNewFixed); | |
| assert(info.type === theArrayNewFixed.type); | |
| assertDeepEqual(info.values, theArrayNewFixed.values); | |
| console.log(theArrayNewFixed.toText()); | |
| assert( | |
| theArrayNewFixed.toText() | |
| == | |
| "(array.new_fixed $array.0 2\n (i32.const 7)\n (i32.const 6)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayNewData"); | |
| (function testArrayNewData() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var type = array0Type; | |
| var segment = "0"; | |
| var offset = module.i32.const(1); | |
| var size = module.i32.const(2); | |
| const theArrayNewData = binaryen.ArrayNewData(module.array.new_data(type, segment, offset, size)); | |
| assert(theArrayNewData instanceof binaryen.ArrayNewData); | |
| assert(theArrayNewData instanceof binaryen.Expression); | |
| assert(theArrayNewData.segment === segment); | |
| assert(theArrayNewData.offset === offset); | |
| assert(theArrayNewData.size === size); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theArrayNewData); | |
| assert(info.id === theArrayNewData.id); | |
| assert(info.type === theArrayNewData.type); | |
| assert(info.segment === theArrayNewData.segment); | |
| assert(info.offset === theArrayNewData.offset); | |
| assert(info.size === theArrayNewData.size); | |
| theArrayNewData.segment = segment = "3"; | |
| assert(theArrayNewData.segment === segment); | |
| theArrayNewData.offset = offset = module.i32.const(4); | |
| assert(theArrayNewData.offset === offset); | |
| theArrayNewData.size = size = module.i32.const(5); | |
| assert(theArrayNewData.size === size); | |
| theArrayNewData.type = type = array1Type; | |
| theArrayNewData.finalize(); | |
| assert(theArrayNewData.type === type); | |
| info = binaryen.getExpressionInfo(theArrayNewData); | |
| assert(info.type === theArrayNewData.type); | |
| assert(info.segment === theArrayNewData.segment); | |
| assert(info.offset === theArrayNewData.offset); | |
| assert(info.size === theArrayNewData.size); | |
| console.log(theArrayNewData.toText()); | |
| assert( | |
| theArrayNewData.toText() | |
| == | |
| "(array.new_data $array.0 $3\n (i32.const 4)\n (i32.const 5)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayNewElem"); | |
| (function testArrayNewElem() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var type = array0Type; | |
| var segment = "0"; | |
| var offset = module.i32.const(1); | |
| var size = module.i32.const(2); | |
| const theArrayNewElem = binaryen.ArrayNewElem(module.array.new_elem(type, segment, offset, size)); | |
| assert(theArrayNewElem instanceof binaryen.ArrayNewElem); | |
| assert(theArrayNewElem instanceof binaryen.Expression); | |
| assert(theArrayNewElem.segment === segment); | |
| assert(theArrayNewElem.offset === offset); | |
| assert(theArrayNewElem.size === size); | |
| // TODO: assert that the type is a non-nullable, exact reference to the | |
| // function type once we can express that in the JS API. | |
| var info = binaryen.getExpressionInfo(theArrayNewElem); | |
| assert(info.id === theArrayNewElem.id); | |
| assert(info.type === theArrayNewElem.type); | |
| assert(info.segment === theArrayNewElem.segment); | |
| assert(info.offset === theArrayNewElem.offset); | |
| assert(info.size === theArrayNewElem.size); | |
| theArrayNewElem.segment = segment = "3"; | |
| assert(theArrayNewElem.segment === segment); | |
| theArrayNewElem.offset = offset = module.i32.const(4); | |
| assert(theArrayNewElem.offset === offset); | |
| theArrayNewElem.size = size = module.i32.const(5); | |
| assert(theArrayNewElem.size === size); | |
| theArrayNewElem.type = type = array1Type; | |
| theArrayNewElem.finalize(); | |
| assert(theArrayNewElem.type === type); | |
| info = binaryen.getExpressionInfo(theArrayNewElem); | |
| assert(info.id === theArrayNewElem.id); | |
| assert(info.type === theArrayNewElem.type); | |
| assert(info.segment === theArrayNewElem.segment); | |
| assert(info.offset === theArrayNewElem.offset); | |
| assert(info.size === theArrayNewElem.size); | |
| console.log(theArrayNewElem.toText()); | |
| assert( | |
| theArrayNewElem.toText() | |
| == | |
| "(array.new_elem $array.0 $3\n (i32.const 4)\n (i32.const 5)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayGet"); | |
| (function testArrayGet() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i64, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, array0Type); | |
| var index = module.i32.const(0); | |
| var type = binaryen.i32; | |
| var signed = false; | |
| const theArrayGet = binaryen.ArrayGet(module.array.get(ref, index, type, signed)); | |
| assert(theArrayGet instanceof binaryen.ArrayGet); | |
| assert(theArrayGet instanceof binaryen.Expression); | |
| assert(theArrayGet.ref === ref); | |
| assert(theArrayGet.index === index); | |
| assert(theArrayGet.signed === signed); | |
| assert(theArrayGet.type === type); | |
| var info = binaryen.getExpressionInfo(theArrayGet); | |
| assert(info.id === theArrayGet.id); | |
| assert(info.type === theArrayGet.type); | |
| assert(info.ref === theArrayGet.ref); | |
| assert(info.index === theArrayGet.index); | |
| assert(info.isSigned === theArrayGet.signed); | |
| theArrayGet.ref = ref = module.local.get(1, array1Type); | |
| assert(theArrayGet.ref === ref); | |
| theArrayGet.index = index = module.i32.const(1); | |
| assert(theArrayGet.index === index); | |
| theArrayGet.signed = signed = true; | |
| assert(theArrayGet.signed === signed); | |
| theArrayGet.type = type = binaryen.i64; | |
| theArrayGet.finalize(); | |
| assert(theArrayGet.type === type); | |
| info = binaryen.getExpressionInfo(theArrayGet); | |
| assert(info.type === theArrayGet.type); | |
| assert(info.ref === theArrayGet.ref); | |
| assert(info.index === theArrayGet.index); | |
| assert(info.isSigned === theArrayGet.signed); | |
| console.log(theArrayGet.toText()); | |
| assert( | |
| theArrayGet.toText() | |
| == | |
| "(array.get $array.0\n (local.get $1)\n (i32.const 1)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArraySet"); | |
| (function testArraySet() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i64, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, array0Type); | |
| var index = module.i32.const(0); | |
| var value = module.local.get(1, binaryen.i32); | |
| const theArraySet = binaryen.ArraySet(module.array.set(ref, index, value)); | |
| assert(theArraySet instanceof binaryen.ArraySet); | |
| assert(theArraySet instanceof binaryen.Expression); | |
| assert(theArraySet.ref === ref); | |
| assert(theArraySet.index === index); | |
| assert(theArraySet.value === value); | |
| assert(theArraySet.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theArraySet); | |
| assert(info.id === theArraySet.id); | |
| assert(info.type === theArraySet.type); | |
| assert(info.ref === theArraySet.ref); | |
| assert(info.index === theArraySet.index); | |
| assert(info.value === theArraySet.value); | |
| theArraySet.ref = ref = module.local.get(2, array1Type); | |
| assert(theArraySet.ref === ref); | |
| theArraySet.index = index = module.i32.const(1); | |
| assert(theArraySet.index === index); | |
| theArraySet.value = value = module.local.get(3, binaryen.i64); | |
| assert(theArraySet.value === value); | |
| theArraySet.type = binaryen.i64; | |
| theArraySet.finalize(); | |
| assert(theArraySet.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theArraySet); | |
| assert(info.type === theArraySet.type); | |
| assert(info.ref === theArraySet.ref); | |
| assert(info.index === theArraySet.index); | |
| assert(info.value === theArraySet.value); | |
| console.log(theArraySet.toText()); | |
| assert( | |
| theArraySet.toText() | |
| == | |
| "(array.set $array.0\n (local.get $2)\n (i32.const 1)\n (local.get $3)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayLen"); | |
| (function testArrayLen() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i64, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, array0Type); | |
| const theArrayLen = binaryen.ArrayLen(module.array.len(ref)); | |
| assert(theArrayLen instanceof binaryen.ArrayLen); | |
| assert(theArrayLen instanceof binaryen.Expression); | |
| assert(theArrayLen.ref === ref); | |
| assert(theArrayLen.type === binaryen.i32); | |
| var info = binaryen.getExpressionInfo(theArrayLen); | |
| assert(info.id === theArrayLen.id); | |
| assert(info.type === theArrayLen.type); | |
| assert(info.ref === theArrayLen.ref); | |
| theArrayLen.ref = ref = module.local.get(1, array1Type); | |
| assert(theArrayLen.ref === ref); | |
| theArrayLen.type = binaryen.i64; | |
| theArrayLen.finalize(); | |
| assert(theArrayLen.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theArrayLen); | |
| assert(info.type === theArrayLen.type); | |
| assert(info.ref === theArrayLen.ref); | |
| console.log(theArrayLen.toText()); | |
| assert( | |
| theArrayLen.toText() | |
| == | |
| "(array.len\n (local.get $1)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayFill"); | |
| (function testArrayFill() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i64, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var ref = module.local.get(0, array0Type); | |
| var index = module.i32.const(0); | |
| var value = module.local.get(1, binaryen.i32); | |
| var size = module.i32.const(1); | |
| const theArrayFill = binaryen.ArrayFill(module.array.fill(ref, index, value, size)); | |
| assert(theArrayFill instanceof binaryen.ArrayFill); | |
| assert(theArrayFill instanceof binaryen.Expression); | |
| assert(theArrayFill.ref === ref); | |
| assert(theArrayFill.index === index); | |
| assert(theArrayFill.value === value); | |
| assert(theArrayFill.size === size); | |
| assert(theArrayFill.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theArrayFill); | |
| assert(info.id === theArrayFill.id); | |
| assert(info.type === theArrayFill.type); | |
| assert(info.ref === theArrayFill.ref); | |
| assert(info.index === theArrayFill.index); | |
| assert(info.value === theArrayFill.value); | |
| assert(info.size === theArrayFill.size); | |
| theArrayFill.ref = ref = module.local.get(2, array1Type); | |
| assert(theArrayFill.ref === ref); | |
| theArrayFill.index = index = module.i32.const(2); | |
| assert(theArrayFill.index === index); | |
| theArrayFill.value = value = module.local.get(3, binaryen.i64); | |
| assert(theArrayFill.value = value); | |
| theArrayFill.size = size = module.i32.const(3); | |
| assert(theArrayFill.size === size); | |
| theArrayFill.type = binaryen.i64; | |
| theArrayFill.finalize(); | |
| assert(theArrayFill.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theArrayFill); | |
| assert(info.type === theArrayFill.type); | |
| assert(info.ref === theArrayFill.ref); | |
| assert(info.index === theArrayFill.index); | |
| assert(info.value === theArrayFill.value); | |
| assert(info.size === theArrayFill.size); | |
| console.log(theArrayFill.toText()); | |
| assert( | |
| theArrayFill.toText() | |
| == | |
| "(array.fill $array.0\n (local.get $2)\n (i32.const 2)\n (local.get $3)\n (i32.const 3)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayCopy"); | |
| (function testArrayCopy() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i64, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var destRef = module.local.get(0, array0Type); | |
| var destIndex = module.i32.const(0); | |
| var srcRef = module.local.get(1, array0Type); | |
| var srcIndex = module.i32.const(1); | |
| var length = module.i32.const(1); | |
| const theArrayCopy = binaryen.ArrayCopy(module.array.copy(destRef, destIndex, srcRef, srcIndex, length)); | |
| assert(theArrayCopy instanceof binaryen.ArrayCopy); | |
| assert(theArrayCopy instanceof binaryen.Expression); | |
| assert(theArrayCopy.destRef === destRef); | |
| assert(theArrayCopy.destIndex === destIndex); | |
| assert(theArrayCopy.srcRef === srcRef); | |
| assert(theArrayCopy.srcIndex === srcIndex); | |
| assert(theArrayCopy.length === length); | |
| assert(theArrayCopy.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theArrayCopy); | |
| assert(info.id === theArrayCopy.id); | |
| assert(info.type === theArrayCopy.type); | |
| assert(info.destRef === theArrayCopy.destRef); | |
| assert(info.destIndex === theArrayCopy.destIndex); | |
| assert(info.srcRef === theArrayCopy.srcRef); | |
| assert(info.srcIndex === theArrayCopy.srcIndex); | |
| assert(info.length === theArrayCopy.length); | |
| theArrayCopy.destRef = destRef = module.local.get(2, array1Type); | |
| assert(theArrayCopy.destRef === destRef); | |
| theArrayCopy.destIndex = destIndex = module.i32.const(2); | |
| assert(theArrayCopy.destIndex === destIndex); | |
| theArrayCopy.srcRef = srcRef = module.local.get(3, array1Type); | |
| assert(theArrayCopy.srcRef === srcRef); | |
| theArrayCopy.srcIndex = srcIndex = module.i32.const(3); | |
| assert(theArrayCopy.srcIndex === srcIndex); | |
| theArrayCopy.length = length = module.i32.const(2); | |
| assert(theArrayCopy.length === length); | |
| theArrayCopy.type = binaryen.i64; | |
| theArrayCopy.finalize(); | |
| assert(theArrayCopy.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theArrayCopy); | |
| assert(info.type === theArrayCopy.type); | |
| assert(info.destRef === theArrayCopy.destRef); | |
| assert(info.destIndex === theArrayCopy.destIndex); | |
| assert(info.srcRef === theArrayCopy.srcRef); | |
| assert(info.srcIndex === theArrayCopy.srcIndex); | |
| assert(info.length === theArrayCopy.length); | |
| console.log(theArrayCopy.toText()); | |
| assert( | |
| theArrayCopy.toText() | |
| == | |
| "(array.copy $array.0 $array.0\n (local.get $2)\n (i32.const 2)\n (local.get $3)\n (i32.const 3)\n (i32.const 2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayInitData"); | |
| (function testArrayInitData() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var segment = "0"; | |
| var ref = module.local.get(0, array0Type); | |
| var index = module.i32.const(0); | |
| var offset = module.i32.const(1); | |
| var size = module.i32.const(2); | |
| const theArrayInitData = binaryen.ArrayInitData(module.array.init_data(segment, ref, index, offset, size)); | |
| assert(theArrayInitData instanceof binaryen.ArrayInitData); | |
| assert(theArrayInitData instanceof binaryen.Expression); | |
| assert(theArrayInitData.segment === segment); | |
| assert(theArrayInitData.ref === ref); | |
| assert(theArrayInitData.index === index); | |
| assert(theArrayInitData.offset === offset); | |
| assert(theArrayInitData.size === size); | |
| assert(theArrayInitData.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theArrayInitData); | |
| assert(info.id === theArrayInitData.id); | |
| assert(info.type === theArrayInitData.type); | |
| assert(info.segment === theArrayInitData.segment); | |
| assert(info.ref === theArrayInitData.ref); | |
| assert(info.index === theArrayInitData.index); | |
| assert(info.offset === theArrayInitData.offset); | |
| assert(info.size === theArrayInitData.size); | |
| theArrayInitData.segment = segment = "1"; | |
| assert(theArrayInitData.segment === segment); | |
| theArrayInitData.ref = ref = module.local.get(1, array1Type); | |
| assert(theArrayInitData.ref === ref); | |
| theArrayInitData.index = index = module.i32.const(3); | |
| assert(theArrayInitData.index === index); | |
| theArrayInitData.offset = offset = module.i32.const(4); | |
| assert(theArrayInitData.offset === offset); | |
| theArrayInitData.size = size = module.i32.const(5); | |
| assert(theArrayInitData.size === size); | |
| theArrayInitData.type = binaryen.i64; | |
| theArrayInitData.finalize(); | |
| assert(theArrayInitData.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theArrayInitData); | |
| assert(info.type === theArrayInitData.type); | |
| assert(info.segment === theArrayInitData.segment); | |
| assert(info.ref === theArrayInitData.ref); | |
| assert(info.index === theArrayInitData.index); | |
| assert(info.offset === theArrayInitData.offset); | |
| assert(info.size === theArrayInitData.size); | |
| console.log(theArrayInitData.toText()); | |
| assert( | |
| theArrayInitData.toText() | |
| == | |
| "(array.init_data $array.0 $1\n (local.get $1)\n (i32.const 3)\n (i32.const 4)\n (i32.const 5)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# ArrayInitElem"); | |
| (function testArrayInitElem() { | |
| const builder = new binaryen.TypeBuilder(2); | |
| builder.setArrayType(0, binaryen.i32, binaryen.i16, true); | |
| builder.setArrayType(1, binaryen.i32, binaryen.notPacked, true); | |
| var [ | |
| array0Type, | |
| array1Type | |
| ] = builder.buildAndDispose(); | |
| const module = new binaryen.Module(); | |
| var segment = "0"; | |
| var ref = module.local.get(0, array0Type); | |
| var index = module.i32.const(0); | |
| var offset = module.i32.const(1); | |
| var size = module.i32.const(2); | |
| const theArrayInitElem = binaryen.ArrayInitElem(module.array.init_elem(segment, ref, index, offset, size)); | |
| assert(theArrayInitElem instanceof binaryen.ArrayInitElem); | |
| assert(theArrayInitElem instanceof binaryen.Expression); | |
| assert(theArrayInitElem.segment === segment); | |
| assert(theArrayInitElem.ref === ref); | |
| assert(theArrayInitElem.index === index); | |
| assert(theArrayInitElem.offset === offset); | |
| assert(theArrayInitElem.size === size); | |
| assert(theArrayInitElem.type === binaryen.none); | |
| var info = binaryen.getExpressionInfo(theArrayInitElem); | |
| assert(info.id === theArrayInitElem.id); | |
| assert(info.type === theArrayInitElem.type); | |
| assert(info.segment === theArrayInitElem.segment); | |
| assert(info.ref === theArrayInitElem.ref); | |
| assert(info.index === theArrayInitElem.index); | |
| assert(info.offset === theArrayInitElem.offset); | |
| assert(info.size === theArrayInitElem.size); | |
| theArrayInitElem.segment = segment = "1"; | |
| assert(theArrayInitElem.segment === segment); | |
| theArrayInitElem.ref = ref = module.local.get(1, array1Type); | |
| assert(theArrayInitElem.ref === ref); | |
| theArrayInitElem.index = index = module.i32.const(3); | |
| assert(theArrayInitElem.index === index); | |
| theArrayInitElem.offset = offset = module.i32.const(4); | |
| assert(theArrayInitElem.offset === offset); | |
| theArrayInitElem.size = size = module.i32.const(5); | |
| assert(theArrayInitElem.size === size); | |
| theArrayInitElem.type = binaryen.i64; | |
| theArrayInitElem.finalize(); | |
| assert(theArrayInitElem.type === binaryen.none); | |
| info = binaryen.getExpressionInfo(theArrayInitElem); | |
| assert(info.type === theArrayInitElem.type); | |
| assert(info.segment === theArrayInitElem.segment); | |
| assert(info.ref === theArrayInitElem.ref); | |
| assert(info.index === theArrayInitElem.index); | |
| assert(info.offset === theArrayInitElem.offset); | |
| assert(info.size === theArrayInitElem.size); | |
| console.log(theArrayInitElem.toText()); | |
| assert( | |
| theArrayInitElem.toText() | |
| == | |
| "(array.init_elem $array.0 $1\n (local.get $1)\n (i32.const 3)\n (i32.const 4)\n (i32.const 5)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# Try"); | |
| (function testTry() { | |
| const module = new binaryen.Module(); | |
| module.addTag("tag1", 0, binaryen.none, binaryen.none); | |
| module.addTag("tag2", 0, binaryen.none, binaryen.none); | |
| module.addTag("tag3", 0, binaryen.none, binaryen.none); | |
| var body = module.i32.const(1); | |
| var catchBodies = [ | |
| module.i32.const(2), | |
| module.i32.const(3) | |
| ]; | |
| const theTry = binaryen.Try(module.try('', body, ["tag1"], catchBodies, '')); | |
| assert(theTry instanceof binaryen.Try); | |
| assert(theTry instanceof binaryen.Expression); | |
| assert(theTry.body === body); | |
| assertDeepEqual(theTry.catchBodies, catchBodies); | |
| assert(theTry.type === binaryen.i32); | |
| assert(theTry.getNumCatchTags() == 1); | |
| assert(theTry.getNumCatchBodies() == 2); | |
| assert(theTry.hasCatchAll() == 1); | |
| console.log(theTry.toText()); | |
| var info = binaryen.getExpressionInfo(theTry); | |
| assert(info.id === theTry.id); | |
| assert(info.type === theTry.type); | |
| assert(info.name === theTry.name); | |
| assert(info.body === theTry.body); | |
| assertDeepEqual(info.catchTags, theTry.catchTags); | |
| assertDeepEqual(info.catchBodies, theTry.catchBodies); | |
| assert(info.hasCatchAll === theTry.hasCatchAll()); | |
| assert(info.delegateTarget === theTry.delegateTarget); | |
| assert(info.isDelegate === theTry.delegate); | |
| theTry.body = body = module.i32.const(4); | |
| assert(theTry.body === body); | |
| catchBodies = [ | |
| module.i32.const(5) // set | |
| //remove | |
| ]; | |
| theTry.setCatchBodies(catchBodies); | |
| assertDeepEqual(theTry.catchBodies, catchBodies); | |
| assertDeepEqual(theTry.getCatchBodies(), catchBodies); | |
| console.log(theTry.toText()); | |
| theTry.insertCatchTagAt(1, "tag2"); | |
| theTry.insertCatchBodyAt(0, module.i32.const(6)); | |
| assert(theTry.getNumCatchTags() == 2); | |
| assert(theTry.getNumCatchBodies() == 2); | |
| assert(theTry.hasCatchAll() == 0); | |
| console.log(theTry.toText()); | |
| assert(theTry.removeCatchTagAt(1) == "tag2"); | |
| theTry.removeCatchBodyAt(1); | |
| assert(theTry.getNumCatchTags() == 1); | |
| assert(theTry.getNumCatchBodies() == 1); | |
| console.log(theTry.toText()); | |
| theTry.appendCatchTag("tag3"); | |
| theTry.appendCatchBody(module.drop(module.i32.const(7))); | |
| assert(theTry.getCatchTagAt(0) == "tag1"); | |
| assert(theTry.getCatchTagAt(1) == "tag3"); | |
| theTry.setCatchTags(["tag2", "tag3"]); | |
| assertDeepEqual(theTry.getCatchTags(), ["tag2", "tag3"]); | |
| theTry.setCatchBodies([module.i32.const(8), module.i32.const(9)]); | |
| assert(theTry.getCatchTagAt(0) == "tag2"); | |
| assert(theTry.getCatchTagAt(1) == "tag3"); | |
| theTry.setCatchTagAt(1, "tag1"); | |
| theTry.setCatchBodyAt(1, module.i32.const(10)); | |
| assert(theTry.getCatchTagAt(1) == "tag1"); | |
| console.log(theTry.toText()); | |
| theTry.type = binaryen.f64; | |
| theTry.finalize(); | |
| assert(theTry.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theTry); | |
| assert(info.id === theTry.id); | |
| assert(info.type === theTry.type); | |
| assert(info.name === theTry.name); | |
| assert(info.body === theTry.body); | |
| assertDeepEqual(info.catchTags, theTry.catchTags); | |
| assertDeepEqual(info.catchBodies, theTry.catchBodies); | |
| assert(info.hasCatchAll === theTry.hasCatchAll()); | |
| assert(info.delegateTarget === theTry.delegateTarget); | |
| assert(info.isDelegate === theTry.delegate); | |
| console.log(theTry.toText()); | |
| const tryDelegate = binaryen.Try(module.try('', body, [], [], "try_blah")); | |
| assert(tryDelegate.isDelegate() == 1); | |
| assert(tryDelegate.getDelegateTarget() == "try_blah"); | |
| tryDelegate.setDelegateTarget("try_outer"); | |
| assert(tryDelegate.getDelegateTarget() == "try_outer"); | |
| info = binaryen.getExpressionInfo(tryDelegate); | |
| assert(info.delegateTarget === tryDelegate.delegateTarget); | |
| assert(info.isDelegate === tryDelegate.delegate); | |
| console.log(tryDelegate.toText()); | |
| module.dispose(); | |
| })(); | |
| console.log("# Throw"); | |
| (function testThrow() { | |
| const module = new binaryen.Module(); | |
| var tag = "foo"; | |
| var operands = [ | |
| module.i32.const(1), | |
| module.i32.const(2) | |
| ]; | |
| const theThrow = binaryen.Throw(module.throw(tag, operands)); | |
| assert(theThrow instanceof binaryen.Throw); | |
| assert(theThrow instanceof binaryen.Expression); | |
| assert(theThrow.tag === tag); | |
| assertDeepEqual(theThrow.operands, operands); | |
| assert(theThrow.type === binaryen.unreachable); | |
| var info = binaryen.getExpressionInfo(theThrow); | |
| assert(info.id === theThrow.id); | |
| assert(info.type === theThrow.type); | |
| assert(info.tag === theThrow.tag); | |
| assertDeepEqual(info.operands, theThrow.operands); | |
| theThrow.tag = "bar"; | |
| assert(theThrow.tag === "bar"); | |
| theThrow.operands = operands = [ | |
| module.i32.const(3), // set | |
| module.i32.const(4), // set | |
| module.i32.const(5) // append | |
| ]; | |
| assertDeepEqual(theThrow.operands, operands); | |
| assertDeepEqual(theThrow.getOperands(), operands); | |
| operands = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theThrow.setOperands(operands); | |
| assertDeepEqual(theThrow.operands, operands); | |
| theThrow.insertOperandAt(1, module.i32.const(7)); | |
| theThrow.type = binaryen.f64; | |
| theThrow.finalize(); | |
| assert(theThrow.type === binaryen.unreachable); | |
| info = binaryen.getExpressionInfo(theThrow); | |
| assert(info.type === theThrow.type); | |
| assert(info.tag === theThrow.tag); | |
| assertDeepEqual(info.operands, theThrow.operands); | |
| 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(); | |
| const theRethrow = binaryen.Rethrow(module.rethrow("l0")); | |
| assert(theRethrow instanceof binaryen.Rethrow); | |
| assert(theRethrow instanceof binaryen.Expression); | |
| assert(theRethrow.target === "l0"); | |
| assert(theRethrow.type === binaryen.unreachable); | |
| var info = binaryen.getExpressionInfo(theRethrow); | |
| assert(info.id === theRethrow.id); | |
| assert(info.type === theRethrow.type); | |
| assert(info.target === theRethrow.target); | |
| theRethrow.target = "l1"; | |
| assert(theRethrow.target === "l1"); | |
| theRethrow.type = binaryen.f64; | |
| theRethrow.finalize(); | |
| assert(theRethrow.type === binaryen.unreachable); | |
| info = binaryen.getExpressionInfo(theRethrow); | |
| assert(info.type === theRethrow.type); | |
| assert(info.target === theRethrow.target); | |
| console.log(theRethrow.toText()); | |
| assert( | |
| theRethrow.toText() | |
| == | |
| "(rethrow $l1)\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); | |
| var info = binaryen.getExpressionInfo(theTupleMake); | |
| assert(info.id === theTupleMake.id); | |
| assert(info.type === theTupleMake.type); | |
| assertDeepEqual(info.operands, theTupleMake.operands); | |
| theTupleMake.operands = operands = [ | |
| module.i32.const(3), // set | |
| module.i32.const(4), // set | |
| module.i32.const(5) // append | |
| ]; | |
| assertDeepEqual(theTupleMake.operands, operands); | |
| operands = [ | |
| module.i32.const(6) // set | |
| // remove | |
| // remove | |
| ]; | |
| theTupleMake.setOperands(operands); | |
| assertDeepEqual(theTupleMake.operands, operands); | |
| assertDeepEqual(theTupleMake.getOperands(), operands); | |
| theTupleMake.insertOperandAt(1, module.i32.const(7)); | |
| theTupleMake.type = binaryen.f64; | |
| theTupleMake.finalize(); | |
| assert(theTupleMake.type === type); | |
| info = binaryen.getExpressionInfo(theTupleMake); | |
| assert(info.type === theTupleMake.type); | |
| assertDeepEqual(info.operands, theTupleMake.operands); | |
| console.log(theTupleMake.toText()); | |
| assert( | |
| theTupleMake.toText() | |
| == | |
| "(tuple.make 2\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); | |
| var info = binaryen.getExpressionInfo(theTupleExtract); | |
| assert(info.id === theTupleExtract.id); | |
| assert(info.type === theTupleExtract.type); | |
| assert(info.tuple === theTupleExtract.tuple); | |
| assert(info.index === theTupleExtract.index); | |
| 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); | |
| info = binaryen.getExpressionInfo(theTupleExtract); | |
| assert(info.type === theTupleExtract.type); | |
| assert(info.tuple === theTupleExtract.tuple); | |
| assert(info.index === theTupleExtract.index); | |
| console.log(theTupleExtract.toText()); | |
| assert( | |
| theTupleExtract.toText() | |
| == | |
| "(tuple.extract 2 0\n (tuple.make 2\n (f64.const 3)\n (f64.const 4)\n )\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# RefI31"); | |
| (function testRefI31() { | |
| const module = new binaryen.Module(); | |
| var value = module.local.get(1, binaryen.i32); | |
| const theRefI31 = binaryen.RefI31(module.ref.i31(value)); | |
| assert(theRefI31 instanceof binaryen.RefI31); | |
| assert(theRefI31 instanceof binaryen.Expression); | |
| assert(theRefI31.value === value); | |
| // assert(theRefI31.type === binaryen.?); // TODO: (ref i31) | |
| var info = binaryen.getExpressionInfo(theRefI31); | |
| assert(info.id === theRefI31.id); | |
| assert(info.type === theRefI31.type); | |
| assert(info.value === theRefI31.value); | |
| theRefI31.value = value = module.local.get(2, binaryen.i32); | |
| assert(theRefI31.value === value); | |
| info = binaryen.getExpressionInfo(theRefI31); | |
| assert(info.value === theRefI31.value); | |
| console.log(theRefI31.toText()); | |
| assert( | |
| theRefI31.toText() | |
| == | |
| "(ref.i31\n (local.get $2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# I31Get"); | |
| (function testI31Get() { | |
| const module = new binaryen.Module(); | |
| var i31 = module.local.get(1, binaryen.i31ref); | |
| const theI31Get = binaryen.I31Get(module.i31.get_s(i31)); | |
| assert(theI31Get instanceof binaryen.I31Get); | |
| assert(theI31Get instanceof binaryen.Expression); | |
| assert(theI31Get.i31 === i31); | |
| assert(theI31Get.signed === true); | |
| assert(theI31Get.type === binaryen.i32); | |
| var info = binaryen.getExpressionInfo(theI31Get); | |
| assert(info.id === theI31Get.id); | |
| assert(info.type === theI31Get.type); | |
| assert(info.i31 === theI31Get.i31); | |
| assert(info.isSigned === theI31Get.signed); | |
| theI31Get.i31 = i31 = module.local.get(2, binaryen.i31ref); | |
| assert(theI31Get.i31 === i31); | |
| theI31Get.signed = false; | |
| assert(theI31Get.signed === false); | |
| theI31Get.type = binaryen.f64; | |
| theI31Get.finalize(); | |
| assert(theI31Get.type === binaryen.i32); | |
| info = binaryen.getExpressionInfo(theI31Get); | |
| assert(info.type === theI31Get.type); | |
| assert(info.i31 === theI31Get.i31); | |
| assert(info.isSigned === theI31Get.signed); | |
| console.log(theI31Get.toText()); | |
| assert( | |
| theI31Get.toText() | |
| == | |
| "(i31.get_u\n (local.get $2)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); | |
| console.log("# CallRef"); | |
| (function testCallRef() { | |
| const module = new binaryen.Module(); | |
| const funcName = "tiny"; | |
| module.addFunction(funcName, binaryen.createType([binaryen.i32, binaryen.i32]), binaryen.none, [], module.nop()); | |
| const funcType = binaryen.Function(module.getFunction(funcName)).type; | |
| const funcRef = binaryen.RefFunc(module.ref.func(funcName, funcType)); | |
| const operands = [ | |
| module.i32.const(6), | |
| module.i32.const(7) | |
| ]; | |
| const theCallRef = binaryen.CallRef(module.call_ref(funcRef, operands, binaryen.none)); | |
| assert(theCallRef instanceof binaryen.CallRef); | |
| assert(theCallRef instanceof binaryen.Expression); | |
| assert(theCallRef.numOperands === operands.length); | |
| assert(theCallRef.type === binaryen.none); | |
| assert(binaryen.RefFunc(theCallRef.target).func === funcName); | |
| const info = binaryen.getExpressionInfo(theCallRef); | |
| assert(info.id === theCallRef.id); | |
| assert(info.type === theCallRef.type); | |
| assert(info.target === theCallRef.target); | |
| assert(info.isReturn === theCallRef.isReturn()); | |
| assert(theCallRef.getNumOperands() === operands.length); | |
| assert(theCallRef.getOperandAt(0) === operands[0]); | |
| assert(theCallRef.getOperandAt(1) === operands[1]); | |
| theCallRef.setOperandAt(0, operands[1]); | |
| assert(theCallRef.getOperandAt(0), operands[1]); | |
| theCallRef.setOperandAt(0, operands[0]); | |
| assert(theCallRef.getOperandAt(0), operands[0]); | |
| const newOperand = module.i32.const(8); | |
| theCallRef.appendOperand(newOperand); | |
| assert(theCallRef.getNumOperands() == 3); | |
| assert(theCallRef.getOperandAt(2) === newOperand); | |
| theCallRef.removeOperandAt(2); | |
| assert(theCallRef.getNumOperands() == 2); | |
| assert(theCallRef.getOperandAt(0) === operands[0]); | |
| assert(theCallRef.getOperandAt(1) === operands[1]); | |
| theCallRef.insertOperandAt(1, newOperand); | |
| assert(theCallRef.getNumOperands() == 3); | |
| assert(theCallRef.getOperandAt(0) === operands[0]); | |
| assert(theCallRef.getOperandAt(1) === newOperand); | |
| assert(theCallRef.getOperandAt(2) === operands[1]); | |
| theCallRef.removeOperandAt(1); | |
| assert(theCallRef.getNumOperands() == 2); | |
| assert(theCallRef.getOperandAt(0) === operands[0]); | |
| assert(theCallRef.getOperandAt(1) === operands[1]); | |
| assert(theCallRef.isReturn() === false); | |
| theCallRef.setReturn(true); | |
| assert(theCallRef.isReturn() === true); | |
| theCallRef.setReturn(false); | |
| assert(theCallRef.isReturn() === false); | |
| const theReturnCallRef = binaryen.CallRef(module.return_call_ref(funcRef, operands, binaryen.none)); | |
| assert(theReturnCallRef instanceof binaryen.CallRef); | |
| assert(theReturnCallRef instanceof binaryen.Expression); | |
| assert(theReturnCallRef.numOperands === operands.length); | |
| assert(binaryen.RefFunc(theReturnCallRef.target).func === funcName); | |
| assert(theReturnCallRef.isReturn() === true); | |
| const targetRef = binaryen.RefFunc(theCallRef.getTarget()); | |
| assert(theCallRef.getTarget() == theCallRef.target); | |
| assert(targetRef.func === funcName); | |
| const newTargetName = "newTarget"; | |
| const newTargetRef = binaryen.RefFunc(module.ref.func(newTargetName, funcType)); | |
| theCallRef.setTarget(newTargetRef); | |
| assert(binaryen.RefFunc(theCallRef.getTarget()).func === newTargetName); | |
| theCallRef.setTarget(funcRef); | |
| assert(binaryen.RefFunc(theCallRef.getTarget()).func === funcName); | |
| console.log(theCallRef.toText()); | |
| assert( | |
| theCallRef.toText() | |
| == | |
| "(call_ref $func.0\n (i32.const 6)\n (i32.const 7)\n (ref.func $tiny)\n)\n" | |
| ); | |
| module.dispose(); | |
| })(); |