2424 * THE SOFTWARE.
2525 */
2626
27+ #include "py/gc.h"
2728#include "py/runtime.h"
2829#include "shared-module/atexit/__init__.h"
2930
@@ -32,15 +33,19 @@ typedef struct _atexit_callback_t {
3233 mp_obj_t func , * args ;
3334} atexit_callback_t ;
3435
35- size_t callback_len = 0 ;
36- atexit_callback_t * callback = NULL ;
36+ static size_t callback_len = 0 ;
37+ static atexit_callback_t * callback = NULL ;
3738
3839void atexit_reset (void ) {
3940 callback_len = 0 ;
4041 m_free (callback );
4142 callback = NULL ;
4243}
4344
45+ void atexit_gc_collect (void ) {
46+ gc_collect_ptr (callback );
47+ }
48+
4449void shared_module_atexit_register (mp_obj_t * func , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
4550 if (!mp_obj_is_callable (func )) {
4651 mp_raise_TypeError_varg (translate ("'%q' object is not callable" ), mp_obj_get_type_qstr (func ));
@@ -50,24 +55,22 @@ void shared_module_atexit_register(mp_obj_t *func, size_t n_args, const mp_obj_t
5055 .n_pos = 0 ,
5156 .n_kw = 0 ,
5257 .func = func ,
53- .args = (( n_args + n_kw_args ) == 0 ) ? NULL : m_malloc ((n_args + (2 * n_kw_args )) * sizeof (mp_obj_t ), false)
58+ .args = (n_args + n_kw_args ) ? m_malloc ((n_args + (n_kw_args * 2 )) * sizeof (mp_obj_t ), false) : NULL
5459 };
5560 for (; cb .n_pos < n_args ; cb .n_pos ++ ) {
5661 cb .args [cb .n_pos ] = pos_args [cb .n_pos ];
5762 }
5863 for (size_t i = cb .n_pos ; cb .n_kw < n_kw_args ; i ++ , cb .n_kw ++ ) {
59- cb .args [i ] = kw_args [cb .n_kw ].table -> key ;
60- cb .args [i += 1 ] = kw_args [cb .n_kw ].table -> value ;
61- }
62- if (!callback ) {
63- callback = (atexit_callback_t * )m_realloc (callback , sizeof (cb ));
64+ cb .args [i ] = kw_args -> table [cb .n_kw ].key ;
65+ cb .args [i += 1 ] = kw_args -> table [cb .n_kw ].value ;
6466 }
67+ callback = (atexit_callback_t * )m_realloc (callback , (callback_len + 1 ) * sizeof (cb ));
6568 callback [callback_len ++ ] = cb ;
6669}
6770
6871void shared_module_atexit_unregister (const mp_obj_t * func ) {
6972 for (size_t i = 0 ; i < callback_len ; i ++ ) {
70- if (callback [i ].func == func ) {
73+ if (callback [i ].func == * func ) {
7174 callback [i ].n_pos = 0 ;
7275 callback [i ].n_kw = 0 ;
7376 callback [i ].func = mp_const_none ;
@@ -78,7 +81,7 @@ void shared_module_atexit_unregister(const mp_obj_t *func) {
7881
7982void shared_module_atexit_execute (void ) {
8083 if (callback ) {
81- for (size_t i = 0 ; i < callback_len ; i ++ ) {
84+ for (size_t i = callback_len ; i -- > 0 ; ) {
8285 if (callback [i ].func != mp_const_none ) {
8386 mp_call_function_n_kw (callback [i ].func , callback [i ].n_pos , callback [i ].n_kw , callback [i ].args );
8487 }
0 commit comments