avm1: Enumerate should push Undefined if the target isn't an object
This commit is contained in:
parent
249648674c
commit
046514eeb9
|
@ -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() {
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue