Commit Graph

3080 Commits

Author SHA1 Message Date
Paul Butler
620212dff8 bool -> boolean in generated TypeScript code (#1933)
* bool -> boolean in generated TypeScript code

* Add a test for booleans

Co-authored-by: Alex Crichton <alex@alexcrichton.com>
2020-01-06 13:17:19 -06:00
Brendan McLoughlin
e169f45e1a Update the link to the js_sys Reflect API docs (#1936) 2020-01-06 11:47:33 -06:00
Fernando Bitti Loureiro
aab99feb3e The example should output "Hello from Rust!" (#1931)
* Make console output "Hello from Rust!"

The HTML says the console would output Hello from Rust!, but instead it outputs Hello, World!
This is a proposed fix.

* Output "Hello from Rust!"

The HTML says the console would output "Hello from Rust!" but instead it outputs "Hello, World!".
This is a proposed fix.
2020-01-06 11:47:13 -06:00
Alex Crichton
1548953364
Handle duplicate imports of the same item. (#1942)
The wasm-bindgen nightly test suite started failing recently and a
bisection shows that rust-lang/rust#67363 is the cause of this issue.
The problem happening here is that after that Rust PR duplicate imports
from the same name/module in different parts of a Rust program may now
show up as duplicate imports rather than being coalesced into one
import. This was tripping up `wasm-bindgen` which, when translating from
the wasm module to wasm-bindgen's IR, is unfortunately very
string-based.

The fix here was to detect these duplicate imports and map them all to
the same item, removing the duplicate imports.

Closes #1929
2020-01-06 11:44:52 -06:00
Alex Crichton
91aaf884d6 Update build of raytrace example to latest nightly
Closes #1935
2020-01-06 08:30:30 -08:00
Darin Morrison
624ff42eae Mark js_sys::Promise as #[must_use] (#1927)
* Mark js_sys::Promise as #[must_use]

* Fix js_sys::Promise #[must_use] warnings
2020-01-06 09:47:16 -06:00
Matthijs Brobbel
7ed152276f Fix typo in arbitrary-data-with-serde.md (#1923) 2020-01-06 09:27:05 -06:00
Katie
0c18768098 Add inspectable attribute to guide (#1924)
This was missed in PR #1876
2020-01-06 09:25:59 -06:00
Nick Fitzgerald
36afba74d4 Bump bumpalo (#1925)
* Fix typo in comment

* Bump `bumpalo` dependency to 3.0.0

* Fix warning about unused loop label
2020-01-06 09:24:32 -06:00
Pauan
580daab1d3 Release 0.2.56 (#1922) 2019-12-20 10:31:17 -06:00
Pauan
221514acb9 Adding in Array::iter and Array::to_vec (#1909)
* Adding in Array::iter and Array::to_vec

* Changing ArrayIter to use std::ops::Range
2019-12-17 11:40:33 -06:00
haveyaseen
cbfefb312c Consistent inline code formatting in js-sys docs (#1915)
* Consistent inline code formatting in docs

Also corrects the docstring of `Math.cbrt()` (the cubic root of x is not x^3).

* Add backticks to Array#includes()

* Fix links to functions in Reflect docs

As soon as intra-rustdoc links land in stable the round brackets can be removed.
2019-12-17 09:22:33 -06:00
Alex Crichton
c564eb72b1
Use *.wat instead of *.wit for text files (#1901)
The `*.wit` extension is actually intended to mean "WebAssembly Instance
Type", not "WebAssembly Interface Types". The `*.wat` text format
already will have support for annotations, and wasm interface types are
just an extension of that!
2019-12-11 16:22:35 -08:00
Linda_pp
090109dea7 disable eslint in generated type definition file (#1908) 2019-12-11 10:24:49 -08:00
Pauan
1c08e2b48b Adding in async support for start (#1905)
* Adding in async support for start

* Adding in another test case

* Refactoring the Start trait to be cleaner
2019-12-09 09:53:29 -08:00
Pauan
b71b136fe8 Changing wasm-in-wasm example to be async (#1903) 2019-12-09 09:44:49 -08:00
Alex Crichton
057c9157b3
Add test for consuming interface types inputs (#1900)
This commit adds a test suite for consuming interface types modules as
input and producing a JS polyfill output. The tests are relatively
simple today and don't exercise a ton of functionality, but they should
hopefully cover the breadth of at least some basics of what wasm
interface types supports today.

A few small fixes were applied along the way, such as:

* Don't require modules to have a stack pointer

* Allow passing `*.wat`, `*.wit`, or `*.wasm` files as input to
  `wasm-bindgen` instead of always requiring `*.wasm`.
2019-12-04 22:39:57 -06:00
Pauan
a1d90398d0 Adding in support for async iterators (#1895)
* Adding in support for async iterators

* Adding in some unit tests for asyncIterator

* Fixing unit tests

* Fixing UI tests
2019-12-04 17:51:22 -06:00
Alex Crichton
203d86f343
Add tests for the interface types output of wasm-bindgen (#1898)
* Add tests for the interface types output of wasm-bindgen

This commit expands the test suite with assertions about the output of
the interface types pass in wasm-bindgen. The goal here is to actually
assert that we produce the right output and have a suite of reference
files to show how the interface types output is changing over time.

The `reference` test suite added in the previous PR has been updated to
work for interface types as well, generating `*.wit` file assertions
which are printed via the `wit-printer` crate on crates.io.

Along the way a number of bugs were fixed with the interface types
output, such as:

* Non-determinism in output caused by iteration of a `HashMap`

* Avoiding JS generation entirely in interface types mode, ensuring that
  we don't export extraneous intrinsics that aren't otherwise needed.

* Fixing location of the stack pointer for modules where it's GC'd out.
  It's now rooted in the aux section of wasm-bindgen so it's available
  to later passes, like the multi-value pass.

* Interface types emission now works in debug mode, meaning the
  `--release` flag is no longer required. This previously did not work
  because the `__wbindgen_throw` intrinsic was required in debug mode.
  This comes about because of the `malloc_failure` and `internal_error`
  functions in the anyref pass. The purpose of these functions is to
  signal fatal runtime errors, if any, in a way that's usable to the
  user. For wasm interface types though we can replace calls to these
  functions with `unreachable` to avoid needing to import the
  intrinsic. This has the accidental side effect of making
  `wasm_bindgen::throw_str` "just work" with wasm interface types by
  aborting the program, but that's not actually entirely intended. It's
  hoped that a split of a `wasm-bindgen-core` crate would solve this
  issue for the future.

* Run the wasm interface types validator in tests

* Add more gc roots for adapter gc

* Improve stack pointer detection

The stack pointer is never initialized to zero, but some other mutable
globals are (TLS, thread ID, etc), so let's filter those out.
2019-12-04 15:19:48 -06:00
Alex Crichton
b9c93a3c24
Remove the long-outdated typescript crate (#1899)
This was added quite some time ago but never ended up progressing, so
let's delete it.

Closes #234
Closes #237
Closes #238
Closes #239
Closes #240
2019-12-04 14:38:37 -06:00
Alex Crichton
d7a4a772cf
Add reference output tests for JS operations (#1894)
* Add reference output tests for JS operations

This commit starts adding a test suite which checks in, to the
repository, test assertions for both the JS and wasm file outputs of a
Rust crate compiled with `#[wasm_bindgen]`. These aren't intended to be
exhaustive or large scale tests, but rather micro-tests to help observe
the changes in `wasm-bindgen`'s output over time.

The motivation for this commit is basically overhauling how all the GC
passes work in `wasm-bindgen` today. The reorganization is also included
in this commit as well.

Previously `wasm-bindgen` would, in an ad-hoc fashion, run the GC passes
of `walrus` in a bunch of places to ensure that less "garbage" was seen
by future passes. This not only was a source of slowdown but it also was
pretty brittle since `wasm-bindgen` kept breaking if extra iteams leaked
through.

The strategy taken in this commit is to have one precise location for a
GC pass, and everything goes through there. This is achieved by:

* All internal exports are removed immediately when generating the
  nonstandard wasm interface types section. Internal exports,
  intrinsics, and runtime support are all referenced by the various
  instructions and/or sections that use them. This means that we now
  have precise tracking of what an adapter uses.

* This in turn enables us to implement the `add_gc_roots` function for
  `walrus` custom sections, which in turn allows walrus GC passes to do
  what `unexport_unused_intrinsics` did before. That function is now no
  longer necessary, but effectively works the same way. All intrinsics
  are unexported at the beginning and then they're selectively
  re-imported and re-exported through the JS glue generation pass as
  necessary and defined by the bindings.

* Passes like the `anyref` pass are now much more precise about the
  intrinsics that they work with. The `anyref` pass also deletes any
  internal intrinsics found and also does some rewriting of the adapters
  aftewards now to hook up calls to the heap count import to the heap
  count intrinsic in the wasm module.

* Fix handling of __wbindgen_realloc

The final user of the `require_internal_export` function was
`__wbindgen_realloc`. This usage has now been removed by updating how we
handle usage of the `realloc` function.

The wasm interface types standard doesn't have a `realloc` function
slot, nor do I think it ever will. This means that as a polyfill for
wasm interface types we'll always have to support the lack of `realloc`.
For direct Rust to JS, however, we can still optionally handle
`realloc`. This is all handled with a few internal changes.

* Custom `StringToMemory` instructions now exist. These have an extra
  `realloc` slot to store an intrinsic, if found.
* Our custom instructions are lowered to the standard instructions when
  generating an interface types section.
* The `realloc` function, if present, is passed as an argument like the
  malloc function when passing strings to wasm. If it's not present we
  use a slower fallback, but if it's present we use the faster
  implementation.

This should mean that there's little-to-no impact on existing users of
`wasm-bindgen`, but this should continue to still work for wasm
interface types polyfills and such. Additionally the GC passes now work
in that they don't delete `__wbindgen_realloc` which we later try to
reference.

* Add an empty test for the anyref pass

* Precisely track I32FromOptionAnyref's dependencies

This depends on the anyref table and a function to allocate an index if
the anyref pass is running, so be sure to track that in the instruction
itself for GC rooting.

* Trim extraneous exports from nop anyref module

Or if you're otherwise not using anyref slices, don't force some
intrinsics to exist.

* Remove globals from reference tests

Looks like these values adjust in slight but insignificant ways over
time

* Update the anyref xform tests
2019-12-04 12:01:39 -06:00
Alex Crichton
9469c1641b
Remove reliance on wat2wasm in interpreter tests (#1893)
Move usage to the `wat` crate instead.
2019-12-03 14:09:33 -06:00
Alex Crichton
31f7bd5d86
Re-enable validation of getter/setter names (#1892)
Accidentally left out of #1882
2019-12-03 13:01:46 -06:00
Alex Crichton
8be8e09d35
Don't hardcode the __wbg_function_table name (#1891)
Instead use the embedded `export_name_of` function to automatically
export the table if necessary.
2019-12-03 13:01:40 -06:00
Alex Crichton
9a1764420e Re-enable validation of getter/setter names
Accidentally left out of #1882
2019-12-03 09:28:42 -08:00
Alex Crichton
8e56cdacc5
Rewrite wasm-bindgen with updated interface types proposal (#1882)
This commit is a pretty large scale rewrite of the internals of wasm-bindgen. No user-facing changes are expected as a result of this PR, but due to the scale of changes here it's likely inevitable that at least something will break. I'm hoping to get more testing in though before landing!

The purpose of this PR is to update wasm-bindgen to the current state of the interface types proposal. The wasm-bindgen tool was last updated when it was still called "WebIDL bindings" so it's been awhile! All support is now based on https://github.com/bytecodealliance/wasm-interface-types which defines parsers/binary format/writers/etc for wasm-interface types.

This is a pretty massive PR and unfortunately can't really be split up any more afaik. I don't really expect realistic review of all the code here (or commits), but some high-level changes are:

* Interface types now consists of a set of "adapter functions". The IR in wasm-bindgen is modeled the same way not.
* Each adapter function has a list of instructions, and these instructions work at a higher level than wasm itself, for example with strings.
* The wasm-bindgen tool has a suite of instructions which are specific to it and not present in the standard. (like before with webidl bindings)
* The anyref/multi-value transformations are now greatly simplified. They're simply "optimization passes" over adapter functions, removing instructions that are otherwise present. This way we don't have to juggle so much all over the place, and instructions always have the same meaning.
2019-12-03 11:16:44 -06:00
Katie
df34cf843e Allow for js property inspection (#1876)
* Add support for #[wasm_bindgen(inspectable)]

This annotation generates a `toJSON` and `toString` implementation for
generated JavaScript classes which display all readable properties
available via the class or its getters

This is useful because wasm-bindgen classes currently serialize to
display one value named `ptr`, which does not model the properties of
the struct in Rust

This annotation addresses rustwasm/wasm-bindgen#1857

* Support console.log for inspectable attr in Nodejs

`#[wasm_bindgen(inspectable)]` now generates an implementation of
`[util.inspect.custom]` for the Node.js target only. This implementation
causes `console.log` and friends to yield the same class-style output,
but with all readable fields of the Rust struct displayed

* Reduce duplication in generated methods

Generated `toString` and `[util.inspect.custom]` methods now call
`toJSON` to reduce duplication

* Store module name in variable
2019-11-26 12:39:57 -06:00
Rich Murphey
181b10be3f Update extends.md (#1874)
typo: Bar reference gives Foo.
2019-11-25 08:33:03 -06:00
Rich Murphey
0acece0c95 'function' typo (#1875) 2019-11-25 08:32:51 -06:00
Darin Morrison
394be5ec21 Update alert message regarding Firefox version (#1870) 2019-11-22 10:01:15 -06:00
Alex Crichton
9768ec9cab Remove extraneous -Ztimings flag 2019-11-22 07:59:46 -08:00
Alex Crichton
aa461c363b
Add one more webkit-specific whitelist in web-sys (#1865)
* Add one more webkit-specific whitelist in web-sys

* Run rustfmt
2019-11-21 09:30:08 -06:00
Alex Crichton
db9d603c8f
Bump to 0.2.55 (#1864) 2019-11-19 11:04:37 -06:00
Alex Crichton
e934a0f3d3
Support multi-value JS engines (#1863)
This commit adds support to wasm-bindgen to run over interface
types-enabled modules that use multi-value returns and returns are
loaded from the returned array rather than from memory.
2019-11-19 10:44:56 -06:00
Alex Crichton
851390089b Add a mutable accessor for the walrus wasm module 2019-11-19 07:48:34 -08:00
Alex Crichton
aca49e1a6e
Fix the anyref xform working on empty modules (#1861)
If there's no need for a transformation then there's no need to inject
anything, so make sure that wasm-bindgen with anyref passes enabled
works on non-wasm-bindgen blobs as well.

Closes bytecodealliance/cargo-wasi#16
2019-11-18 10:12:41 -06:00
Liam Griffin-Jowett
a8882dc3a6 Point master branch documention link to web_sys instead of js_sys (#1859) 2019-11-11 08:46:28 -06:00
Ilya Baryshnikov
ada615f3dd simplify macro for arrays (#1856) 2019-11-08 16:12:22 -06:00
Alex Crichton
3573164b52
Bump to 0.2.54 (#1854) 2019-11-07 12:59:01 -06:00
lshlyapnikov
d51f539d1a Add an unsafe method view_mut_raw (#1850)
* adding .vscode folder to .gitignore

* Adding view_mut_raw to generated arrays

* test populating rust vector from JS  function

* Uint32Array test, need to make it generic

* Add doc + more test cases

* replacing macro-generated tests with generic test function

it is cleaner, safer and better that way

* improving rustdoc
2019-11-06 12:37:26 -06:00
Alex Crichton
e7bfa161e0 Fix UI tests for updated beta 2019-11-06 09:15:51 -08:00
Alexandre Stein
2a12ca2a4f Update mod.rs (#1852)
Using Typescript I have this warning:
`./pkg/index.js
  Line 52:22:  Expected '!==' and instead saw '!='  eqeqeq

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.
`

I guess this should solve the warning.

Thank you for all the work.
2019-11-06 11:12:47 -06:00
Melody Horn
79cf4f6198 Add first-class support for binary crates (#1843)
* autodiscover an exported `main` if possible

this allows for first-class support of binary crates

* wrap `main` to zero out arguments and suppress return value

* add test for bin crate support

* process only the export of the generated main wrapper

* skip most of `export` since only one line of that is needed
2019-11-04 13:34:42 -06:00
Alex Crichton
b29c110d01 Remove dependencies on git versions of crates 2019-11-04 10:37:50 -08:00
Alex Crichton
935f71afec
Switch from failure to anyhow (#1851)
This commit switches all of `wasm-bindgen` from the `failure` crate to
`anyhow`. The `anyhow` crate should serve all the purposes that we
previously used `failure` for but has a few advantages:

* It's based on the standard `Error` trait rather than a custom `Fail`
  trait, improving ecosystem compatibility.
* We don't need a `#[derive(Fail)]`, which means that's less code to
  compile for `wasm-bindgen`. This notably helps the compile time of
  `web-sys` itself.
* Using `Result<()>` in `fn main` with `anyhow::Error` produces
  human-readable output, so we can use that natively.
2019-11-04 11:35:28 -06:00
Tanner Rogalsky
913fdbc3da Update HTMLImageElement IDL to latest version from gecko (#1842)
* Update HTMLImageElement IDL to latest version from gecko

* Remove Mozilla-specific extensions to HTMLImageElement IDL
2019-10-29 18:11:19 -05:00
Pauan
1f51831c3d Adding in to_vec method for typed arrays (#1844)
* Adding in to_vec method for typed arrays

* Fixing type error
2019-10-29 18:10:18 -05:00
Jakub Hlusička
6159d50eb6 Fix expired Discord link in README.md (#1845) 2019-10-29 17:56:07 -05:00
Alex Crichton
c7c169ae72
Bump to 0.2.53 (#1840) 2019-10-29 09:37:37 -05:00
Alex Crichton
9b8711a5b7
Update webidl_ty field in multi-value transform (#1839)
* Reduce indentation in interface types processing

Just a small stylistic change

* Update `webidl_ty` field in multi-value transform

When we're emitting a bindings section we need to be sure to update the
listed type of the binding in addition to the actual binding
expressions. This should help remove the stray return pointer being
listed there by accident!
2019-10-29 08:55:01 -05:00