avm2: Make missing props on sealed classes throw properly

This commit is contained in:
Adrian Wielgosik 2022-08-11 19:46:36 +02:00 committed by Adrian Wielgosik
parent 71571b9594
commit 4a7cb51148
5 changed files with 44 additions and 6 deletions

View File

@ -166,11 +166,19 @@ impl<'gc> ScriptObjectData<'gc> {
}; };
let value = self.values.get(&local_name); let value = self.values.get(&local_name);
if let Some(value) = value { if let Some(value) = value {
return Ok(*value); return Ok(*value);
} else if let Some(proto) = self.proto() { }
return proto.get_property_local(multiname, activation);
// follow the prototype chain
let mut proto = self.proto();
while let Some(obj) = proto {
let obj = obj.base();
let value = obj.values.get(&local_name);
if let Some(value) = value {
return Ok(*value);
}
proto = obj.proto();
} }
// Special case: Unresolvable properties on dynamic classes are treated // Special case: Unresolvable properties on dynamic classes are treated

View File

@ -1,5 +1,11 @@
package { // compiled with mxmlc
public class Test {}
package {
import flash.display.MovieClip;
public class Test extends MovieClip {
public function Test() {
}
}
} }
class ES4Class extends Object { class ES4Class extends Object {
@ -51,3 +57,22 @@ x.test_method();
ES4Class.test_static(); ES4Class.test_static();
x.test_proto_method(); x.test_proto_method();
trace(x.test_get); trace(x.test_get);
trace("-----------------")
class SealedClass{}
SealedClass.prototype.field = 1;
x = new SealedClass();
trace(x.field);
try {
trace(x.nofield);
} catch (e) {
trace("Caught missing field")
}
dynamic class DynamicClass{}
DynamicClass.prototype.field = 1;
x = new DynamicClass();
trace(x.field);
trace(x.nofield);

View File

@ -6,3 +6,8 @@ ES4Class test_method
ES4Class test_static ES4Class test_static
ES4Class test_proto_method ES4Class test_proto_method
ES4Class test_get ES4Class test_get
-----------------
1
Caught missing field
1
undefined