@@ -352,7 +352,7 @@ pub fn wrap_object3<
352
352
}
353
353
354
354
pub struct UnsafePtr < T : GarbageCollected > {
355
- inner : v8:: cppgc:: UnsafePtr < CppGcObject < T > > ,
355
+ inner : v8:: cppgc:: Ptr < CppGcObject < T > > ,
356
356
root : Option < v8:: cppgc:: Persistent < CppGcObject < T > > > ,
357
357
}
358
358
@@ -374,6 +374,13 @@ impl<T: GarbageCollected> UnsafePtr<T> {
374
374
}
375
375
}
376
376
377
+ impl < T : GarbageCollected > std:: ops:: Deref for UnsafePtr < T > {
378
+ type Target = T ;
379
+ fn deref ( & self ) -> & T {
380
+ & self . inner . member
381
+ }
382
+ }
383
+
377
384
#[ doc( hidden) ]
378
385
#[ allow( clippy:: needless_lifetimes) ]
379
386
pub fn try_unwrap_cppgc_object < ' sc , T : GarbageCollected + ' static > (
@@ -401,6 +408,51 @@ pub fn try_unwrap_cppgc_object<'sc, T: GarbageCollected + 'static>(
401
408
} )
402
409
}
403
410
411
+ pub struct Ref < T : GarbageCollected > {
412
+ inner : v8:: cppgc:: Persistent < CppGcObject < T > > ,
413
+ }
414
+
415
+ impl < T : GarbageCollected > std:: ops:: Deref for Ref < T > {
416
+ type Target = T ;
417
+ fn deref ( & self ) -> & T {
418
+ & self . inner . borrow ( ) . unwrap ( ) . member
419
+ }
420
+ }
421
+
422
+ #[ doc( hidden) ]
423
+ #[ allow( clippy:: needless_lifetimes) ]
424
+ pub fn try_unwrap_cppgc_persistent_object <
425
+ ' sc ,
426
+ T : GarbageCollected + ' static ,
427
+ > (
428
+ isolate : & mut v8:: Isolate ,
429
+ val : v8:: Local < ' sc , v8:: Value > ,
430
+ ) -> Option < Ref < T > > {
431
+ let ptr = try_unwrap_cppgc_object :: < T > ( isolate, val) ?;
432
+ Some ( Ref {
433
+ inner : v8:: cppgc:: Persistent :: new ( & ptr. inner ) ,
434
+ } )
435
+ }
436
+
437
+ pub struct Member < T : GarbageCollected > {
438
+ inner : v8:: cppgc:: Member < CppGcObject < T > > ,
439
+ }
440
+
441
+ impl < T : GarbageCollected > From < Ref < T > > for Member < T > {
442
+ fn from ( value : Ref < T > ) -> Self {
443
+ Member {
444
+ inner : v8:: cppgc:: Member :: new ( & value. inner ) ,
445
+ }
446
+ }
447
+ }
448
+
449
+ impl < T : GarbageCollected > std:: ops:: Deref for Member < T > {
450
+ type Target = T ;
451
+ fn deref ( & self ) -> & T {
452
+ & self . inner . borrow ( ) . unwrap ( ) . member
453
+ }
454
+ }
455
+
404
456
#[ doc( hidden) ]
405
457
#[ allow( clippy:: needless_lifetimes) ]
406
458
pub fn try_unwrap_cppgc_proto_object <
@@ -503,3 +555,55 @@ impl FunctionTemplateData {
503
555
. collect ( ) ;
504
556
}
505
557
}
558
+
559
+ #[ derive( Debug ) ]
560
+ pub struct SameObject < T : GarbageCollected + ' static > {
561
+ cell : std:: cell:: OnceCell < v8:: Global < v8:: Object > > ,
562
+ _phantom_data : std:: marker:: PhantomData < T > ,
563
+ }
564
+
565
+ impl < T : GarbageCollected + ' static > SameObject < T > {
566
+ #[ allow( clippy:: new_without_default) ]
567
+ pub fn new ( ) -> Self {
568
+ Self {
569
+ cell : Default :: default ( ) ,
570
+ _phantom_data : Default :: default ( ) ,
571
+ }
572
+ }
573
+
574
+ pub fn get < F > (
575
+ & self ,
576
+ scope : & mut v8:: HandleScope ,
577
+ f : F ,
578
+ ) -> v8:: Global < v8:: Object >
579
+ where
580
+ F : FnOnce ( & mut v8:: HandleScope ) -> T ,
581
+ {
582
+ self
583
+ . cell
584
+ . get_or_init ( || {
585
+ let v = f ( scope) ;
586
+ let obj = make_cppgc_object ( scope, v) ;
587
+ v8:: Global :: new ( scope, obj)
588
+ } )
589
+ . clone ( )
590
+ }
591
+
592
+ pub fn set (
593
+ & self ,
594
+ scope : & mut v8:: HandleScope ,
595
+ value : T ,
596
+ ) -> Result < ( ) , v8:: Global < v8:: Object > > {
597
+ let obj = make_cppgc_object ( scope, value) ;
598
+ self . cell . set ( v8:: Global :: new ( scope, obj) )
599
+ }
600
+
601
+ pub fn try_unwrap (
602
+ & self ,
603
+ scope : & mut v8:: HandleScope ,
604
+ ) -> Option < UnsafePtr < T > > {
605
+ let obj = self . cell . get ( ) ?;
606
+ let val = v8:: Local :: new ( scope, obj) ;
607
+ try_unwrap_cppgc_object ( scope, val. cast ( ) )
608
+ }
609
+ }
0 commit comments