/
githubmirror
/
servo
Обзор
Документация
Войти
/
githubmirror
/
servo
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
components/script/dom/bindings/frozenarray.rs
53 строки
2 KB
Simon Wülker
script: Migrate some calls from `DomRefCell::borrow_mut` to `safe_borrow_mut(cx.no_gc())` (#46435)
10 июл 2026, 12:08
Не верифицирован
10 июл 2026, 12:08
5b9e3a8
Код
Авторство
О чём код?
/* 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 https://mozilla.org/MPL/2.0/. */ use js::context::JSContext; use js::conversions::ToJSValConvertible; use js::jsapi::Heap; use js::jsval::JSVal; use js::rust::MutableHandleValue; use script_bindings::cell::DomRefCell; use crate::dom::bindings::utils::to_frozen_array; #[derive(JSTraceable)] #[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] pub(crate) struct CachedFrozenArray { frozen_value: DomRefCell<Option<Heap<JSVal>>>, } impl CachedFrozenArray { pub(crate) fn new() -> CachedFrozenArray { CachedFrozenArray { frozen_value: DomRefCell::new(None), } } pub(crate) fn get_or_init<F: FnOnce() -> Vec<T>, T: ToJSValConvertible>( &self, cx: &mut JSContext, f: F, mut retval: MutableHandleValue, ) { if let Some(inner) = &*self.frozen_value.borrow() { retval.set(inner.get()); return; } let array = f(); to_frozen_array(cx, array.as_slice(), retval.reborrow()); // Safety: need to create the Heap value in its final memory location before setting it. *self.frozen_value.safe_borrow_mut(cx.no_gc()) = Some(Heap::default()); self.frozen_value .borrow() .as_ref() .unwrap() .set(retval.get()); } pub(crate) fn clear(&self) { *self.frozen_value.borrow_mut() = None; } }