Bug 1474793 - Part 11: Add FFI API to use SharedMemoryBuilder. r=emilio

Depends on D17197

Differential Revision: https://phabricator.services.mozilla.com/D17198

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Cameron McCormack 2019-03-30 00:16:27 +00:00
Родитель 6b5853fa8e
Коммит 3a08c03925
11 изменённых файлов: 96 добавлений и 2 удалений

2
Cargo.lock сгенерированный
Просмотреть файл

@ -1187,6 +1187,7 @@ dependencies = [
"smallvec 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
"style 0.0.1",
"style_traits 0.0.1",
"to_shmem 0.0.1",
]
[[package]]
@ -2792,6 +2793,7 @@ dependencies = [
"smallvec 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
"style 0.0.1",
"style_traits 0.0.1",
"to_shmem 0.0.1",
]
[[package]]

Просмотреть файл

@ -180,6 +180,7 @@ SERVO_ARC_TYPE(ComputedStyle, mozilla::ComputedStyle)
SERVO_BOXED_TYPE(StyleSet, RawServoStyleSet)
SERVO_BOXED_TYPE(AuthorStyles, RawServoAuthorStyles)
SERVO_BOXED_TYPE(SelectorList, RawServoSelectorList)
SERVO_BOXED_TYPE(SharedMemoryBuilder, RawServoSharedMemoryBuilder)
SERVO_BOXED_TYPE(SourceSizeList, RawServoSourceSizeList)
SERVO_BOXED_TYPE(UseCounters, StyleUseCounters)
#undef SERVO_BOXED_TYPE

Просмотреть файл

@ -1002,6 +1002,16 @@ void Servo_Quotes_GetQuote(const RawServoQuotes* quotes, int32_t depth,
mozilla::StyleContentType quote_type,
nsAString* result);
RawServoSharedMemoryBuilder* Servo_SharedMemoryBuilder_Create(uint8_t* buffer,
size_t len);
const ServoCssRules* Servo_SharedMemoryBuilder_AddStylesheet(
RawServoSharedMemoryBuilder* builder,
const RawServoStyleSheetContents* sheet);
size_t Servo_SharedMemoryBuilder_GetLength(
RawServoSharedMemoryBuilder* builder);
} // extern "C"
#pragma GCC diagnostic pop

Просмотреть файл

@ -0,0 +1,21 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//! FFI implementations for types listed in ServoBoxedTypeList.h.
use crate::gecko_bindings::sugar::ownership::{HasBoxFFI, HasFFI, HasSimpleFFI};
use to_shmem::SharedMemoryBuilder;
// TODO(heycam): The FFI impls for most of the types in ServoBoxedTypeList.h are spread across
// various files at the moment, but should probably all move here, and use macros to define
// them more succinctly, like we do in arc_types.rs.
#[cfg(feature = "gecko")]
unsafe impl HasFFI for SharedMemoryBuilder {
type FFIType = crate::gecko_bindings::bindings::RawServoSharedMemoryBuilder;
}
#[cfg(feature = "gecko")]
unsafe impl HasSimpleFFI for SharedMemoryBuilder {}
#[cfg(feature = "gecko")]
unsafe impl HasBoxFFI for SharedMemoryBuilder {}

Просмотреть файл

@ -8,6 +8,7 @@
mod non_ts_pseudo_class_list;
pub mod arc_types;
pub mod boxed_types;
pub mod conversions;
pub mod data;
pub mod media_features;

Просмотреть файл

@ -27,3 +27,4 @@ servo_arc = {path = "../../components/servo_arc"}
smallvec = "0.6"
style = {path = "../../components/style", features = ["gecko"]}
style_traits = {path = "../../components/style_traits"}
to_shmem = {path = "../../components/to_shmem"}

Просмотреть файл

