avm2: Add `any` field to `CommonMultinames` and use it

This should reduce Gc allocations when loading multiname index 0 from the cpool
This commit is contained in:
Lord-McSweeney 2024-09-10 12:15:52 -07:00 committed by Lord-McSweeney
parent 4a43ec0548
commit 3438966a04
10 changed files with 24 additions and 34 deletions

View File

@ -524,7 +524,7 @@ impl<'gc> Class<'gc> {
// A 'callable' class doesn't have a signature - let the
// method do any needed coercions
vec![],
Gc::new(activation.gc(), Multiname::any()),
activation.avm2().multinames.any,
true,
activation.context.gc_context,
);
@ -1029,11 +1029,7 @@ impl<'gc> Class<'gc> {
) {
self.define_instance_trait(
activation.context.gc_context,
Trait::from_const(
name,
activation.avm2().multinames.function,
Some(value),
),
Trait::from_const(name, activation.avm2().multinames.function, Some(value)),
);
}

View File

@ -433,10 +433,7 @@ fn describe_internal_body<'gc>(
let setter = vtable
.get_full_method(*set)
.unwrap_or_else(|| panic!("Missing 'set' method for id {set:?}"));
(
setter.method.signature()[0].param_type_name.clone(),
setter.class,
)
(setter.method.signature()[0].param_type_name, setter.class)
} else {
unreachable!();
};

View File

@ -7,9 +7,7 @@ use crate::avm2::globals::number::print_with_radix;
use crate::avm2::method::{Method, NativeMethodImpl, ParamConfig};
use crate::avm2::object::{primitive_allocator, FunctionObject, Object, TObject};
use crate::avm2::value::Value;
use crate::avm2::{AvmString, Error, Multiname, QName};
use gc_arena::Gc;
use crate::avm2::{AvmString, Error, QName};
/// Implements `int`'s instance initializer.
fn instance_init<'gc>(
@ -229,10 +227,10 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
"<int instance initializer>",
vec![ParamConfig {
param_name: AvmString::new_utf8(activation.context.gc_context, "value"),
param_type_name: Gc::new(mc, Multiname::any()),
param_type_name: activation.avm2().multinames.any,
default_value: Some(Value::Integer(0)),
}],
Gc::new(mc, Multiname::any()),
activation.avm2().multinames.any,
true,
mc,
),

View File

@ -7,11 +7,8 @@ use crate::avm2::object::{FunctionObject, Object, TObject};
use crate::avm2::traits::Trait;
use crate::avm2::value::Value;
use crate::avm2::Error;
use crate::avm2::Multiname;
use crate::avm2::QName;
use gc_arena::Gc;
/// Implements `Object`'s instance initializer.
pub fn instance_init<'gc>(
_activation: &mut Activation<'_, 'gc>,
@ -281,7 +278,7 @@ pub fn create_i_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
has_own_property,
vec![ParamConfig::optional(
"name",
Gc::new(gc_context, Multiname::any()),
activation.avm2().multinames.any,
Value::Undefined,
)],
activation.avm2().multinames.boolean,
@ -291,7 +288,7 @@ pub fn create_i_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
is_prototype_of,
vec![ParamConfig::optional(
"theClass",
Gc::new(gc_context, Multiname::any()),
activation.avm2().multinames.any,
Value::Undefined,
)],
activation.avm2().multinames.boolean,
@ -301,7 +298,7 @@ pub fn create_i_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
property_is_enumerable,
vec![ParamConfig::optional(
"name",
Gc::new(gc_context, Multiname::any()),
activation.avm2().multinames.any,
Value::Undefined,
)],
activation.avm2().multinames.boolean,

View File

