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 l = range(0, 10) 2 print l # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 4 s = slice(2, 5) 5 print s # __builtins__.span.slice(2, 5, 1) 6 7 print l[s] # [2, 3, 4] 8 print l[2:5] # [2, 3, 4] 9 print l[2:5:-1] # [] 10 print l[5:2:-1] # [5, 4, 3] 11 print l[1:9:2] # [1, 3, 5, 7] 12 print l[9:1:-2] # [9, 7, 5, 3] 13 print l[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 14 print l[::-2] # [9, 7, 5, 3, 1] 15 print reversed(l) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]