From fb168f46b386ea4bd3fc22d9f84848f28c9a9d54 Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Wed, 3 Jul 2024 14:25:02 +0300 Subject: [PATCH] avm2: Use `Gc` instead of `GcCell` in `FontObject` --- core/src/avm2/object.rs | 2 +- core/src/avm2/object/font_object.rs | 32 ++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index 38ca3eab1..8e3b50977 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -1413,7 +1413,7 @@ impl<'gc> Object<'gc> { Self::ShaderDataObject(o) => WeakObject::ShaderDataObject(ShaderDataObjectWeak(Gc::downgrade(o.0))), Self::SocketObject(o) => WeakObject::SocketObject(SocketObjectWeak(Gc::downgrade(o.0))), Self::FileReferenceObject(o) => WeakObject::FileReferenceObject(FileReferenceObjectWeak(Gc::downgrade(o.0))), - Self::FontObject(o) => WeakObject::FontObject(FontObjectWeak(GcCell::downgrade(o.0))), + Self::FontObject(o) => WeakObject::FontObject(FontObjectWeak(Gc::downgrade(o.0))), Self::LocalConnectionObject(o) => WeakObject::LocalConnectionObject(LocalConnectionObjectWeak(Gc::downgrade(o.0))), } } diff --git a/core/src/avm2/object/font_object.rs b/core/src/avm2/object/font_object.rs index 8d876d5f5..2bf01a3ed 100644 --- a/core/src/avm2/object/font_object.rs +++ b/core/src/avm2/object/font_object.rs @@ -4,8 +4,8 @@ use crate::avm2::value::Value; use crate::avm2::{Activation, ClassObject, Error}; use crate::character::Character; use crate::font::Font; -use gc_arena::Mutation; -use gc_arena::{Collect, GcCell, GcWeakCell}; +use gc_arena::barrier::unlock; +use gc_arena::{lock::RefLock, Collect, Gc, GcWeak, Mutation}; use std::cell::{Ref, RefMut}; use std::fmt; @@ -14,7 +14,7 @@ pub fn font_allocator<'gc>( class: ClassObject<'gc>, activation: &mut Activation<'_, 'gc>, ) -> Result, Error<'gc>> { - let base = ScriptObjectData::new(class); + let base = ScriptObjectData::new(class).into(); let font = if let Some((movie, id)) = activation .context @@ -35,7 +35,7 @@ pub fn font_allocator<'gc>( None }; - Ok(FontObject(GcCell::new( + Ok(FontObject(Gc::new( activation.context.gc_context, FontObjectData { base, font }, )) @@ -44,12 +44,16 @@ pub fn font_allocator<'gc>( #[derive(Clone, Collect, Copy)] #[collect(no_drop)] -pub struct FontObject<'gc>(pub GcCell<'gc, FontObjectData<'gc>>); +pub struct FontObject<'gc>(pub Gc<'gc, FontObjectData<'gc>>); + +#[derive(Clone, Collect, Copy, Debug)] +#[collect(no_drop)] +pub struct FontObjectWeak<'gc>(pub GcWeak<'gc, FontObjectData<'gc>>); impl<'gc> FontObject<'gc> { pub fn for_font(mc: &Mutation<'gc>, class: ClassObject<'gc>, font: Font<'gc>) -> Object<'gc> { - let base = ScriptObjectData::new(class); - FontObject(GcCell::new( + let base = ScriptObjectData::new(class).into(); + FontObject(Gc::new( mc, FontObjectData { base, @@ -60,21 +64,17 @@ impl<'gc> FontObject<'gc> { } } -#[derive(Clone, Collect, Copy, Debug)] -#[collect(no_drop)] -pub struct FontObjectWeak<'gc>(pub GcWeakCell<'gc, FontObjectData<'gc>>); - impl<'gc> TObject<'gc> for FontObject<'gc> { fn base(&self) -> Ref> { - Ref::map(self.0.read(), |read| &read.base) + self.0.base.borrow() } fn base_mut(&self, mc: &Mutation<'gc>) -> RefMut> { - RefMut::map(self.0.write(mc), |write| &mut write.base) + unlock!(Gc::write(mc, self.0), FontObjectData, base).borrow_mut() } fn as_ptr(&self) -> *const ObjectPtr { - self.0.as_ptr() as *const ObjectPtr + Gc::as_ptr(self.0) as *const ObjectPtr } fn value_of(&self, _mc: &Mutation<'gc>) -> Result, Error<'gc>> { @@ -82,7 +82,7 @@ impl<'gc> TObject<'gc> for FontObject<'gc> { } fn as_font(&self) -> Option> { - self.0.read().font + self.0.font } } @@ -90,7 +90,7 @@ impl<'gc> TObject<'gc> for FontObject<'gc> { #[collect(no_drop)] pub struct FontObjectData<'gc> { /// Base script object - base: ScriptObjectData<'gc>, + base: RefLock>, font: Option>, }