avm2: Use interned "*" character in `PropertyClass::get_name` and `Multiname::to_qualified_name_or_star`

This commit is contained in:
Lord-McSweeney 2024-09-11 08:51:13 -07:00 committed by Lord-McSweeney
parent 3438966a04
commit b3769aa6f2
4 changed files with 22 additions and 11 deletions

View File

@ -302,7 +302,8 @@ fn describe_internal_body<'gc>(
if !flags.contains(DescribeTypeFlags::INCLUDE_VARIABLES) {
continue;
}
let prop_class_name = vtable.slot_class_name(mc, *slot_id)?;
let prop_class_name =
vtable.slot_class_name(&mut activation.borrow_gc(), *slot_id)?;
let access = match prop {
Property::ConstSlot { .. } => "readonly",
@ -356,7 +357,10 @@ fn describe_internal_body<'gc>(
continue;
}
let return_type_name = method.method.return_type().to_qualified_name_or_star(mc);
let return_type_name = method
.method
.return_type()
.to_qualified_name_or_star(&mut activation.borrow_gc());
let declared_by = method.class;
if flags.contains(DescribeTypeFlags::HIDE_OBJECT)
@ -453,7 +457,8 @@ fn describe_internal_body<'gc>(
Some(ns.as_uri())
};
let accessor_type = method_type.to_qualified_name_or_star(mc);
let accessor_type =
method_type.to_qualified_name_or_star(&mut activation.borrow_gc());
let declared_by = defining_class.dollar_removed_name(mc).to_qualified_name(mc);
let accessor_obj = activation
@ -541,7 +546,7 @@ fn write_params<'gc>(
for param in method.signature() {
let param_type_name = param
.param_type_name
.to_qualified_name_or_star(activation.context.gc_context);
.to_qualified_name_or_star(&mut activation.borrow_gc());
let optional = param.default_value.is_some();
let param_obj = activation
.avm2()

View File

@ -464,9 +464,11 @@ impl<'gc> Multiname<'gc> {
/// Like `to_qualified_name`, but returns `*` if `self.is_any()` is true.
/// This is used by `describeType`
pub fn to_qualified_name_or_star(&self, mc: &Mutation<'gc>) -> AvmString<'gc> {
pub fn to_qualified_name_or_star(&self, context: &mut GcContext<'_, 'gc>) -> AvmString<'gc> {
let mc = context.gc_context;
if self.is_any_name() {
AvmString::new_utf8(mc, "*")
context.interner.get_char(mc, '*' as u16)
} else {
self.to_qualified_name(mc)
}

View File

@ -5,6 +5,7 @@ use crate::avm2::Error;
use crate::avm2::Multiname;
use crate::avm2::TranslationUnit;
use crate::avm2::Value;
use crate::context::GcContext;
use crate::string::AvmString;
use gc_arena::{Collect, Gc, Mutation};
@ -128,11 +129,13 @@ impl<'gc> PropertyClass<'gc> {
}
}
pub fn get_name(&self, mc: &Mutation<'gc>) -> AvmString<'gc> {
pub fn get_name(&self, context: &mut GcContext<'_, 'gc>) -> AvmString<'gc> {
let mc = context.gc_context;
match self {
PropertyClass::Class(class) => class.name().to_qualified_name(mc),
PropertyClass::Name(gc) => gc.0.to_qualified_name_or_star(mc),
PropertyClass::Any => AvmString::new_utf8(mc, "*"),
PropertyClass::Name(gc) => gc.0.to_qualified_name_or_star(context),
PropertyClass::Any => context.interner.get_char(mc, '*' as u16),
}
}
}

View File

@ -8,6 +8,7 @@ use crate::avm2::scope::ScopeChain;
use crate::avm2::traits::{Trait, TraitKind};
use crate::avm2::value::Value;
use crate::avm2::{Class, Error, Multiname, Namespace, QName};
use crate::context::GcContext;
use crate::string::AvmString;
use gc_arena::{Collect, GcCell, Mutation};
use std::cell::Ref;
@ -114,7 +115,7 @@ impl<'gc> VTable<'gc> {
pub fn slot_class_name(
&self,
mc: &Mutation<'gc>,
context: &mut GcContext<'_, 'gc>,
slot_id: u32,
) -> Result<AvmString<'gc>, Error<'gc>> {
self.0
@ -122,7 +123,7 @@ impl<'gc> VTable<'gc> {
.slot_classes
.get(slot_id as usize)
.ok_or_else(|| "Invalid slot ID".into())
.map(|c| c.get_name(mc))
.map(|c| c.get_name(context))
}
pub fn get_trait(self, name: &Multiname<'gc>) -> Option<Property> {