avm2: Make missing props on sealed classes throw properly
This commit is contained in:
parent
71571b9594
commit
4a7cb51148
|
@ -166,11 +166,19 @@ impl<'gc> ScriptObjectData<'gc> {
|
|||
};
|
||||
|
||||
let value = self.values.get(&local_name);
|
||||
|
||||
if let Some(value) = 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
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
package {
|
||||
public class Test {}
|
||||
// compiled with mxmlc
|
||||
|
||||
package {
|
||||
import flash.display.MovieClip;
|
||||
public class Test extends MovieClip {
|
||||
public function Test() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ES4Class extends Object {
|
||||
|
@ -51,3 +57,22 @@ x.test_method();
|
|||
ES4Class.test_static();
|
||||
x.test_proto_method();
|
||||
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);
|
||||
|
||||
|
|
|
@ -6,3 +6,8 @@ ES4Class test_method
|
|||
ES4Class test_static
|
||||
ES4Class test_proto_method
|
||||
ES4Class test_get
|
||||
-----------------
|
||||
1
|
||||
Caught missing field
|
||||
1
|
||||
undefined
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue