avm2: `Array.every/some` should early return

This commit is contained in:
Adrian Wielgosik 2021-05-31 18:05:45 +02:00 committed by kmeisthax
parent 07f979b582
commit 519feb9af7
1 changed files with 12 additions and 6 deletions

View File

@ -446,13 +446,12 @@ pub fn every<'gc>(
.unwrap_or(Value::Null) .unwrap_or(Value::Null)
.coerce_to_object(activation) .coerce_to_object(activation)
.ok(); .ok();
let mut is_every = true;
let mut iter = ArrayIter::new(activation, this)?; let mut iter = ArrayIter::new(activation, this)?;
while let Some(r) = iter.next(activation) { while let Some(r) = iter.next(activation) {
let (i, item) = r?; let (i, item) = r?;
is_every &= callback let result = callback
.call( .call(
receiver, receiver,
&[item, i.into(), this.into()], &[item, i.into(), this.into()],
@ -460,9 +459,13 @@ pub fn every<'gc>(
receiver.and_then(|r| r.proto()), receiver.and_then(|r| r.proto()),
)? )?
.coerce_to_boolean(); .coerce_to_boolean();
if !result {
return Ok(false.into());
}
} }
return Ok(is_every.into()); return Ok(true.into());
} }
Ok(Value::Undefined) Ok(Value::Undefined)
@ -486,13 +489,12 @@ pub fn some<'gc>(
.unwrap_or(Value::Null) .unwrap_or(Value::Null)
.coerce_to_object(activation) .coerce_to_object(activation)
.ok(); .ok();
let mut is_some = false;
let mut iter = ArrayIter::new(activation, this)?; let mut iter = ArrayIter::new(activation, this)?;
while let Some(r) = iter.next(activation) { while let Some(r) = iter.next(activation) {
let (i, item) = r?; let (i, item) = r?;
is_some |= callback let result = callback
.call( .call(
receiver, receiver,
&[item, i.into(), this.into()], &[item, i.into(), this.into()],
@ -500,9 +502,13 @@ pub fn some<'gc>(
receiver.and_then(|r| r.proto()), receiver.and_then(|r| r.proto()),
)? )?
.coerce_to_boolean(); .coerce_to_boolean();
if result {
return Ok(true.into());
}
} }
return Ok(is_some.into()); return Ok(false.into());
} }
Ok(Value::Undefined) Ok(Value::Undefined)