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 class C: 2 def __init__(x, y, z): # no explicit self 3 self.x = x 4 self.y = y 5 self.z = z 6 7 def c(): 8 return self.x 9 10 class D(C): 11 def d(): 12 return self.y 13 14 class E(D): 15 def c(): 16 return self.z 17 18 c = C(1, 2, 3) 19 d = D(1, 2, 3) 20 e = E(1, 2, 3) 21 22 print c.c() # 1 23 print d.c() # 1 24 print e.c() # 3 25 print d.d() # 2 26 print e.d() # 2