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 A: 2 def __init__(self, x): 3 self.x = x 4 def __sub__(self, other): 5 return self.x - other.x 6 7 class B: 8 def __init__(self, x): 9 self.x = x 10 def __rsub__(self, other): 11 return other.x - self.x 12 13 class C: 14 def __init__(self, x): 15 self.x = x 16 17 a = A(10) 18 b = B(5) 19 c = C(3) 20 21 print a - b # 5 22 print c - b # -2 23 print a - c # 7 24 25 try: 26 print b - c # should raise an exception 27 except TypeError: 28 print "b - c: b and c do not respectively support the __sub__ and __rsub__ operations"