@@ -235,6 +235,10 @@ def can_raise(self) -> bool:
235235 def sources (self ) -> list [Value ]:
236236 """All the values the op may read."""
237237
238+ @abstractmethod
239+ def set_sources (self , new : list [Value ]) -> None :
240+ """Rewrite the soruces of an op"""
241+
238242 def stolen (self ) -> list [Value ]:
239243 """Return arguments that have a reference count stolen by this op"""
240244 return []
@@ -271,6 +275,9 @@ def __init__(self, dest: Register, src: Value, line: int = -1) -> None:
271275 def sources (self ) -> list [Value ]:
272276 return [self .src ]
273277
278+ def set_sources (self , new : list [Value ]) -> None :
279+ (self .src ,) = new
280+
274281 def stolen (self ) -> list [Value ]:
275282 return [self .src ]
276283
@@ -301,6 +308,9 @@ def __init__(self, dest: Register, src: list[Value], line: int = -1) -> None:
301308 def sources (self ) -> list [Value ]:
302309 return self .src .copy ()
303310
311+ def set_sources (self , new : list [Value ]) -> None :
312+ self .src = new [:]
313+
304314 def stolen (self ) -> list [Value ]:
305315 return []
306316
@@ -342,6 +352,9 @@ def __repr__(self) -> str:
342352 def sources (self ) -> list [Value ]:
343353 return []
344354
355+ def set_sources (self , new : list [Value ]) -> None :
356+ assert not new
357+
345358 def accept (self , visitor : OpVisitor [T ]) -> T :
346359 return visitor .visit_goto (self )
347360
@@ -402,6 +415,9 @@ def set_target(self, i: int, new: BasicBlock) -> None:
402415 def sources (self ) -> list [Value ]:
403416 return [self .value ]
404417
418+ def set_sources (self , new : list [Value ]) -> None :
419+ (self .value ,) = new
420+
405421 def invert (self ) -> None :
406422 self .negated = not self .negated
407423
@@ -421,6 +437,9 @@ def __init__(self, value: Value, line: int = -1) -> None:
421437 def sources (self ) -> list [Value ]:
422438 return [self .value ]
423439
440+ def set_sources (self , new : list [Value ]) -> None :
441+ (self .value ,) = new
442+
424443 def stolen (self ) -> list [Value ]:
425444 return [self .value ]
426445
@@ -452,6 +471,9 @@ def __init__(self, line: int = -1) -> None:
452471 def sources (self ) -> list [Value ]:
453472 return []
454473
474+ def set_sources (self , new : list [Value ]) -> None :
475+ assert not new
476+
455477 def accept (self , visitor : OpVisitor [T ]) -> T :
456478 return visitor .visit_unreachable (self )
457479
@@ -494,6 +516,9 @@ def __init__(self, src: Value, line: int = -1) -> None:
494516 def sources (self ) -> list [Value ]:
495517 return [self .src ]
496518
519+ def set_sources (self , new : list [Value ]) -> None :
520+ (self .src ,) = new
521+
497522 def accept (self , visitor : OpVisitor [T ]) -> T :
498523 return visitor .visit_inc_ref (self )
499524
@@ -519,6 +544,9 @@ def __repr__(self) -> str:
519544 def sources (self ) -> list [Value ]:
520545 return [self .src ]
521546
547+ def set_sources (self , new : list [Value ]) -> None :
548+ (self .src ,) = new
549+
522550 def accept (self , visitor : OpVisitor [T ]) -> T :
523551 return visitor .visit_dec_ref (self )
524552
@@ -544,6 +572,9 @@ def __init__(self, fn: FuncDecl, args: Sequence[Value], line: int) -> None:
544572 def sources (self ) -> list [Value ]:
545573 return list (self .args .copy ())
546574
575+ def set_sources (self , new : list [Value ]) -> None :
576+ self .args = new [:]
577+
547578 def accept (self , visitor : OpVisitor [T ]) -> T :
548579 return visitor .visit_call (self )
549580
@@ -572,6 +603,9 @@ def __init__(self, obj: Value, method: str, args: list[Value], line: int = -1) -
572603 def sources (self ) -> list [Value ]:
573604 return self .args .copy () + [self .obj ]
574605
606+ def set_sources (self , new : list [Value ]) -> None :
607+ * self .args , self .obj = new
608+
575609 def accept (self , visitor : OpVisitor [T ]) -> T :
576610 return visitor .visit_method_call (self )
577611
@@ -599,6 +633,9 @@ def __init__(
599633 def sources (self ) -> list [Value ]:
600634 return []
601635
636+ def set_sources (self , new : list [Value ]) -> None :
637+ assert not new
638+
602639 def accept (self , visitor : OpVisitor [T ]) -> T :
603640 return visitor .visit_load_error_value (self )
604641
@@ -631,6 +668,9 @@ def __init__(self, value: LiteralValue, rtype: RType) -> None:
631668 def sources (self ) -> list [Value ]:
632669 return []
633670
671+ def set_sources (self , new : list [Value ]) -> None :
672+ assert not new
673+
634674 def accept (self , visitor : OpVisitor [T ]) -> T :
635675 return visitor .visit_load_literal (self )
636676
@@ -655,6 +695,9 @@ def __init__(self, obj: Value, attr: str, line: int, *, borrow: bool = False) ->
655695 def sources (self ) -> list [Value ]:
656696 return [self .obj ]
657697
698+ def set_sources (self , new : list [Value ]) -> None :
699+ (self .obj ,) = new
700+
658701 def accept (self , visitor : OpVisitor [T ]) -> T :
659702 return visitor .visit_get_attr (self )
660703
@@ -687,6 +730,9 @@ def mark_as_initializer(self) -> None:
687730 def sources (self ) -> list [Value ]:
688731 return [self .obj , self .src ]
689732
733+ def set_sources (self , new : list [Value ]) -> None :
734+ self .obj , self .src = new
735+
690736 def stolen (self ) -> list [Value ]:
691737 return [self .src ]
692738
@@ -737,6 +783,9 @@ def __init__(
737783 def sources (self ) -> list [Value ]:
738784 return []
739785
786+ def set_sources (self , new : list [Value ]) -> None :
787+ assert not new
788+
740789 def accept (self , visitor : OpVisitor [T ]) -> T :
741790 return visitor .visit_load_static (self )
742791
@@ -766,6 +815,9 @@ def __init__(
766815 def sources (self ) -> list [Value ]:
767816 return [self .value ]
768817
818+ def set_sources (self , new : list [Value ]) -> None :
819+ (self .value ,) = new
820+
769821 def accept (self , visitor : OpVisitor [T ]) -> T :
770822 return visitor .visit_init_static (self )
771823
@@ -795,6 +847,9 @@ def sources(self) -> list[Value]:
795847 def stolen (self ) -> list [Value ]:
796848 return self .items .copy ()
797849
850+ def set_sources (self , new : list [Value ]) -> None :
851+ self .items = new [:]
852+
798853 def accept (self , visitor : OpVisitor [T ]) -> T :
799854 return visitor .visit_tuple_set (self )
800855
@@ -816,6 +871,9 @@ def __init__(self, src: Value, index: int, line: int = -1, *, borrow: bool = Fal
816871 def sources (self ) -> list [Value ]:
817872 return [self .src ]
818873
874+ def set_sources (self , new : list [Value ]) -> None :
875+ (self .src ,) = new
876+
819877 def accept (self , visitor : OpVisitor [T ]) -> T :
820878 return visitor .visit_tuple_get (self )
821879
@@ -839,6 +897,9 @@ def __init__(self, src: Value, typ: RType, line: int, *, borrow: bool = False) -
839897 def sources (self ) -> list [Value ]:
840898 return [self .src ]
841899
900+ def set_sources (self , new : list [Value ]) -> None :
901+ (self .src ,) = new
902+
842903 def stolen (self ) -> list [Value ]:
843904 if self .is_borrowed :
844905 return []
@@ -872,6 +933,9 @@ def __init__(self, src: Value, line: int = -1) -> None:
872933 def sources (self ) -> list [Value ]:
873934 return [self .src ]
874935
936+ def set_sources (self , new : list [Value ]) -> None :
937+ (self .src ,) = new
938+
875939 def stolen (self ) -> list [Value ]:
876940 return [self .src ]
877941
@@ -898,6 +962,9 @@ def __init__(self, src: Value, typ: RType, line: int) -> None:
898962 def sources (self ) -> list [Value ]:
899963 return [self .src ]
900964
965+ def set_sources (self , new : list [Value ]) -> None :
966+ (self .src ,) = new
967+
901968 def accept (self , visitor : OpVisitor [T ]) -> T :
902969 return visitor .visit_unbox (self )
903970
@@ -930,6 +997,9 @@ def __init__(self, class_name: str, value: str | Value | None, line: int) -> Non
930997 def sources (self ) -> list [Value ]:
931998 return []
932999
1000+ def set_sources (self , new : list [Value ]) -> None :
1001+ assert not new
1002+
9331003 def accept (self , visitor : OpVisitor [T ]) -> T :
9341004 return visitor .visit_raise_standard_error (self )
9351005
@@ -968,7 +1038,10 @@ def __init__(
9681038 self .var_arg_idx = var_arg_idx
9691039
9701040 def sources (self ) -> list [Value ]:
971- return self .args
1041+ return self .args [:]
1042+
1043+ def set_sources (self , new : list [Value ]) -> None :
1044+ self .args = new [:]
9721045
9731046 def stolen (self ) -> list [Value ]:
9741047 if isinstance (self .steals , list ):
@@ -1001,6 +1074,9 @@ def __init__(self, src: Value, dst_type: RType, line: int = -1) -> None:
10011074 def sources (self ) -> list [Value ]:
10021075 return [self .src ]
10031076
1077+ def set_sources (self , new : list [Value ]) -> None :
1078+ (self .src ,) = new
1079+
10041080 def stolen (self ) -> list [Value ]:
10051081 return []
10061082
@@ -1032,6 +1108,9 @@ def __init__(self, src: Value, dst_type: RType, signed: bool, line: int = -1) ->
10321108 def sources (self ) -> list [Value ]:
10331109 return [self .src ]
10341110
1111+ def set_sources (self , new : list [Value ]) -> None :
1112+ (self .src ,) = new
1113+
10351114 def stolen (self ) -> list [Value ]:
10361115 return []
10371116
@@ -1059,6 +1138,9 @@ def __init__(self, type: RType, identifier: str, line: int = -1, ann: object = N
10591138 def sources (self ) -> list [Value ]:
10601139 return []
10611140
1141+ def set_sources (self , new : list [Value ]) -> None :
1142+ (self .src ,) = new
1143+
10621144 def accept (self , visitor : OpVisitor [T ]) -> T :
10631145 return visitor .visit_load_global (self )
10641146
@@ -1115,6 +1197,9 @@ def __init__(self, type: RType, lhs: Value, rhs: Value, op: int, line: int = -1)
11151197 def sources (self ) -> list [Value ]:
11161198 return [self .lhs , self .rhs ]
11171199
1200+ def set_sources (self , new : list [Value ]) -> None :
1201+ self .lhs , self .rhs = new
1202+
11181203 def accept (self , visitor : OpVisitor [T ]) -> T :
11191204 return visitor .visit_int_op (self )
11201205
@@ -1178,6 +1263,9 @@ def __init__(self, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
11781263 def sources (self ) -> list [Value ]:
11791264 return [self .lhs , self .rhs ]
11801265
1266+ def set_sources (self , new : list [Value ]) -> None :
1267+ self .lhs , self .rhs = new
1268+
11811269 def accept (self , visitor : OpVisitor [T ]) -> T :
11821270 return visitor .visit_comparison_op (self )
11831271
@@ -1292,6 +1380,9 @@ def __init__(self, type: RType, src: Value, line: int = -1) -> None:
12921380 def sources (self ) -> list [Value ]:
12931381 return [self .src ]
12941382
1383+ def set_sources (self , new : list [Value ]) -> None :
1384+ (self .src ,) = new
1385+
12951386 def accept (self , visitor : OpVisitor [T ]) -> T :
12961387 return visitor .visit_load_mem (self )
12971388
@@ -1317,6 +1408,9 @@ def __init__(self, type: RType, dest: Value, src: Value, line: int = -1) -> None
13171408 def sources (self ) -> list [Value ]:
13181409 return [self .src , self .dest ]
13191410
1411+ def set_sources (self , new : list [Value ]) -> None :
1412+ self .src , self .dest = new
1413+
13201414 def stolen (self ) -> list [Value ]:
13211415 return [self .src ]
13221416
@@ -1343,6 +1437,9 @@ def __init__(self, src: Value, src_type: RType, field: str, line: int = -1) -> N
13431437 def sources (self ) -> list [Value ]:
13441438 return [self .src ]
13451439
1440+ def set_sources (self , new : list [Value ]) -> None :
1441+ (self .src ,) = new
1442+
13461443 def accept (self , visitor : OpVisitor [T ]) -> T :
13471444 return visitor .visit_get_element_ptr (self )
13481445
@@ -1371,6 +1468,11 @@ def sources(self) -> list[Value]:
13711468 else :
13721469 return []
13731470
1471+ def set_sources (self , new : list [Value ]) -> None :
1472+ if new :
1473+ assert isinstance (new [0 ], Register )
1474+ self .src = new [0 ]
1475+
13741476 def accept (self , visitor : OpVisitor [T ]) -> T :
13751477 return visitor .visit_load_address (self )
13761478
@@ -1415,6 +1517,9 @@ def stolen(self) -> list[Value]:
14151517 return self .src .copy ()
14161518 return []
14171519
1520+ def set_sources (self , new : list [Value ]) -> None :
1521+ self .src = new [:]
1522+
14181523 def accept (self , visitor : OpVisitor [T ]) -> T :
14191524 return visitor .visit_keep_alive (self )
14201525
0 commit comments