WebAssembly
O objeto WebAssembly do Azion Runtime: os métodos estáticos que validam, compilam e instanciam um módulo, e os construtores dele.
O objeto WebAssembly contém a interface JavaScript para WebAssembly no Azion Runtime. Uma function o usa para validar, compilar e instanciar um módulo a partir do código binário dele, e para criar a memória, as tabelas e as tags que um módulo usa. O Azion Runtime oferece a interface que a MDN Web Docs define, exceto que os dois métodos de streaming não aceitam um Response. Para mais informações, consulte WebAssembly e WebAssembly JavaScript interface na MDN Web Docs.
Os exemplos declaram o código binário de um módulo inline, por isso cada um executa como está escrito. Uma function que baixa um arquivo .wasm com fetch() passa o resultado de response.arrayBuffer() no lugar dele.
Métodos
O objeto WebAssembly tem estes métodos estáticos.
WebAssembly.compile()
WebAssembly.compile() compila código binário WebAssembly em um objeto WebAssembly.Module. Use-o quando você compila um módulo antes de instanciá-lo; caso contrário, use WebAssembly.instantiate().
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bufferSource | Typed array ou ArrayBuffer | Sim | Código binário do módulo .wasm a compilar. |
Este exemplo compila um módulo que exporta uma função, add, e lista as exportações do módulo:
Bytes que não formam um módulo válido fazem a promise ser rejeitada com um WebAssembly.CompileError. Por exemplo, um módulo com uma versão não suportada é rejeitado com WebAssembly.compile(): expected version 01 00 00 00, found 09 00 00 00 @+4.
WebAssembly.compileStreaming()
WebAssembly.compileStreaming() compila um WebAssembly.Module a partir de uma fonte subjacente transmitida por streaming. Use-o quando você compila um módulo antes de instanciá-lo; caso contrário, use WebAssembly.instantiateStreaming().
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
source | Response | Sim | Fonte subjacente do módulo .wasm a transmitir por streaming e compilar. |
O Azion Runtime não aceita um Response como source: a promise é rejeitada com TypeError: WebAssembly.compile(): Argument 0 must be a buffer source. Para compilar um módulo a partir de uma resposta, leia o corpo com response.arrayBuffer() e passe o resultado para WebAssembly.compile().
WebAssembly.instantiate()
WebAssembly.instantiate() compila e instancia código WebAssembly. Ele tem dois overloads:
- O overload primário recebe o código binário, como um typed array ou um
ArrayBuffer, e o compila e instancia em uma única etapa. A promise é cumprida com um objeto que contémmoduleeinstance. - O overload secundário recebe um
WebAssembly.Modulejá compilado. A promise é cumprida com umaInstancedesse módulo.
O overload primário recebe estes parâmetros:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bufferSource | Typed array ou ArrayBuffer | Sim | Código binário do módulo .wasm a compilar e instanciar. |
importObject | Object | Não | Valores a importar para a nova Instance, como funções ou objetos WebAssembly.Memory. Ele precisa de uma propriedade correspondente para cada importação que o módulo declara; caso contrário, a promise é rejeitada com um WebAssembly.LinkError. |
O overload secundário recebe estes parâmetros:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
module | WebAssembly.Module | Sim | Módulo a instanciar. |
importObject | Object | Não | Valores a importar para a nova Instance, como funções ou objetos WebAssembly.Memory. Ele precisa de uma propriedade correspondente para cada importação de module; caso contrário, a promise é rejeitada com um WebAssembly.LinkError. |
Um objeto de importação sem a função que um módulo importa faz a promise ser rejeitada com WebAssembly.instantiate(): Import #0 "imports" "imported_func": function import requires a callable.
Este exemplo usa o overload primário. O módulo importa imports.imported_func e exporta exported_func, que chama a função importada com o valor 42:
Este exemplo usa o overload secundário. Ele compila o módulo add primeiro e depois o instancia:
WebAssembly.instantiateStreaming()
WebAssembly.instantiateStreaming() compila e instancia um módulo WebAssembly diretamente a partir de uma fonte subjacente transmitida por streaming.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
source | Response, ou uma promise que é cumprida com um | Sim | Fonte subjacente do módulo .wasm a transmitir por streaming, compilar e instanciar. |
importObject | Object | Não | Valores a importar para a nova Instance, como funções ou objetos WebAssembly.Memory. Ele precisa de uma propriedade correspondente para cada importação que o módulo declara; caso contrário, a promise é rejeitada com um WebAssembly.LinkError. |
O Azion Runtime não aceita um Response como source: a promise é rejeitada com TypeError: WebAssembly.compile(): Argument 0 must be a buffer source. Para instanciar um módulo a partir de uma resposta, leia o corpo com response.arrayBuffer() e passe o resultado para WebAssembly.instantiate().
WebAssembly.validate()
WebAssembly.validate() verifica se um typed array de código binário WebAssembly forma um módulo válido. Ele retorna true quando os bytes formam um módulo válido e false quando não formam.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bufferSource | Typed array ou ArrayBuffer | Sim | Código binário a validar. |
Este exemplo valida o módulo add e três bytes que não são um módulo:
Construtores
O objeto WebAssembly contém estes construtores.
WebAssembly.CompileError()
WebAssembly.CompileError() cria um objeto CompileError, que indica um erro durante a decodificação ou a validação de WebAssembly.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | String | Não | Descrição legível do erro. |
fileName | String | Não | Nome do arquivo que contém o código que causou a exceção. |
lineNumber | Number | Não | Número da linha do código que causou a exceção. |
Este exemplo lança um CompileError e o lê em um bloco catch:
CompileError é uma propriedade do objeto WebAssembly, não um global: teste-o com e instanceof WebAssembly.CompileError.
WebAssembly.Instance()
WebAssembly.Instance() cria um objeto Instance, uma instância executável e com estado de um WebAssembly.Module.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
module | WebAssembly.Module | Sim | Módulo a instanciar. |
importObject | Object | Não | Valores a importar para a nova Instance, como funções ou objetos WebAssembly.Memory. |
Este exemplo compila o módulo add e o instancia de forma síncrona:
WebAssembly.LinkError()
WebAssembly.LinkError() cria um objeto LinkError, que indica um erro durante a instanciação do módulo, além dos traps da função start.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | String | Não | Descrição legível do erro. |
fileName | String | Não | Nome do arquivo que contém o código que causou a exceção. |
lineNumber | Number | Não | Número da linha do código que causou a exceção. |
Este exemplo lança um LinkError e o lê em um bloco catch:
LinkError é uma propriedade do objeto WebAssembly, não um global: teste-o com e instanceof WebAssembly.LinkError.
WebAssembly.Memory()
WebAssembly.Memory() cria um objeto Memory. A propriedade buffer dele é um ArrayBuffer ou SharedArrayBuffer redimensionável que contém os bytes brutos de memória que uma Instance WebAssembly acessa. Uma memória criada por JavaScript ou por código WebAssembly é acessível e mutável tanto a partir de JavaScript quanto de WebAssembly.
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
memoryDescriptor.initial | Number | Sim | — | Tamanho inicial da memória, em páginas WebAssembly. |
memoryDescriptor.maximum | Number | Não | — | Tamanho máximo que a memória pode atingir, em páginas WebAssembly. Quando presente, indica ao mecanismo que reserve memória antecipadamente; o mecanismo pode ignorar ou limitar a reserva. Uma memória não compartilhada não precisa de um máximo; uma memória compartilhada precisa. |
memoryDescriptor.shared | Boolean | Não | false | Define se a memória é uma memória compartilhada. Defina como true para uma memória compartilhada. |
Este exemplo cria uma memória de 10 páginas que pode crescer até 100 páginas:
Com initial definido como 10, o buffer contém 655.360 bytes, portanto uma página WebAssembly contém 65.536 bytes.
Este exemplo cria uma memória compartilhada. O buffer dela é um SharedArrayBuffer:
WebAssembly.Module()
WebAssembly.Module() cria um objeto Module, que contém código WebAssembly sem estado, já compilado, que pode ser instanciado várias vezes. O construtor compila o código binário de forma síncrona. A principal forma de obter um Module é uma função de compilação assíncrona, como WebAssembly.compile().
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bufferSource | Typed array ou ArrayBuffer | Sim | Código binário do módulo .wasm a compilar. |
Este exemplo compila o módulo add de forma síncrona e depois o instancia com WebAssembly.instantiate():
WebAssembly.RuntimeError()
WebAssembly.RuntimeError() cria um objeto RuntimeError, o tipo que o WebAssembly lança sempre que especifica um trap.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | String | Não | Descrição legível do erro. |
fileName | String | Não | Nome do arquivo que contém o código que causou a exceção. O objeto de erro não o expõe. |
lineNumber | Number | Não | Número da linha do código que causou a exceção. O objeto de erro não o expõe. |
Este exemplo lança um RuntimeError e o lê em um bloco catch. O construtor aceita fileName e lineNumber, mas e.fileName, e.lineNumber e e.columnNumber são lidos como undefined:
WebAssembly.Table()
WebAssembly.Table() cria um objeto Table com o tamanho e o tipo de elemento informados.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tableDescriptor.element | String | Sim | Tipo de valor que a tabela armazena: "anyfunc" para funções ou "externref" para referências de host. |
tableDescriptor.initial | Number | Sim | Número inicial de elementos da tabela. |
tableDescriptor.maximum | Number | Não | Número máximo de elementos até o qual a tabela pode crescer. |
Este exemplo cria uma tabela de duas funções, lê o comprimento e os elementos dela e adiciona a tabela a um objeto de importação:
WebAssembly.Tag()
WebAssembly.Tag() cria um objeto WebAssembly.Tag.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type.parameters | Array de strings | Sim | Tipos de dados dos valores que a tag carrega: "i32", "i64", "f32", "f64", "v128", "externref" ou "anyfunc". |
O construtor lança um TypeError quando type.parameters não é fornecido, não contém nenhum valor ou contém um descritor de tag não suportado.
Este exemplo cria uma tag com dois valores:
WebAssembly.Exception()
WebAssembly.Exception() cria um objeto WebAssembly.Exception. O construtor recebe uma Tag e um array de payload com campos de dados. O tipo de dados de cada elemento do payload precisa corresponder ao tipo de dados correspondente da Tag.
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
tag | WebAssembly.Tag | Sim | — | Tag que define o tipo de dados de cada valor do payload. |
payload | Array | Sim | — | Um ou mais campos de dados que compõem o payload da exceção. Os elementos precisam corresponder aos tipos de dados dos elementos correspondentes da tag. |
options.traceStack | Boolean | Não | false | true quando o código WebAssembly que lança a exceção pode anexar um stack trace à propriedade stack da exceção. |
O construtor lança um TypeError quando o payload e a tag não têm o mesmo número de elementos ou quando os elementos não são de tipos correspondentes.
Este exemplo cria uma tag e a usa para criar uma exceção, depois lê a exceção de volta:
O segundo valor é lido como 42.29999923706055 porque a tag o armazena como um f32, um float de 32 bits.