avm2: Return correct error if Event.clone() returns null
This commit is contained in:
parent
925ed2e82b
commit
e8bc47a569
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
|
@ -0,0 +1,3 @@
|
|||
first handler called
|
||||
CustomEvent cloned!
|
||||
TypeError: Error #2007: Parameter event must be non-null.
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
num_ticks = 1
|
Loading…
Reference in New Issue