From 519feb9af7d6fa03dc923741aefedced9894211f Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Mon, 31 May 2021 18:05:45 +0200 Subject: [PATCH] avm2: `Array.every/some` should early return --- core/src/avm2/globals/array.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/src/avm2/globals/array.rs b/core/src/avm2/globals/array.rs index d05cb8883..8ed8327ff 100644 --- a/core/src/avm2/globals/array.rs +++ b/core/src/avm2/globals/array.rs @@ -446,13 +446,12 @@ pub fn every<'gc>( .unwrap_or(Value::Null) .coerce_to_object(activation) .ok(); - let mut is_every = true; let mut iter = ArrayIter::new(activation, this)?; while let Some(r) = iter.next(activation) { let (i, item) = r?; - is_every &= callback + let result = callback .call( receiver, &[item, i.into(), this.into()], @@ -460,9 +459,13 @@ pub fn every<'gc>( receiver.and_then(|r| r.proto()), )? .coerce_to_boolean(); + + if !result { + return Ok(false.into()); + } } - return Ok(is_every.into()); + return Ok(true.into()); } Ok(Value::Undefined) @@ -486,13 +489,12 @@ pub fn some<'gc>( .unwrap_or(Value::Null) .coerce_to_object(activation) .ok(); - let mut is_some = false; let mut iter = ArrayIter::new(activation, this)?; while let Some(r) = iter.next(activation) { let (i, item) = r?; - is_some |= callback + let result = callback .call( receiver, &[item, i.into(), this.into()], @@ -500,9 +502,13 @@ pub fn some<'gc>( receiver.and_then(|r| r.proto()), )? .coerce_to_boolean(); + + if result { + return Ok(true.into()); + } } - return Ok(is_some.into()); + return Ok(false.into()); } Ok(Value::Undefined)