@@ -410,6 +410,7 @@ extern char *ctermid_r(char *);
410410#endif 
411411
412412#ifdef  HAVE_STATX 
413+ /* until we can assume glibc 2.28 at runtime, we must weakly link */ 
413414#  pragma  weak statx
414415/* provide constants introduced later than statx itself */ 
415416#  ifndef  STATX_MNT_ID 
@@ -2624,7 +2625,8 @@ _posix_free(void *module)
26242625
26252626#define  SEC_TO_NS  (1000000000LL)
26262627static  PyObject  * 
2627- nanosecond_timestamp (_posixstate  * state , time_t  sec , unsigned long  nsec ) {
2628+ stat_nanosecond_timestamp (_posixstate  * state , time_t  sec , unsigned long  nsec )
2629+ {
26282630    /* 1677-09-21 00:12:44 to 2262-04-11 23:47:15 UTC inclusive */ 
26292631    if  ((LLONG_MIN /SEC_TO_NS ) <= sec  &&  sec  <= (LLONG_MAX /SEC_TO_NS  -  1 )) {
26302632        return  PyLong_FromLongLong (sec  *  SEC_TO_NS  +  nsec );
@@ -2680,7 +2682,7 @@ fill_time(_posixstate *state, PyObject *v, int s_index, int f_index,
26802682    }
26812683
26822684    if  (ns_index  >= 0 ) {
2683-         PyObject  * ns_total  =  nanosecond_timestamp (state , sec , nsec );
2685+         PyObject  * ns_total  =  stat_nanosecond_timestamp (state , sec , nsec );
26842686        if  (ns_total  ==  NULL ) {
26852687            return  -1 ;
26862688        }
@@ -3322,18 +3324,18 @@ typedef struct {
33223324    struct  statx  stx ;
33233325    double  atime_sec , btime_sec , ctime_sec , mtime_sec ;
33243326    dev_t  rdev , dev ;
3325- } statx_result ;
3327+ } Py_statx_result ;
33263328
33273329#define  M (attr , type , offset , doc ) \
33283330    {attr, type, offset, Py_READONLY, PyDoc_STR(doc)}
33293331#define  MO (attr , type , offset , doc ) \
3330-     M(#attr, type, offsetof(statx_result , stx) + offset, doc)
3332+     M(#attr, type, offsetof(Py_statx_result , stx) + offset, doc)
33313333#define  MM (attr , type , member , doc ) \
3332-     M(#attr, type, offsetof(statx_result , stx.stx_##member), doc)
3334+     M(#attr, type, offsetof(Py_statx_result , stx.stx_##member), doc)
33333335#define  MX (attr , type , member , doc ) \
3334-     M(#attr, type, offsetof(statx_result , member), doc)
3336+     M(#attr, type, offsetof(Py_statx_result , member), doc)
33353337
3336- static  PyMemberDef  statx_result_members [] =  {
3338+ static  PyMemberDef  pystatx_result_members [] =  {
33373339    MM (stx_mask , Py_T_UINT , mask , "member validity mask" ),
33383340    MM (st_blksize , Py_T_UINT , blksize , "blocksize for filesystem I/O" ),
33393341    MM (stx_attributes , Py_T_ULONGLONG , attributes , "Linux inode attribute bits" ),
@@ -3370,42 +3372,40 @@ static PyMemberDef statx_result_members[] = {
33703372#undef  MO
33713373#undef  M
33723374
3373- #define  DECLARE_GET (name , type , func ) \
3374-     static PyObject * \
3375-     statx_result_get_##name(PyObject *op, void *context) { \
3376-         statx_result *self = (statx_result *) op; \
3377-         uint16_t offset = (uintptr_t)context; \
3378-         type val; \
3379-         memcpy(&val, (void *)self + offset, sizeof(val)); \
3380-         return func(val); \
3381-     }
3382- DECLARE_GET (u32 , uint32_t , PyLong_FromUInt32 )
3383- #undef  DECLARE_GET
3375+ static  PyObject  * 
3376+ pystatx_result_get_u32 (PyObject  * op , void  * context ) {
3377+     Py_statx_result  * self  =  (Py_statx_result  * ) op ;
3378+     uint16_t  offset  =  (uintptr_t )context ;
3379+     uint32_t  val ;
3380+     memcpy (& val , (void  * )self  +  offset , sizeof (val ));
3381+     return  PyLong_FromUInt32 (val );
3382+ }
33843383
33853384static  PyObject  * 
3386- statx_result_get_nsec (PyObject  * op , void  * context ) {
3387-     statx_result  * self  =  (statx_result  * ) op ;
3385+ pystatx_result_get_nsec (PyObject  * op , void  * context )
3386+ {
3387+     Py_statx_result  * self  =  (Py_statx_result  * ) op ;
33883388    uint16_t  offset  =  (uintptr_t )context ;
33893389    struct  statx_timestamp  val ;
33903390    memcpy (& val , (void  * )self  +  offset , sizeof (val ));
33913391    _posixstate  * state  =  PyType_GetModuleState (Py_TYPE (op ));
33923392    assert (state  !=  NULL );
3393-     return  nanosecond_timestamp (state , val .tv_sec , val .tv_nsec );
3393+     return  stat_nanosecond_timestamp (state , val .tv_sec , val .tv_nsec );
33943394}
33953395
33963396/* The low 16 bits of the context pointer are the offset from the start of 
3397-    statx_result  to the struct statx member. */ 
3398- #define  OFFSET_CONTEXT (offset ) (void *)(offsetof(statx_result , stx) + offset)
3397+    Py_statx_result  to the struct statx member. */ 
3398+ #define  OFFSET_CONTEXT (offset ) (void *)(offsetof(Py_statx_result , stx) + offset)
33993399#define  MEMBER_CONTEXT (name ) OFFSET_CONTEXT(offsetof(struct statx, stx_##name))
34003400
34013401#define  G (attr , type , doc , context ) \
3402-     {attr, statx_result_get_ ##type, NULL, PyDoc_STR(doc), context}
3402+     {attr, pystatx_result_get_ ##type, NULL, PyDoc_STR(doc), context}
34033403#define  GM (attr , type , member , doc ) \
34043404    G(#attr, type, doc, MEMBER_CONTEXT(member))
34053405#define  GO (attr , type , offset , doc ) \
34063406    G(#attr, type, doc, OFFSET_CONTEXT(offset))
34073407
3408- static  PyGetSetDef  statx_result_getset [] =  {
3408+ static  PyGetSetDef  pystatx_result_getset [] =  {
34093409    GM (st_atime_ns , nsec , atime , "time of last access in nanoseconds" ),
34103410    GM (st_birthtime_ns , nsec , btime , "time of creation in nanoseconds" ),
34113411    GM (st_ctime_ns , nsec , ctime , "time of last change in nanoseconds" ),
@@ -3426,74 +3426,72 @@ static PyGetSetDef statx_result_getset[] = {
34263426};
34273427
34283428#undef  GO
3429- #undef  GOC
34303429#undef  GM
3431- #undef  GMC
34323430#undef  G
34333431#undef  MEMBER_CONTEXT
3434- #undef  MEMBER_CACHE_CONTEXT
34353432#undef  OFFSET_CONTEXT
3436- #undef  OFFSET_CACHE_CONTEXT
34373433
34383434static  PyObject  * 
3439- statx_result_repr (PyObject  * op ) {
3435+ pystatx_result_repr (PyObject  * op ) {
34403436    PyUnicodeWriter  * writer  =  PyUnicodeWriter_Create (0 );
34413437    if  (writer  ==  NULL ) {
34423438        return  NULL ;
34433439    }
3444- #define  WRITE_ASCII (s ,  n ) \
3440+ #define  WRITE_ASCII (s ) \
34453441    do { \
3446-         if (PyUnicodeWriter_WriteASCII(writer, s, n ) < 0) { \
3442+         if (PyUnicodeWriter_WriteASCII(writer, s, strlen(s) ) < 0) { \
34473443            goto error; \
34483444        } \
34493445    } while (0)
34503446
3451-     WRITE_ASCII ("os.statx_result(" ,  -1 );
3447+     WRITE_ASCII ("os.statx_result(" );
34523448
3453-     for  (size_t  i  =  0 ; i  <  Py_ARRAY_LENGTH (statx_result_members ) -  1 ; ++ i ) {
3449+     for  (size_t  i  =  0 ; i  <  Py_ARRAY_LENGTH (pystatx_result_members ) -  1 ; ++ i ) {
34543450        if  (i  >  0 ) {
3455-             WRITE_ASCII (", " ,  2 );
3451+             WRITE_ASCII (", " );
34563452        }
34573453
3458-         PyMemberDef  * d  =  & statx_result_members [i ];
3459-         WRITE_ASCII (d -> name ,  -1 );
3460-         WRITE_ASCII ("=" ,  1 );
3454+         PyMemberDef  * d  =  & pystatx_result_members [i ];
3455+         WRITE_ASCII (d -> name );
3456+         WRITE_ASCII ("=" );
34613457
34623458        PyObject  * o  =  PyMember_GetOne ((const  char  * )op , d );
34633459        if  (o  ==  NULL ) {
34643460            goto error ;
34653461        }
34663462        if  (PyUnicodeWriter_WriteRepr (writer , o ) <  0 ) {
3463+             Py_DECREF (o );
34673464            goto error ;
34683465        }
34693466        Py_DECREF (o );
34703467    }
34713468
3472-     if  (Py_ARRAY_LENGTH (statx_result_members ) >  1 
3473-         &&  Py_ARRAY_LENGTH (statx_result_getset ) >  1 ) {
3474-         WRITE_ASCII (", " ,  2 );
3469+     if  (Py_ARRAY_LENGTH (pystatx_result_members ) >  1 
3470+         &&  Py_ARRAY_LENGTH (pystatx_result_getset ) >  1 ) {
3471+         WRITE_ASCII (", " );
34753472    }
34763473
3477-     for  (size_t  i  =  0 ; i  <  Py_ARRAY_LENGTH (statx_result_getset ) -  1 ; ++ i ) {
3474+     for  (size_t  i  =  0 ; i  <  Py_ARRAY_LENGTH (pystatx_result_getset ) -  1 ; ++ i ) {
34783475        if  (i  >  0 ) {
3479-             WRITE_ASCII (", " ,  2 );
3476+             WRITE_ASCII (", " );
34803477        }
34813478
3482-         PyGetSetDef  * d  =  & statx_result_getset [i ];
3483-         WRITE_ASCII (d -> name ,  -1 );
3484-         WRITE_ASCII ("=" ,  1 );
3479+         PyGetSetDef  * d  =  & pystatx_result_getset [i ];
3480+         WRITE_ASCII (d -> name );
3481+         WRITE_ASCII ("=" );
34853482
34863483        PyObject  * o  =  d -> get (op , d -> closure );
34873484        if  (o  ==  NULL ) {
34883485            goto error ;
34893486        }
34903487        if  (PyUnicodeWriter_WriteRepr (writer , o ) <  0 ) {
3488+             Py_DECREF (o );
34913489            goto error ;
34923490        }
34933491        Py_DECREF (o );
34943492    }
34953493
3496-     WRITE_ASCII (")" ,  1 );
3494+     WRITE_ASCII (")" );
34973495    return  PyUnicodeWriter_Finish (writer );
34983496#undef  WRITE_ASCII
34993497
@@ -3503,35 +3501,35 @@ statx_result_repr(PyObject *op) {
35033501}
35043502
35053503static  int 
3506- statx_result_traverse (PyObject  * self , visitproc  visit , void  * arg ) {
3504+ pystatx_result_traverse (PyObject  * self , visitproc  visit , void  * arg ) {
35073505    Py_VISIT (Py_TYPE (self ));
35083506    return  0 ;
35093507}
35103508
35113509static  void 
3512- statx_result_dealloc (PyObject  * op ) {
3513-     statx_result  * self  =  (statx_result  * ) op ;
3510+ pystatx_result_dealloc (PyObject  * op ) {
3511+     Py_statx_result  * self  =  (Py_statx_result  * ) op ;
35143512    PyTypeObject  * tp  =  Py_TYPE (self );
35153513    PyObject_GC_UnTrack (self );
35163514    tp -> tp_free (self );
35173515    Py_DECREF (tp );
35183516}
35193517
3520- static  PyType_Slot  statx_result_slots [] =  {
3521-     {Py_tp_repr , statx_result_repr },
3522-     {Py_tp_traverse , statx_result_traverse },
3523-     {Py_tp_dealloc , statx_result_dealloc },
3524-     {Py_tp_members , statx_result_members },
3525-     {Py_tp_getset , statx_result_getset },
3518+ static  PyType_Slot  pystatx_result_slots [] =  {
3519+     {Py_tp_repr , pystatx_result_repr },
3520+     {Py_tp_traverse , pystatx_result_traverse },
3521+     {Py_tp_dealloc , pystatx_result_dealloc },
3522+     {Py_tp_members , pystatx_result_members },
3523+     {Py_tp_getset , pystatx_result_getset },
35263524    {0 , NULL },
35273525};
35283526
3529- static  PyType_Spec  statx_result_spec  =  {
3527+ static  PyType_Spec  pystatx_result_spec  =  {
35303528    .name  =  "statx_result" ,
3531-     .basicsize  =  sizeof (statx_result ),
3529+     .basicsize  =  sizeof (Py_statx_result ),
35323530    .flags  =  Py_TPFLAGS_DEFAULT  | Py_TPFLAGS_HEAPTYPE  | Py_TPFLAGS_HAVE_GC  |
35333531             Py_TPFLAGS_IMMUTABLETYPE  | Py_TPFLAGS_DISALLOW_INSTANTIATION ,
3534-     .slots  =  statx_result_slots ,
3532+     .slots  =  pystatx_result_slots ,
35353533};
35363534
35373535static  int 
@@ -3612,7 +3610,7 @@ os_statx_impl(PyObject *module, path_t *path, unsigned int mask, int dir_fd,
36123610
36133611    _posixstate  * state  =  get_posix_state (module );
36143612    PyTypeObject  * tp  =  (PyTypeObject  * )state -> StatxResultType ;
3615-     statx_result  * v  =  (statx_result  * )tp -> tp_alloc (tp , 0 );
3613+     Py_statx_result  * v  =  (Py_statx_result  * )tp -> tp_alloc (tp , 0 );
36163614    if  (v  ==  NULL ) {
36173615        return  NULL ;
36183616    }
@@ -18558,8 +18556,8 @@ posixmodule_exec(PyObject *m)
1855818556        }
1855918557    }
1856018558    else  {
18561-         statx_result_spec .name  =  "os.statx_result" ;
18562-         state -> StatxResultType  =  PyType_FromModuleAndSpec (m , & statx_result_spec , NULL );
18559+         pystatx_result_spec .name  =  "os.statx_result" ;
18560+         state -> StatxResultType  =  PyType_FromModuleAndSpec (m , & pystatx_result_spec , NULL );
1856318561        if  (PyModule_AddObjectRef (m , "statx_result" , state -> StatxResultType ) <  0 ) {
1856418562            return  -1 ;
1856518563        }
0 commit comments