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/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 000000000000..7f7b2d0af06c Binary files /dev/null and b/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.swf differ diff --git a/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.toml b/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.toml new file mode 100644 index 000000000000..cf6123969a1d --- /dev/null +++ b/tests/tests/swfs/avm2/number_to_float_auto_conversion/test.toml @@ -0,0 +1 @@ +num_ticks = 1 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