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 C: 2 def m(self): 3 return 1 4 5 D = C # alias for C 6 7 print C # __main__.C 8 print D # __main__.C 9 10 class E: 11 def m(self): 12 return 2 13 14 F = E # alias for E 15 16 print E # __main__.E 17 print F # __main__.E 18 19 def f(): 20 c = C 21 d = D # C 22 cm = C.m 23 dm = D.m # C.m 24 25 print c # __main__.C 26 print d # __main__.C 27 print cm # __main__.C.m 28 print dm # __main__.C.m 29 30 c = E 31 d = F # E 32 cm = E.m 33 dm = F.m # E.m 34 35 print c # __main__.E 36 print d # __main__.E 37 print cm # __main__.E.m 38 print dm # __main__.E.m 39 40 f() 41 42 Cm = C.m 43 Dm = D.m 44 Em = E.m 45 Fm = F.m 46 47 print Cm # __main__.C.m 48 print Dm # __main__.C.m 49 print Em # __main__.E.m 50 print Fm # __main__.E.m 51 52 def g(): 53 Cm = E.m 54 Dm = F.m # E.m 55 56 print Cm # __main__.E.m 57 print Dm # __main__.E.m 58 59 g() 60 61 def h(): 62 global Em, Fm 63 Em = C.m 64 Fm = D.m # C.m 65 66 print Em # __main__.C.m 67 print Fm # __main__.C.m 68 69 h() 70 71 print Em # __main__.C.m 72 print Fm # __main__.C.m 73 74 Ci = C() 75 Ei = E() 76 77 print Ci # <__main__.C instance> 78 print Ei # <__main__.E instance> 79 80 def i(): 81 c = Ci 82 print c # <__main__.C instance> 83 c = Ei 84 print c # <__main__.E instance> 85 86 i() 87 88 def j(): 89 global Ei 90 Ei = C() 91 print Ei # <__main__.C instance> 92 93 j() 94 95 print Ei # <__main__.C instance> 96 97 L = [] 98 M = [1] 99 100 print L # [] 101 print M # [1] 102 103 def k(): 104 c = L 105 print c # [] 106 107 k() 108 109 def l(): 110 global M 111 M = [] 112 print M # [] 113 114 l() 115 print M # []