avm1: Don't fail if base clip is invalid in `GetProperty`/`SetProperty`
This commit is contained in:
parent
6ec01f3ecb
commit
181aac46b0
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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("");
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
num_frames = 1
|
Loading…
Reference in New Issue