From 2ec606c5cb9b40c619ec0cb7b81e743ba242ff66 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 7 Feb 2022 23:34:21 -0500 Subject: [PATCH] avm2: Add utilities for formatting `Multiname`s and class instances' names. --- core/src/avm2/names.rs | 33 +++++++++++++++++++++++++++++++++ core/src/avm2/object.rs | 7 +++++++ 2 files changed, 40 insertions(+) diff --git a/core/src/avm2/names.rs b/core/src/avm2/names.rs index 6c4cfc597..381d3e1e6 100644 --- a/core/src/avm2/names.rs +++ b/core/src/avm2/names.rs @@ -602,6 +602,39 @@ impl<'gc> Multiname<'gc> { pub fn params(&self) -> &[Multiname<'gc>] { &self.params[..] } + + pub fn to_qualified_name(&self, mc: MutationContext<'gc, '_>) -> AvmString<'gc> { + let mut uri = WString::new(); + let ns = match self.ns.get(0).filter(|_| self.ns.len() == 1) { + Some(Namespace::Any) => "*".into(), + Some(ns) => ns.as_uri(), + None => "".into(), + }; + + uri.push_str(&ns); + + if let Some(name) = self.name { + uri.push_str(WStr::from_units(b"::")); + uri.push_str(&name); + } else { + uri.push_str(WStr::from_units(b"::*")); + } + + if !self.params.is_empty() { + uri.push_str(WStr::from_units(b"<")); + + for (i, param) in self.params.iter().enumerate() { + uri.push_str(¶m.to_qualified_name(mc)); + if i < self.params.len() - 1 { + uri.push_str(WStr::from_units(b",")); + } + } + + uri.push_str(WStr::from_units(b">")); + } + + AvmString::new(mc, uri) + } } impl<'gc> From> for Multiname<'gc> { diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index 282ab20c7..34de068e8 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -815,6 +815,13 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into> + Clone + Copy self.instance_of().map(|cls| cls.inner_class_definition()) } + /// Get this object's class's name, formatted for debug output. + fn instance_of_class_name(&self, mc: MutationContext<'gc, '_>) -> AvmString<'gc> { + self.instance_of_class_definition() + .map(|r| r.read().name().to_qualified_name(mc)) + .unwrap_or_else(|| "".into()) + } + fn set_instance_of(&self, mc: MutationContext<'gc, '_>, instance_of: ClassObject<'gc>) { let instance_vtable = instance_of.instance_vtable();