@@ -578,35 +578,37 @@ class ListObject(ctypes.Structure):
578578 ("ob_item", ctypes.c_void_p),
579579 ]
580580
581- class TupleObject(ctypes.Structure):
582- _fields_ = [
583- ("ob_type", ctypes.c_void_p),
584- ("ob_size", ctypes.c_ssize_t),
585- ]
586-
587- class TupleItems(ctypes.Structure):
588- _fields_ = [
589- ("ob_item0", ctypes.c_void_p),
590- ("ob_item1", ctypes.c_void_p),
591- ]
581+ if sys.version_info >= (3, 14):
582+ class TupleObject(ctypes.Structure):
583+ _fields_ = [
584+ ("ob_type", ctypes.c_void_p),
585+ ("ob_size", ctypes.c_ssize_t),
586+ ("ob_hash", ctypes.c_ssize_t),
587+ ("ob_item0", ctypes.c_void_p),
588+ ("ob_item1", ctypes.c_void_p),
589+ ]
590+ else:
591+ class TupleObject(ctypes.Structure):
592+ _fields_ = [
593+ ("ob_type", ctypes.c_void_p),
594+ ("ob_size", ctypes.c_ssize_t),
595+ ("ob_item0", ctypes.c_void_p),
596+ ("ob_item1", ctypes.c_void_p),
597+ ]
592598
593599def ob_type_field(obj):
594600 # Assume ob_type is the last field of PyObject
595601 return id(obj) + sys.getsizeof(None) - ctypes.sizeof(ctypes.c_void_p)
596602
597- def tuple_ob_items_field(tup):
598- assert isinstance(tup, tuple)
599- return id(tup) + sys.getsizeof(()) - sys.getsizeof(None)
600-
601603def main():
602604 bad_type = (1, 2, 3)
603605 bad_elem = (4, 5, 6)
604606 nullelem = (7, 8, 9)
605607 bad_list = [0, 1, 2]
606608
607609 TupleObject.from_address(ob_type_field(bad_type)).ob_type = 0xded
608- TupleItems .from_address(tuple_ob_items_field (bad_elem)).ob_item1 = 0xbad
609- TupleItems .from_address(tuple_ob_items_field (nullelem)).ob_item1 = 0x0
610+ TupleObject .from_address(ob_type_field (bad_elem)).ob_item1 = 0xbad
611+ TupleObject .from_address(ob_type_field (nullelem)).ob_item1 = 0x0
610612 ListObject.from_address(ob_type_field(bad_list)).ob_item = 0x0
611613
612614 fifo = sys.argv[1]
0 commit comments