-
Notifications
You must be signed in to change notification settings - Fork 695
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Specify display conventions for wasm locations #1053
Changes from 7 commits
b9ca72f
a2c18aa
759732f
44f9459
40727c8
fc10e38
2c19e3a
aaa35d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -123,6 +123,69 @@ MIME type mismatch or `opaque` response types | |
[reject](http://tc39.github.io/ecma262/#sec-rejectpromise) the Promise with a | ||
`WebAssembly.CompileError`. | ||
|
||
## Developer-facing display conventions | ||
|
||
Browsers, JavaScript engines, and offline tools have common ways of referring to | ||
JavaScript artifacts and language constructs. For example, locations in | ||
JavaScript source code are printed in stack traces or error messages, and are | ||
represented naturally as decimal-format lines and columns in text files. Names | ||
of functions and variables are taken directly from the sources. Therefore (for | ||
example) even though the exact format of Error.stack strings does not always | ||
match, the locations are easily understandable and the same across browsers. | ||
|
||
To achive the same goal of a common representations for WebAssembly constructs, the | ||
following conventions are adopted. | ||
|
||
A WebAssembly location is a reference to a particular instruction in the binary, and may be | ||
displayed by a browser or engine in similar contexts as JavaScript source locations. | ||
It has the following format: | ||
|
||
`${url}:wasm-function[${funcIndex}]:${pcOffset}` | ||
|
||
Where | ||
* `${url}` is the URL associated with the module, if applicable (see notes). | ||
* `${funcIndex}` is an index in the [function index space](Modules.md#function-index-space). | ||
* `${pcOffset}` is the offset in the module binary of the first byte | ||
of the instruction, printed in hexadecimal with lower-case digits, | ||
with a leading `0x` prefix. | ||
|
||
Notes: | ||
* The URL field may be interpreted differently depending on the | ||
context. When the response-based | ||
instantiation [API](#additional-web-embedding-api) is used in a | ||
browser, the associated URL should be used; or when the | ||
ArrayBuffer-based instantiation | ||
[API](JS.md#webassemblyinstantiate) is used, the browser should represent | ||
the location of the API call. This kind of instantiation is analagous to | ||
executing JavaScript using `eval`; therefore if the browser has an existing | ||
method to represent the location of the `eval` call it can use a similar | ||
one for `WebAssembly.instantiate`. For example if the browser uses | ||
`foo.js line 10 > eval` or `eval at bar (foo.js:10:3)` for `eval`, it could | ||
use `foo.js line 10 > WebAssembly.instantiate` or | ||
`WebAssembly.instantiate at bar (foo.js:10:3)`, respectively. | ||
Offline tools may use a filename instead. | ||
* Using hexadecimal for module offsets matches common conventions in native tools | ||
such as objdump (where addresses are printed in hex) and makes them visually | ||
distinct from JavaScript line numbers. Other numbers are represented in decimal. | ||
|
||
Names of functions may also be displayed if the module contains a | ||
["name" section](BinaryEncoding.md#name-section); | ||
these can be used in the same contexts as JavaScript functions. | ||
If the module's name section includes both module and function names, it | ||
should be represented as `${module_name}.${function_name}`. | ||
If the function name is absent, then the output can be context-dependent. | ||
For example, if the function name is shown alongside its location in a | ||
stack trace, then just the module name (if present) or an empty string | ||
can be used, because the function index is shown with the location. | ||
Otherwise a representation that indicates the function index should be | ||
used (for example `${module_name}.wasm-function[${funcIndex}]`). | ||
|
||
Note also that this document does | ||
not specify the full format of strings such as stack frame representations; | ||
this allows engines to continue using their existing formats for JavaScript | ||
(which existing code may already be depending on) while still printing | ||
WebAssembly frames in a format consistent with JavaScript. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you also add a Note saying somewhere that these conventions do not describe the value of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ha good point. Would we want a way to map one to the other as a standalone function? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You you mean like some new JS API for producing the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. My thinking it: we already let developers access the name section so they don't have to parse their own module... but then they need to parse the name section to get that information! Cut the middle-person. 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, that makes sense if client code would otherwise be doing their own binary parsing that we've already done. With the other Module reflection methods, our motivating use case was module loaders (and specific experience with incorporating wasm into SystemJS). It'd be nice to have some specific user who is wanting to programmatically access these function names. Anyhow, this probably belongs in a different issue. |
||
|
||
## Modules | ||
|
||
WebAssembly's [modules](Modules.md) allow for natural [integration with | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: "... same contexts as JavaScript function names".