Skip to content

Commit

Permalink
avm2: Add many more ops to optimizer
Browse files Browse the repository at this point in the history
  • Loading branch information
Lord-McSweeney authored and Lord-McSweeney committed Mar 24, 2024
1 parent 9f44281 commit 530319c
Showing 1 changed file with 74 additions and 11 deletions.
85 changes: 74 additions & 11 deletions core/src/avm2/optimize.rs
Expand Up @@ -406,6 +406,11 @@ pub fn optimize<'gc>(
stack.pop();
stack.push_any();
}
Op::NegateI => {
stack.pop();
stack.pop();
stack.push_any();
}
Op::Add => {
let value2 = stack.pop_or_any();
let value1 = stack.pop_or_any();
Expand Down Expand Up @@ -497,6 +502,10 @@ pub fn optimize<'gc>(
Op::NewClass { .. } => {
stack.push_class_object(types.class);
}
Op::NewCatch { .. } => {
// Avoid handling for now
stack.push_any();
}
Op::IsType { .. } => {
stack.pop();
stack.push_class_object(types.boolean);
Expand All @@ -506,6 +515,10 @@ pub fn optimize<'gc>(
stack.pop();
stack.push_class_object(types.boolean);
}
Op::TypeOf => {
stack.pop();
stack.push_class_object(types.string);
}
Op::ApplyType { num_types } => {
stack.popn(*num_types);

Expand Down Expand Up @@ -580,15 +593,23 @@ pub fn optimize<'gc>(
Op::PopScope => {
scope_stack.pop();
}
Op::GetScopeObject { .. } => {
// Avoid handling for now
stack.push_any();
}
Op::Pop => {
stack.pop();
}
Op::Dup => {
let stack_value = stack.pop();
if let Some(stack_value) = stack_value {
stack.push(stack_value);
stack.push(stack_value);
}
let stack_value = stack.pop_or_any();
stack.push(stack_value);
stack.push(stack_value);
}
Op::Swap => {
let first = stack.pop_or_any();
let second = stack.pop_or_any();
stack.push(first);
stack.push(second);
}
Op::Kill { index } => {
local_types.set_any(*index as usize);
Expand Down Expand Up @@ -616,6 +637,43 @@ pub fn optimize<'gc>(
// Avoid handling for now
stack.push_any();
}
Op::FindDef { .. } => {
// Avoid handling for now
stack.push_any();
}
Op::In => {
stack.pop();
stack.pop();
stack.push_class_object(types.boolean);
}
Op::NextName => {
stack.pop();
stack.pop();
stack.push_any();
}
Op::NextValue => {
stack.pop();
stack.pop();
stack.push_any();
}
Op::HasNext2 {
index_register,
object_register,
} => {
stack.push_class_object(types.boolean);
local_types.set_any(*index_register as usize);
local_types.set_any(*object_register as usize);
}
Op::GetSlot { .. } => {
stack.pop();

// Avoid handling type for now
stack.push_any();
}
Op::SetSlot { .. } => {
stack.pop();
stack.pop();
}
Op::GetProperty { multiname } => {
let mut stack_push_done = false;
stack.pop_for_multiname(*multiname);
Expand Down Expand Up @@ -667,12 +725,6 @@ pub fn optimize<'gc>(
stack.push_any();
}
}
Op::GetSlot { .. } => {
stack.pop();

// Avoid handling type for now
stack.push_any();
}
Op::InitProperty { multiname } => {
stack.pop();
stack.pop_for_multiname(*multiname);
Expand Down Expand Up @@ -710,6 +762,11 @@ pub fn optimize<'gc>(
}
// `stack_pop_multiname` handled lazy
}
Op::DeleteProperty { multiname } => {
stack.pop_for_multiname(*multiname);

stack.pop();
}
Op::Construct { num_args } => {
// Arguments
stack.popn(*num_args);
Expand Down Expand Up @@ -826,6 +883,12 @@ pub fn optimize<'gc>(
value.contains_valid_integer = true;
stack.push(value);
}
Op::Sxi8 | Op::Sxi16 => {
stack.pop();
let mut value = OptValue::of_type(types.int);
value.contains_valid_integer = true;
stack.push(value);
}
Op::Li32 => {
stack.pop();
stack.push_class_object(types.int);
Expand Down

0 comments on commit 530319c

Please sign in to comment.