avm2: Throw proper error when setting name of timeline objects

This commit is contained in:
Nathan Adams 2023-07-23 00:25:26 +02:00
parent 5ee6218ab4
commit 4219f39668
11 changed files with 120 additions and 5 deletions

View File

@ -210,6 +210,17 @@ pub fn verify_error<'gc>(
error_constructor(activation, class, message, code)
}
#[inline(never)]
#[cold]
pub fn illegal_operation_error<'gc>(
activation: &mut Activation<'_, 'gc>,
message: &str,
code: u32,
) -> Result<Value<'gc>, Error<'gc>> {
let class = activation.avm2().classes().illegaloperationerror;
error_constructor(activation, class, message, code)
}
#[inline(never)]
#[cold]
pub fn io_error<'gc>(

View File

@ -1,7 +1,7 @@
//! `flash.display.DisplayObject` builtin/prototype
use crate::avm2::activation::Activation;
use crate::avm2::error::{argument_error, make_error_2008};
use crate::avm2::error::{argument_error, illegal_operation_error, make_error_2008};
use crate::avm2::filters::FilterAvm2Ext;
use crate::avm2::object::{Object, TObject};
use crate::avm2::parameters::ParametersExt;
@ -490,10 +490,11 @@ pub fn set_name<'gc>(
let new_name = args.get_string(activation, 0)?;
if dobj.instantiated_by_timeline() {
return Err(format!(
"Display object {new_name} was placed by the timeline and cannot have it's name changed.",
)
.into());
return Err(Error::AvmError(illegal_operation_error(
activation,
"Error #2078: The name property of a Timeline-placed object cannot be modified.",
2078,
)?));
}
dobj.set_name(activation.context.gc_context, new_name);

View File

@ -0,0 +1,14 @@
// circle.
_level0.circle
// circle._name
circle
// circle._name = "square"
// circle
undefined
// square
_level0.square

View File

@ -0,0 +1 @@
num_frames = 1

View File

@ -0,0 +1,62 @@
package {
import flash.display.MovieClip;
import flash.utils.describeType;
import flash.display.Sprite;
public class Test extends MovieClip {
public function Test() {
trace("// circle.");
trace(circle);
trace("");
trace("// circle.name");
trace(circle.name);
trace("");
trace("// circle.name = \"square\"");
try {
circle.name = "square";
} catch (e) {
trace(e);
}
trace("");
trace("// circle");
trace(circle);
trace("");
trace("// circle.name");
trace(circle.name);
trace("");
trace("// removeChild(circle)");
removeChild(circle);
trace("");
trace("// circle.name = \"square\"");
try {
circle.name = "square";
} catch (e) {
trace(e);
}
trace("");
trace("// addChild(circle)");
addChild(circle);
trace("");
trace("// circle.name = \"square\"");
try {
circle.name = "square";
} catch (e) {
trace(e);
}
trace("");
}
}
}

View File

@ -0,0 +1,25 @@
// circle.
[object MovieClip]
// circle.name
circle
// circle.name = "square"
Error: Error #2078: The name property of a Timeline-placed object cannot be modified.
// circle
[object MovieClip]
// circle.name
circle
// removeChild(circle)
// circle.name = "square"
Error: Error #2078: The name property of a Timeline-placed object cannot be modified.
// addChild(circle)
// circle.name = "square"
Error: Error #2078: The name property of a Timeline-placed object cannot be modified.

View File

@ -0,0 +1 @@
num_frames = 1