Skip to content

Introduce APIs for managing the lifetimes of languages, allow WASM languages to be deleted#2840

Merged
maxbrunsfeld merged 10 commits intomasterfrom
language-reference-count
Jan 30, 2024
Merged

Introduce APIs for managing the lifetimes of languages, allow WASM languages to be deleted#2840
maxbrunsfeld merged 10 commits intomasterfrom
language-reference-count

Conversation

@maxbrunsfeld
Copy link
Copy Markdown
Contributor

@maxbrunsfeld maxbrunsfeld commented Dec 27, 2023

Background

PR #1864 added initial support for loading languages from WASM files. Up until then, languages were always static data, so there were no APIs for managing their ownership or lifetime. So although you could load a language from WASM, there was no way to dynamically unload that language without leaking the memory.

Change

This PR introduces two new C APIs for managing the lifetime of a TSLanguage: ts_language_delete, and ts_language_copy. For Tree-sitter's normal, statically-allocated language objects, these APIs are noops. But for languages loaded from WASM files, these APIs perform reference counting operations. When a language's reference count goes to zero, all of its memory is released.

This allows you to dynamically reload WASM languages at runtime. This could be used, for example, to create a Tree-sitter grammar playground that dynamically re-generates its parser, recompiles it using Emscripten, and re-loads it into the current process 🙀 !.

Rust API

In Rust, Language is no longer Copy, and now has a Drop. Some functions (like Parser::set_language and Query::new) that take languages now take them by reference, so that the caller doesn't need to call .clone (since the C APIs bump the reference count internally).

maxbrunsfeld added a commit to zed-industries/zed that referenced this pull request Jan 3, 2024
This PR adds undocumented functionality for loading custom language
plugins at runtime. I don't intend to expose the functionality to end
users yet, but this will allow the team to test the capability
internally.

### Implementation

There isn't much new code in Zed. Most of the work here is within
Tree-sitter, in PRs tree-sitter/tree-sitter#1864
and tree-sitter/tree-sitter#2840, which allow
Tree-sitter to load languages from WASM blobs. I've tested the
functionality in Tree-sitter's test suite and via its CLI, but having it
wired into Zed allows us to test the functionality more fully.

### Details

Now, on startup, Zed will look for subdirectories inside of
`~/Application Support/plugins`. These subdirectories are expected to
look similar to the per-language subdirectories in
[`crates/zed2/src/languages`](https://github.com/zed-industries/zed/tree/main/crates/zed2/src/languages),
except that they also contain a `.wasm` file for the parser itself.

I'll add more details here as I go.
Co-authored-by: Antonio <antonio@zed.dev>
Co-authored-by: Mikayla <mikayla@zed.dev>
Co-authored-by: Joseph <joseph@zed.dev>
@maxbrunsfeld maxbrunsfeld force-pushed the language-reference-count branch from e05e803 to 3c66dd2 Compare January 25, 2024 19:07
@amaanq
Copy link
Copy Markdown
Member

amaanq commented Jan 25, 2024

Hey @maxbrunsfeld, PHP had a rewrite splitting it into two grammars - you can rebase on top of master for the fix I added in #2878 that'll resolve the CI errors

@maxbrunsfeld
Copy link
Copy Markdown
Contributor Author

Nice, thanks @amaanq

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants