From e6e92dd1754c217048677c8b246ad7a1d040fbf0 Mon Sep 17 00:00:00 2001 From: Moulins Date: Fri, 13 Sep 2024 20:22:37 +0200 Subject: [PATCH] avm2: Also use avmplus' qsort in `Vector.sort` This was forgotten in #17846. --- core/src/avm2/globals/array.rs | 4 +++- core/src/avm2/globals/vector.rs | 29 ++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/core/src/avm2/globals/array.rs b/core/src/avm2/globals/array.rs index 43ade131d..87401dedb 100644 --- a/core/src/avm2/globals/array.rs +++ b/core/src/avm2/globals/array.rs @@ -903,7 +903,9 @@ where /// will permute the slice arbitrarily, but won't return an error. /// /// Original code: https://github.com/adobe/avmplus/blob/master/core/ArrayClass.cpp#L637 -fn qsort( +/// +/// NOTE: this is `pub(super)` so it can be called by `vector::sort`. +pub(super) fn qsort( slice: &mut [T], cmp: &mut impl FnMut(&T, &T) -> Result, ) -> Result<(), E> { diff --git a/core/src/avm2/globals/vector.rs b/core/src/avm2/globals/vector.rs index 1d489a4b3..eb97ae9e3 100644 --- a/core/src/avm2/globals/vector.rs +++ b/core/src/avm2/globals/vector.rs @@ -764,6 +764,8 @@ pub fn slice<'gc>( } /// Implements `Vector.sort` +/// +/// TODO: Consider sharing this code with `globals::array::sort`? pub fn sort<'gc>( activation: &mut Activation<'_, 'gc>, this: Object<'gc>, @@ -813,21 +815,18 @@ pub fn sort<'gc>( drop(vs); let mut unique_sort_satisfied = true; - let mut error_signal = Ok(()); - values.sort_unstable_by(|a, b| match compare(activation, *a, *b) { - Ok(Ordering::Equal) => { - unique_sort_satisfied = false; - Ordering::Equal - } - Ok(v) if options.contains(SortOptions::DESCENDING) => v.reverse(), - Ok(v) => v, - Err(e) => { - error_signal = Err(e); - Ordering::Less - } - }); - - error_signal?; + super::array::qsort(&mut values, &mut |a, b| { + compare(activation, *a, *b).map(|cmp| { + if cmp == Ordering::Equal { + unique_sort_satisfied = false; + Ordering::Equal + } else if options.contains(SortOptions::DESCENDING) { + cmp.reverse() + } else { + cmp + } + }) + })?; //NOTE: RETURNINDEXEDARRAY does NOT actually return anything useful. //The actual sorting still happens, but the results are discarded.