Restucture wasm module, return a normal TSLanguage from load_language
This commit is contained in:
parent
3f1a7f9cd4
commit
042e6f9d57
26 changed files with 3068 additions and 317 deletions
|
|
@ -1,7 +1,5 @@
|
|||
use crate::{LanguageError, Parser};
|
||||
|
||||
use super::ffi;
|
||||
use std::{ffi::CString, os::raw::c_char};
|
||||
use crate::{ffi, Language, LanguageError, Parser};
|
||||
use std::{ffi::CString, mem, os::raw::c_char};
|
||||
pub use wasmtime;
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
|
|
@ -16,18 +14,22 @@ pub struct wasm_engine_t {
|
|||
}
|
||||
|
||||
pub struct WasmStore(*mut ffi::TSWasmStore);
|
||||
pub struct WasmLanguage(*const ffi::TSWasmLanguage);
|
||||
|
||||
impl WasmStore {
|
||||
pub fn new(engine: wasmtime::Engine) -> Self {
|
||||
let mut c_engine = wasm_engine_t { engine };
|
||||
let c_engine = &mut c_engine as *mut _;
|
||||
WasmStore(unsafe { ffi::ts_wasm_store_new(c_engine as *mut _) })
|
||||
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
|
||||
}
|
||||
|
||||
pub fn load_language(&mut self, name: &str, bytes: &[u8]) -> WasmLanguage {
|
||||
pub fn load_language(&mut self, name: &str, bytes: &[u8]) -> Language {
|
||||
let name = CString::new(name).unwrap();
|
||||
WasmLanguage(unsafe {
|
||||
Language(unsafe {
|
||||
ffi::ts_wasm_store_load_language(
|
||||
self.0,
|
||||
name.as_ptr(),
|
||||
|
|
@ -38,34 +40,19 @@ impl WasmStore {
|
|||
}
|
||||
}
|
||||
|
||||
impl Parser {
|
||||
pub fn wasm_language(&self) -> Option<WasmLanguage> {
|
||||
let language = unsafe { ffi::ts_parser_wasm_language(self.0.as_ptr()) };
|
||||
if language.is_null() {
|
||||
None
|
||||
} else {
|
||||
Some(WasmLanguage(language))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_wasm_language(&mut self, language: WasmLanguage) -> Result<(), LanguageError> {
|
||||
unsafe {
|
||||
ffi::ts_parser_set_wasm_language(self.0.as_ptr(), language.0);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn set_wasm_store(&mut self, language: WasmStore) -> Result<(), LanguageError> {
|
||||
unsafe {
|
||||
ffi::ts_parser_set_wasm_store(self.0.as_ptr(), language.0);
|
||||
}
|
||||
Ok(())
|
||||
impl Language {
|
||||
pub fn is_wasm(&self) -> bool {
|
||||
unsafe { ffi::ts_language_is_wasm(self.0) }
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for WasmLanguage {
|
||||
fn drop(&mut self) {
|
||||
unsafe { ffi::ts_wasm_language_delete(self.0) };
|
||||
impl Parser {
|
||||
pub fn set_wasm_store(&mut self, store: WasmStore) -> Result<(), LanguageError> {
|
||||
unsafe {
|
||||
ffi::ts_parser_set_wasm_store(self.0.as_ptr(), store.0);
|
||||
}
|
||||
mem::forget(store);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue