Skip to content
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

Refactor #1524

Merged
merged 24 commits into from
Apr 20, 2020
Merged

Refactor #1524

merged 24 commits into from
Apr 20, 2020

Conversation

sunfishcode
Copy link
Member

This contains refactorings and API changes split off from #1516.

The main public-facing change here is that Instance and Module now compute their imports and exports on demand rather than holding precomputed arrays, and Func::get* return closures which capture an InstanceHandle so that they hold the instance live dynamically.

@sunfishcode sunfishcode added the wasmtime:api Related to the API of the `wasmtime` crate itself label Apr 16, 2020
@github-actions
Copy link

Subscribe to Label Action

cc @peterhuene

This issue or pull request has been labeled: "wasmtime:api"

Thus the following users have been cc'd because of the following labels:

  • peterhuene: wasmtime:api

To subscribe or unsubscribe from this label, edit the .github/subscribe-to-label.json configuration file.

Learn more.

@github-actions github-actions bot added fuzzing Issues related to our fuzzing infrastructure wasmtime:c-api Issues pertaining to the C API. labels Apr 16, 2020
Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks pretty good to me! My worry about this though is that it's making a lot more parts of the API "owned" where it's no longer behind a reference. That means that some places are a little more unergonomic (e.g. getting the nth export as a function) and some may involve more clones (seems like there's lots of various clones here and there).

Overall it does seem pretty nice to avoid trying to duplicate information between the api crate and its internals though. I wonder if we could perhaps try to assuage some of this ergonomic/cloning overhead with some different idioms? We could, for example, add some apis to Instance to do something like "get the nth function" or switch all the examples to "get the export named foo".

crates/api/src/func.rs Outdated Show resolved Hide resolved
crates/api/src/externals.rs Outdated Show resolved Hide resolved
crates/api/src/externals.rs Show resolved Hide resolved
crates/api/src/instance.rs Outdated Show resolved Hide resolved
crates/api/src/instance.rs Show resolved Hide resolved
crates/api/src/module.rs Outdated Show resolved Hide resolved
@github-actions
Copy link

Subscribe to Label Action

cc @fitzgen, @peterhuene

This issue or pull request has been labeled: "fuzzing", "wasmtime:c-api"

Thus the following users have been cc'd because of the following labels:

  • fitzgen: fuzzing
  • peterhuene: wasmtime:c-api

To subscribe or unsubscribe from this label, edit the .github/subscribe-to-label.json configuration file.

Learn more.

crates/c-api/src/types/export.rs Outdated Show resolved Hide resolved
crates/api/src/externals.rs Show resolved Hide resolved
crates/api/src/func.rs Outdated Show resolved Hide resolved
crates/api/src/func.rs Outdated Show resolved Hide resolved
crates/api/src/types.rs Outdated Show resolved Hide resolved
crates/api/src/types.rs Outdated Show resolved Hide resolved
crates/api/src/externals.rs Show resolved Hide resolved
@sunfishcode sunfishcode force-pushed the refactor branch 2 times, most recently from aa3589e to 186573c Compare April 18, 2020 00:57
Instead having instances eagerly compute a Vec of Externs, and bumping
the refcount for each Extern, compute Externs on demand.

This also enables `Instance::get_export` to avoid doing a linear search.

This also means that the closure returned by `get0` and friends now
holds an `InstanceHandle` to dynamically hold the instance live rather
than being scoped to a lifetime.
And compute Extern::ty on demand too.
This helps differentiate it from other Export types in the tree, and
describes what it is.
This significantly simplifies the public API, as it's relatively common
to need the names, and this avoids the need to do a zip with
`Module::exports`.

This also changes `ImportType` and `ExportType` to have public members
instead of private members and accessors, as I find that simplifies the
usage particularly in cases where there are temporary instances.
This doesn't quite remove `Instance`'s `module` member, it gets a step
closer.
Instead, just create a closure containing the instance handle and the
export for them to call.
@github-actions github-actions bot added cranelift Issues related to the Cranelift code generator cranelift:wasm labels Apr 20, 2020
@github-actions
Copy link

Subscribe to Label Action

cc @bnjbvr

This issue or pull request has been labeled: "cranelift", "cranelift:wasm"

Thus the following users have been cc'd because of the following labels:

  • bnjbvr: cranelift

To subscribe or unsubscribe from this label, edit the .github/subscribe-to-label.json configuration file.

Learn more.

This makes them more consistent with ExportType.
Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great to me!

crates/api/src/instance.rs Outdated Show resolved Hide resolved
crates/api/src/types.rs Outdated Show resolved Hide resolved
crates/api/src/types.rs Outdated Show resolved Hide resolved
Instead of 'me, use 'instance and 'module to make it clear what the
lifetime is.
@alexcrichton alexcrichton merged commit 9364eb1 into bytecodealliance:master Apr 20, 2020
CryZe pushed a commit to CryZe/wasmtime that referenced this pull request Apr 25, 2020
* Compute instance exports on demand.

Instead having instances eagerly compute a Vec of Externs, and bumping
the refcount for each Extern, compute Externs on demand.

This also enables `Instance::get_export` to avoid doing a linear search.

This also means that the closure returned by `get0` and friends now
holds an `InstanceHandle` to dynamically hold the instance live rather
than being scoped to a lifetime.

* Compute module imports and exports on demand too.

And compute Extern::ty on demand too.

* Add a utility function for computing an ExternType.

* Add a utility function for looking up a function's signature.

* Add a utility function for computing the ValType of a Global.

* Rename wasmtime_environ::Export to EntityIndex.

This helps differentiate it from other Export types in the tree, and
describes what it is.

* Fix a typo in a comment.

* Simplify module imports and exports.

* Make `Instance::exports` return the export names.

This significantly simplifies the public API, as it's relatively common
to need the names, and this avoids the need to do a zip with
`Module::exports`.

This also changes `ImportType` and `ExportType` to have public members
instead of private members and accessors, as I find that simplifies the
usage particularly in cases where there are temporary instances.

* Remove `Instance::module`.

This doesn't quite remove `Instance`'s `module` member, it gets a step
closer.

* Use a InstanceHandle utility function.

* Don't consume self in the `Func::get*` methods.

Instead, just create a closure containing the instance handle and the
export for them to call.

* Use `ExactSizeIterator` to avoid needing separate `num_*` methods.

* Rename `Extern::func()` etc. to `into_func()` etc.

* Revise examples to avoid using `nth`.

* Add convenience methods to instance for getting specific extern types.

* Use the convenience functions in more tests and examples.

* Avoid cloning strings for `ImportType` and `ExportType`.

* Remove more obviated clone() calls.

* Simplify `Func`'s closure state.

* Make wasmtime::Export's fields private.

This makes them more consistent with ExportType.

* Fix compilation error.

* Make a lifetime parameter explicit, and use better lifetime names.

Instead of 'me, use 'instance and 'module to make it clear what the
lifetime is.

* More lifetime cleanups.
@sunfishcode sunfishcode deleted the refactor branch June 2, 2020 00:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cranelift:wasm cranelift Issues related to the Cranelift code generator fuzzing Issues related to our fuzzing infrastructure wasmtime:api Related to the API of the `wasmtime` crate itself wasmtime:c-api Issues pertaining to the C API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants