avm2: `Object.hasOwnProperty`, `propertyIsEnumerable`, and `setPropertyIsEnumerable` only work with public-NS properties.

This commit is contained in:
David Wendt 2021-10-30 12:40:30 -04:00 committed by kmeisthax
parent 9aed0e7db4
commit 039777c41e
10 changed files with 46 additions and 26 deletions

View File

@ -159,14 +159,8 @@ pub fn has_own_property<'gc>(
let name: Result<&Value<'gc>, Error> = args.get(0).ok_or_else(|| "No name specified".into());
let name = name?.coerce_to_string(activation)?;
if let Some(ns) = this.resolve_any(name)? {
if !ns.is_private() {
let qname = QName::new(ns, name);
return Ok(this.has_own_property(&qname)?.into());
}
}
Ok(false.into())
let qname = QName::dynamic_name(name);
Ok(this.has_own_property(&qname)?.into())
}
/// `Object.prototype.isPrototypeOf`
@ -202,14 +196,8 @@ pub fn property_is_enumerable<'gc>(
let name: Result<&Value<'gc>, Error> = args.get(0).ok_or_else(|| "No name specified".into());
let name = name?.coerce_to_string(activation)?;
if let Some(ns) = this.resolve_any(name)? {
if !ns.is_private() {
let qname = QName::new(ns, name);
return Ok(this.property_is_enumerable(&qname).into());
}
}
Ok(false.into())
let qname = QName::dynamic_name(name);
Ok(this.property_is_enumerable(&qname).into())
}
/// `Object.prototype.setPropertyIsEnumerable`
@ -224,16 +212,8 @@ pub fn set_property_is_enumerable<'gc>(
let name = name?.coerce_to_string(activation)?;
if let Some(Value::Bool(is_enum)) = args.get(1) {
if let Some(ns) = this.resolve_any(name)? {
if !ns.is_private() {
let qname = QName::new(ns, name);
this.set_local_property_is_enumerable(
activation.context.gc_context,
&qname,
*is_enum,
)?;
}
}
let qname = QName::dynamic_name(name);
this.set_local_property_is_enumerable(activation.context.gc_context, &qname, *is_enum)?;
}
Ok(Value::Undefined)

View File

@ -707,6 +707,8 @@ swf_tests! {
(as3_qname_tostring, "avm2/qname_tostring", 1),
(as3_qname_valueof, "avm2/qname_valueof", 1),
(as3_getouterscope, "avm2/getouterscope", 1),
(as3_hasownproperty_namespaces, "avm2/hasownproperty_namespaces", 1),
(as3_propertyisenumerable_namespaces, "avm2/propertyisenumerable_namespaces", 1),
}
// TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough.

View File

@ -0,0 +1,12 @@
package {
public class Test {}
}
class ES4Class {
AS3 function as3_prop() {
}
}
trace("///new ES4Class.hasOwnProperty(\"as3_prop\");");
trace(new ES4Class().hasOwnProperty("as3_prop"));

View File

@ -0,0 +1,2 @@
///new ES4Class.hasOwnProperty("as3_prop");
false

View File

@ -0,0 +1,18 @@
package {
public class Test {}
}
dynamic class ES4Class {
AS3 function as3_prop() {
}
}
trace("///new ES4Class.propertyIsEnumerable(\"as3_prop\");");
trace(new ES4Class().propertyIsEnumerable("as3_prop"));
trace("///new ES4Class.setPropertyIsEnumerable(\"as3_prop\", true);");
trace(new ES4Class().setPropertyIsEnumerable("as3_prop", true));
trace("///new ES4Class.propertyIsEnumerable(\"as3_prop\");");
trace(new ES4Class().propertyIsEnumerable("as3_prop"));

View File

@ -0,0 +1,6 @@
///new ES4Class.propertyIsEnumerable("as3_prop");
false
///new ES4Class.setPropertyIsEnumerable("as3_prop", true);
undefined
///new ES4Class.propertyIsEnumerable("as3_prop");
false