@ -7,9 +7,7 @@ use crate::avm2::globals::number::print_with_radix;
use crate::avm2::method::{Method, NativeMethodImpl, ParamConfig};
use crate::avm2::object::{primitive_allocator, FunctionObject, Object, TObject};
use crate::avm2::value::Value;
use crate::avm2::{AvmString, Error, Multiname, QName};
use gc_arena::Gc;
use crate::avm2::{AvmString, Error, QName};
/// Implements `uint`'s instance initializer.
fn instance_init<'gc>(
@ -230,10 +228,10 @@ pub fn create_class<'gc>(activation: &mut Activation<'_, 'gc>) -> Class<'gc> {
"<uint instance initializer>",
vec![ParamConfig {
param_name: AvmString::new_utf8(activation.context.gc_context, "value"),
param_type_name: Gc::new(mc, Multiname::any()),
param_type_name: activation.avm2().multinames.any,
default_value: Some(Value::Integer(0)),
}],
Gc::new(mc, Multiname::any()),
activation.avm2().multinames.any,
true,
mc,
),

View File

@ -166,7 +166,7 @@ impl<'gc> BytecodeMethod<'gc> {
let abc = txunit.abc();
let mut signature = Vec::new();
let mut return_type = Gc::new(mc, Multiname::any());
let mut return_type = activation.avm2().multinames.any;
let mut abc_method_body = None;
if abc.methods.get(abc_method.0 as usize).is_some() {

View File

@ -523,6 +523,8 @@ impl<'gc> From<QName<'gc>> for Multiname<'gc> {
#[derive(Collect)]
#[collect(no_drop)]
pub struct CommonMultinames<'gc> {
pub any: Gc<'gc, Multiname<'gc>>,
pub boolean: Gc<'gc, Multiname<'gc>>,
pub function: Gc<'gc, Multiname<'gc>>,
pub int: Gc<'gc, Multiname<'gc>>,
@ -535,9 +537,11 @@ impl<'gc> CommonMultinames<'gc> {
context: &mut GcContext<'_, 'gc>,
public_namespace_base_version: Namespace<'gc>,
) -> Self {
let mc = context.gc_context;
let mut create_pub_multiname = |local_name: &'static [u8]| -> Gc<'gc, Multiname<'gc>> {
Gc::new(
context.gc_context,
mc,
Multiname::new(
public_namespace_base_version,
context
@ -548,6 +552,7 @@ impl<'gc> CommonMultinames<'gc> {
};
Self {
any: Gc::new(mc, Multiname::any()),
boolean: create_pub_multiname(b"Boolean"),
function: create_pub_multiname(b"Function"),
int: create_pub_multiname(b"int"),

View File

@ -8,7 +8,7 @@ use crate::avm2::object::script_object::{ScriptObject, ScriptObjectData};
use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject};
use crate::avm2::scope::ScopeChain;
use crate::avm2::value::Value;
use crate::avm2::{Error, Multiname};
use crate::avm2::Error;
use core::fmt;
use gc_arena::barrier::unlock;
use gc_arena::{
@ -39,7 +39,7 @@ pub fn function_allocator<'gc>(
name: "<Empty Function>",
signature: vec![],
resolved_signature: GcCell::new(mc, None),
return_type: Gc::new(mc, Multiname::any()),
return_type: activation.avm2().multinames.any,
is_variadic: true,
},
);

View File

@ -392,8 +392,7 @@ impl<'gc> TranslationUnit<'gc> {
context: &mut UpdateContext<'gc>,
) -> Result<Gc<'gc, Multiname<'gc>>, Error<'gc>> {
if multiname_index.0 == 0 {
let mc = context.gc_context;
Ok(Gc::new(mc, Multiname::any()))
Ok(context.avm2.multinames.any)
} else {
self.pool_multiname_static(multiname_index, context)
}

View File

@ -460,13 +460,13 @@ impl<'gc> VTable<'gc> {
type_name, unit, ..
} => (
Property::new_slot(new_slot_id),
PropertyClass::name(mc, type_name.clone(), *unit),
PropertyClass::name(mc, *type_name, *unit),
),
TraitKind::Const {
type_name, unit, ..
} => (
Property::new_const_slot(new_slot_id),
PropertyClass::name(mc, type_name.clone(), *unit),
PropertyClass::name(mc, *type_name, *unit),
),
TraitKind::Class { class, .. } => (
Property::new_const_slot(new_slot_id),