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);
|
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
|
||||||
|
|
|
@ -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 {
|
||||||
|
@ -50,4 +56,23 @@ trace(x.test_proto_var);
|
||||||
x.test_method();
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue