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())
+  }
 }