clone wasm store engine (#3542)
This resolves https://github.com/tree-sitter/tree-sitter/issues/3454. This brings the usage of wasmtime::Engine in line with how wasmtime intends it to be used. All wasmtime functions that receive an Engine always receive an `&Engine`, never an owned `Engine`. They are always responsible for cloning the reference if they need it. This brings the usage of wasmtime::Engine in line with how TSParser treats TSLanguages: when setting a language to the parser, the parser is responsible for cloning the reference to the TSLanguage. It is counterintuitive for TSParser to have different behavior when receiving wasmtime_engine_t. C API users also expect this behavior, see "Memory Management" [here](https://docs.wasmtime.dev/c-api/wasm_8h.html). Talking about the C API: without this change, failing to clone the `wasmtime_engine_t` (which, again, is never something API users need to do in wasmtime) and then reusing the engine in multiple TSLanguages results in a use after free. With this change, failing to call `wasm_engine_delete` on your owned Engine results in a memory leak. Memory leaks are safer than use-after-free.
This commit is contained in:
parent
5364ac4ea8
commit
b5e4ef6d9a
5 changed files with 20 additions and 21 deletions
|
|
@ -732,7 +732,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) {
|
|||
assert(!error);
|
||||
|
||||
*self = (TSWasmStore) {
|
||||
.engine = engine,
|
||||
.engine = wasmtime_engine_clone(engine),
|
||||
.store = store,
|
||||
.memory = memory,
|
||||
.function_table = function_table,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue