@@ -245,6 +245,15 @@ typedef struct _m_tracked_node_t {
245245 uint8_t data [];
246246} m_tracked_node_t ;
247247
248+ // Helper to get data size of a tracked node, abstracting MICROPY_TRACKED_ALLOC_STORE_SIZE.
249+ static inline size_t get_tracked_node_size (m_tracked_node_t * node ) {
250+ #if MICROPY_TRACKED_ALLOC_STORE_SIZE
251+ return node -> size ;
252+ #else
253+ return gc_nbytes (node ) - sizeof (m_tracked_node_t );
254+ #endif
255+ }
256+
248257#if MICROPY_DEBUG_VERBOSE
249258static size_t m_tracked_count_links (size_t * nb ) {
250259 m_tracked_node_lock ();
@@ -292,18 +301,57 @@ void *m_tracked_calloc(size_t nmemb, size_t size) {
292301 return & node -> data [0 ];
293302}
294303
304+ void * m_tracked_realloc (void * ptr_in , size_t n_bytes ) {
305+ // check for pure allocation
306+ if (ptr_in == NULL ) {
307+ return m_tracked_calloc (1 , n_bytes );
308+ }
309+ // check for pure free
310+ if (n_bytes == 0 ) {
311+ m_tracked_free (ptr_in );
312+ return NULL ;
313+ }
314+ m_tracked_node_t * node = (m_tracked_node_t * )((uint8_t * )ptr_in - sizeof (m_tracked_node_t ));
315+ #if MICROPY_MALLOC_USES_ALLOCATED_SIZE || MICROPY_DEBUG_VERBOSE
316+ size_t prev_bytes ;
317+ prev_bytes = get_tracked_node_size (node );
318+ #if MICROPY_DEBUG_VERBOSE
319+ size_t nb ;
320+ size_t n = m_tracked_count_links (& nb );
321+ DEBUG_printf ("m_tracked_realloc(%p, [%p, %p], pbytes=%u, nbytes=%u, links=%u;%u)\n" , node , node -> prev , node -> next , (int )prev_bytes , (int )n_bytes , (int )n , (int )nb );
322+ #endif
323+ #endif
324+ node = m_realloc (node ,
325+ #if MICROPY_MALLOC_USES_ALLOCATED_SIZE
326+ sizeof (m_tracked_node_t ) + prev_bytes ,
327+ #endif
328+ sizeof (m_tracked_node_t ) + n_bytes
329+ );
330+ // m_realloc raises on failure (never returns NULL), so no error handling needed.
331+ #if MICROPY_TRACKED_ALLOC_STORE_SIZE
332+ node -> size = n_bytes ;
333+ #endif
334+ m_tracked_node_lock ();
335+ if (node -> next != NULL ) {
336+ node -> next -> prev = node ;
337+ }
338+ if (node -> prev != NULL ) {
339+ node -> prev -> next = node ;
340+ } else {
341+ MP_STATE_VM (m_tracked_head ) = node ;
342+ }
343+ m_tracked_node_unlock ();
344+ return & node -> data [0 ];
345+ }
346+
295347void m_tracked_free (void * ptr_in ) {
296348 if (ptr_in == NULL ) {
297349 return ;
298350 }
299351 m_tracked_node_t * node = (m_tracked_node_t * )((uint8_t * )ptr_in - sizeof (m_tracked_node_t ));
300352 #if MICROPY_DEBUG_VERBOSE
301353 size_t data_bytes ;
302- #if MICROPY_TRACKED_ALLOC_STORE_SIZE
303- data_bytes = node -> size ;
304- #else
305- data_bytes = gc_nbytes (node );
306- #endif
354+ data_bytes = get_tracked_node_size (node );
307355 size_t nb ;
308356 size_t n = m_tracked_count_links (& nb );
309357 DEBUG_printf ("m_tracked_free(%p, [%p, %p], nbytes=%u, links=%u;%u)\n" , node , node -> prev , node -> next , (int )data_bytes , (int )n , (int )nb );
0 commit comments