aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <servo-ops@mozilla.com>2020-06-05 09:56:41 -0400
committerGitHub <noreply@github.com>2020-06-05 09:56:41 -0400
commit00b57b4fd95ad53859c52f9be19d94ae16bed9c2 (patch)
tree5a8ef14a431e652ebe90c3da57a0edef0e30bab3 /components/script
parent7495b929924a32d192a7151a25b90464b9224758 (diff)
parentdbdc44215b2b2acea193dba87a611ed045d9b9e2 (diff)
downloadservo-00b57b4fd95ad53859c52f9be19d94ae16bed9c2.tar.gz
servo-00b57b4fd95ad53859c52f9be19d94ae16bed9c2.zip
Auto merge of #26792 - servo:static-mut, r=nox
Replace `static mut` with `const`, `static`+`AtomicPtr`, or `static`+`UnsafeCell` Fixes https://github.com/servo/servo/issues/26550
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py28
-rw-r--r--components/script/dom/eventtarget.rs12
2 files changed, 21 insertions, 19 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 0b1187a07fb..b0361d6ca47 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2750,7 +2750,9 @@ class CGWrapMethod(CGAbstractMethod):
unforgeable = CopyUnforgeablePropertiesToInstance(self.descriptor)
if self.descriptor.proxy:
create = """
-let handler = RegisterBindings::PROXY_HANDLERS[PrototypeList::Proxies::%(concreteType)s as usize];
+let handler: *const libc::c_void =
+ RegisterBindings::proxy_handlers::%(concreteType)s
+ .load(std::sync::atomic::Ordering::Acquire);
rooted!(in(*cx) let obj = NewProxyObject(
*cx,
handler,
@@ -6744,7 +6746,10 @@ class CGRegisterProxyHandlersMethod(CGAbstractMethod):
def definition_body(self):
return CGList([
- CGGeneric("PROXY_HANDLERS[Proxies::%s as usize] = Bindings::%s::DefineProxyHandler();"
+ CGGeneric("proxy_handlers::%s.store(\n"
+ " Bindings::%s::DefineProxyHandler() as *mut _,\n"
+ " std::sync::atomic::Ordering::Release,\n"
+ ");"
% (desc.name, '::'.join([desc.name + 'Binding'] * 2)))
for desc in self.descriptors
], "\n")
@@ -6753,10 +6758,18 @@ class CGRegisterProxyHandlersMethod(CGAbstractMethod):
class CGRegisterProxyHandlers(CGThing):
def __init__(self, config):
descriptors = config.getDescriptors(proxy=True)
- length = len(descriptors)
self.root = CGList([
- CGGeneric("pub static mut PROXY_HANDLERS: [*const libc::c_void; %d] = [0 as *const libc::c_void; %d];"
- % (length, length)),
+ CGGeneric(
+ "#[allow(non_upper_case_globals)]\n" +
+ "pub mod proxy_handlers {\n" +
+ "".join(
+ " pub static %s: std::sync::atomic::AtomicPtr<libc::c_void> =\n"
+ " std::sync::atomic::AtomicPtr::new(std::ptr::null_mut());\n"
+ % desc.name
+ for desc in descriptors
+ ) +
+ "}\n"
+ ),
CGRegisterProxyHandlersMethod(descriptors),
], "\n")
@@ -7606,8 +7619,6 @@ class GlobalGenRoots():
for d in config.getDescriptors(hasInterfaceObject=True)
if d.shouldHaveGetConstructorObjectMethod()])
- proxies = [d.name for d in config.getDescriptors(proxy=True)]
-
return CGList([
CGGeneric(AUTOGENERATED_WARNING_COMMENT),
CGGeneric("pub const PROTO_OR_IFACE_LENGTH: usize = %d;\n" % (len(protos) + len(constructors))),
@@ -7624,7 +7635,6 @@ class GlobalGenRoots():
" debug_assert!(proto_id < ID::Last as u16);\n"
" INTERFACES[proto_id as usize]\n"
"}\n\n"),
- CGNonNamespacedEnum('Proxies', proxies, 0, deriving="PartialEq, Copy, Clone"),
])
@staticmethod
@@ -7636,8 +7646,6 @@ class GlobalGenRoots():
return CGImports(code, descriptors=[], callbacks=[], dictionaries=[], enums=[], typedefs=[], imports=[
'crate::dom::bindings::codegen::Bindings',
- 'crate::dom::bindings::codegen::PrototypeList::Proxies',
- 'libc',
], config=config, ignored_warnings=[])
@staticmethod
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index b39bf977c5b..7018300b107 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -515,8 +515,8 @@ impl EventTarget {
let name = CString::new(format!("on{}", &**ty)).unwrap();
// Step 3.9, subsection ParameterList
- static mut ARG_NAMES: [*const c_char; 1] = [b"event\0" as *const u8 as *const c_char];
- static mut ERROR_ARG_NAMES: [*const c_char; 5] = [
+ const ARG_NAMES: &[*const c_char] = &[b"event\0" as *const u8 as *const c_char];
+ const ERROR_ARG_NAMES: &[*const c_char] = &[
b"event\0" as *const u8 as *const c_char,
b"source\0" as *const u8 as *const c_char,
b"lineno\0" as *const u8 as *const c_char,
@@ -524,13 +524,7 @@ impl EventTarget {
b"error\0" as *const u8 as *const c_char,
];
let is_error = ty == &atom!("error") && self.is::<Window>();
- let args = unsafe {
- if is_error {
- &ERROR_ARG_NAMES[..]
- } else {
- &ARG_NAMES[..]
- }
- };
+ let args = if is_error { ERROR_ARG_NAMES } else { ARG_NAMES };
let cx = window.get_cx();
let options = unsafe {