mirror of
https://github.com/servo/servo.git
synced 2025-08-02 12:10:29 +01:00
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
This commit is contained in:
commit
00b57b4fd9
3 changed files with 93 additions and 77 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue