TLDR: bind should be overrided for WebAssembly.Function to return regular JS Function.
According to the proposal WebAssembly.Function is a subclass of regular JS Function and Function.prototype in its prototype chain. It makes possible to call Function.prototype.bind on WebAssembly.Function object. It returns Bound Function exotic object with its [[Prototype]] internal field set to a prototype of target - WebAssembly.Function.prototype in our case. After that we get an object indistinguishable from WebAssembly.Function using instanceof machinery, but it couldn't be used as an argument for Table.set.
let wafn = new WebAssembly.Function({parameters: ['i32'], results:[]}, _ => 0)
let pseudo_wafn = wafn.bind(null)
console.log(pseudo_wafn instanceof WebAssembly.Function) // true in current state of things
console.log(pseudo_wafn.type().parameters) // ['i32']? []? but Function.prototype.bind knows nothing about WebAssembly.Function
let table = new WebAssembly.Table({ initial: 1, element: "anyfunc" })
table.set(0, pseudo_wafn) // throws an exception. pseudo_wafn is not a real WebAssembly.Function
To keep it consistent and predictable I propose to override bind on the level of WebAssembly.Function.prototype to behave exactly like original one, but return BoundFunctionObject with a regular function prototype. It allows to keep ergonomic on JS side without changing ecma262 spec.
TLDR:
bindshould be overrided for WebAssembly.Function to return regular JS Function.According to the proposal
WebAssembly.Functionis a subclass of regular JS Function andFunction.prototypein its prototype chain. It makes possible to call Function.prototype.bind onWebAssembly.Functionobject. It returns Bound Function exotic object with its[[Prototype]]internal field set to a prototype of target -WebAssembly.Function.prototypein our case. After that we get an object indistinguishable fromWebAssembly.Functionusinginstanceofmachinery, but it couldn't be used as an argument forTable.set.To keep it consistent and predictable I propose to override
bindon the level ofWebAssembly.Function.prototypeto behave exactly like original one, but returnBoundFunctionObjectwith a regular function prototype. It allows to keep ergonomic on JS side without changingecma262spec.