From afadf1a531f6d2e1e17b6202f1217cb0061e0dd3 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 26 Dec 2015 01:14:04 +0100 Subject: [PATCH 1/4] Remove the drop flag on Rooted --- src/jsapi_linux_32.rs | 1 + src/jsapi_linux_64.rs | 1 + src/jsapi_macos_64.rs | 1 + src/jsapi_windows_gcc_64.rs | 1 + src/rust.rs | 4 ++++ 5 files changed, 8 insertions(+) diff --git a/src/jsapi_linux_32.rs b/src/jsapi_linux_32.rs index 399feb32e..3d2066924 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>, diff --git a/src/jsapi_linux_64.rs b/src/jsapi_linux_64.rs index 19b3e87c5..112f5f51c 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>, diff --git a/src/jsapi_macos_64.rs b/src/jsapi_macos_64.rs index 7677230ca..e59f8a34c 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>, diff --git a/src/jsapi_windows_gcc_64.rs b/src/jsapi_windows_gcc_64.rs index 4eb06c7d6..f3658a8b7 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>, diff --git a/src/rust.rs b/src/rust.rs index 89a4fda6f..1d5a37f23 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(); } } From 3a259bc6dc73ccd41f843afcc4e211632293e385 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 26 Dec 2015 01:28:01 +0100 Subject: [PATCH 2/4] Remove the drop flag on CustomAutoRooter --- src/jsapi_linux_32.rs | 1 + src/jsapi_linux_64.rs | 1 + src/jsapi_macos_64.rs | 1 + src/jsapi_windows_gcc_64.rs | 1 + src/rust.rs | 4 ++++ 5 files changed, 8 insertions(+) diff --git a/src/jsapi_linux_32.rs b/src/jsapi_linux_32.rs index 3d2066924..99202f2d5 100644 --- a/src/jsapi_linux_32.rs +++ b/src/jsapi_linux_32.rs @@ -1292,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, diff --git a/src/jsapi_linux_64.rs b/src/jsapi_linux_64.rs index 112f5f51c..ba9fb4113 100644 --- a/src/jsapi_linux_64.rs +++ b/src/jsapi_linux_64.rs @@ -1292,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, diff --git a/src/jsapi_macos_64.rs b/src/jsapi_macos_64.rs index e59f8a34c..ee8f10784 100644 --- a/src/jsapi_macos_64.rs +++ b/src/jsapi_macos_64.rs @@ -1292,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, diff --git a/src/jsapi_windows_gcc_64.rs b/src/jsapi_windows_gcc_64.rs index f3658a8b7..3cf9ebc0b 100644 --- a/src/jsapi_windows_gcc_64.rs +++ b/src/jsapi_windows_gcc_64.rs @@ -1292,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, diff --git a/src/rust.rs b/src/rust.rs index 1d5a37f23..cd53b6a4b 100644 --- a/src/rust.rs +++ b/src/rust.rs @@ -370,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(); } } From e611187b86b94d56a11d8618c91bdc000a775540 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 26 Dec 2015 01:30:45 +0100 Subject: [PATCH 3/4] Remove the drop flag on JSAutoRequest --- src/jsapi_linux_32.rs | 1 + src/jsapi_linux_64.rs | 1 + src/jsapi_macos_64.rs | 1 + src/jsapi_windows_gcc_64.rs | 1 + src/rust.rs | 4 ++++ 5 files changed, 8 insertions(+) diff --git a/src/jsapi_linux_32.rs b/src/jsapi_linux_32.rs index 99202f2d5..571f75ade 100644 --- a/src/jsapi_linux_32.rs +++ b/src/jsapi_linux_32.rs @@ -1452,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } diff --git a/src/jsapi_linux_64.rs b/src/jsapi_linux_64.rs index ba9fb4113..f516bce0c 100644 --- a/src/jsapi_linux_64.rs +++ b/src/jsapi_linux_64.rs @@ -1452,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } diff --git a/src/jsapi_macos_64.rs b/src/jsapi_macos_64.rs index ee8f10784..4646dfb5b 100644 --- a/src/jsapi_macos_64.rs +++ b/src/jsapi_macos_64.rs @@ -1452,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } diff --git a/src/jsapi_windows_gcc_64.rs b/src/jsapi_windows_gcc_64.rs index 3cf9ebc0b..161b08899 100644 --- a/src/jsapi_windows_gcc_64.rs +++ b/src/jsapi_windows_gcc_64.rs @@ -1452,6 +1452,7 @@ pub type JS_ICUFreeFn = ::std::option::Option; #[repr(C)] +#[unsafe_no_drop_flag] pub struct JSAutoRequest { pub mContext: *mut JSContext, } diff --git a/src/rust.rs b/src/rust.rs index cd53b6a4b..41229e685 100644 --- a/src/rust.rs +++ b/src/rust.rs @@ -561,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(); } } From 9e58e3dc1bd0221d450a17bf31530f0a4c9e6414 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 26 Dec 2015 01:33:26 +0100 Subject: [PATCH 4/4] Remove the drop flag on JSAutoCompartment --- src/jsapi_linux_32.rs | 1 + src/jsapi_linux_64.rs | 1 + src/jsapi_macos_64.rs | 1 + src/jsapi_windows_gcc_64.rs | 1 + src/rust.rs | 4 ++++ 5 files changed, 8 insertions(+) diff --git a/src/jsapi_linux_32.rs b/src/jsapi_linux_32.rs index 571f75ade..74d5a798d 100644 --- a/src/jsapi_linux_32.rs +++ b/src/jsapi_linux_32.rs @@ -1544,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 f516bce0c..e7624f641 100644 --- a/src/jsapi_linux_64.rs +++ b/src/jsapi_linux_64.rs @@ -1544,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 4646dfb5b..67cf56808 100644 --- a/src/jsapi_macos_64.rs +++ b/src/jsapi_macos_64.rs @@ -1544,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 161b08899..74a97fcbe 100644 --- a/src/jsapi_windows_gcc_64.rs +++ b/src/jsapi_windows_gcc_64.rs @@ -1544,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 41229e685..fa37b9bb8 100644 --- a/src/rust.rs +++ b/src/rust.rs @@ -580,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(); } }