@@ -280,14 +280,7 @@ def generate_tuple(self, name: str, t: tuple[object, ...]) -> str:
280
280
self .write (item + "," )
281
281
return f"& { name } ._object.ob_base.ob_base"
282
282
283
- def generate_int (self , name : str , i : int ) -> str :
284
- maxint = sys .maxsize
285
- if maxint == 2 ** 31 - 1 :
286
- digit = 2 ** 15
287
- elif maxint == 2 ** 63 - 1 :
288
- digit = 2 ** 30
289
- else :
290
- assert False , f"What int size is this system?!? { maxint = } "
283
+ def _generate_int_for_bits (self , name : str , i : int , digit : int ) -> None :
291
284
sign = - 1 if i < 0 else 0 if i == 0 else + 1
292
285
i = abs (i )
293
286
digits : list [int ] = []
@@ -304,6 +297,20 @@ def generate_int(self, name: str, i: int) -> str:
304
297
if digits :
305
298
ds = ", " .join (map (str , digits ))
306
299
self .write (f".ob_digit = {{ { ds } }}," )
300
+
301
+ def generate_int (self , name : str , i : int ) -> str :
302
+ if abs (i ) < 2 ** 15 :
303
+ self ._generate_int_for_bits (name , i , 2 ** 15 )
304
+ else :
305
+ connective = "if"
306
+ for bits_in_digit in 15 , 30 :
307
+ self .write (f"#{ connective } PYLONG_BITS_IN_DIGIT == { bits_in_digit } " )
308
+ self ._generate_int_for_bits (name , i , 2 ** bits_in_digit )
309
+ connective = "elif"
310
+ self .write ("#else" )
311
+ self .write ('#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"' )
312
+ self .write ("#endif" )
313
+ # If neither clause applies, it won't compile
307
314
return f"& { name } .ob_base.ob_base"
308
315
309
316
def generate_float (self , name : str , x : float ) -> str :
0 commit comments