Skip to content

Commit a797456

Browse files
committed
avm1: Ignore primitives in __resolve logic.
See the added test-cases in `avm1/object_resolve.`
1 parent fba7fae commit a797456

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

core/src/avm1/object.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,8 +452,10 @@ pub fn find_resolve_method<'gc>(
452452
return Err(Error::PrototypeRecursionLimit);
453453
}
454454

455-
if let Some(value) = p.get_local_stored(istr!("__resolve"), activation, false) {
456-
return Ok(Some(value.coerce_to_object(activation)));
455+
let resolve = p.get_local_stored(istr!("__resolve"), activation, false);
456+
// FP completely skips over primitives (but not over non-function objects).
457+
if let Some(Value::Object(value)) = resolve {
458+
return Ok(Some(value));
457459
}
458460

459461
proto = p.proto(activation);

tests/tests/swfs/avm1/object_resolve/Test.as

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ class Test {
5454

5555
trace("");
5656

57+
trace("// object.__resolve = 42");
58+
object.__resolve = 42;
59+
trace("object.object: " + object.object);
60+
trace("// object.__resolve = _root");
61+
object.__resolve = _root;
62+
trace("object.object: " + object.object);
63+
trace("// object.__resolve = {}");
64+
object.__resolve = {};
65+
trace("object.object: " + object.object);
66+
67+
trace("");
68+
5769
object = {};
5870
object.addProperty("__resolve", function() {return function() {return "resolved!";}}, null);
5971
trace("object.foo with an addProperty __resolve: " + object.foo);

tests/tests/swfs/avm1/object_resolve/output.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,13 @@ object.function: [type Function]
2626
object.function(): undefined
2727
object.hasOwnProperty("function"): false
2828

29+
// object.__resolve = 42
30+
// Proto.prototype.__resolve function called!
31+
object.object: [object Object]
32+
// object.__resolve = _root
33+
// Proto.prototype.__resolve function called!
34+
object.object: [object Object]
35+
// object.__resolve = {}
36+
object.object: undefined
37+
2938
object.foo with an addProperty __resolve: undefined
63 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)