2019-11-20 13:34:32 -08:00
|
|
|
use std::ops::Deref;
|
2019-11-30 16:31:51 +01:00
|
|
|
use std::ops::DerefMut;
|
2019-12-19 19:15:52 -05:00
|
|
|
use std::ptr::NonNull;
|
2019-11-20 13:34:32 -08:00
|
|
|
|
|
|
|
use crate::array_buffer::Allocator;
|
2019-12-19 14:13:33 +01:00
|
|
|
use crate::promise::PromiseRejectMessage;
|
2019-11-20 13:34:32 -08:00
|
|
|
use crate::support::Delete;
|
2019-11-15 16:21:34 -08:00
|
|
|
use crate::support::Opaque;
|
2019-11-20 13:34:32 -08:00
|
|
|
use crate::support::UniqueRef;
|
2019-11-15 16:21:34 -08:00
|
|
|
|
2019-12-19 14:13:33 +01:00
|
|
|
type PromiseRejectCallback = extern "C" fn(PromiseRejectMessage);
|
|
|
|
|
2019-11-15 16:21:34 -08:00
|
|
|
extern "C" {
|
2019-12-19 19:15:52 -05:00
|
|
|
fn v8__Isolate__New(params: *mut CreateParams) -> *mut Isolate;
|
|
|
|
fn v8__Isolate__Dispose(this: *mut Isolate);
|
|
|
|
fn v8__Isolate__Enter(this: *mut Isolate);
|
|
|
|
fn v8__Isolate__Exit(this: *mut Isolate);
|
2019-12-18 17:17:38 -05:00
|
|
|
fn v8__Isolate__SetCaptureStackTraceForUncaughtExceptions(
|
2019-12-19 19:15:52 -05:00
|
|
|
this: *mut Isolate,
|
2019-12-18 17:17:38 -05:00
|
|
|
caputre: bool,
|
|
|
|
frame_limit: i32,
|
|
|
|
);
|
2019-12-19 14:13:33 +01:00
|
|
|
fn v8__Isolate__SetPromiseRejectCallback(
|
2019-12-19 19:15:52 -05:00
|
|
|
isolate: *mut Isolate,
|
2019-12-19 14:13:33 +01:00
|
|
|
callback: PromiseRejectCallback,
|
2019-12-19 19:15:52 -05:00
|
|
|
);
|
2019-11-20 13:34:32 -08:00
|
|
|
|
|
|
|
fn v8__Isolate__CreateParams__NEW() -> *mut CreateParams;
|
|
|
|
fn v8__Isolate__CreateParams__DELETE(this: &mut CreateParams);
|
|
|
|
fn v8__Isolate__CreateParams__SET__array_buffer_allocator(
|
|
|
|
this: &mut CreateParams,
|
|
|
|
value: *mut Allocator,
|
|
|
|
);
|
2019-11-15 16:21:34 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
2019-12-19 19:15:52 -05:00
|
|
|
pub struct Isolate(Opaque);
|
2019-11-27 07:14:39 -08:00
|
|
|
|
2019-11-15 16:21:34 -08:00
|
|
|
impl Isolate {
|
2019-12-04 00:57:06 -05:00
|
|
|
/// Creates a new isolate. Does not change the currently entered
|
|
|
|
/// isolate.
|
|
|
|
///
|
|
|
|
/// When an isolate is no longer used its resources should be freed
|
|
|
|
/// by calling V8::dispose(). Using the delete operator is not allowed.
|
|
|
|
///
|
|
|
|
/// V8::initialize() must have run prior to this.
|
2019-12-19 19:15:52 -05:00
|
|
|
#[allow(clippy::new_ret_no_self)]
|
|
|
|
pub fn new(params: UniqueRef<CreateParams>) -> OwnedIsolate {
|
2019-11-15 16:21:34 -08:00
|
|
|
// TODO: support CreateParams.
|
2019-11-30 09:16:25 -08:00
|
|
|
crate::V8::assert_initialized();
|
2019-12-19 19:15:52 -05:00
|
|
|
let isolate_ptr = unsafe { v8__Isolate__New(params.into_raw()) };
|
|
|
|
OwnedIsolate(NonNull::new(isolate_ptr).unwrap())
|
2019-11-15 16:21:34 -08:00
|
|
|
}
|
2019-12-04 00:57:06 -05:00
|
|
|
|
|
|
|
/// Initial configuration parameters for a new Isolate.
|
|
|
|
pub fn create_params() -> UniqueRef<CreateParams> {
|
|
|
|
CreateParams::new()
|
|
|
|
}
|
2019-12-09 02:26:58 +01:00
|
|
|
|
|
|
|
/// Sets this isolate as the entered one for the current thread.
|
|
|
|
/// Saves the previously entered one (if any), so that it can be
|
|
|
|
/// restored when exiting. Re-entering an isolate is allowed.
|
|
|
|
pub fn enter(&mut self) {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { v8__Isolate__Enter(self) }
|
2019-12-09 02:26:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Exits this isolate by restoring the previously entered one in the
|
|
|
|
/// current thread. The isolate may still stay the same, if it was
|
|
|
|
/// entered more than once.
|
|
|
|
///
|
|
|
|
/// Requires: self == Isolate::GetCurrent().
|
|
|
|
pub fn exit(&mut self) {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { v8__Isolate__Exit(self) }
|
2019-12-09 02:26:58 +01:00
|
|
|
}
|
2019-12-18 17:17:38 -05:00
|
|
|
|
|
|
|
/// Tells V8 to capture current stack trace when uncaught exception occurs
|
|
|
|
/// and report it to the message listeners. The option is off by default.
|
|
|
|
pub fn set_capture_stack_trace_for_uncaught_exceptions(
|
|
|
|
&mut self,
|
|
|
|
capture: bool,
|
|
|
|
frame_limit: i32,
|
|
|
|
) {
|
|
|
|
unsafe {
|
|
|
|
v8__Isolate__SetCaptureStackTraceForUncaughtExceptions(
|
2019-12-19 19:15:52 -05:00
|
|
|
self,
|
2019-12-18 17:17:38 -05:00
|
|
|
capture,
|
|
|
|
frame_limit,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
2019-12-19 14:13:33 +01:00
|
|
|
|
|
|
|
/// Set callback to notify about promise reject with no handler, or
|
|
|
|
/// revocation of such a previous notification once the handler is added.
|
|
|
|
pub fn set_promise_reject_callback(
|
|
|
|
&mut self,
|
|
|
|
callback: PromiseRejectCallback,
|
|
|
|
) {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { v8__Isolate__SetPromiseRejectCallback(self, callback) }
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Disposes the isolate. The isolate must not be entered by any
|
|
|
|
/// thread to be disposable.
|
|
|
|
pub unsafe fn dispose(&mut self) {
|
|
|
|
v8__Isolate__Dispose(self)
|
2019-12-19 14:13:33 +01:00
|
|
|
}
|
2019-11-15 16:21:34 -08:00
|
|
|
}
|
|
|
|
|
2019-12-19 19:15:52 -05:00
|
|
|
/// Same as Isolate but gets disposed when it goes out of scope.
|
|
|
|
pub struct OwnedIsolate(NonNull<Isolate>);
|
|
|
|
|
|
|
|
impl Drop for OwnedIsolate {
|
2019-11-15 16:21:34 -08:00
|
|
|
fn drop(&mut self) {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { self.0.as_mut().dispose() }
|
2019-11-15 16:21:34 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-19 19:15:52 -05:00
|
|
|
impl Deref for OwnedIsolate {
|
|
|
|
type Target = Isolate;
|
2019-11-30 16:31:51 +01:00
|
|
|
fn deref(&self) -> &Self::Target {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { self.0.as_ref() }
|
2019-11-15 16:21:34 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-19 19:15:52 -05:00
|
|
|
impl DerefMut for OwnedIsolate {
|
2019-11-30 16:31:51 +01:00
|
|
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
2019-12-19 19:15:52 -05:00
|
|
|
unsafe { self.0.as_mut() }
|
2019-11-30 16:31:51 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-20 13:34:32 -08:00
|
|
|
#[repr(C)]
|
|
|
|
pub struct CreateParams(Opaque);
|
|
|
|
|
|
|
|
impl CreateParams {
|
|
|
|
pub fn new() -> UniqueRef<CreateParams> {
|
|
|
|
unsafe { UniqueRef::from_raw(v8__Isolate__CreateParams__NEW()) }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn set_array_buffer_allocator(&mut self, value: UniqueRef<Allocator>) {
|
|
|
|
unsafe {
|
|
|
|
v8__Isolate__CreateParams__SET__array_buffer_allocator(
|
|
|
|
self,
|
|
|
|
value.into_raw(),
|
|
|
|
)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Delete for CreateParams {
|
|
|
|
fn delete(&'static mut self) {
|
|
|
|
unsafe { v8__Isolate__CreateParams__DELETE(self) }
|
|
|
|
}
|
|
|
|
}
|