@@ -785,18 +785,22 @@ def try_specialize_in_expr(
785785 items = [builder .accept (item ) for item in rhs .items ]
786786 elif isinstance (builder .node_type (rhs ), RTuple ):
787787 left = builder .accept (lhs )
788- tuple_val = builder .accept (rhs )
789- assert isinstance (tuple_val .type , RTuple )
790788 proper_type = get_proper_type (builder .types [rhs ])
791789 assert isinstance (proper_type , TupleType )
792- items = [
793- (
794- LoadLiteral (typ .value , object_rprimitive )
795- if isinstance (typ , LiteralType )
796- else builder .add (TupleGet (tuple_val , i ))
797- )
798- for i , typ in enumerate (map (try_getting_literal , proper_type .items ))
799- ]
790+ literal_items = list (map (try_getting_literal , proper_type .items ))
791+ if None not in literal_items :
792+ # If all tuple items are literals we don't even need to accept the tuple
793+ # TODO: should we use object_rprimitive? prob not, what do?
794+ items = [LoadLiteral (literal .value , object_rprimitive ) for literal in literal_items ]
795+ else :
796+ tuple_val = builder .accept (rhs )
797+ assert isinstance (tuple_val .type , RTuple )
798+ proper_type = get_proper_type (builder .types [rhs ])
799+ items = [
800+ # TODO: should we use object_rprimitive? prob not, what do?
801+ LoadLiteral (typ .value , object_rprimitive ) if isinstance (typ , LiteralType ) else builder .add (TupleGet (tuple_val , i ))
802+ for i , typ in enumerate (map (try_getting_literal , proper_type .items ))
803+ ]
800804
801805 if items is not None :
802806 assert left is not None
0 commit comments