avm2: Add utilities for formatting `Multiname`s and class instances' names.

This commit is contained in:
David Wendt 2022-02-07 23:34:21 -05:00 committed by Mike Welsh
parent e8d5274a18
commit 2ec606c5cb
2 changed files with 40 additions and 0 deletions

View File

@ -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(&param.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<QName<'gc>> for Multiname<'gc> {

View File

@ -815,6 +815,13 @@ pub trait TObject<'gc>: 'gc + Collect + Debug + Into<Object<'gc>> + 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(|| "<Unknown type>".into())
}
fn set_instance_of(&self, mc: MutationContext<'gc, '_>, instance_of: ClassObject<'gc>) {
let instance_vtable = instance_of.instance_vtable();