Skip to content

Commit b597166

Browse files
committed
Add a test that loads multiple languages in a wasm store
1 parent 359317f commit b597166

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

cli/src/tests/helpers/dirs.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ lazy_static! {
88
fs::create_dir_all(&result).unwrap();
99
result
1010
};
11+
pub static ref WASM_DIR: PathBuf = ROOT_DIR.join("target").join("release");
1112
pub static ref SCRATCH_DIR: PathBuf = {
1213
// https://doc.rust-lang.org/reference/conditional-compilation.html
1314
let vendor = if cfg!(target_vendor = "apple") {

cli/src/tests/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ mod test_highlight_test;
1414
mod test_tags_test;
1515
mod text_provider_test;
1616
mod tree_test;
17+
18+
#[cfg(feature = "wasm")]
19+
mod wasm_language_test;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use crate::tests::helpers::fixtures::WASM_DIR;
2+
use lazy_static::lazy_static;
3+
use std::fs;
4+
use tree_sitter::{wasmtime::Engine, Parser, WasmStore};
5+
6+
lazy_static! {
7+
static ref ENGINE: Engine = Engine::default();
8+
}
9+
10+
#[test]
11+
fn test_wasm_store() {
12+
let mut store = WasmStore::new(ENGINE.clone());
13+
let mut parser = Parser::new();
14+
15+
let wasm_cpp = fs::read(&WASM_DIR.join(format!("tree-sitter-cpp.wasm"))).unwrap();
16+
let wasm_rs = fs::read(&WASM_DIR.join(format!("tree-sitter-rust.wasm"))).unwrap();
17+
let wasm_rb = fs::read(&WASM_DIR.join(format!("tree-sitter-ruby.wasm"))).unwrap();
18+
19+
let language_rust = store.load_language("rust", &wasm_rs);
20+
let language_cpp = store.load_language("cpp", &wasm_cpp);
21+
let language_ruby = store.load_language("ruby", &wasm_rb);
22+
parser.set_wasm_store(store).unwrap();
23+
24+
for _ in 0..2 {
25+
parser.set_language(language_cpp).unwrap();
26+
let tree = parser.parse("A<B> c = d();", None).unwrap();
27+
assert_eq!(
28+
tree.root_node().to_sexp(),
29+
"(translation_unit (declaration type: (template_type name: (type_identifier) arguments: (template_argument_list (type_descriptor type: (type_identifier)))) declarator: (init_declarator declarator: (identifier) value: (call_expression function: (identifier) arguments: (argument_list)))))"
30+
);
31+
32+
parser.set_language(language_rust).unwrap();
33+
let tree = parser.parse("const A: B = c();", None).unwrap();
34+
assert_eq!(
35+
tree.root_node().to_sexp(),
36+
"(source_file (const_item name: (identifier) type: (type_identifier) value: (call_expression function: (identifier) arguments: (arguments))))"
37+
);
38+
39+
parser.set_language(language_ruby).unwrap();
40+
let tree = parser.parse("class A; end", None).unwrap();
41+
assert_eq!(
42+
tree.root_node().to_sexp(),
43+
"(program (class name: (constant)))"
44+
);
45+
}
46+
}

lib/src/wasm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,12 @@ static bool ts_wasm_store__instantiate(
704704
wasmtime_error_t *error = NULL;
705705
wasm_trap_t *trap = NULL;
706706

707+
// Grow the function table to make room for the new functions.
708+
wasmtime_val_t initializer = {.kind = WASMTIME_FUNCREF};
709+
uint32_t prev_size;
710+
error = wasmtime_table_grow(context, &self->function_table, dylink_info->table_size, &initializer, &prev_size);
711+
assert(!error);
712+
707713
// Construct the language function name as string.
708714
unsigned prefix_len = strlen("tree_sitter_");
709715
size_t name_len = strlen(language_name);

0 commit comments

Comments
 (0)