use crate::function::FunctionCallbackArguments;
use crate::function::FunctionCallbackInfo;
use crate::scope::CallbackScope;
use crate::scope::HandleScope;
use crate::support::char;
use crate::support::Opaque;
use crate::support::UnitType;
use crate::ArrayBuffer;
use crate::Isolate;
use crate::Local;
use crate::Value;
use crate::WasmMemoryObject;
use crate::WasmModuleObject;
use std::ptr::null;
use std::ptr::null_mut;
#[repr(C)]
struct WasmStreamingSharedPtr([*mut u8; 2]);
#[repr(C)]
pub struct WasmStreaming(WasmStreamingSharedPtr);
impl WasmStreaming {
#[inline(always)]
pub fn on_bytes_received(&mut self, data: &[u8]) {
unsafe {
v8__WasmStreaming__OnBytesReceived(&mut self.0, data.as_ptr(), data.len())
}
}
#[inline(always)]
pub fn finish(mut self) {
unsafe { v8__WasmStreaming__Finish(&mut self.0) }
}
#[inline(always)]
pub fn abort(mut self, exception: Option<Local<Value>>) {
let exception = exception.map(|v| &*v as *const Value).unwrap_or(null());
unsafe { v8__WasmStreaming__Abort(&mut self.0, exception) }
}
#[inline(always)]
pub fn set_url(&mut self, url: &str) {
let null_terminated_url = format!("{}\0", url);
unsafe {
v8__WasmStreaming__SetUrl(
&mut self.0,
null_terminated_url.as_ptr() as *const char,
url.len(),
)
}
}
}
impl Drop for WasmStreaming {
fn drop(&mut self) {
unsafe { v8__WasmStreaming__shared_ptr_DESTRUCT(&mut self.0) }
}
}
impl WasmModuleObject {
#[inline(always)]
pub fn from_compiled_module<'s>(
scope: &mut HandleScope<'s>,
compiled_module: &CompiledWasmModule,
) -> Option<Local<'s, WasmModuleObject>> {
unsafe {
scope.cast_local(|sd| {
v8__WasmModuleObject__FromCompiledModule(
sd.get_isolate_ptr(),
compiled_module.0,
)
})
}
}
#[inline(always)]
pub fn get_compiled_module(&self) -> CompiledWasmModule {
let ptr = unsafe { v8__WasmModuleObject__GetCompiledModule(self) };
CompiledWasmModule(ptr)
}
#[inline(always)]
pub fn compile<'s>(
scope: &mut HandleScope<'s>,
wire_bytes: &[u8],
) -> Option<Local<'s, WasmModuleObject>> {
unsafe {
scope.cast_local(|sd| {
v8__WasmModuleObject__Compile(
sd.get_isolate_ptr(),
wire_bytes.as_ptr(),
wire_bytes.len(),
)
})
}
}
}
#[repr(C)]
struct InternalCompiledWasmModule(Opaque);
pub struct CompiledWasmModule(*mut InternalCompiledWasmModule);
impl CompiledWasmModule {
#[inline(always)]
pub fn get_wire_bytes_ref(&self) -> &[u8] {
let mut len = 0isize;
unsafe {
let ptr = v8__CompiledWasmModule__GetWireBytesRef(self.0, &mut len);
std::slice::from_raw_parts(ptr, len.try_into().unwrap())
}
}
#[inline(always)]
pub fn source_url(&self) -> &str {
let mut len = 0;
unsafe {
let ptr = v8__CompiledWasmModule__SourceUrl(self.0, &mut len);
let bytes = std::slice::from_raw_parts(ptr as *const u8, len);
std::str::from_utf8_unchecked(bytes)
}
}
}
unsafe impl Send for CompiledWasmModule {}
unsafe impl Sync for CompiledWasmModule {}
impl Drop for CompiledWasmModule {
fn drop(&mut self) {
unsafe { v8__CompiledWasmModule__DELETE(self.0) }
}
}
impl WasmMemoryObject {
#[inline(always)]
pub fn buffer(&self) -> Local<ArrayBuffer> {
unsafe { Local::from_raw(v8__WasmMemoryObject__Buffer(self)) }.unwrap()
}
}
pub(crate) fn trampoline<F>() -> extern "C" fn(*const FunctionCallbackInfo)
where
F: UnitType + Fn(&mut HandleScope, Local<Value>, WasmStreaming),
{
extern "C" fn c_fn<F>(info: *const FunctionCallbackInfo)
where
F: UnitType + Fn(&mut HandleScope, Local<Value>, WasmStreaming),
{
let info = unsafe { &*info };
let scope = &mut unsafe { CallbackScope::new(info) };
let args = FunctionCallbackArguments::from_function_callback_info(info);
let data = args.data();
let zero = null_mut();
let mut that = WasmStreamingSharedPtr([zero, zero]);
unsafe {
v8__WasmStreaming__Unpack(scope.get_isolate_ptr(), &*data, &mut that)
};
let source = args.get(0);
(F::get())(scope, source, WasmStreaming(that));
}
c_fn::<F>
}
extern "C" {
fn v8__WasmStreaming__Unpack(
isolate: *mut Isolate,
value: *const Value,
that: *mut WasmStreamingSharedPtr, );
fn v8__WasmStreaming__shared_ptr_DESTRUCT(this: *mut WasmStreamingSharedPtr);
fn v8__WasmStreaming__OnBytesReceived(
this: *mut WasmStreamingSharedPtr,
data: *const u8,
len: usize,
);
fn v8__WasmStreaming__Finish(this: *mut WasmStreamingSharedPtr);
fn v8__WasmStreaming__Abort(
this: *mut WasmStreamingSharedPtr,
exception: *const Value,
);
fn v8__WasmStreaming__SetUrl(
this: *mut WasmStreamingSharedPtr,
url: *const char,
len: usize,
);
fn v8__WasmModuleObject__FromCompiledModule(
isolate: *mut Isolate,
compiled_module: *const InternalCompiledWasmModule,
) -> *const WasmModuleObject;
fn v8__WasmModuleObject__GetCompiledModule(
this: *const WasmModuleObject,
) -> *mut InternalCompiledWasmModule;
fn v8__WasmModuleObject__Compile(
isolate: *mut Isolate,
wire_bytes_data: *const u8,
length: usize,
) -> *mut WasmModuleObject;
fn v8__CompiledWasmModule__GetWireBytesRef(
this: *mut InternalCompiledWasmModule,
length: *mut isize,
) -> *const u8;
fn v8__CompiledWasmModule__SourceUrl(
this: *mut InternalCompiledWasmModule,
length: *mut usize,
) -> *const char;
fn v8__CompiledWasmModule__DELETE(this: *mut InternalCompiledWasmModule);
fn v8__WasmMemoryObject__Buffer(
this: *const WasmMemoryObject,
) -> *mut ArrayBuffer;
}