From a7bd5e873fd4cfe3e9f25d9e110efe4d27de5cf7 Mon Sep 17 00:00:00 2001 From: Guilherme Leobas Date: Tue, 29 Jul 2025 11:33:22 -0300 Subject: [PATCH 1/2] Update [ghstack-poisoned] --- ...n313-test_collections-TestChainMap.test_bool | 0 ...st_collections-TestChainMap.test_constructor | 0 ..._collections-TestChainMap.test_dict_coercion | 0 ...TestNamedTuple.test_new_builtins_issue_43102 | 0 ...llections-TestUserObjects.test_dict_protocol | 0 ...llections-TestUserObjects.test_list_protocol | 0 ...ollections-TestUserObjects.test_str_protocol | 0 torch/_dynamo/polyfills/__init__.py | 4 ++++ torch/_dynamo/test_case.py | 2 +- torch/_dynamo/variables/builtin.py | 17 +++++++++++++++-- torch/_dynamo/variables/user_defined.py | 4 ++-- 11 files changed, 22 insertions(+), 5 deletions(-) delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_bool delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_constructor delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_dict_coercion delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestNamedTuple.test_new_builtins_issue_43102 delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_dict_protocol delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_list_protocol delete mode 100644 test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_str_protocol diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_bool b/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_bool deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_constructor b/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_constructor deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_dict_coercion b/test/dynamo_expected_failures/CPython313-test_collections-TestChainMap.test_dict_coercion deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestNamedTuple.test_new_builtins_issue_43102 b/test/dynamo_expected_failures/CPython313-test_collections-TestNamedTuple.test_new_builtins_issue_43102 deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_dict_protocol b/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_dict_protocol deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_list_protocol b/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_list_protocol deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_str_protocol b/test/dynamo_expected_failures/CPython313-test_collections-TestUserObjects.test_str_protocol deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/torch/_dynamo/polyfills/__init__.py b/torch/_dynamo/polyfills/__init__.py index 6d467b215797..07b005e736e8 100644 --- a/torch/_dynamo/polyfills/__init__.py +++ b/torch/_dynamo/polyfills/__init__.py @@ -243,6 +243,10 @@ def set_difference_update(set1, *others): set1.update(result) +def assert_dict_equal(self_, d1, d2, msg=None): + self_.assertTrue(d1 == d2, msg) + + def assert_multi_line_equal(self_, first, second, msg=None): return self_.assertTrue(first == second, msg) diff --git a/torch/_dynamo/test_case.py b/torch/_dynamo/test_case.py index 230aac4794f2..3e2d76d6e15c 100644 --- a/torch/_dynamo/test_case.py +++ b/torch/_dynamo/test_case.py @@ -140,7 +140,7 @@ class CPythonTestCase(TestCase): assertListEqual = unittest.TestCase.assertListEqual assertTupleEqual = unittest.TestCase.assertTupleEqual assertSetEqual = unittest.TestCase.assertSetEqual - assertDictEqual = unittest.TestCase.assertDictEqual + assertDictEqual = polyfills.assert_dict_equal assertRaises = unittest.TestCase.assertRaises assertRaisesRegex = unittest.TestCase.assertRaisesRegex assertWarns = unittest.TestCase.assertWarns diff --git a/torch/_dynamo/variables/builtin.py b/torch/_dynamo/variables/builtin.py index 34012263c73f..628226b4228a 100644 --- a/torch/_dynamo/variables/builtin.py +++ b/torch/_dynamo/variables/builtin.py @@ -109,6 +109,7 @@ UnspecializedPythonVariable, ) from .user_defined import ( + MutableMappingVariable, UserDefinedDictVariable, UserDefinedObjectVariable, UserDefinedSetVariable, @@ -1854,6 +1855,12 @@ def call_cast(self, _, *args, **kwargs): hints=["Ensure your call to cast() has exactly 2 arguments."], ) + def call_dir(self, tx: "InstructionTranslator", arg): + if isinstance(arg, variables.UserDefinedClassVariable): + return VariableTracker.build(tx, dir(arg.value)) + if isinstance(arg, BuiltinVariable): + return VariableTracker.build(tx, dir(arg.fn)) + def call_dict(self, tx: "InstructionTranslator", *args, **kwargs): return BuiltinVariable.call_custom_dict(tx, dict, *args, **kwargs) @@ -2244,7 +2251,6 @@ def call_getattr( "assertRaisesRegex", "assertNotWarns", "assertWarnsRegex", - "assertDictEqual", "assertWarns", ) ): @@ -2731,6 +2737,7 @@ def call_or_(self, tx: "InstructionTranslator", a, b): ( ConstDictVariable, DictKeysVariable, + MutableMappingVariable, SetVariable, UserDefinedDictVariable, UserDefinedSetVariable, @@ -2759,7 +2766,13 @@ def call_ior(self, tx: "InstructionTranslator", a, b): # This call looks like `{"one": torch.ones(1)} |= {"two": torch.ones(2)}`. if isinstance( a, - (ConstDictVariable, DictKeysVariable, SetVariable, UserDefinedSetVariable), + ( + ConstDictVariable, + DictKeysVariable, + MutableMappingVariable, + SetVariable, + UserDefinedSetVariable + ), ): return a.call_method(tx, "__ior__", [b], {}) diff --git a/torch/_dynamo/variables/user_defined.py b/torch/_dynamo/variables/user_defined.py index 17e20663f767..e70e892c9795 100644 --- a/torch/_dynamo/variables/user_defined.py +++ b/torch/_dynamo/variables/user_defined.py @@ -88,7 +88,7 @@ tuple_methods, unpatched_nn_module_getattr, ) -from .base import AttributeMutationExisting, ValueMutationNew, VariableTracker +from .base import AttributeMutationNew, ValueMutationNew, VariableTracker from .dicts import DefaultDictVariable from .lists import SizeVariable @@ -1989,7 +1989,7 @@ class MutableMappingVariable(UserDefinedObjectVariable): def __init__(self, value, **kwargs): super().__init__(value, **kwargs) self.generic_dict_vt = variables.ConstDictVariable({}) - self.mutation_type = AttributeMutationExisting() + self.mutation_type = AttributeMutationNew() def var_getattr(self, tx: "InstructionTranslator", name: str) -> "VariableTracker": # A common pattern in the init code of MutableMapping objects is to From fdbb7d9935aeac9a4a399d81e3e46685645a7780 Mon Sep 17 00:00:00 2001 From: Guilherme Leobas Date: Wed, 30 Jul 2025 19:38:00 -0300 Subject: [PATCH 2/2] Update [ghstack-poisoned] --- torch/_dynamo/variables/builtin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torch/_dynamo/variables/builtin.py b/torch/_dynamo/variables/builtin.py index 628226b4228a..94b191602177 100644 --- a/torch/_dynamo/variables/builtin.py +++ b/torch/_dynamo/variables/builtin.py @@ -2771,7 +2771,7 @@ def call_ior(self, tx: "InstructionTranslator", a, b): DictKeysVariable, MutableMappingVariable, SetVariable, - UserDefinedSetVariable + UserDefinedSetVariable, ), ): return a.call_method(tx, "__ior__", [b], {})