avm1: Enumerate should push Undefined if the target isn't an object

This commit is contained in:
Callum Thomson 2022-08-26 21:01:42 +00:00 committed by GitHub
parent 249648674c
commit 046514eeb9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 113 additions and 2 deletions

View File

@ -988,8 +988,8 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
fn action_enumerate(&mut self) -> Result<FrameControl<'gc>, Error<'gc>> {
let name_value = self.context.avm1.pop();
let name = name_value.coerce_to_string(self)?;
self.context.avm1.push(Value::Null); // Sentinel that indicates end of enumeration
let object: Value<'gc> = self.get_variable(name)?.into();
self.context.avm1.push(Value::Undefined); // Sentinel that indicates end of enumeration
match object {
Value::Object(ob) => {
@ -1006,7 +1006,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
fn action_enumerate_2(&mut self) -> Result<FrameControl<'gc>, Error<'gc>> {
let value = self.context.avm1.pop();
self.context.avm1.push(Value::Null); // Sentinel that indicates end of enumeration
self.context.avm1.push(Value::Undefined); // Sentinel that indicates end of enumeration
if let Value::Object(object) = value {
for k in object.get_keys(self).into_iter().rev() {

View File

@ -31,3 +31,63 @@ for(e in this.obj)
{
trace(e);
}
// The following is added via JPEXS
trace("// enumerate(undefined)")
trace(enumerate(undefined))
trace("// enumerate(null)")
trace(enumerate(null))
trace("// enumerate(10)")
trace(enumerate(10))
trace("// enumerate(10.0)")
trace(enumerate(10.0))
trace("// enumerate(false)")
trace(enumerate(false))
trace("// enumerate(true)")
trace(enumerate(true))
trace("// enumerate('Test string')")
trace(enumerate('Test string'))
trace("// enumerate({'a': 1})")
trace(enumerate({'a': 1}))
trace("// enumerate2(undefined)")
trace(enumerate2(undefined))
trace("// enumerate2(null)")
trace(enumerate2(null))
trace("// enumerate2(10)")
trace(enumerate2(10))
trace("// enumerate2(10.0)")
trace(enumerate2(10.0))
trace("// enumerate2(false)")
trace(enumerate2(false))
trace("// enumerate2(true)")
trace(enumerate2(true))
trace("// enumerate2('Test string')")
trace(enumerate2('Test string'))
trace("// enumerate2({'a': 1})")
trace(enumerate2({'a': 1}))
var x = {'a': 1};
trace("// enumerate({'a': 1} (indirect))")
trace(enumerate("x"))
var x = null;
trace("// enumerate(null (indirect)")
trace(enumerate("x"))
var x = undefined;
trace("// enumerate(undefined (indirect)")
trace(enumerate("x"))
var x = 10;
trace("// enumerate(10 (indirect)")
trace(enumerate("x"))
var x = 10.0;
trace("// enumerate(10.0 (indirect)")
trace(enumerate("x"))
var x = false;
trace("// enumerate(false (indirect)")
trace(enumerate("x"))
var x = true;
trace("// enumerate(true (indirect)")
trace(enumerate("x"))
var x = "Test string";
trace("// enumerate('Test string' (indirect)")
trace(enumerate("x"))

View File

@ -11,3 +11,54 @@ def
// this.obj (GetMember)
ghi
jkl
// enumerate(undefined)
undefined
// enumerate(null)
undefined
// enumerate(10)
undefined
// enumerate(10.0)
undefined
// enumerate(false)
undefined
// enumerate(true)
undefined
// enumerate('Test string')
undefined
// enumerate({'a': 1})
ghi
jkl
// enumerate2(undefined)
undefined
// enumerate2(null)
undefined
// enumerate2(10)
undefined
// enumerate2(10.0)
undefined
// enumerate2(false)
undefined
// enumerate2(true)
undefined
// enumerate2('Test string')
undefined
// enumerate2({'a': 1})
a
undefined
// enumerate({'a': 1} (indirect))
a
undefined
// enumerate(null (indirect))
undefined
// enumerate(undefined (indirect))
undefined
// enumerate(10 (indirect))
undefined
// enumerate(10.0 (indirect))
undefined
// enumerate(false (indirect))
undefined
// enumerate(true (indirect))
undefined
// enumerate('Test string' (indirect))
undefined