diff --git a/cli/src/tests/wasm_language_test.rs b/cli/src/tests/wasm_language_test.rs index cf36dc57..5d2e20f5 100644 --- a/cli/src/tests/wasm_language_test.rs +++ b/cli/src/tests/wasm_language_test.rs @@ -196,6 +196,27 @@ fn test_load_and_reload_wasm_language() { }); } +#[test] +fn test_reset_wasm_store() { + allocations::record(|| { + let mut language_store = WasmStore::new(ENGINE.clone()).unwrap(); + let wasm = fs::read(WASM_DIR.join("tree-sitter-rust.wasm")).unwrap(); + let language = language_store.load_language("rust", &wasm).unwrap(); + + let mut parser = Parser::new(); + let parser_store = WasmStore::new(ENGINE.clone()).unwrap(); + parser.set_wasm_store(parser_store).unwrap(); + parser.set_language(&language).unwrap(); + let tree = parser.parse("fn main() {}", None).unwrap(); + assert_eq!(tree.root_node().to_sexp(), "(source_file (function_item name: (identifier) parameters: (parameters) body: (block)))"); + + let parser_store = WasmStore::new(ENGINE.clone()).unwrap(); + parser.set_wasm_store(parser_store).unwrap(); + let tree = parser.parse("fn main() {}", None).unwrap(); + assert_eq!(tree.root_node().to_sexp(), "(source_file (function_item name: (identifier) parameters: (parameters) body: (block)))"); + }); +} + #[test] fn test_load_wasm_errors() { allocations::record(|| { diff --git a/lib/src/parser.c b/lib/src/parser.c index 1c372c54..2927d820 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -2144,11 +2144,22 @@ TSTree *ts_parser_parse_string_encoding( } void ts_parser_set_wasm_store(TSParser *self, TSWasmStore *store) { + if (self->language && ts_language_is_wasm(self->language)) { + // Copy the assigned language into the new store. + const TSLanguage *copy = ts_language_copy(self->language); + ts_parser_set_language(self, copy); + ts_language_delete(copy); + } + ts_wasm_store_delete(self->wasm_store); self->wasm_store = store; } TSWasmStore *ts_parser_take_wasm_store(TSParser *self) { + if (self->language && ts_language_is_wasm(self->language)) { + ts_parser_set_language(self, NULL); + } + TSWasmStore *result = self->wasm_store; self->wasm_store = NULL; return result;