@ -55,7 +55,8 @@ use style::gecko_bindings::structs::{
RawServoKeyframesRule, ServoCssRules, RawServoStyleSheetContents,
RawServoPageRule, RawServoNamespaceRule, RawServoMozDocumentRule,
RawServoKeyframe, RawServoMediaRule, RawServoImportRule,
RawServoFontFaceRule, RawServoFontFeatureValuesRule
RawServoFontFaceRule, RawServoFontFeatureValuesRule,
RawServoSharedMemoryBuilder
};
use style::gecko_bindings::structs::gfxFontFeatureValueSet;
use style::gecko_bindings::structs::nsAtom;
@ -107,7 +108,7 @@ use style::properties::{parse_one_declaration_into, parse_style_attribute};
use style::properties::{ComputedValues, Importance, NonCustomPropertyId};
use style::properties::{LonghandId, LonghandIdSet, PropertyDeclarationBlock, PropertyId};
use style::properties::{PropertyDeclarationId, ShorthandId};
use style::properties::{SourcePropertyDeclaration, StyleBuilder};
use style::properties::{SourcePropertyDeclaration, StyleBuilder, UnparsedValue};
use style::rule_cache::RuleCacheConditions;
use style::rule_tree::{CascadeLevel, StrongRuleNode};
use style::selector_parser::{PseudoElementCascadeType, SelectorImpl};
@ -137,6 +138,7 @@ use style::values::specified::gecko::IntersectionObserverRootMargin;
use style::values::specified::source_size_list::SourceSizeList;
use style::values::{CustomIdent, KeyframesName};
use style_traits::{CssWriter, ParsingMode, StyleParseErrorKind, ToCss};
use to_shmem::SharedMemoryBuilder;
trait ClosureHelper {
fn invoke(&self);
@ -6337,3 +6339,55 @@ pub unsafe extern "C" fn Servo_Quotes_GetQuote(
};
(*result).write_str(quote).unwrap();
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SharedMemoryBuilder_Create(
buffer: *mut u8,
len: usize,
) -> *mut RawServoSharedMemoryBuilder {
let mut builder = Box::new(SharedMemoryBuilder::new(buffer, len));
// We have Arc<UnparsedValue>s in style sheets due to CSS variables being
// used in shorthand property declarations. There aren't many, though,
// and they aren't big, so we just allow their duplication for now.
builder.add_allowed_duplication_type::<UnparsedValue>();
Box::into_raw(builder) as *mut _
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SharedMemoryBuilder_AddStylesheet(
builder: &mut RawServoSharedMemoryBuilder,
raw_contents: &RawServoStyleSheetContents,
) -> *const ServoCssRules {
let builder = SharedMemoryBuilder::from_ffi_mut(builder);
let contents = StylesheetContents::as_arc(&raw_contents);
// Assert some things we assume when we create a style sheet from shared
// memory.
debug_assert_eq!(contents.origin, Origin::UserAgent);
debug_assert_eq!(contents.quirks_mode, QuirksMode::NoQuirks);
debug_assert!(contents.source_map_url.read().is_none());
debug_assert!(contents.source_url.read().is_none());
let rules = &contents.rules;
let shared_rules: &Arc<Locked<CssRules>> = &*builder.write(rules);
(&*shared_rules).with_raw_offset_arc(|arc| {
*Locked::<CssRules>::arc_as_borrowed(arc) as *const _
})
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SharedMemoryBuilder_GetLength(
builder: &mut RawServoSharedMemoryBuilder,
) -> usize {
let builder = SharedMemoryBuilder::from_ffi_mut(builder);
builder.len()
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SharedMemoryBuilder_Drop(
builder: Owned<RawServoSharedMemoryBuilder>
) {
let _ = builder.into_box::<SharedMemoryBuilder>();
}

Просмотреть файл

@ -17,6 +17,7 @@ extern crate smallvec;
#[macro_use]
extern crate style;
extern crate style_traits;
extern crate to_shmem;
mod error_reporter;
#[allow(non_snake_case)]

Просмотреть файл

@ -24,3 +24,4 @@ size_of_test = {path = "../../../components/size_of_test"}
smallvec = "0.6"
style_traits = {path = "../../../components/style_traits"}
style = {path = "../../../components/style", features = ["gecko"]}
to_shmem = {path = "../../../components/to_shmem"}

Просмотреть файл

@ -26,6 +26,7 @@ extern crate size_of_test;
#[cfg_attr(target_pointer_width = "64", macro_use)]
extern crate style;
extern crate style_traits;
extern crate to_shmem;
#[cfg(target_pointer_width = "64")]
mod size_of;

Просмотреть файл

@ -27,3 +27,4 @@ size_of_test = {path = "../../../components/size_of_test"}
style = {path = "../../../components/style"}
style_traits = {path = "../../../components/style_traits"}
std_test_override = { path = "../../../components/std_test_override" }
to_shmem = { path = "../../../components/to_shmem" }