From 76ab8570e4564584571d46d1371ee5ab2e072480 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 9 Jul 2020 21:46:17 -0400 Subject: [PATCH] Implement and test `equals`. The test is also far more in-depth than the `if_eq`/`if_ne` tests, which use the same set of vectors as the strict-equality tests from a while ago. Interestingly, this test passed on first run --- core/src/avm2/activation.rs | 15 + core/tests/regression_tests.rs | 1 + core/tests/swfs/avm2/equals/Test.as | 773 +++++++++++++++++++++++++ core/tests/swfs/avm2/equals/output.txt | 512 ++++++++++++++++ core/tests/swfs/avm2/equals/test.fla | Bin 0 -> 3983 bytes core/tests/swfs/avm2/equals/test.swf | Bin 0 -> 4160 bytes 6 files changed, 1301 insertions(+) create mode 100644 core/tests/swfs/avm2/equals/Test.as create mode 100644 core/tests/swfs/avm2/equals/output.txt create mode 100644 core/tests/swfs/avm2/equals/test.fla create mode 100644 core/tests/swfs/avm2/equals/test.swf diff --git a/core/src/avm2/activation.rs b/core/src/avm2/activation.rs index ce6ebf2e8..bf979b1e6 100644 --- a/core/src/avm2/activation.rs +++ b/core/src/avm2/activation.rs @@ -489,6 +489,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { Op::IfEq { offset } => self.op_if_eq(context, offset, reader), Op::IfNe { offset } => self.op_if_ne(context, offset, reader), Op::StrictEquals => self.op_strict_equals(), + Op::Equals => self.op_equals(context), Op::Not => self.op_not(), Op::HasNext => self.op_has_next(), Op::HasNext2 { @@ -1488,6 +1489,20 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { Ok(FrameControl::Continue) } + fn op_equals( + &mut self, + context: &mut UpdateContext<'_, 'gc, '_>, + ) -> Result, Error> { + let value2 = self.avm2.pop(); + let value1 = self.avm2.pop(); + + let result = value1.abstract_eq(&value2, self, context)?; + + self.avm2.push(result); + + Ok(FrameControl::Continue) + } + fn op_not(&mut self) -> Result, Error> { let value = self.context.avm2.pop().coerce_to_boolean(); diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 3c9b2b917..5620759ad 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -283,6 +283,7 @@ swf_tests! { (as3_coerce_string, "avm2/coerce_string", 1), (as3_if_eq, "avm2/if_eq", 1), (as3_if_ne, "avm2/if_ne", 1), + (as3_equals, "avm2/equals", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm2/equals/Test.as b/core/tests/swfs/avm2/equals/Test.as new file mode 100644 index 000000000..1a610cd95 --- /dev/null +++ b/core/tests/swfs/avm2/equals/Test.as @@ -0,0 +1,773 @@ +package { + public class Test {} +} + +/// undefined, null, -5, -1, -0, 0, 1, 2, 5, "abc", "2", "true", "false", true, false, NaN + +trace("//undefined == undefined"); +trace(undefined == undefined); + +trace("//undefined == null"); +trace(undefined == null); + +trace("//undefined == (-5)"); +trace(undefined == (-5)); + +trace("//undefined == (-1)"); +trace(undefined == (-1)); + +trace("//undefined == (-0)"); +trace(undefined == (-0)); + +trace("//undefined == 0"); +trace(undefined == 0); + +trace("//undefined == 1"); +trace(undefined == 1); + +trace("//undefined == 2"); +trace(undefined == 2); + +trace("//undefined == 5"); +trace(undefined == 5); + +trace("//undefined == \"abc\""); +trace(undefined == "abc"); + +trace("//undefined == \"2\""); +trace(undefined == "2"); + +trace("//undefined == \"true\""); +trace(undefined == "true"); + +trace("//undefined == \"false\""); +trace(undefined == "false"); + +trace("//undefined == true"); +trace(undefined == true); + +trace("//undefined == false"); +trace(undefined == false); + +trace("//undefined == NaN"); +trace(undefined == NaN); + +trace("//null == undefined"); +trace(null == undefined); + +trace("//null == null"); +trace(null == null); + +trace("//null == (-5)"); +trace(null == (-5)); + +trace("//null == (-1)"); +trace(null == (-1)); + +trace("//null == (-0)"); +trace(null == (-0)); + +trace("//null == 0"); +trace(null == 0); + +trace("//null == 1"); +trace(null == 1); + +trace("//null == 2"); +trace(null == 2); + +trace("//null == 5"); +trace(null == 5); + +trace("//null == \"abc\""); +trace(null == "abc"); + +trace("//null == \"2\""); +trace(null == "2"); + +trace("//null == \"true\""); +trace(null == "true"); + +trace("//null == \"false\""); +trace(null == "false"); + +trace("//null == true"); +trace(null == true); + +trace("//null == false"); +trace(null == false); + +trace("//null == NaN"); +trace(null == NaN); + +trace("//(-5) == undefined"); +trace((-5) == undefined); + +trace("//(-5) == null"); +trace((-5) == null); + +trace("//(-5) == (-5)"); +trace((-5) == (-5)); + +trace("//(-5) == (-1)"); +trace((-5) == (-1)); + +trace("//(-5) == (-0)"); +trace((-5) == (-0)); + +trace("//(-5) == 0"); +trace((-5) == 0); + +trace("//(-5) == 1"); +trace((-5) == 1); + +trace("//(-5) == 2"); +trace((-5) == 2); + +trace("//(-5) == 5"); +trace((-5) == 5); + +trace("//(-5) == \"abc\""); +trace((-5) == "abc"); + +trace("//(-5) == \"2\""); +trace((-5) == "2"); + +trace("//(-5) == \"true\""); +trace((-5) == "true"); + +trace("//(-5) == \"false\""); +trace((-5) == "false"); + +trace("//(-5) == true"); +trace((-5) == true); + +trace("//(-5) == false"); +trace((-5) == false); + +trace("//(-5) == NaN"); +trace((-5) == NaN); + +trace("//(-1) == undefined"); +trace((-1) == undefined); + +trace("//(-1) == null"); +trace((-1) == null); + +trace("//(-1) == (-5)"); +trace((-1) == (-5)); + +trace("//(-1) == (-1)"); +trace((-1) == (-1)); + +trace("//(-1) == (-0)"); +trace((-1) == (-0)); + +trace("//(-1) == 0"); +trace((-1) == 0); + +trace("//(-1) == 1"); +trace((-1) == 1); + +trace("//(-1) == 2"); +trace((-1) == 2); + +trace("//(-1) == 5"); +trace((-1) == 5); + +trace("//(-1) == \"abc\""); +trace((-1) == "abc"); + +trace("//(-1) == \"2\""); +trace((-1) == "2"); + +trace("//(-1) == \"true\""); +trace((-1) == "true"); + +trace("//(-1) == \"false\""); +trace((-1) == "false"); + +trace("//(-1) == true"); +trace((-1) == true); + +trace("//(-1) == false"); +trace((-1) == false); + +trace("//(-1) == NaN"); +trace((-1) == NaN); + +trace("//(-0) == undefined"); +trace((-0) == undefined); + +trace("//(-0) == null"); +trace((-0) == null); + +trace("//(-0) == (-5)"); +trace((-0) == (-5)); + +trace("//(-0) == (-1)"); +trace((-0) == (-1)); + +trace("//(-0) == (-0)"); +trace((-0) == (-0)); + +trace("//(-0) == 0"); +trace((-0) == 0); + +trace("//(-0) == 1"); +trace((-0) == 1); + +trace("//(-0) == 2"); +trace((-0) == 2); + +trace("//(-0) == 5"); +trace((-0) == 5); + +trace("//(-0) == \"abc\""); +trace((-0) == "abc"); + +trace("//(-0) == \"2\""); +trace((-0) == "2"); + +trace("//(-0) == \"true\""); +trace((-0) == "true"); + +trace("//(-0) == \"false\""); +trace((-0) == "false"); + +trace("//(-0) == true"); +trace((-0) == true); + +trace("//(-0) == false"); +trace((-0) == false); + +trace("//(-0) == NaN"); +trace((-0) == NaN); + +trace("//0 == undefined"); +trace(0 == undefined); + +trace("//0 == null"); +trace(0 == null); + +trace("//0 == (-5)"); +trace(0 == (-5)); + +trace("//0 == (-1)"); +trace(0 == (-1)); + +trace("//0 == (-0)"); +trace(0 == (-0)); + +trace("//0 == 0"); +trace(0 == 0); + +trace("//0 == 1"); +trace(0 == 1); + +trace("//0 == 2"); +trace(0 == 2); + +trace("//0 == 5"); +trace(0 == 5); + +trace("//0 == \"abc\""); +trace(0 == "abc"); + +trace("//0 == \"2\""); +trace(0 == "2"); + +trace("//0 == \"true\""); +trace(0 == "true"); + +trace("//0 == \"false\""); +trace(0 == "false"); + +trace("//0 == true"); +trace(0 == true); + +trace("//0 == false"); +trace(0 == false); + +trace("//0 == NaN"); +trace(0 == NaN); + +trace("//1 == undefined"); +trace(1 == undefined); + +trace("//1 == null"); +trace(1 == null); + +trace("//1 == (-5)"); +trace(1 == (-5)); + +trace("//1 == (-1)"); +trace(1 == (-1)); + +trace("//1 == (-0)"); +trace(1 == (-0)); + +trace("//1 == 0"); +trace(1 == 0); + +trace("//1 == 1"); +trace(1 == 1); + +trace("//1 == 2"); +trace(1 == 2); + +trace("//1 == 5"); +trace(1 == 5); + +trace("//1 == \"abc\""); +trace(1 == "abc"); + +trace("//1 == \"2\""); +trace(1 == "2"); + +trace("//1 == \"true\""); +trace(1 == "true"); + +trace("//1 == \"false\""); +trace(1 == "false"); + +trace("//1 == true"); +trace(1 == true); + +trace("//1 == false"); +trace(1 == false); + +trace("//1 == NaN"); +trace(1 == NaN); + +trace("//2 == undefined"); +trace(2 == undefined); + +trace("//2 == null"); +trace(2 == null); + +trace("//2 == (-5)"); +trace(2 == (-5)); + +trace("//2 == (-1)"); +trace(2 == (-1)); + +trace("//2 == (-0)"); +trace(2 == (-0)); + +trace("//2 == 0"); +trace(2 == 0); + +trace("//2 == 1"); +trace(2 == 1); + +trace("//2 == 2"); +trace(2 == 2); + +trace("//2 == 5"); +trace(2 == 5); + +trace("//2 == \"abc\""); +trace(2 == "abc"); + +trace("//2 == \"2\""); +trace(2 == "2"); + +trace("//2 == \"true\""); +trace(2 == "true"); + +trace("//2 == \"false\""); +trace(2 == "false"); + +trace("//2 == true"); +trace(2 == true); + +trace("//2 == false"); +trace(2 == false); + +trace("//2 == NaN"); +trace(2 == NaN); + +trace("//5 == undefined"); +trace(5 == undefined); + +trace("//5 == null"); +trace(5 == null); + +trace("//5 == (-5)"); +trace(5 == (-5)); + +trace("//5 == (-1)"); +trace(5 == (-1)); + +trace("//5 == (-0)"); +trace(5 == (-0)); + +trace("//5 == 0"); +trace(5 == 0); + +trace("//5 == 1"); +trace(5 == 1); + +trace("//5 == 2"); +trace(5 == 2); + +trace("//5 == 5"); +trace(5 == 5); + +trace("//5 == \"abc\""); +trace(5 == "abc"); + +trace("//5 == \"2\""); +trace(5 == "2"); + +trace("//5 == \"true\""); +trace(5 == "true"); + +trace("//5 == \"false\""); +trace(5 == "false"); + +trace("//5 == true"); +trace(5 == true); + +trace("//5 == false"); +trace(5 == false); + +trace("//5 == NaN"); +trace(5 == NaN); + +trace("//\"abc\" == undefined"); +trace("abc" == undefined); + +trace("//\"abc\" == null"); +trace("abc" == null); + +trace("//\"abc\" == (-5)"); +trace("abc" == (-5)); + +trace("//\"abc\" == (-1)"); +trace("abc" == (-1)); + +trace("//\"abc\" == (-0)"); +trace("abc" == (-0)); + +trace("//\"abc\" == 0"); +trace("abc" == 0); + +trace("//\"abc\" == 1"); +trace("abc" == 1); + +trace("//\"abc\" == 2"); +trace("abc" == 2); + +trace("//\"abc\" == 5"); +trace("abc" == 5); + +trace("//\"abc\" == \"abc\""); +trace("abc" == "abc"); + +trace("//\"abc\" == \"2\""); +trace("abc" == "2"); + +trace("//\"abc\" == \"true\""); +trace("abc" == "true"); + +trace("//\"abc\" == \"false\""); +trace("abc" == "false"); + +trace("//\"abc\" == true"); +trace("abc" == true); + +trace("//\"abc\" == false"); +trace("abc" == false); + +trace("//\"abc\" == NaN"); +trace("abc" == NaN); + +trace("//\"2\" == undefined"); +trace("2" == undefined); + +trace("//\"2\" == null"); +trace("2" == null); + +trace("//\"2\" == (-5)"); +trace("2" == (-5)); + +trace("//\"2\" == (-1)"); +trace("2" == (-1)); + +trace("//\"2\" == (-0)"); +trace("2" == (-0)); + +trace("//\"2\" == 0"); +trace("2" == 0); + +trace("//\"2\" == 1"); +trace("2" == 1); + +trace("//\"2\" == 2"); +trace("2" == 2); + +trace("//\"2\" == 5"); +trace("2" == 5); + +trace("//\"2\" == \"abc\""); +trace("2" == "abc"); + +trace("//\"2\" == \"2\""); +trace("2" == "2"); + +trace("//\"2\" == \"true\""); +trace("2" == "true"); + +trace("//\"2\" == \"false\""); +trace("2" == "false"); + +trace("//\"2\" == true"); +trace("2" == true); + +trace("//\"2\" == false"); +trace("2" == false); + +trace("//\"2\" == NaN"); +trace("2" == NaN); + +trace("//\"true\" == undefined"); +trace("true" == undefined); + +trace("//\"true\" == null"); +trace("true" == null); + +trace("//\"true\" == (-5)"); +trace("true" == (-5)); + +trace("//\"true\" == (-1)"); +trace("true" == (-1)); + +trace("//\"true\" == (-0)"); +trace("true" == (-0)); + +trace("//\"true\" == 0"); +trace("true" == 0); + +trace("//\"true\" == 1"); +trace("true" == 1); + +trace("//\"true\" == 2"); +trace("true" == 2); + +trace("//\"true\" == 5"); +trace("true" == 5); + +trace("//\"true\" == \"abc\""); +trace("true" == "abc"); + +trace("//\"true\" == \"2\""); +trace("true" == "2"); + +trace("//\"true\" == \"true\""); +trace("true" == "true"); + +trace("//\"true\" == \"false\""); +trace("true" == "false"); + +trace("//\"true\" == true"); +trace("true" == true); + +trace("//\"true\" == false"); +trace("true" == false); + +trace("//\"true\" == NaN"); +trace("true" == NaN); + +trace("//\"false\" == undefined"); +trace("false" == undefined); + +trace("//\"false\" == null"); +trace("false" == null); + +trace("//\"false\" == (-5)"); +trace("false" == (-5)); + +trace("//\"false\" == (-1)"); +trace("false" == (-1)); + +trace("//\"false\" == (-0)"); +trace("false" == (-0)); + +trace("//\"false\" == 0"); +trace("false" == 0); + +trace("//\"false\" == 1"); +trace("false" == 1); + +trace("//\"false\" == 2"); +trace("false" == 2); + +trace("//\"false\" == 5"); +trace("false" == 5); + +trace("//\"false\" == \"abc\""); +trace("false" == "abc"); + +trace("//\"false\" == \"2\""); +trace("false" == "2"); + +trace("//\"false\" == \"true\""); +trace("false" == "true"); + +trace("//\"false\" == \"false\""); +trace("false" == "false"); + +trace("//\"false\" == true"); +trace("false" == true); + +trace("//\"false\" == false"); +trace("false" == false); + +trace("//\"false\" == NaN"); +trace("false" == NaN); + +trace("//true == undefined"); +trace(true == undefined); + +trace("//true == null"); +trace(true == null); + +trace("//true == (-5)"); +trace(true == (-5)); + +trace("//true == (-1)"); +trace(true == (-1)); + +trace("//true == (-0)"); +trace(true == (-0)); + +trace("//true == 0"); +trace(true == 0); + +trace("//true == 1"); +trace(true == 1); + +trace("//true == 2"); +trace(true == 2); + +trace("//true == 5"); +trace(true == 5); + +trace("//true == \"abc\""); +trace(true == "abc"); + +trace("//true == \"2\""); +trace(true == "2"); + +trace("//true == \"true\""); +trace(true == "true"); + +trace("//true == \"false\""); +trace(true == "false"); + +trace("//true == true"); +trace(true == true); + +trace("//true == false"); +trace(true == false); + +trace("//true == NaN"); +trace(true == NaN); + +trace("//false == undefined"); +trace(false == undefined); + +trace("//false == null"); +trace(false == null); + +trace("//false == (-5)"); +trace(false == (-5)); + +trace("//false == (-1)"); +trace(false == (-1)); + +trace("//false == (-0)"); +trace(false == (-0)); + +trace("//false == 0"); +trace(false == 0); + +trace("//false == 1"); +trace(false == 1); + +trace("//false == 2"); +trace(false == 2); + +trace("//false == 5"); +trace(false == 5); + +trace("//false == \"abc\""); +trace(false == "abc"); + +trace("//false == \"2\""); +trace(false == "2"); + +trace("//false == \"true\""); +trace(false == "true"); + +trace("//false == \"false\""); +trace(false == "false"); + +trace("//false == true"); +trace(false == true); + +trace("//false == false"); +trace(false == false); + +trace("//false == NaN"); +trace(false == NaN); + +trace("//NaN == undefined"); +trace(NaN == undefined); + +trace("//NaN == null"); +trace(NaN == null); + +trace("//NaN == (-5)"); +trace(NaN == (-5)); + +trace("//NaN == (-1)"); +trace(NaN == (-1)); + +trace("//NaN == (-0)"); +trace(NaN == (-0)); + +trace("//NaN == 0"); +trace(NaN == 0); + +trace("//NaN == 1"); +trace(NaN == 1); + +trace("//NaN == 2"); +trace(NaN == 2); + +trace("//NaN == 5"); +trace(NaN == 5); + +trace("//NaN == \"abc\""); +trace(NaN == "abc"); + +trace("//NaN == \"2\""); +trace(NaN == "2"); + +trace("//NaN == \"true\""); +trace(NaN == "true"); + +trace("//NaN == \"false\""); +trace(NaN == "false"); + +trace("//NaN == true"); +trace(NaN == true); + +trace("//NaN == false"); +trace(NaN == false); + +trace("//NaN == NaN"); +trace(NaN == NaN); \ No newline at end of file diff --git a/core/tests/swfs/avm2/equals/output.txt b/core/tests/swfs/avm2/equals/output.txt new file mode 100644 index 000000000..ce02c1781 --- /dev/null +++ b/core/tests/swfs/avm2/equals/output.txt @@ -0,0 +1,512 @@ +//undefined == undefined +true +//undefined == null +true +//undefined == (-5) +false +//undefined == (-1) +false +//undefined == (-0) +false +//undefined == 0 +false +//undefined == 1 +false +//undefined == 2 +false +//undefined == 5 +false +//undefined == "abc" +false +//undefined == "2" +false +//undefined == "true" +false +//undefined == "false" +false +//undefined == true +false +//undefined == false +false +//undefined == NaN +false +//null == undefined +true +//null == null +true +//null == (-5) +false +//null == (-1) +false +//null == (-0) +false +//null == 0 +false +//null == 1 +false +//null == 2 +false +//null == 5 +false +//null == "abc" +false +//null == "2" +false +//null == "true" +false +//null == "false" +false +//null == true +false +//null == false +false +//null == NaN +false +//(-5) == undefined +false +//(-5) == null +false +//(-5) == (-5) +true +//(-5) == (-1) +false +//(-5) == (-0) +false +//(-5) == 0 +false +//(-5) == 1 +false +//(-5) == 2 +false +//(-5) == 5 +false +//(-5) == "abc" +false +//(-5) == "2" +false +//(-5) == "true" +false +//(-5) == "false" +false +//(-5) == true +false +//(-5) == false +false +//(-5) == NaN +false +//(-1) == undefined +false +//(-1) == null +false +//(-1) == (-5) +false +//(-1) == (-1) +true +//(-1) == (-0) +false +//(-1) == 0 +false +//(-1) == 1 +false +//(-1) == 2 +false +//(-1) == 5 +false +//(-1) == "abc" +false +//(-1) == "2" +false +//(-1) == "true" +false +//(-1) == "false" +false +//(-1) == true +false +//(-1) == false +false +//(-1) == NaN +false +//(-0) == undefined +false +//(-0) == null +false +//(-0) == (-5) +false +//(-0) == (-1) +false +//(-0) == (-0) +true +//(-0) == 0 +true +//(-0) == 1 +false +//(-0) == 2 +false +//(-0) == 5 +false +//(-0) == "abc" +false +//(-0) == "2" +false +//(-0) == "true" +false +//(-0) == "false" +false +//(-0) == true +false +//(-0) == false +true +//(-0) == NaN +false +//0 == undefined +false +//0 == null +false +//0 == (-5) +false +//0 == (-1) +false +//0 == (-0) +true +//0 == 0 +true +//0 == 1 +false +//0 == 2 +false +//0 == 5 +false +//0 == "abc" +false +//0 == "2" +false +//0 == "true" +false +//0 == "false" +false +//0 == true +false +//0 == false +true +//0 == NaN +false +//1 == undefined +false +//1 == null +false +//1 == (-5) +false +//1 == (-1) +false +//1 == (-0) +false +//1 == 0 +false +//1 == 1 +true +//1 == 2 +false +//1 == 5 +false +//1 == "abc" +false +//1 == "2" +false +//1 == "true" +false +//1 == "false" +false +//1 == true +true +//1 == false +false +//1 == NaN +false +//2 == undefined +false +//2 == null +false +//2 == (-5) +false +//2 == (-1) +false +//2 == (-0) +false +//2 == 0 +false +//2 == 1 +false +//2 == 2 +true +//2 == 5 +false +//2 == "abc" +false +//2 == "2" +true +//2 == "true" +false +//2 == "false" +false +//2 == true +false +//2 == false +false +//2 == NaN +false +//5 == undefined +false +//5 == null +false +//5 == (-5) +false +//5 == (-1) +false +//5 == (-0) +false +//5 == 0 +false +//5 == 1 +false +//5 == 2 +false +//5 == 5 +true +//5 == "abc" +false +//5 == "2" +false +//5 == "true" +false +//5 == "false" +false +//5 == true +false +//5 == false +false +//5 == NaN +false +//"abc" == undefined +false +//"abc" == null +false +//"abc" == (-5) +false +//"abc" == (-1) +false +//"abc" == (-0) +false +//"abc" == 0 +false +//"abc" == 1 +false +//"abc" == 2 +false +//"abc" == 5 +false +//"abc" == "abc" +true +//"abc" == "2" +false +//"abc" == "true" +false +//"abc" == "false" +false +//"abc" == true +false +//"abc" == false +false +//"abc" == NaN +false +//"2" == undefined +false +//"2" == null +false +//"2" == (-5) +false +//"2" == (-1) +false +//"2" == (-0) +false +//"2" == 0 +false +//"2" == 1 +false +//"2" == 2 +true +//"2" == 5 +false +//"2" == "abc" +false +//"2" == "2" +true +//"2" == "true" +false +//"2" == "false" +false +//"2" == true +false +//"2" == false +false +//"2" == NaN +false +//"true" == undefined +false +//"true" == null +false +//"true" == (-5) +false +//"true" == (-1) +false +//"true" == (-0) +false +//"true" == 0 +false +//"true" == 1 +false +//"true" == 2 +false +//"true" == 5 +false +//"true" == "abc" +false +//"true" == "2" +false +//"true" == "true" +true +//"true" == "false" +false +//"true" == true +false +//"true" == false +false +//"true" == NaN +false +//"false" == undefined +false +//"false" == null +false +//"false" == (-5) +false +//"false" == (-1) +false +//"false" == (-0) +false +//"false" == 0 +false +//"false" == 1 +false +//"false" == 2 +false +//"false" == 5 +false +//"false" == "abc" +false +//"false" == "2" +false +//"false" == "true" +false +//"false" == "false" +true +//"false" == true +false +//"false" == false +false +//"false" == NaN +false +//true == undefined +false +//true == null +false +//true == (-5) +false +//true == (-1) +false +//true == (-0) +false +//true == 0 +false +//true == 1 +true +//true == 2 +false +//true == 5 +false +//true == "abc" +false +//true == "2" +false +//true == "true" +false +//true == "false" +false +//true == true +true +//true == false +false +//true == NaN +false +//false == undefined +false +//false == null +false +//false == (-5) +false +//false == (-1) +false +//false == (-0) +true +//false == 0 +true +//false == 1 +false +//false == 2 +false +//false == 5 +false +//false == "abc" +false +//false == "2" +false +//false == "true" +false +//false == "false" +false +//false == true +false +//false == false +true +//false == NaN +false +//NaN == undefined +false +//NaN == null +false +//NaN == (-5) +false +//NaN == (-1) +false +//NaN == (-0) +false +//NaN == 0 +false +//NaN == 1 +false +//NaN == 2 +false +//NaN == 5 +false +//NaN == "abc" +false +//NaN == "2" +false +//NaN == "true" +false +//NaN == "false" +false +//NaN == true +false +//NaN == false +false +//NaN == NaN +false diff --git a/core/tests/swfs/avm2/equals/test.fla b/core/tests/swfs/avm2/equals/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..bbbf05379d9a0f5b17213c2debc83d0b5adf3174 GIT binary patch literal 3983 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 literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/equals/test.swf b/core/tests/swfs/avm2/equals/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..425a920cd7cd65f2da2769dae37808ef8dc4b14c GIT binary patch literal 4160 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