avm2: Use `Gc` instead of `GcCell` in `ScriptObject`

This commit is contained in:
Lord-McSweeney 2024-07-31 13:14:52 -07:00 committed by Lord-McSweeney
parent c80bd7a55e
commit 3ae53a6ef2
2 changed files with 14 additions and 14 deletions

View File

@ -22,7 +22,7 @@ use crate::display_object::DisplayObject;
use crate::html::TextFormat; use crate::html::TextFormat;
use crate::streams::NetStream; use crate::streams::NetStream;
use crate::string::AvmString; use crate::string::AvmString;
use gc_arena::{Collect, Gc, GcCell, Mutation}; use gc_arena::{Collect, Gc, Mutation};
use ruffle_macros::enum_trait_object; use ruffle_macros::enum_trait_object;
use std::cell::{Ref, RefMut}; use std::cell::{Ref, RefMut};
use std::fmt::Debug; use std::fmt::Debug;
@ -1376,7 +1376,7 @@ impl<'gc> Object<'gc> {
#[rustfmt::skip] #[rustfmt::skip]
pub fn downgrade(&self) -> WeakObject<'gc> { pub fn downgrade(&self) -> WeakObject<'gc> {
match self { match self {
Self::ScriptObject(o) => WeakObject::ScriptObject(ScriptObjectWeak(GcCell::downgrade(o.0))), Self::ScriptObject(o) => WeakObject::ScriptObject(ScriptObjectWeak(Gc::downgrade(o.0))),
Self::FunctionObject(o) => WeakObject::FunctionObject(FunctionObjectWeak(Gc::downgrade(o.0))), Self::FunctionObject(o) => WeakObject::FunctionObject(FunctionObjectWeak(Gc::downgrade(o.0))),
Self::PrimitiveObject(o) => WeakObject::PrimitiveObject(PrimitiveObjectWeak(Gc::downgrade(o.0))), Self::PrimitiveObject(o) => WeakObject::PrimitiveObject(PrimitiveObjectWeak(Gc::downgrade(o.0))),
Self::NamespaceObject(o) => WeakObject::NamespaceObject(NamespaceObjectWeak(Gc::downgrade(o.0))), Self::NamespaceObject(o) => WeakObject::NamespaceObject(NamespaceObjectWeak(Gc::downgrade(o.0))),

View File

@ -10,7 +10,7 @@ use crate::avm2::vtable::VTable;
use crate::avm2::Multiname; use crate::avm2::Multiname;
use crate::avm2::{Error, QName}; use crate::avm2::{Error, QName};
use crate::string::AvmString; use crate::string::AvmString;
use gc_arena::{Collect, GcCell, GcWeakCell, Mutation}; use gc_arena::{lock::RefLock, Collect, Gc, GcWeak, Mutation};
use std::cell::{Ref, RefMut}; use std::cell::{Ref, RefMut};
use std::fmt::Debug; use std::fmt::Debug;
@ -19,19 +19,19 @@ pub fn scriptobject_allocator<'gc>(
class: ClassObject<'gc>, class: ClassObject<'gc>,
activation: &mut Activation<'_, 'gc>, activation: &mut Activation<'_, 'gc>,
) -> Result<Object<'gc>, Error<'gc>> { ) -> Result<Object<'gc>, Error<'gc>> {
let base = ScriptObjectData::new(class); let base = ScriptObjectData::new(class).into();
Ok(ScriptObject(GcCell::new(activation.context.gc_context, base)).into()) Ok(ScriptObject(Gc::new(activation.context.gc_context, base)).into())
} }
/// Default implementation of `avm2::Object`. /// Default implementation of `avm2::Object`.
#[derive(Clone, Collect, Copy)] #[derive(Clone, Collect, Copy)]
#[collect(no_drop)] #[collect(no_drop)]
pub struct ScriptObject<'gc>(pub GcCell<'gc, ScriptObjectData<'gc>>); pub struct ScriptObject<'gc>(pub Gc<'gc, RefLock<ScriptObjectData<'gc>>>);
#[derive(Clone, Collect, Copy, Debug)] #[derive(Clone, Collect, Copy, Debug)]
#[collect(no_drop)] #[collect(no_drop)]
pub struct ScriptObjectWeak<'gc>(pub GcWeakCell<'gc, ScriptObjectData<'gc>>); pub struct ScriptObjectWeak<'gc>(pub GcWeak<'gc, RefLock<ScriptObjectData<'gc>>>);
/// Base data common to all `TObject` implementations. /// Base data common to all `TObject` implementations.
/// ///
@ -62,15 +62,15 @@ pub struct ScriptObjectData<'gc> {
impl<'gc> TObject<'gc> for ScriptObject<'gc> { impl<'gc> TObject<'gc> for ScriptObject<'gc> {
fn base(&self) -> Ref<ScriptObjectData<'gc>> { fn base(&self) -> Ref<ScriptObjectData<'gc>> {
self.0.read() self.0.borrow()
} }
fn base_mut(&self, mc: &Mutation<'gc>) -> RefMut<ScriptObjectData<'gc>> { fn base_mut(&self, mc: &Mutation<'gc>) -> RefMut<ScriptObjectData<'gc>> {
self.0.write(mc) self.0.borrow_mut(mc)
} }
fn as_ptr(&self) -> *const ObjectPtr { 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<Value<'gc>, Error<'gc>> { fn value_of(&self, _mc: &Mutation<'gc>) -> Result<Value<'gc>, Error<'gc>> {
@ -108,9 +108,9 @@ impl<'gc> ScriptObject<'gc> {
class_obj: Option<ClassObject<'gc>>, class_obj: Option<ClassObject<'gc>>,
proto: Option<Object<'gc>>, proto: Option<Object<'gc>>,
) -> Object<'gc> { ) -> Object<'gc> {
ScriptObject(GcCell::new( ScriptObject(Gc::new(
mc, mc,
ScriptObjectData::custom_new(class, proto, class_obj), RefLock::new(ScriptObjectData::custom_new(class, proto, class_obj)),
)) ))
.into() .into()
} }
@ -130,7 +130,7 @@ impl<'gc> ScriptObject<'gc> {
base.set_vtable(vt); base.set_vtable(vt);
base.install_instance_slots(); base.install_instance_slots();
ScriptObject(GcCell::new(activation.context.gc_context, base)).into() ScriptObject(Gc::new(activation.context.gc_context, RefLock::new(base))).into()
} }
} }
@ -434,7 +434,7 @@ impl<'gc> Debug for ScriptObject<'gc> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
let mut f = f.debug_struct("ScriptObject"); let mut f = f.debug_struct("ScriptObject");
match self.0.try_read() { match self.0.try_borrow() {
Ok(obj) => f.field("name", &obj.debug_class_name()), Ok(obj) => f.field("name", &obj.debug_class_name()),
Err(err) => f.field("name", &err), Err(err) => f.field("name", &err),
}; };