From db16113c3e4fe6a3eb8f1c5537d18715a8ffa18a Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Mon, 13 Oct 2025 00:53:35 +0200 Subject: [PATCH 1/2] avm2: Convert float values representable as ints to Value::Integer This fixes some previously failing tests. --- core/src/avm2/value.rs | 9 +++++++-- .../swfs/from_avmplus/as3/Types/Number/abs/test.toml | 1 - .../swfs/from_avmplus/as3/Types/Number/ceil/test.toml | 1 - .../swfs/from_avmplus/as3/Types/Number/floor/test.toml | 1 - .../swfs/from_avmplus/as3/Types/Number/round/test.toml | 1 - .../swfs/from_avmplus/ecma3/JSON/e15_12_3/test.toml | 1 - 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/avm2/value.rs b/core/src/avm2/value.rs index f2177e399da8..5990ce64189d 100644 --- a/core/src/avm2/value.rs +++ b/core/src/avm2/value.rs @@ -82,13 +82,18 @@ where impl From for Value<'_> { fn from(value: f64) -> Self { - Value::Number(value) + let value_i = value as i32; + if value.to_bits() == (value_i as f64).to_bits() { + Value::Integer(value_i) + } else { + Value::Number(value) + } } } impl From for Value<'_> { fn from(value: f32) -> Self { - Value::Number(f64::from(value)) + f64::from(value).into() } } diff --git a/tests/tests/swfs/from_avmplus/as3/Types/Number/abs/test.toml b/tests/tests/swfs/from_avmplus/as3/Types/Number/abs/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/Types/Number/abs/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/Types/Number/abs/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true diff --git a/tests/tests/swfs/from_avmplus/as3/Types/Number/ceil/test.toml b/tests/tests/swfs/from_avmplus/as3/Types/Number/ceil/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/Types/Number/ceil/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/Types/Number/ceil/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true diff --git a/tests/tests/swfs/from_avmplus/as3/Types/Number/floor/test.toml b/tests/tests/swfs/from_avmplus/as3/Types/Number/floor/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/Types/Number/floor/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/Types/Number/floor/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true diff --git a/tests/tests/swfs/from_avmplus/as3/Types/Number/round/test.toml b/tests/tests/swfs/from_avmplus/as3/Types/Number/round/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/Types/Number/round/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/Types/Number/round/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true diff --git a/tests/tests/swfs/from_avmplus/ecma3/JSON/e15_12_3/test.toml b/tests/tests/swfs/from_avmplus/ecma3/JSON/e15_12_3/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/ecma3/JSON/e15_12_3/test.toml +++ b/tests/tests/swfs/from_avmplus/ecma3/JSON/e15_12_3/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true From 51096ccd2eb8ede1d45ee08e7b5bad8703a03dda Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Mon, 13 Oct 2025 01:19:50 +0200 Subject: [PATCH 2/2] tests: Add avm2/number_to_float_auto_conversion test This test verifies whether floats that are representable as ints are converted to ints. --- .../number_to_float_auto_conversion/Test.as | 24 ++++++++++++++++++ .../output.txt | 5 ++++ .../number_to_float_auto_conversion/test.swf | Bin 0 -> 848 bytes .../number_to_float_auto_conversion/test.toml | 1 + 4 files changed, 30 insertions(+) create mode 100644 tests/tests/swfs/avm2/number_to_float_auto_conversion/Test.as create mode 100644 tests/tests/swfs/avm2/number_to_float_auto_conversion/output.txt create mode 100644 tests/tests/swfs/avm2/number_to_float_auto_conversion/test.swf create mode 100644 tests/tests/swfs/avm2/number_to_float_auto_conversion/test.toml diff --git a/tests/tests/swfs/avm2/number_to_float_auto_conversion/Test.as b/tests/tests/swfs/avm2/number_to_float_auto_conversion/Test.as new file mode 100644 index 000000000000..362fa698948a --- /dev/null +++ b/tests/tests/swfs/avm2/number_to_float_auto_conversion/Test.as @@ -0,0 +1,24 @@ +package { + +import flash.display.Sprite; +import avmplus.*; + +public class Test extends Sprite { + public function Test() { + trace(getQualifiedClassName(getV())); + trace(getQualifiedClassName(getV() + getV())); + trace(getQualifiedClassName(getV() * 2)); + trace(getQualifiedClassName(getV() * getV())); + trace(getQualifiedClassName(getU())); + } + + private function getU(): Number { + return 1.0; + } + + private function getV(): Number { + return 1.5; + } +} + +} diff --git a/tests/tests/swfs/avm2/number_to_float_auto_conversion/output.txt b/tests/tests/swfs/avm2/number_to_float_auto_conversion/output.txt new file mode 100644 index 000000000000..907cbbf37d4f --- /dev/null +++ b/tests/tests/swfs/avm2/number_to_float_auto_conversion/output.txt @@ -0,0 +1,5 @@ +Number +int +int +Number +int diff --git a/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.swf b/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..7f7b2d0af06c64b75e5b94633742ef5856cb496e GIT binary patch literal 848 zcmV-W1F!r;S5prf1poke0fke~ZyQAvo|#?mc>N=BNb06gBulLnAz|;@2|wbd1}nzU zO9C}52xM84-C29-dUv%uYr7}@4sM78C;k9#oH%gvnIoqjgT#Sbcr%WjRy{D%jAy_1 zecyXC^SnU%UkGjejL<$ty`6o8(D%D9FhVDZ>$M;E`nAP02-7xvJv^8Q5w|UCKA$({ zhm9y1Tg~I+W6N$?tyUcv_4Iit*rFb$_YOMBpvO}u@nhjfVNDvcizpKh4-T$fU1wt& zXGx$eUB}`9pYl+oROx~ftoydg@NlW-=Y{}ruiQWCImoUt+Q@No2GpgcE_Isp^BbMA;*v-NJRWw+j2 z)hp2xOJ4m;PjQXF>vqsqCA)KWUjMv17<_g9xQCY8&;qZFUgd>$f=b%mBKc*zG37U!-x