From 7f40f0725a5a7d54b51ff862e97c959a8d7c9fb5 Mon Sep 17 00:00:00 2001 From: Kenta Moriuchi <moriken@kimamass.com> Date: Sat, 25 Jan 2025 03:07:37 +0900 Subject: [PATCH] feat(webidl): add `SameObject` utils in cppgc --- core/cppgc.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/cppgc.rs b/core/cppgc.rs index 74d30ff72..cd0d86c47 100644 --- a/core/cppgc.rs +++ b/core/cppgc.rs @@ -182,10 +182,12 @@ impl FunctionTemplateData { } } +#[derive(Debug)] pub struct SameObject<T: GarbageCollected + 'static> { cell: std::cell::OnceCell<v8::Global<v8::Object>>, _phantom_data: std::marker::PhantomData<T>, } + impl<T: GarbageCollected + 'static> SameObject<T> { #[allow(clippy::new_without_default)] pub fn new() -> Self { @@ -212,4 +214,19 @@ impl<T: GarbageCollected + 'static> SameObject<T> { }) .clone() } + + pub fn set( + &self, + scope: &mut v8::HandleScope, + value: T, + ) -> Result<(), v8::Global<v8::Object>> { + let obj = make_cppgc_object(scope, value); + self.cell.set(v8::Global::new(scope, obj)) + } + + pub fn try_unwrap(&self, scope: &mut v8::HandleScope) -> Option<Ptr<T>> { + let obj = self.cell.get()?; + let val = v8::Local::new(scope, obj); + try_unwrap_cppgc_object(scope, val.cast()) + } }