From b07c0a99eac82671625605e05bf8d9cdd9d17558 Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Sun, 4 Feb 2024 08:58:45 -0800 Subject: [PATCH] avm2: Also optimize `CallProperty` to `CallMethod` when possible --- core/src/avm2/verify.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/src/avm2/verify.rs b/core/src/avm2/verify.rs index 1c744af9d..e7e81280c 100644 --- a/core/src/avm2/verify.rs +++ b/core/src/avm2/verify.rs @@ -1314,13 +1314,27 @@ fn optimize<'gc>( } // Then receiver. - stack.pop(); + let stack_value = stack.pop(); let multiname = method .translation_unit() .pool_maybe_uninitialized_multiname(*name_index, &mut activation.context); if let Ok(multiname) = multiname { - if multiname.has_lazy_component() { + if !multiname.has_lazy_component() { + if let Some(ValueType::Class(class)) = stack_value { + if !class.inner_class_definition().read().is_interface() { + match class.instance_vtable().get_trait(&multiname) { + Some(Property::Method { disp_id }) => { + *op = Op::CallMethod { + num_args: *num_args, + index: Index::new(disp_id), + }; + } + _ => {} + } + } + } + } else { // Avoid handling lazy for now stack.clear(); }