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:
parent
4a43ec0548
commit
3438966a04
|
@ -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)),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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!();
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
);
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue