From 2db5a2ad703faedafcda092938bde12d9d52d6f3 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 01/12] [mypyc] feat: exact_dict_rprimitive --- mypyc/ir/rtypes.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/mypyc/ir/rtypes.py b/mypyc/ir/rtypes.py index 34824a59cd5c..6ae26b5dedf9 100644 --- a/mypyc/ir/rtypes.py +++ b/mypyc/ir/rtypes.py @@ -487,8 +487,13 @@ def __hash__(self) -> int: "builtins.list", is_unboxed=False, is_refcounted=True, may_be_immortal=False ) -# Python dict object (or an instance of a subclass of dict). +# Python dict object. +exact_dict_rprimitive: Final = RPrimitive( + "builtins.dict[exact]", is_unboxed=False, is_refcounted=True) +) + dict_rprimitive: Final = RPrimitive("builtins.dict", is_unboxed=False, is_refcounted=True) +# An instance of a subclass of dict. # Python set object (or an instance of a subclass of set). set_rprimitive: Final = RPrimitive("builtins.set", is_unboxed=False, is_refcounted=True) @@ -608,7 +613,14 @@ def is_list_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]: def is_dict_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]: - return isinstance(rtype, RPrimitive) and rtype.name == "builtins.dict" + return isinstance(rtype, RPrimitive) and rtype.name in ( + "builtins.dict", + "builtins.dict[exact]", + ) + + +def is_exact_dict_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]: + return isinstance(rtype, RPrimitive) and rtype.name == "builtins.dict[exact]" def is_set_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]: From f43c0728e6a880aa1ecd38ed8414bcad747a739e Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 02/12] Update rt_subtype.py --- mypyc/rt_subtype.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mypyc/rt_subtype.py b/mypyc/rt_subtype.py index 004e56ed75bc..01619158a954 100644 --- a/mypyc/rt_subtype.py +++ b/mypyc/rt_subtype.py @@ -27,6 +27,8 @@ RVoid, is_bit_rprimitive, is_bool_rprimitive, + is_dict_rprimitive, + is_exact_dict_rprimitive, is_int_rprimitive, is_short_int_rprimitive, ) @@ -58,6 +60,8 @@ def visit_rprimitive(self, left: RPrimitive) -> bool: return True if is_bit_rprimitive(left) and is_bool_rprimitive(self.right): return True + if is_exact_dict_rprimitive(left) and is_dict_rprimitive(self.right): + return True return left is self.right def visit_rtuple(self, left: RTuple) -> bool: From 3942c6289a2e123b8e0519faa84b0626fd6c65ad Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 03/12] Update subtype.py --- mypyc/subtype.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mypyc/subtype.py b/mypyc/subtype.py index 726a48d7a01d..6ad4dcb1d19e 100644 --- a/mypyc/subtype.py +++ b/mypyc/subtype.py @@ -1,3 +1,4 @@ + """Subtype check for RTypes.""" from __future__ import annotations @@ -14,6 +15,8 @@ RVoid, is_bit_rprimitive, is_bool_rprimitive, + is_dict_rprimitive, + is_exact_dict_rprimitive, is_fixed_width_rtype, is_int_rprimitive, is_object_rprimitive, @@ -67,6 +70,9 @@ def visit_rprimitive(self, left: RPrimitive) -> bool: elif is_fixed_width_rtype(left): if is_int_rprimitive(right): return True + elif is_exact_dict_rprimitive(left): + if is_dict_rprimitive(right): + return True return left is right def visit_rtuple(self, left: RTuple) -> bool: From 11768a9301000cd13358e8ba06b88f649a06c369 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 04/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/subtype.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mypyc/subtype.py b/mypyc/subtype.py index 6ad4dcb1d19e..6feb4b83b5cf 100644 --- a/mypyc/subtype.py +++ b/mypyc/subtype.py @@ -1,4 +1,3 @@ - """Subtype check for RTypes.""" from __future__ import annotations From 555d83aab0d659e68f594930ded92e458c9b7631 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 05/12] Update ircheck.py --- mypyc/analysis/ircheck.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mypyc/analysis/ircheck.py b/mypyc/analysis/ircheck.py index 6980c9cee419..0af0c4b0ec28 100644 --- a/mypyc/analysis/ircheck.py +++ b/mypyc/analysis/ircheck.py @@ -197,7 +197,10 @@ def can_coerce_to(src: RType, dest: RType) -> bool: if isinstance(src, RPrimitive): # If either src or dest is a disjoint type, then they must both be. if src.name in disjoint_types and dest.name in disjoint_types: - return src.name == dest.name + return src.name == dest.name or ( + src.name in ("builtins.dict", "builtins.dict[exact]") + and dest.name in ("builtins.dict", "builtins.dict[exact]") + ) return src.size == dest.size if isinstance(src, RInstance): return is_object_rprimitive(dest) From 665e2e6bcf0a5928e0df10aad70114409cb80fd7 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 06/12] Update rtypes.py --- mypyc/ir/rtypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/ir/rtypes.py b/mypyc/ir/rtypes.py index 6ae26b5dedf9..e5db2211d859 100644 --- a/mypyc/ir/rtypes.py +++ b/mypyc/ir/rtypes.py @@ -492,8 +492,8 @@ def __hash__(self) -> int: "builtins.dict[exact]", is_unboxed=False, is_refcounted=True) ) -dict_rprimitive: Final = RPrimitive("builtins.dict", is_unboxed=False, is_refcounted=True) # An instance of a subclass of dict. +dict_rprimitive: Final = RPrimitive("builtins.dict", is_unboxed=False, is_refcounted=True) # Python set object (or an instance of a subclass of set). set_rprimitive: Final = RPrimitive("builtins.set", is_unboxed=False, is_refcounted=True) From 0e7ef8dce648e33cfa68e2daa178f026f3a2e960 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:48:52 +0000 Subject: [PATCH 07/12] Update rtypes.py --- mypyc/ir/rtypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/ir/rtypes.py b/mypyc/ir/rtypes.py index e5db2211d859..7cb3d59e2ea9 100644 --- a/mypyc/ir/rtypes.py +++ b/mypyc/ir/rtypes.py @@ -489,7 +489,7 @@ def __hash__(self) -> int: # Python dict object. exact_dict_rprimitive: Final = RPrimitive( - "builtins.dict[exact]", is_unboxed=False, is_refcounted=True) + "builtins.dict[exact]", is_unboxed=False, is_refcounted=True ) # An instance of a subclass of dict. From 3aca0f3cd68815c9175daac2990ac11191c106a9 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 18 Aug 2025 17:10:36 -0400 Subject: [PATCH 08/12] Update misc_ops.py --- mypyc/primitives/misc_ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mypyc/primitives/misc_ops.py b/mypyc/primitives/misc_ops.py index 8e6e450c64dc..63a48b6e2906 100644 --- a/mypyc/primitives/misc_ops.py +++ b/mypyc/primitives/misc_ops.py @@ -13,6 +13,7 @@ c_pyssize_t_rprimitive, cstring_rprimitive, dict_rprimitive, + exact_dict_rprimitive, float_rprimitive, int_rprimitive, none_rprimitive, @@ -161,7 +162,7 @@ # Get the sys.modules dictionary get_module_dict_op = custom_op( arg_types=[], - return_type=dict_rprimitive, + return_type=exact_dict_rprimitive, c_function_name="PyImport_GetModuleDict", error_kind=ERR_NEVER, is_borrowed=True, From 328a11db21ce472b15d6d9d2e7987e33a5ba2737 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:58:33 -0400 Subject: [PATCH 09/12] update IR --- mypyc/test-data/irbuild-basic.test | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 612f3266fd79..340d1c230031 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -3290,7 +3290,7 @@ def root(): r4 :: str r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8 :: str r9 :: object r10 :: i32 @@ -3301,7 +3301,7 @@ def root(): r16 :: str r17 :: object r18 :: str - r19 :: dict + r19 :: dict[exact] r20 :: str r21 :: object r22 :: i32 @@ -3347,12 +3347,12 @@ def submodule(): r4 :: str r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8 :: str r9 :: object r10 :: i32 r11 :: bit - r12 :: dict + r12 :: dict[exact] r13 :: str r14 :: object r15 :: str From 405b9b58ca2d08bdffbe1eeeb4e52c835626fac4 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Fri, 3 Oct 2025 21:24:43 +0000 Subject: [PATCH 10/12] [mypyc] feat: use exact_dict_rprimitive for globals dict rtype --- mypyc/irbuild/builder.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mypyc/irbuild/builder.py b/mypyc/irbuild/builder.py index 63930123135f..79fc51f818c4 100644 --- a/mypyc/irbuild/builder.py +++ b/mypyc/irbuild/builder.py @@ -93,7 +93,7 @@ bitmap_rprimitive, bytes_rprimitive, c_pyssize_t_rprimitive, - dict_rprimitive, + exact_dict_rprimitive, int_rprimitive, is_float_rprimitive, is_list_rprimitive, @@ -437,6 +437,8 @@ def add_to_non_ext_dict( ) -> None: # Add an attribute entry into the class dict of a non-extension class. key_unicode = self.load_str(key) + # must use `dict_set_item_op` instead of `exact_dict_set_item_op` because + # it breaks enums, and probably other stuff, if we take the fast path. self.primitive_op(dict_set_item_op, [non_ext.dict, key_unicode, val], line) # It's important that accessing class dictionary items from multiple threads @@ -1409,7 +1411,7 @@ def load_global_str(self, name: str, line: int) -> Value: return self.primitive_op(dict_get_item_op, [_globals, reg], line) def load_globals_dict(self) -> Value: - return self.add(LoadStatic(dict_rprimitive, "globals", self.module_name)) + return self.add(LoadStatic(exact_dict_rprimitive, "globals", self.module_name)) def load_module_attr_by_fullname(self, fullname: str, line: int) -> Value: module, _, name = fullname.rpartition(".") From 5be83694ac76687be9afeb27fdffcce24f757232 Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Fri, 3 Oct 2025 22:04:42 +0000 Subject: [PATCH 11/12] fix ir --- mypyc/test-data/irbuild-basic.test | 38 ++++++++++----------- mypyc/test-data/irbuild-classes.test | 2 +- mypyc/test-data/irbuild-set.test | 4 +-- mypyc/test-data/irbuild-singledispatch.test | 4 +-- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 340d1c230031..972fe8ba5e99 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -1672,7 +1672,7 @@ L0: return r0 def g(): r0 :: tuple[int, int, int] - r1 :: dict + r1 :: dict[exact] r2 :: str r3, r4, r5 :: object r6 :: tuple[int, int, int] @@ -1687,7 +1687,7 @@ L0: return r6 def h(): r0 :: tuple[int, int] - r1 :: dict + r1 :: dict[exact] r2 :: str r3 :: object r4 :: list @@ -1732,7 +1732,7 @@ L0: def g(): r0, r1, r2 :: str r3, r4, r5 :: object - r6, r7 :: dict + r6, r7 :: dict[exact] r8 :: str r9 :: object r10 :: tuple @@ -1758,7 +1758,7 @@ L0: def h(): r0, r1 :: str r2, r3 :: object - r4, r5 :: dict + r4, r5 :: dict[exact] r6 :: str r7 :: object r8 :: dict @@ -2149,7 +2149,7 @@ def __top_level__(): r3 :: str r4, r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8 :: object r9, r10 :: str r11 :: object @@ -2161,53 +2161,53 @@ def __top_level__(): r17 :: object r18 :: tuple[object, object] r19 :: object - r20 :: dict + r20 :: dict[exact] r21 :: str r22 :: object r23 :: object[2] r24 :: object_ptr r25 :: object - r26 :: dict + r26 :: dict[exact] r27 :: str r28 :: i32 r29 :: bit r30 :: str - r31 :: dict + r31 :: dict[exact] r32 :: str r33, r34 :: object r35 :: object[2] r36 :: object_ptr r37 :: object r38 :: tuple - r39 :: dict + r39 :: dict[exact] r40 :: str r41 :: i32 r42 :: bit - r43 :: dict + r43 :: dict[exact] r44 :: str r45, r46, r47 :: object - r48 :: dict + r48 :: dict[exact] r49 :: str r50 :: i32 r51 :: bit r52 :: str - r53 :: dict + r53 :: dict[exact] r54 :: str r55 :: object - r56 :: dict + r56 :: dict[exact] r57 :: str r58 :: object r59 :: object[2] r60 :: object_ptr r61 :: object - r62 :: dict + r62 :: dict[exact] r63 :: str r64 :: i32 r65 :: bit r66 :: list r67, r68, r69 :: object r70 :: ptr - r71 :: dict + r71 :: dict[exact] r72 :: str r73 :: i32 r74 :: bit @@ -2784,7 +2784,7 @@ def __top_level__(): r3 :: str r4, r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8 :: object L0: r0 = builtins :: module @@ -3284,7 +3284,7 @@ x = 1 [file p/m.py] [out] def root(): - r0 :: dict + r0 :: dict[exact] r1, r2 :: object r3 :: bit r4 :: str @@ -3295,7 +3295,7 @@ def root(): r9 :: object r10 :: i32 r11 :: bit - r12 :: dict + r12 :: dict[exact] r13, r14 :: object r15 :: bit r16 :: str @@ -3341,7 +3341,7 @@ L4: r23 = r22 >= 0 :: signed return 1 def submodule(): - r0 :: dict + r0 :: dict[exact] r1, r2 :: object r3 :: bit r4 :: str diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index a98b3a7d3dcf..ed6add8ebcda 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -1064,7 +1064,7 @@ L0: return 1 def B.__mypyc_defaults_setup(__mypyc_self__): __mypyc_self__ :: __main__.B - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: str diff --git a/mypyc/test-data/irbuild-set.test b/mypyc/test-data/irbuild-set.test index 5586a2bf4cfb..62e7f422f5e4 100644 --- a/mypyc/test-data/irbuild-set.test +++ b/mypyc/test-data/irbuild-set.test @@ -646,7 +646,7 @@ L0: return r3 def not_precomputed_non_final_name(i): i :: int - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: int @@ -766,7 +766,7 @@ L4: L5: return 1 def not_precomputed(): - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: int diff --git a/mypyc/test-data/irbuild-singledispatch.test b/mypyc/test-data/irbuild-singledispatch.test index 1060ee63c57d..66c48e5ee4ed 100644 --- a/mypyc/test-data/irbuild-singledispatch.test +++ b/mypyc/test-data/irbuild-singledispatch.test @@ -124,7 +124,7 @@ L0: return r0 def f(arg): arg :: object - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: bool @@ -255,7 +255,7 @@ L0: return r0 def f(x): x :: object - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: None From f3ac86416091a5d3a10892bd28c480cba3bc2cee Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Fri, 3 Oct 2025 22:30:14 +0000 Subject: [PATCH 12/12] fix ir --- mypyc/test-data/irbuild-basic.test | 48 +++++++++++++++------------- mypyc/test-data/irbuild-classes.test | 18 +++++------ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 972fe8ba5e99..662372196f8e 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -526,11 +526,11 @@ def __top_level__(): r11 :: native_int[4] r12 :: c_ptr r13 :: object - r14 :: dict + r14 :: dict[exact] r15, r16 :: str r17 :: bit r18 :: str - r19 :: dict + r19 :: dict[exact] r20 :: str r21 :: i32 r22 :: bit @@ -540,7 +540,7 @@ def __top_level__(): r26 :: native_int[1] r27 :: c_ptr r28 :: object - r29 :: dict + r29 :: dict[exact] r30, r31 :: str r32 :: bit r33 :: object @@ -604,18 +604,18 @@ def h() -> int: [out] def f(x): x :: int - r0 :: dict + r0 :: dict[exact] r1 :: str r2, r3 :: object r4 :: object[1] r5 :: object_ptr r6 :: object r7 :: int - r8 :: dict + r8 :: dict[exact] r9 :: str r10, r11 :: object r12, r13 :: int - r14 :: dict + r14 :: dict[exact] r15 :: str r16, r17 :: object r18, r19 :: int @@ -648,10 +648,10 @@ def __top_level__(): r3 :: str r4, r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8, r9, r10 :: object r11 :: str - r12 :: dict + r12 :: dict[exact] r13 :: object L0: r0 = builtins :: module @@ -1137,7 +1137,7 @@ L0: return r0 def call_python_function(x): x :: int - r0 :: dict + r0 :: dict[exact] r1 :: str r2, r3 :: object r4 :: object[1] @@ -1159,7 +1159,7 @@ def return_float(): L0: return 5.0 def return_callable_type(): - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object L0: @@ -1423,7 +1423,7 @@ def f() -> None: print(x) [out] def f(): - r0 :: dict + r0 :: dict[exact] r1 :: str r2 :: object r3 :: int @@ -1452,12 +1452,12 @@ def __top_level__(): r2 :: bit r3 :: str r4 :: object - r5 :: dict + r5 :: dict[exact] r6 :: str r7 :: object r8 :: i32 r9 :: bit - r10 :: dict + r10 :: dict[exact] r11 :: str r12 :: object r13 :: int @@ -1732,7 +1732,8 @@ L0: def g(): r0, r1, r2 :: str r3, r4, r5 :: object - r6, r7 :: dict[exact] + r6 :: dict + r7 :: dict[exact] r8 :: str r9 :: object r10 :: tuple @@ -1758,7 +1759,8 @@ L0: def h(): r0, r1 :: str r2, r3 :: object - r4, r5 :: dict[exact] + r4 :: dict + r5 :: dict[exact] r6 :: str r7 :: object r8 :: dict @@ -2581,19 +2583,19 @@ def c(): r0 :: __main__.c_env r1 :: __main__.d_c_obj r2 :: bool - r3 :: dict + r3 :: dict[exact] r4 :: str r5 :: object r6 :: object[1] r7 :: object_ptr r8 :: object - r9 :: dict + r9 :: dict[exact] r10 :: str r11 :: object r12 :: object[1] r13 :: object_ptr r14, d :: object - r15 :: dict + r15 :: dict[exact] r16 :: str r17 :: i32 r18 :: bit @@ -2643,24 +2645,24 @@ def __top_level__(): r3 :: str r4, r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8 :: object - r9 :: dict + r9 :: dict[exact] r10 :: str r11 :: object - r12 :: dict + r12 :: dict[exact] r13 :: str r14 :: object r15 :: object[1] r16 :: object_ptr r17 :: object - r18 :: dict + r18 :: dict[exact] r19 :: str r20 :: object r21 :: object[1] r22 :: object_ptr r23 :: object - r24 :: dict + r24 :: dict[exact] r25 :: str r26 :: i32 r27 :: bit diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index ed6add8ebcda..0ec109e83782 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -201,19 +201,19 @@ def __top_level__(): r3 :: str r4, r5 :: object r6 :: str - r7 :: dict + r7 :: dict[exact] r8, r9 :: object r10 :: str - r11 :: dict + r11 :: dict[exact] r12 :: object r13 :: str - r14 :: dict + r14 :: dict[exact] r15 :: str r16 :: object r17 :: object[1] r18 :: object_ptr r19 :: object - r20 :: dict + r20 :: dict[exact] r21 :: str r22 :: i32 r23 :: bit @@ -225,7 +225,7 @@ def __top_level__(): r30 :: tuple r31 :: i32 r32 :: bit - r33 :: dict + r33 :: dict[exact] r34 :: str r35 :: i32 r36 :: bit @@ -236,15 +236,15 @@ def __top_level__(): r42 :: tuple r43 :: i32 r44 :: bit - r45 :: dict + r45 :: dict[exact] r46 :: str r47 :: i32 r48 :: bit r49, r50 :: object - r51 :: dict + r51 :: dict[exact] r52 :: str r53 :: object - r54 :: dict + r54 :: dict[exact] r55 :: str r56, r57 :: object r58 :: tuple @@ -255,7 +255,7 @@ def __top_level__(): r65 :: tuple r66 :: i32 r67 :: bit - r68 :: dict + r68 :: dict[exact] r69 :: str r70 :: i32 r71 :: bit