| 
									
										
										
										
											2020-06-22 17:39:32 +02:00
										 |  |  | #ifndef Py_INTERNAL_LIST_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_LIST_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-29 08:11:28 -08:00
										 |  |  | PyAPI_FUNC(PyObject*) _PyList_Extend(PyListObject *, PyObject *); | 
					
						
							| 
									
										
										
										
											2023-08-24 21:44:34 +02:00
										 |  |  | extern void _PyList_DebugMallocStats(FILE *out); | 
					
						
							| 
									
										
										
										
											2020-06-22 17:39:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-28 17:42:22 +01:00
										 |  |  | #define _PyList_ITEMS(op) _Py_RVALUE(_PyList_CAST(op)->ob_item)
 | 
					
						
							| 
									
										
										
										
											2020-06-22 17:39:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-29 08:11:28 -08:00
										 |  |  | PyAPI_FUNC(int) | 
					
						
							| 
									
										
										
										
											2022-04-01 06:23:42 -04:00
										 |  |  | _PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-01 08:58:08 +09:00
										 |  |  | // In free-threaded build: self should be locked by the caller, if it should be thread-safe.
 | 
					
						
							| 
									
										
										
										
											2022-04-01 06:23:42 -04:00
										 |  |  | static inline int | 
					
						
							|  |  |  | _PyList_AppendTakeRef(PyListObject *self, PyObject *newitem) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     assert(self != NULL && newitem != NULL); | 
					
						
							|  |  |  |     assert(PyList_Check(self)); | 
					
						
							| 
									
										
										
										
											2024-02-01 08:58:08 +09:00
										 |  |  |     Py_ssize_t len = Py_SIZE(self); | 
					
						
							| 
									
										
										
										
											2022-04-01 06:23:42 -04:00
										 |  |  |     Py_ssize_t allocated = self->allocated; | 
					
						
							|  |  |  |     assert((size_t)len + 1 < PY_SSIZE_T_MAX); | 
					
						
							|  |  |  |     if (allocated > len) { | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | #ifdef Py_GIL_DISABLED
 | 
					
						
							|  |  |  |         _Py_atomic_store_ptr_release(&self->ob_item[len], newitem); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2023-06-28 03:45:57 +02:00
										 |  |  |         PyList_SET_ITEM(self, len, newitem); | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-11-03 12:02:39 +01:00
										 |  |  |         Py_SET_SIZE(self, len + 1); | 
					
						
							| 
									
										
										
										
											2022-04-01 06:23:42 -04:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return _PyList_AppendTakeRefListResize(self, newitem); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-06-22 17:39:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-26 04:10:23 +02:00
										 |  |  | // Repeat the bytes of a buffer in place
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | _Py_memory_repeat(char* dest, Py_ssize_t len_dest, Py_ssize_t len_src) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     assert(len_src > 0); | 
					
						
							|  |  |  |     Py_ssize_t copied = len_src; | 
					
						
							|  |  |  |     while (copied < len_dest) { | 
					
						
							|  |  |  |         Py_ssize_t bytes_to_copy = Py_MIN(copied, len_dest - copied); | 
					
						
							| 
									
										
										
										
											2024-09-17 16:43:39 +02:00
										 |  |  |         memcpy(dest + copied, dest, (size_t)bytes_to_copy); | 
					
						
							| 
									
										
										
										
											2022-07-26 04:10:23 +02:00
										 |  |  |         copied += bytes_to_copy; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-21 06:19:26 -04:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |     PyObject_HEAD | 
					
						
							|  |  |  |     Py_ssize_t it_index; | 
					
						
							|  |  |  |     PyListObject *it_seq; /* Set to NULL when iterator is exhausted */ | 
					
						
							|  |  |  | } _PyListIterObject; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-12 14:49:49 -04:00
										 |  |  | union _PyStackRef; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(PyObject *)_PyList_FromStackRefSteal(const union _PyStackRef *src, Py_ssize_t n); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-03 10:49:49 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 17:39:32 +02:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif   /* !Py_INTERNAL_LIST_H */
 |