Created
March 6, 2018 14:33
-
-
Save rossberg/c0fa2e20d7614b128a9ffb5c5ab50dde to your computer and use it in GitHub Desktop.
Annotation syntax for the asm text format
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Annotation Syntax for the Wasm Text Format | |
## Motivation | |
Problem | |
* The Wasm binary format supports custom sections to enable associating arbitrary meta data with a Wasm module. | |
* No equivalent exists for the text format. In particular, there is no way to | |
- represent custom sections themselves in the text format, cf. WebAssembly/design#1153 and https://gist.github.com/binji/d1cfff7faaebb2aa4f8b1c995234e5a0 | |
- reflect arbitrary names in the text format, cf. WebAssembly/spec#617 | |
- express information like for host bindings, cf. https://github.com/WebAssembly/host-bindings/blob/master/proposals/host-bindings/Overview.md | |
Solution | |
* This proposal adds the ability to decorate a module in textual notarion with arbitrary annotations of the form `(@id ...)`. | |
* Neither the syntactic shape nor the semantics is prescribed by the Wasm specification, though the . | |
* This only affects the text format, nothing else. | |
## Details | |
Extend the Text Format as follows: | |
* Anywhere where white space is allowed, allow *annotations* of the following form: | |
``` | |
annot ::= "(@"idchar+ annotelem* ")" | |
annotelem ::= keyword | reserved | uN | sN | fN | string | id | "(" annotelem* ")" | "(@"idchar+ annotelem* ")" | |
``` | |
In other words, an annotation can contain any sequence of tokens, as long as it is well-bracketed. | |
No white space is allowed inside the initial `(@idchar+` delimiter. | |
* The initial `idchar+` is meant to be an identifier categorising the extension, and plays a role similar to the name of a custom section. | |
By convention, annotations corresponding to a custom section should use the same id. | |
Extend the Appendix on the Custom Sections: | |
* Define annotations reflecting the Name section, which take the form of annotations `(@name "name")`. | |
They may be placed after the binder for any construct that can be named by the name section. | |
* Define annotation syntax expressing arbitrary custom sections; cf. https://gist.github.com/binji/d1cfff7faaebb2aa4f8b1c995234e5a0 | |
As always with annotation, it is up to implementations how they handle the case of an explicit custom section overlaps with individual annotations that are associated with the same custom section. | |
## Examples | |
Expressing custom sections (cf. https://gist.github.com/binji/d1cfff7faaebb2aa4f8b1c995234e5a0) | |
``` | |
(module | |
(@custom "name" (after function) "contents") | |
) | |
``` | |
Expressing names | |
``` | |
(module (@name "Gümüsü") | |
(func $lambda (@name "λ") (param $x (@name "αβγδ") i32) (result i32) (get_local $x)) | |
) | |
``` | |
Host bindings (cf. https://github.com/WebAssembly/host-bindings/blob/master/proposals/host-bindings/Overview.md) | |
``` | |
(module | |
(func (export "f") (param i32 (@js unsigned)) ...) ;; argument converted as unsigned | |
(func (export "method") (param $x anyref (@js this)) (param $y i32) ...) ;; maps this to first arg | |
(func (import "m" "constructor") (@js new) (param i32) (result anyref) ;; is called as a constructor | |
) | |
``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment