From 26cf380aa4f222b4aaadbf7c8ddacc95d4e6355b Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Tue, 11 Jul 2023 22:32:09 +0200 Subject: [PATCH] avm2: Fix Array.sort(function) --- core/src/avm2/globals/array.rs | 18 +++++++++--------- tests/tests/swfs/avm2/array_sort/Test.as | 2 +- tests/tests/swfs/avm2/array_sort/output.txt | 18 +++++++++--------- tests/tests/swfs/avm2/array_sort/test.swf | Bin 2320 -> 2751 bytes 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/core/src/avm2/globals/array.rs b/core/src/avm2/globals/array.rs index e12ce4f3e..c948e6490 100644 --- a/core/src/avm2/globals/array.rs +++ b/core/src/avm2/globals/array.rs @@ -1015,15 +1015,15 @@ pub fn sort<'gc>( ), ) } else { - ( - None, - SortOptions::from_bits_truncate( - args.get(0) - .cloned() - .unwrap_or_else(|| 0.into()) - .coerce_to_u32(activation)? as u8, - ), - ) + let arg = args.get(0).cloned().unwrap_or(Value::Undefined); + if let Ok(callable) = arg.as_callable(activation, None, None) { + (Some(callable), SortOptions::empty()) + } else { + ( + None, + SortOptions::from_bits_truncate(arg.coerce_to_u32(activation)? as u8), + ) + } }; let mut values = if let Some(values) = extract_array_values(activation, this.into())? { diff --git a/tests/tests/swfs/avm2/array_sort/Test.as b/tests/tests/swfs/avm2/array_sort/Test.as index 538a56e0e..e4ad73568 100644 --- a/tests/tests/swfs/avm2/array_sort/Test.as +++ b/tests/tests/swfs/avm2/array_sort/Test.as @@ -26,7 +26,7 @@ function length_based_comparison(a, b) { } function sub_comparison(a, b) { - return a - b; + return b - a; } function lbc(a, b) { diff --git a/tests/tests/swfs/avm2/array_sort/output.txt b/tests/tests/swfs/avm2/array_sort/output.txt index 980e8e4ed..ff1eda4d9 100644 --- a/tests/tests/swfs/avm2/array_sort/output.txt +++ b/tests/tests/swfs/avm2/array_sort/output.txt @@ -263,17 +263,17 @@ false //Array.prototype[10] = "hole in slot 10"; //var a = new Array(7,2,1,"3","4") //(contents of a.sort(sub_comparison)) -1 -2 -3 -4 7 +4 +3 +2 +1 //(contents of a.sort(sub_comparison, 2)) -7 -4 -3 -2 1 +2 +3 +4 +7 //(contents of a.sort(sub_comparison, Array.RETURNINDEXEDARRAY)) 4 3 @@ -293,5 +293,5 @@ false true //var d = new Array(3,"4") //(contents of d.sort(sub_comparison, 4)) -3 4 +3 diff --git a/tests/tests/swfs/avm2/array_sort/test.swf b/tests/tests/swfs/avm2/array_sort/test.swf index 81b48d3ce788bb0bfb33f2f36927c43752ace5e4..bb00a023b55cfae9e3dcfdf59f2a5b1a226cfc25 100644 GIT binary patch literal 2751 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