avm1: Don't fail if base clip is invalid in `GetProperty`/`SetProperty`

This commit is contained in:
Toad06 2023-06-09 00:49:41 +02:00 committed by Nathan Adams
parent 6ec01f3ecb
commit 181aac46b0
5 changed files with 119 additions and 35 deletions

View File

@ -1128,15 +1128,10 @@ impl<'a, 'gc> Activation<'a, 'gc> {
let prop_index = self.context.avm1.pop().coerce_to_f64(self)?;
let path = self.context.avm1.pop();
let (target, clip) = if let Some(target) = self.target_clip() {
(
Some(target),
self.resolve_target_display_object(target, path, true)?,
)
let clip = if let Some(target) = self.target_clip() {
self.resolve_target_display_object(target, path, true)?
} else {
// `path` must be coerced even if the target is invalid.
let _ = path.coerce_to_string(self)?;
(None, None)
self.resolve_target_display_object(self.base_clip(), path, false)?
};
let property = if !prop_index.is_finite() || prop_index <= -1.0 {
@ -1151,20 +1146,15 @@ impl<'a, 'gc> Activation<'a, 'gc> {
}
};
let result = if target.is_some() {
if let Some(clip) = clip {
if let Some(property) = property {
property.get(self, clip)
} else {
avm_warn!(self, "GetProperty: Invalid property {}", prop_index);
Value::Undefined
}
let result = if let Some(clip) = clip {
if let Some(property) = property {
property.get(self, clip)
} else {
avm_warn!(self, "GetProperty: Invalid target {:?}", path);
avm_warn!(self, "GetProperty: Invalid property {}", prop_index);
Value::Undefined
}
} else {
avm_warn!(self, "GetProperty: Invalid base clip");
avm_warn!(self, "GetProperty: Invalid target {:?}", path);
Value::Undefined
};
@ -1899,15 +1889,10 @@ impl<'a, 'gc> Activation<'a, 'gc> {
let prop_index = self.context.avm1.pop().coerce_to_f64(self)?;
let path = self.context.avm1.pop();
let (target, clip) = if let Some(target) = self.target_clip() {
(
Some(target),
self.resolve_target_display_object(target, path, true)?,
)
let clip = if let Some(target) = self.target_clip() {
self.resolve_target_display_object(target, path, true)?
} else {
// `path` must be coerced even if the target is invalid.
let _ = path.coerce_to_string(self)?;
(None, None)
self.resolve_target_display_object(self.base_clip(), path, false)?
};
let property = if !prop_index.is_finite() || prop_index <= -1.0 {
@ -1932,18 +1917,14 @@ impl<'a, 'gc> Activation<'a, 'gc> {
}
};
if target.is_some() {
if let Some(clip) = clip {
if let Some(property) = property {
property.set(self, clip, prop_value)?;
} else {
avm_warn!(self, "SetProperty: Invalid property {}", prop_index);
}
if let Some(clip) = clip {
if let Some(property) = property {
property.set(self, clip, prop_value)?;
} else {
avm_warn!(self, "SetProperty: Invalid target {:?}", path);
avm_warn!(self, "SetProperty: Invalid property {}", prop_index);
}
} else {
avm_warn!(self, "SetProperty: Invalid base clip");
avm_warn!(self, "SetProperty: Invalid target {:?}", path);
};
Ok(FrameControl::Continue)

View File

@ -0,0 +1,37 @@
getProperty('_root.mc3', _X)
123
getProperty('mc3', _X)
undefined
getProperty('clip3', _X)
undefined
setProperty('_root.mc3', _Y, 789)
789
789
setProperty('mc3', _Y, 123)
123
undefined
setProperty('clip3', _Y, 456)
456
undefined
Target not found: Target="/mc2" Base="_level0"
// tellTarget(mc1) { mc2.removeMovieClip() }
getProperty('_root.mc3', _X)
123
getProperty('mc3', _X)
123
getProperty('clip3', _X)
undefined
setProperty('_root.mc3', _Y, 789)
789
789
setProperty('mc3', _Y, 123)
123
123
setProperty('clip3', _Y, 456)
456
undefined

View File

@ -0,0 +1,65 @@
mc1 = _root.createEmptyMovieClip("mc1", _root.getNextHighestDepth());
mc2 = _root.createEmptyMovieClip("mc2", _root.getNextHighestDepth());
mc3 = _root.createEmptyMovieClip("mc3", _root.getNextHighestDepth());
_global.clip3 = mc3;
tellTarget(mc2) {
_root.mc3._x = 123;
_root.mc3._y = 456;
trace("getProperty('_root.mc3', _X)");
trace(getProperty("_root.mc3", _X));
trace("getProperty('mc3', _X)");
trace(getProperty("mc3", _X));
trace("getProperty('clip3', _X)");
trace(getProperty("clip3", _X));
trace("");
trace("setProperty('_root.mc3', _Y, 789)");
trace(setProperty("_root.mc3", _Y, 789));
trace(getProperty("_root.mc3", _Y));
trace("setProperty('mc3', _Y, 123)");
trace(setProperty("mc3", _Y, 123));
trace(getProperty("mc3", _Y));
trace("setProperty('clip3', _Y, 456)");
trace(setProperty("clip3", _Y, 456));
trace(getProperty("clip3", _Y));
trace("");
tellTarget(mc1) {
mc2.removeMovieClip();
}
_root.mc3._x = 123;
_root.mc3._y = 456;
trace("// tellTarget(mc1) { mc2.removeMovieClip() }");
trace("");
trace("getProperty('_root.mc3', _X)");
trace(getProperty("_root.mc3", _X));
trace("getProperty('mc3', _X)");
trace(getProperty("mc3", _X));
trace("getProperty('clip3', _X)");
trace(getProperty("clip3", _X));
trace("");
trace("setProperty('_root.mc3', _Y, 789)");
trace(setProperty("_root.mc3", _Y, 789));
trace(getProperty("_root.mc3", _Y));
trace("setProperty('mc3', _Y, 123)");
trace(setProperty("mc3", _Y, 123));
trace(getProperty("mc3", _Y));
trace("setProperty('clip3', _Y, 456)");
trace(setProperty("clip3", _Y, 456));
trace(getProperty("clip3", _Y));
trace("");
}

View File

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