diff --git a/Web.md b/Web.md index 6662e2c1..57b74469 100644 --- a/Web.md +++ b/Web.md @@ -20,6 +20,35 @@ WebAssembly's [modules](Modules.md) allow for natural [integration with the ES6 module system](Modules.md#integration-with-es6-modules) and allow synchronous calling to and from JavaScript. +### Function Names + +A WebAssembly module imports and exports functions. WebAssembly names functions +using arbitrary-length byte sequences. Any 8-bit values are permitted in a +WebAssembly name, including the null byte and byte sequences that don't +correspond to any Unicode code point regardless of encoding. The most natural +Web representation of a mapping of function names to functions is a JS object +in which each function is a property. Property names in JS are UTF-16 encoded +strings. A WebAssembly module may fail validation on the Web if it imports or +exports functions whose names do not transcode cleanly to UTF-16 according to +the following conversion algorithm, assuming that the WebAssembly name is in a +`Uint8Array` called `array`: + +``` +function convertToJSString(array) +{ + var string = ""; + for (var i = 0; i < array.length; ++i) + string += String.fromCharCode(array[i]); + return decodeURIComponent(escape(string)); +} +``` + +This performs the UTF8 decoding (`decodeURIComponent(unescape(string))`) using +a [common JS idiom](http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html). +Transcoding failure is detected by `decodeURIComponent`, which may throw +`URIError`. If it does, the WebAssembly module will not validate. This validation +rule is only mandatory for Web embedding. + ## Aliasing linear memory from JS If [allowed by the module](Modules.md#linear-memory-section), JavaScript can