From 773681806950a009621dd818b398b17f39ef86de Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 18 Sep 2021 14:10:58 +0200 Subject: [PATCH] avm2: Rename as_class -> get_own_class_definition --- core/src/avm2/activation.rs | 10 +++++----- core/src/avm2/globals.rs | 8 ++++---- .../avm2/globals/flash/display/bitmapdata.rs | 2 +- core/src/avm2/globals/flash/media/sound.rs | 2 +- core/src/avm2/globals/flash/utils.rs | 4 ++-- core/src/avm2/globals/vector.rs | 16 ++++++++-------- core/src/avm2/object.rs | 18 ++++++++++-------- core/src/avm2/object/class_object.rs | 8 ++++---- core/src/avm2/object/loaderinfo_object.rs | 2 +- core/src/avm2/object/primitive_object.rs | 2 +- core/src/avm2/object/script_object.rs | 8 ++++---- core/src/avm2/value.rs | 4 ++-- 12 files changed, 43 insertions(+), 41 deletions(-) diff --git a/core/src/avm2/activation.rs b/core/src/avm2/activation.rs index 05782c268..09fc44889 100644 --- a/core/src/avm2/activation.rs +++ b/core/src/avm2/activation.rs @@ -216,7 +216,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { .ok_or_else(|| format!("Could not resolve parameter type {:?}", type_name))? .coerce_to_object(self)?; - if class.as_class().is_none() { + if class.get_own_class_definition().is_none() { return Err(format!("Resolved parameter type {:?} is not a class", type_name).into()); } @@ -1279,7 +1279,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { // dynamic properties not yet set if name.is_err() && !object - .as_class() + .get_own_class_definition() .map(|c| c.read().is_sealed()) .unwrap_or(false) { @@ -1357,7 +1357,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { // Unknown properties on a dynamic class delete successfully. self.context.avm2.push( !object - .as_class() + .get_own_class_definition() .map(|c| c.read().is_sealed()) .unwrap_or(false), ) @@ -2559,7 +2559,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { }); let class = found?.coerce_to_object(self)?; - if class.as_class().is_none() { + if class.get_own_class_definition().is_none() { return Err("TypeError: The right-hand side of operator must be a class.".into()); } @@ -2576,7 +2576,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { let class = self.context.avm2.pop().coerce_to_object(self)?; let value = self.context.avm2.pop().coerce_to_object(self)?; - if class.as_class().is_none() { + if class.get_own_class_definition().is_none() { return Err("TypeError: The right-hand side of operator must be a class.".into()); } diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index 9aa5e6a42..167bcfb78 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -311,7 +311,7 @@ fn dynamic_class<'gc>( script: Script<'gc>, ) -> Result<(), Error> { let class = class_object - .as_class() + .get_own_class_definition() .ok_or("Attempted to create builtin dynamic class without class on it's constructor!")?; let name = class.read().name().clone(); @@ -463,15 +463,15 @@ pub fn load_player_globals<'gc>( // usually are done in the associated constructor for `ClassObject`. object_class.install_traits( activation, - object_class.as_class().unwrap().read().class_traits(), + object_class.get_own_class_definition().unwrap().read().class_traits(), )?; function_class.install_traits( activation, - function_class.as_class().unwrap().read().class_traits(), + function_class.get_own_class_definition().unwrap().read().class_traits(), )?; class_class.install_traits( activation, - class_class.as_class().unwrap().read().class_traits(), + class_class.get_own_class_definition().unwrap().read().class_traits(), )?; object_cinit.call(Some(object_class), &[], activation, Some(object_class))?; diff --git a/core/src/avm2/globals/flash/display/bitmapdata.rs b/core/src/avm2/globals/flash/display/bitmapdata.rs index 0849e75e1..b8ba6bcb5 100644 --- a/core/src/avm2/globals/flash/display/bitmapdata.rs +++ b/core/src/avm2/globals/flash/display/bitmapdata.rs @@ -23,7 +23,7 @@ pub fn instance_init<'gc>( let name = this .instance_of() - .and_then(|t| t.as_class()) + .and_then(|t| t.get_own_class_definition()) .map(|c| c.read().name().clone()); let character = this .instance_of() diff --git a/core/src/avm2/globals/flash/media/sound.rs b/core/src/avm2/globals/flash/media/sound.rs index 75aa4975b..127e50558 100644 --- a/core/src/avm2/globals/flash/media/sound.rs +++ b/core/src/avm2/globals/flash/media/sound.rs @@ -40,7 +40,7 @@ pub fn instance_init<'gc>( { this.set_sound(activation.context.gc_context, *sound); } else { - log::warn!("Attempted to construct subclass of Sound, {}, which is associated with non-Sound character {}", class_object.as_class().expect("Class object is also a class").read().name().local_name(), symbol); + log::warn!("Attempted to construct subclass of Sound, {}, which is associated with non-Sound character {}", class_object.get_own_class_definition().expect("Class object is also a class").read().name().local_name(), symbol); } } } diff --git a/core/src/avm2/globals/flash/utils.rs b/core/src/avm2/globals/flash/utils.rs index 2049cc64d..3becf9254 100644 --- a/core/src/avm2/globals/flash/utils.rs +++ b/core/src/avm2/globals/flash/utils.rs @@ -39,7 +39,7 @@ pub fn get_qualified_class_name<'gc>( Ok(AvmString::new( activation.context.gc_context, - class.as_class() + class.get_own_class_definition() .ok_or("This object does not have a class")? .read() .name() @@ -71,7 +71,7 @@ pub fn get_qualified_super_class_name<'gc>( Ok(AvmString::new( activation.context.gc_context, super_class - .as_class() + .get_own_class_definition() .ok_or("This object does not have a class")? .read() .name() diff --git a/core/src/avm2/globals/vector.rs b/core/src/avm2/globals/vector.rs index 913e80744..bf7ee8868 100644 --- a/core/src/avm2/globals/vector.rs +++ b/core/src/avm2/globals/vector.rs @@ -67,7 +67,7 @@ pub fn class_init<'gc>( let int_vector_class = this.apply(activation, &[int_class.into()])?; let int_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$int"); int_vector_class - .as_class() + .get_own_class_definition() .unwrap() .write(activation.context.gc_context) .set_name(int_vector_name.clone()); @@ -85,7 +85,7 @@ pub fn class_init<'gc>( let uint_vector_class = this.apply(activation, &[uint_class.into()])?; let uint_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$uint"); uint_vector_class - .as_class() + .get_own_class_definition() .unwrap() .write(activation.context.gc_context) .set_name(uint_vector_name.clone()); @@ -103,7 +103,7 @@ pub fn class_init<'gc>( let number_vector_class = this.apply(activation, &[number_class.into()])?; let number_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$double"); number_vector_class - .as_class() + .get_own_class_definition() .unwrap() .write(activation.context.gc_context) .set_name(number_vector_name.clone()); @@ -120,7 +120,7 @@ pub fn class_init<'gc>( let object_vector_class = this.apply(activation, &[Value::Null])?; let object_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$object"); object_vector_class - .as_class() + .get_own_class_definition() .unwrap() .write(activation.context.gc_context) .set_name(object_vector_name.clone()); @@ -282,14 +282,14 @@ pub fn concat<'gc>( for arg in args.iter().map(|a| a.clone()) { let arg_obj = arg.coerce_to_object(activation)?; let arg_class = arg_obj - .as_class() + .get_own_class_definition() .ok_or("TypeError: Tried to concat from a bare object")?; if !arg.is_of_type(activation, my_class)? { return Err(format!( "TypeError: Cannot coerce argument of type {:?} to argument of type {:?}", arg_class.read().name(), my_class - .as_class() + .get_own_class_definition() .ok_or("TypeError: Tried to concat into a bare object")? .read() .name() @@ -308,13 +308,13 @@ pub fn concat<'gc>( if let Ok(val_obj) = val.coerce_to_object(activation) { if !val.is_of_type(activation, val_class)? { let other_val_class = val_obj - .as_class() + .get_own_class_definition() .ok_or("TypeError: Tried to concat a bare object into a Vector")?; return Err(format!( "TypeError: Cannot coerce Vector value of type {:?} to type {:?}", other_val_class.read().name(), val_class - .as_class() + .get_own_class_definition() .ok_or("TypeError: Tried to concat into a bare object")? .read() .name() diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index 885c78dc9..55c86a8d1 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -131,7 +131,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy /// defined prototype methods for ES3-style classes. fn find_class_for_trait(self, name: &QName<'gc>) -> Result>, Error> { let class = self - .as_class() + .get_own_class_definition() .ok_or("Cannot get base traits on non-class object")?; if class.read().has_instance_trait(name) { @@ -433,7 +433,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy } } - if let Some(class) = from_class_object.as_class() { + if let Some(class) = from_class_object.get_own_class_definition() { self.install_traits(activation, class.read().instance_traits())?; } @@ -698,7 +698,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy })?; let mut class_traits = Vec::new(); superclass_object - .as_class() + .get_own_class_definition() .unwrap() .read() .lookup_instance_traits(name, &mut class_traits)?; @@ -764,7 +764,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy })?; let mut class_traits = Vec::new(); superclass_object - .as_class() + .get_own_class_definition() .unwrap() .read() .lookup_instance_traits(name, &mut class_traits)?; @@ -824,7 +824,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy })?; let mut class_traits = Vec::new(); superclass_object - .as_class() + .get_own_class_definition() .unwrap() .read() .lookup_instance_traits(name, &mut class_traits)?; @@ -923,7 +923,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy /// coercions. fn to_string(&self, mc: MutationContext<'gc, '_>) -> Result, Error> { let class_name = self - .as_class() + .get_own_class_definition() .map(|c| c.read().name().local_name()) .unwrap_or_else(|| "Object".into()); @@ -940,7 +940,7 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy /// of the class that created this object). fn to_locale_string(&self, mc: MutationContext<'gc, '_>) -> Result, Error> { let class_name = self - .as_class() + .get_own_class_definition() .map(|c| c.read().name().local_name()) .unwrap_or_else(|| "Object".into()); @@ -1083,7 +1083,9 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy fn as_ptr(&self) -> *const ObjectPtr; /// Get this object's `Class`, if it has one. - fn as_class(&self) -> Option>> { + /// This this object is already a ClassObject, return its own Class. + /// Note: this probably shouldn't be used in most cases. + fn get_own_class_definition(&self) -> Option>> { let class = match self.as_class_object() { Some(class) => class, None => match self.instance_of() { diff --git a/core/src/avm2/object/class_object.rs b/core/src/avm2/object/class_object.rs index 88c5fc3a7..1f9778cdf 100644 --- a/core/src/avm2/object/class_object.rs +++ b/core/src/avm2/object/class_object.rs @@ -85,7 +85,7 @@ impl<'gc> ClassObject<'gc> { superclass_object: Option>, scope: Option>>, ) -> Result, Error> { - if let Some(base_class) = superclass_object.and_then(|b| b.as_class()) { + if let Some(base_class) = superclass_object.and_then(|b| b.get_own_class_definition()) { if base_class.read().is_final() { return Err(format!( "Base class {:?} is final and cannot be extended", @@ -294,7 +294,7 @@ impl<'gc> ClassObject<'gc> { } let interface = interface.unwrap().coerce_to_object(activation)?; - if let Some(class) = interface.as_class() { + if let Some(class) = interface.get_own_class_definition() { if !class.read().is_interface() { return Err(format!( "Class {:?} is not an interface and cannot be implemented by classes", @@ -530,7 +530,7 @@ impl<'gc> TObject<'gc> for ClassObject<'gc> { nullable_params: &[Value<'gc>], ) -> Result, Error> { let self_class = self - .as_class() + .get_own_class_definition() .ok_or("Attempted to apply type arguments to non-class!")?; if !self_class.read().is_generic() { @@ -570,7 +570,7 @@ impl<'gc> TObject<'gc> for ClassObject<'gc> { class_params.push( param .unwrap_or(activation.avm2().classes().object) - .as_class() + .get_own_class_definition() .ok_or(format!( "Cannot apply class {:?} with non-class parameter", self_class.read().name() diff --git a/core/src/avm2/object/loaderinfo_object.rs b/core/src/avm2/object/loaderinfo_object.rs index 38d57ce87..87c2fd5fd 100644 --- a/core/src/avm2/object/loaderinfo_object.rs +++ b/core/src/avm2/object/loaderinfo_object.rs @@ -123,7 +123,7 @@ impl<'gc> TObject<'gc> for LoaderInfoObject<'gc> { impl_avm2_custom_object_instance!(base); fn value_of(&self, mc: MutationContext<'gc, '_>) -> Result, Error> { - if let Some(class) = self.as_class() { + if let Some(class) = self.get_own_class_definition() { Ok(AvmString::new(mc, format!("[object {}]", class.read().name().local_name())).into()) } else { Ok("[object Object]".into()) diff --git a/core/src/avm2/object/primitive_object.rs b/core/src/avm2/object/primitive_object.rs index 6b665daff..13de17876 100644 --- a/core/src/avm2/object/primitive_object.rs +++ b/core/src/avm2/object/primitive_object.rs @@ -118,7 +118,7 @@ impl<'gc> TObject<'gc> for PrimitiveObject<'gc> { val @ Value::Integer(_) | val @ Value::Unsigned(_) => Ok(val), _ => { let class_name = self - .as_class() + .get_own_class_definition() .map(|c| c.read().name().local_name()) .unwrap_or_else(|| "Object".into()); diff --git a/core/src/avm2/object/script_object.rs b/core/src/avm2/object/script_object.rs index 113d4ec04..6a8e286fa 100644 --- a/core/src/avm2/object/script_object.rs +++ b/core/src/avm2/object/script_object.rs @@ -218,7 +218,7 @@ impl<'gc> TObject<'gc> for ScriptObject<'gc> { } fn to_string(&self, mc: MutationContext<'gc, '_>) -> Result, Error> { - if let Some(class) = self.as_class() { + if let Some(class) = self.get_own_class_definition() { Ok(AvmString::new(mc, format!("[object {}]", class.read().name().local_name())).into()) } else { Ok("[object Object]".into()) @@ -512,7 +512,7 @@ impl<'gc> ScriptObjectData<'gc> { while let Some(class) = cur_class { let cur_static_class = class - .as_class() + .get_own_class_definition() .ok_or("Object is not a class constructor")?; if cur_static_class.read().has_instance_trait(name) { return Ok(true); @@ -573,7 +573,7 @@ impl<'gc> ScriptObjectData<'gc> { while let Some(class) = cur_class { let cur_static_class = class - .as_class() + .get_own_class_definition() .ok_or("Object is not a class constructor")?; if let Some(ns) = cur_static_class .read() @@ -761,7 +761,7 @@ impl<'gc> ScriptObjectData<'gc> { value: Value<'gc>, ) -> Result<(), Error> { if let Some(class) = self.instance_of() { - if let Some(class) = class.as_class() { + if let Some(class) = class.get_own_class_definition() { if class.read().is_sealed() { return Err(format!( "Objects of type {:?} are not dynamic", diff --git a/core/src/avm2/value.rs b/core/src/avm2/value.rs index 0219c86dd..60500e153 100644 --- a/core/src/avm2/value.rs +++ b/core/src/avm2/value.rs @@ -611,7 +611,7 @@ impl<'gc> Value<'gc> { } } - if let Some(static_class) = class.as_class() { + if let Some(static_class) = class.get_own_class_definition() { return Err(format!( "Cannot coerce {:?} to an {:?}", self, @@ -671,7 +671,7 @@ impl<'gc> Value<'gc> { activation: &mut Activation<'_, 'gc, '_>, type_object: Object<'gc>, ) -> Result { - if let Some(type_class) = type_object.as_class() { + if let Some(type_class) = type_object.get_own_class_definition() { if type_class.read().name() == &QName::new(Namespace::public(), "Number") { return Ok(self.is_number()); }