2021-11-28 | Paul Boddie | raw annotate files changeset graph | Introduced support for values that can be allocated on a special thread-local stack, copied around and overwritten/mutated, demonstrating the concept using integer and floating-point numbers. Various complications arise with special attributes (such as __data__) due to the way references are tagged to indicate mutable values, and attribute slots must be cleared in locals, objects and fragments before values are stored since target slots are tested for mutable values. | tagged-address-values |
1 class SignalState: 2 Red = 1 3 Amber = 2 4 Green = 3 5 AmberAgain = 4 6 Off = None 7 8 class Signal: 9 def __init__(self): 10 self.disable() 11 12 def enable(self): 13 self.state = SignalState.Red 14 15 def disable(self): 16 self.state = SignalState.Off 17 18 def next(self): 19 if self.state == SignalState.Red: 20 self.state = SignalState.Amber 21 elif self.state == SignalState.Amber: 22 self.state = SignalState.Green 23 elif self.state == SignalState.Green: 24 self.state = SignalState.AmberAgain 25 elif self.state == SignalState.AmberAgain: 26 self.state = SignalState.Red 27 else: 28 self.state = SignalState.Off 29 30 s = Signal() 31 print s.state # None 32 s.next() 33 print s.state # None 34 s.enable() 35 print s.state # 1 36 s.next() 37 print s.state # 2 38 s.next() 39 print s.state # 3 40 s.next() 41 print s.state # 4 42 s.next() 43 print s.state # 1