diff --git a/src/jsapi_linux_32.rs b/src/jsapi_linux_32.rs index 399feb32e..74d5a798d 100644 --- a/src/jsapi_linux_32.rs +++ b/src/jsapi_linux_32.rs @@ -639,6 +639,7 @@ pub struct InternalHandle { pub _phantom0: PhantomData, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct Rooted { pub _base: RootedBase, pub stack: *mut *mut Rooted<*mut ::libc::c_void>, @@ -1291,6 +1292,7 @@ pub struct AutoFunctionVector; #[derive(Copy, Clone)] pub struct AutoScriptVector; #[repr(C)] +#[unsafe_no_drop_flag] pub struct CustomAutoRooter { pub _vftable: *const _vftable_CustomAutoRooter, pub _base: AutoGCRooter, @@ -1450,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } @@ -1541,6 +1544,7 @@ pub struct AutoSaveContextOptions { pub oldOptions_: ContextOptions, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoCompartment { pub cx_: *mut JSContext, pub oldCompartment_: *mut JSCompartment, diff --git a/src/jsapi_linux_64.rs b/src/jsapi_linux_64.rs index 19b3e87c5..e7624f641 100644 --- a/src/jsapi_linux_64.rs +++ b/src/jsapi_linux_64.rs @@ -639,6 +639,7 @@ pub struct InternalHandle { pub _phantom0: PhantomData, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct Rooted { pub _base: RootedBase, pub stack: *mut *mut Rooted<*mut ::libc::c_void>, @@ -1291,6 +1292,7 @@ pub struct AutoFunctionVector; #[derive(Copy, Clone)] pub struct AutoScriptVector; #[repr(C)] +#[unsafe_no_drop_flag] pub struct CustomAutoRooter { pub _vftable: *const _vftable_CustomAutoRooter, pub _base: AutoGCRooter, @@ -1450,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } @@ -1541,6 +1544,7 @@ pub struct AutoSaveContextOptions { pub oldOptions_: ContextOptions, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoCompartment { pub cx_: *mut JSContext, pub oldCompartment_: *mut JSCompartment, diff --git a/src/jsapi_macos_64.rs b/src/jsapi_macos_64.rs index 7677230ca..67cf56808 100644 --- a/src/jsapi_macos_64.rs +++ b/src/jsapi_macos_64.rs @@ -639,6 +639,7 @@ pub struct InternalHandle { pub _phantom0: PhantomData, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct Rooted { pub _base: RootedBase, pub stack: *mut *mut Rooted<*mut ::libc::c_void>, @@ -1291,6 +1292,7 @@ pub struct AutoFunctionVector; #[derive(Copy, Clone)] pub struct AutoScriptVector; #[repr(C)] +#[unsafe_no_drop_flag] pub struct CustomAutoRooter { pub _vftable: *const _vftable_CustomAutoRooter, pub _base: AutoGCRooter, @@ -1450,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } @@ -1541,6 +1544,7 @@ pub struct AutoSaveContextOptions { pub oldOptions_: ContextOptions, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoCompartment { pub cx_: *mut JSContext, pub oldCompartment_: *mut JSCompartment, diff --git a/src/jsapi_windows_gcc_64.rs b/src/jsapi_windows_gcc_64.rs index 4eb06c7d6..74a97fcbe 100644 --- a/src/jsapi_windows_gcc_64.rs +++ b/src/jsapi_windows_gcc_64.rs @@ -639,6 +639,7 @@ pub struct InternalHandle { pub _phantom0: PhantomData, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct Rooted { pub _base: RootedBase, pub stack: *mut *mut Rooted<*mut ::libc::c_void>, @@ -1291,6 +1292,7 @@ pub struct AutoFunctionVector; #[derive(Copy, Clone)] pub struct AutoScriptVector; #[repr(C)] +#[unsafe_no_drop_flag] pub struct CustomAutoRooter { pub _vftable: *const _vftable_CustomAutoRooter, pub _base: AutoGCRooter, @@ -1450,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } @@ -1541,6 +1544,7 @@ pub struct AutoSaveContextOptions { pub oldOptions_: ContextOptions, } #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoCompartment { pub cx_: *mut JSContext, pub oldCompartment_: *mut JSCompartment, diff --git a/src/rust.rs b/src/rust.rs index 89a4fda6f..fa37b9bb8 100644 --- a/src/rust.rs +++ b/src/rust.rs @@ -330,10 +330,14 @@ impl MutableHandle { impl Drop for Rooted { fn drop(&mut self) { + if self.stack.is_null() { + return; + } unsafe { assert!(*self.stack == mem::transmute(&*self)); *self.stack = self.prev; } + self.stack = ptr::null_mut(); } } @@ -366,10 +370,14 @@ impl CustomAutoRooter { impl Drop for CustomAutoRooter { fn drop(&mut self) { + if self._base.stackTop.is_null() { + return; + } unsafe { assert!(*self._base.stackTop == mem::transmute(&self._base)); *self._base.stackTop = self._base.down; } + self._base.stackTop = ptr::null_mut(); } } @@ -553,7 +561,11 @@ impl JSAutoRequest { impl Drop for JSAutoRequest { fn drop(&mut self) { + if self.mContext.is_null() { + return; + } unsafe { JS_EndRequest(self.mContext); } + self.mContext = ptr::null_mut(); } } @@ -568,7 +580,11 @@ impl JSAutoCompartment { impl Drop for JSAutoCompartment { fn drop(&mut self) { + if self.cx_.is_null() { + return; + } unsafe { JS_LeaveCompartment(self.cx_, self.oldCompartment_); } + self.cx_ = ptr::null_mut(); } }