From c28ca7b405da7e47585037df13a8baa2fff8bb5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 12 Nov 2019 20:30:42 +0000 Subject: [PATCH] style: Use MaybeUninit in style struct clone impls / constructors. Differential Revision: https://phabricator.services.mozilla.com/D51788 --- components/style/properties/gecko.mako.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 7783c7eebd3..b6cd741038c 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -46,7 +46,7 @@ use crate::rule_tree::StrongRuleNode; use crate::selector_parser::PseudoElement; use servo_arc::{Arc, RawOffsetArc, UniqueArc}; use std::marker::PhantomData; -use std::mem::{forget, zeroed, ManuallyDrop}; +use std::mem::{forget, MaybeUninit}; use std::{cmp, ops, ptr}; use crate::values::{self, CustomIdent, Either, KeyframesName, None_}; use crate::values::computed::{Percentage, TransitionProperty}; @@ -218,7 +218,7 @@ impl ComputedValuesInner { unsafe { let mut arc = UniqueArc::::new_uninit(); bindings::Gecko_ComputedStyle_Init( - &mut (*arc.as_mut_ptr()).0, + arc.as_mut_ptr() as *mut _, &self, pseudo_ty, ); @@ -621,14 +621,17 @@ def set_gecko_property(ffi_name, expr): impl ${style_struct.gecko_struct_name} { #[allow(dead_code, unused_variables)] pub fn default(document: &structs::Document) -> Arc { - let mut result = Arc::new(${style_struct.gecko_struct_name} { gecko: ManuallyDrop::new(unsafe { zeroed() }) }); unsafe { + let mut result = UniqueArc::::new_uninit(); + // FIXME(bug 1595895): Zero the memory to keep valgrind happy, but + // these looks like Valgrind false-positives at a quick glance. + ptr::write_bytes::(result.as_mut_ptr(), 0, 1); Gecko_Construct_Default_${style_struct.gecko_ffi_name}( - &mut *Arc::get_mut(&mut result).unwrap().gecko, + result.as_mut_ptr() as *mut _, document, ); + UniqueArc::assume_init(result).shareable() } - result } } impl Drop for ${style_struct.gecko_struct_name} { @@ -641,9 +644,12 @@ impl Drop for ${style_struct.gecko_struct_name} { impl Clone for ${style_struct.gecko_struct_name} { fn clone(&self) -> Self { unsafe { - let mut result = ${style_struct.gecko_struct_name} { gecko: ManuallyDrop::new(zeroed()) }; - Gecko_CopyConstruct_${style_struct.gecko_ffi_name}(&mut *result.gecko, &*self.gecko); - result + let mut result = MaybeUninit::::uninit(); + // FIXME(bug 1595895): Zero the memory to keep valgrind happy, but + // these looks like Valgrind false-positives at a quick glance. + ptr::write_bytes::(result.as_mut_ptr(), 0, 1); + Gecko_CopyConstruct_${style_struct.gecko_ffi_name}(result.as_mut_ptr() as *mut _, &*self.gecko); + result.assume_init() } } }