Auto merge of #27852 - joseph62:fix_memory_profile_crash, r=jdm

Fix memory profile crash

<!-- Please describe your changes on the following line: -->
Added a callback for determining which objects should be included in the memory profiling that was removed by 74c1e00d81 (diff-86033f852232a3ea1cb2f43d2f255850fb6d091c6eeba07213152e13b7006026L219)

Also added `is_platform_object_static` that did not require a JSContext to be used in the callback.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #27836 (GitHub issue number if applicable)

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because ___

Wasn't sure about tests for these changes. Some direction for that would be great. Thank you!

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
bors-servo 2020-11-26 19:59:54 -05:00 committed by GitHub
commit 7824b6d0de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 5 deletions

View file

@ -6182,7 +6182,8 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'crate::dom::bindings::utils::get_property_on_prototype',
'crate::dom::bindings::utils::get_proto_or_iface_array',
'crate::dom::bindings::utils::has_property_on_prototype',
'crate::dom::bindings::utils::is_platform_object',
'crate::dom::bindings::utils::is_platform_object_dynamic',
'crate::dom::bindings::utils::is_platform_object_static',
'crate::dom::bindings::utils::resolve_global',
'crate::dom::bindings::utils::set_dictionary_property',
'crate::dom::bindings::utils::trace_global',

View file

@ -19,7 +19,7 @@ use crate::script_runtime::JSContext as SafeJSContext;
use js::conversions::{jsstr_to_string, ToJSValConvertible};
use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper};
use js::glue::{GetCrossCompartmentWrapper, JS_GetReservedSlot, WrapperNew};
use js::glue::{UnwrapObjectDynamic, RUST_JSID_TO_INT, RUST_JSID_TO_STRING};
use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic, RUST_JSID_TO_INT, RUST_JSID_TO_STRING};
use js::glue::{
RUST_FUNCTION_VALUE_TO_JITINFO, RUST_JSID_IS_INT, RUST_JSID_IS_STRING, RUST_JSID_IS_VOID,
};
@ -251,9 +251,24 @@ pub unsafe fn find_enum_value<'a, T>(
))
}
/// Returns wether `obj` is a platform object
/// Returns wether `obj` is a platform object using dynamic unwrap
/// <https://heycam.github.io/webidl/#dfn-platform-object>
pub fn is_platform_object(obj: *mut JSObject, cx: *mut JSContext) -> bool {
pub fn is_platform_object_dynamic(obj: *mut JSObject, cx: *mut JSContext) -> bool {
is_platform_object(obj, &|o| unsafe {
UnwrapObjectDynamic(o, cx, /* stopAtWindowProxy = */ 0)
})
}
/// Returns wether `obj` is a platform object using static unwrap
/// <https://heycam.github.io/webidl/#dfn-platform-object>
pub fn is_platform_object_static(obj: *mut JSObject) -> bool {
is_platform_object(obj, &|o| unsafe { UnwrapObjectStatic(o) })
}
fn is_platform_object(
obj: *mut JSObject,
unwrap_obj: &dyn Fn(*mut JSObject) -> *mut JSObject,
) -> bool {
unsafe {
// Fast-path the common case
let mut clasp = get_object_class(obj);
@ -262,7 +277,7 @@ pub fn is_platform_object(obj: *mut JSObject, cx: *mut JSContext) -> bool {
}
// Now for simplicity check for security wrappers before anything else
if IsWrapper(obj) {
let unwrapped_obj = UnwrapObjectDynamic(obj, cx, /* stopAtWindowProxy = */ 0);
let unwrapped_obj = unwrap_obj(obj);
if unwrapped_obj.is_null() {
return false;
}

View file

@ -3,8 +3,11 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::bindings::codegen::RegisterBindings;
use crate::dom::bindings::conversions::is_dom_proxy;
use crate::dom::bindings::proxyhandler;
use crate::dom::bindings::utils::is_platform_object_static;
use crate::script_runtime::JSEngineSetup;
use js::jsapi::JSObject;
#[cfg(target_os = "linux")]
#[allow(unsafe_code)]
@ -49,6 +52,11 @@ fn perform_platform_specific_initialization() {
#[cfg(not(target_os = "linux"))]
fn perform_platform_specific_initialization() {}
#[allow(unsafe_code)]
unsafe extern "C" fn is_dom_object(obj: *mut JSObject) -> bool {
!obj.is_null() && (is_platform_object_static(obj) || is_dom_proxy(obj))
}
#[allow(unsafe_code)]
pub fn init() -> JSEngineSetup {
unsafe {
@ -57,6 +65,8 @@ pub fn init() -> JSEngineSetup {
// Create the global vtables used by the (generated) DOM
// bindings to implement JS proxies.
RegisterBindings::RegisterProxyHandlers();
js::glue::InitializeMemoryReporter(Some(is_dom_object));
}
perform_platform_specific_initialization();