avm2: Implement AsTypeLate

This commit is contained in:
EmperorBale 2021-04-12 01:41:30 -07:00 committed by Mike Welsh
parent b9d84c0a82
commit c0a56b14c0
1 changed files with 20 additions and 0 deletions

View File

@ -670,6 +670,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
Op::NextValue => self.op_next_value(),
Op::IsType { index } => self.op_is_type(method, index),
Op::IsTypeLate => self.op_is_type_late(),
Op::AsTypeLate => self.op_as_type_late(),
Op::InstanceOf => self.op_instance_of(),
Op::Label => Ok(FrameControl::Continue),
Op::Debug {
@ -2280,6 +2281,25 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
Ok(FrameControl::Continue)
}
fn op_as_type_late(&mut self) -> Result<FrameControl<'gc>, Error> {
let class = self.context.avm2.pop().coerce_to_object(self)?;
let value = self.context.avm2.pop().coerce_to_object(self)?;
if class.as_class().is_none() {
return Err("TypeError: The right-hand side of operator must be a class.".into());
}
let is_instance_of = value.is_instance_of(self, class, true)?;
if is_instance_of {
self.context.avm2.push(value);
} else {
self.context.avm2.push(Value::Null);
}
Ok(FrameControl::Continue)
}
fn op_instance_of(&mut self) -> Result<FrameControl<'gc>, Error> {
let type_object = self.context.avm2.pop().coerce_to_object(self)?;
let value = self.context.avm2.pop().coerce_to_object(self)?;