2022-09-06 22:41:05 -07:00
|
|
|
use crate::{ffi, Language, LanguageError, Parser};
|
|
|
|
|
use std::{ffi::CString, mem, os::raw::c_char};
|
2022-01-03 10:57:01 -08:00
|
|
|
pub use wasmtime;
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "wasm")]
|
|
|
|
|
pub fn test() {
|
|
|
|
|
wasmtime_c_api::wasm_engine_new();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
|
pub struct wasm_engine_t {
|
|
|
|
|
pub(crate) engine: wasmtime::Engine,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct WasmStore(*mut ffi::TSWasmStore);
|
|
|
|
|
|
|
|
|
|
impl WasmStore {
|
|
|
|
|
pub fn new(engine: wasmtime::Engine) -> Self {
|
2022-09-06 22:41:05 -07:00
|
|
|
let mut c_engine = Box::new(wasm_engine_t {
|
|
|
|
|
engine: engine.clone(),
|
|
|
|
|
});
|
|
|
|
|
let result = WasmStore(unsafe {
|
|
|
|
|
ffi::ts_wasm_store_new(c_engine.as_mut() as *mut wasm_engine_t as *mut _)
|
|
|
|
|
});
|
|
|
|
|
mem::forget(c_engine);
|
|
|
|
|
result
|
2022-01-03 10:57:01 -08:00
|
|
|
}
|
|
|
|
|
|
2022-09-06 22:41:05 -07:00
|
|
|
pub fn load_language(&mut self, name: &str, bytes: &[u8]) -> Language {
|
2022-01-03 10:57:01 -08:00
|
|
|
let name = CString::new(name).unwrap();
|
2022-09-06 22:41:05 -07:00
|
|
|
Language(unsafe {
|
2022-01-03 10:57:01 -08:00
|
|
|
ffi::ts_wasm_store_load_language(
|
|
|
|
|
self.0,
|
|
|
|
|
name.as_ptr(),
|
|
|
|
|
bytes.as_ptr() as *const c_char,
|
|
|
|
|
bytes.len() as u32,
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-06 22:41:05 -07:00
|
|
|
impl Language {
|
|
|
|
|
pub fn is_wasm(&self) -> bool {
|
|
|
|
|
unsafe { ffi::ts_language_is_wasm(self.0) }
|
2022-01-03 10:57:01 -08:00
|
|
|
}
|
2022-09-06 22:41:05 -07:00
|
|
|
}
|
2022-01-03 10:57:01 -08:00
|
|
|
|
2022-09-06 22:41:05 -07:00
|
|
|
impl Parser {
|
|
|
|
|
pub fn set_wasm_store(&mut self, store: WasmStore) -> Result<(), LanguageError> {
|
2022-01-03 10:57:01 -08:00
|
|
|
unsafe {
|
2022-09-06 22:41:05 -07:00
|
|
|
ffi::ts_parser_set_wasm_store(self.0.as_ptr(), store.0);
|
2022-01-03 10:57:01 -08:00
|
|
|
}
|
2022-09-06 22:41:05 -07:00
|
|
|
mem::forget(store);
|
2022-01-03 10:57:01 -08:00
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Drop for WasmStore {
|
|
|
|
|
fn drop(&mut self) {
|
|
|
|
|
unsafe { ffi::ts_wasm_store_delete(self.0) };
|
|
|
|
|
}
|
|
|
|
|
}
|