avm2: Return correct error if Event.clone() returns null

This commit is contained in:
sleepycatcoding 2023-08-04 22:11:44 +03:00 committed by Nathan Adams
parent 925ed2e82b
commit e8bc47a569
6 changed files with 69 additions and 1 deletions

View File

@ -1,6 +1,7 @@
//! Core event structure
use crate::avm2::activation::Activation;
use crate::avm2::error::type_error;
use crate::avm2::object::{Object, TObject};
use crate::avm2::value::Value;
use crate::avm2::Error;
@ -457,7 +458,19 @@ pub fn dispatch_event<'gc>(
let event = if dispatched {
event
.call_public_property("clone", &[], activation)?
.coerce_to_object(activation)?
.coerce_to_object(activation)
.map_err(|_| {
let error = type_error(
activation,
&format!("Error #2007: Parameter event must be non-null."),
2007,
);
match error {
Err(e) => e,
Ok(e) => Error::AvmError(e),
}
})?
} else {
event
};

View File

@ -0,0 +1,15 @@
package {
import flash.events.Event;
public class CustomEvent extends Event {
public function CustomEvent(type:String, bubbles:Boolean, cancelable:Boolean) {
super(type, bubbles, cancelable);
}
override public function clone():Event {
trace("CustomEvent cloned!");
return null;
}
}
}

View File

@ -0,0 +1,36 @@
package
{
import flash.display.Sprite;
public class Test extends Sprite
{
}
}
import flash.events.EventDispatcher;
import flash.events.Event;
var event:CustomEvent = new CustomEvent("custom", false, false);
var dispatcher1:EventDispatcher = new EventDispatcher();
var dispatcher2:EventDispatcher = new EventDispatcher();
dispatcher1.addEventListener("custom", function(event:CustomEvent):void
{
trace("first handler called");
try
{
dispatcher2.dispatchEvent(event);
}
catch (e:TypeError)
{
trace(e);
}
});
dispatcher2.addEventListener("custom", function(event:CustomEvent):void
{
trace("second handler called");
});
dispatcher1.dispatchEvent(event);

View File

@ -0,0 +1,3 @@
first handler called
CustomEvent cloned!
TypeError: Error #2007: Parameter event must be non-null.

View File

@ -0,0 +1 @@
num_ticks = 1