2017-03-23 | Paul Boddie | raw annotate files changeset graph | Represent integers as __attr values with bit 0 set. Since pointers must be aligned (to four-byte boundaries on many modern systems, maybe two-byte boundaries on older or embedded systems, eight-byte boundaries on some 64-bit systems), any value with bit 0 set will not be referencing an object. This avoids allocating objects for integers and instead just allows them to be passed around. Bit 0 needs to be tested when attributes are accessed, and for integers, a common instance is employed to provide any instance attributes, an instance table reference and a reference to the integer class. | integers-as-tagged-attrs |
1 a = 4 2 3 def f(x): 4 # f.$l0 f.$l0.$l0 5 g = lambda y, x=x: lambda z, x=x, y=y: (x, y, z, a) 6 return g 7 8 print f # __main__.f 9 print f(1) # __main__.f.$l0 10 print f(1)(2) # __main__.f.$l0.$l0 11 12 result = f(1)(2)(3) 13 print result[0] 14 print result[1] 15 print result[2] 16 print result[3] 17 print result # (1, 2, 3, 4)