@@ -21,6 +21,7 @@ typedef struct {
21
21
} _PyAdaptiveEntry ;
22
22
23
23
typedef struct {
24
+ /* Borrowed ref */
24
25
PyObject * obj ;
25
26
} _PyObjectCache ;
26
27
@@ -429,77 +430,108 @@ extern PyObject* _Py_GetSpecializationStats(void);
429
430
#ifdef WORDS_BIGENDIAN
430
431
431
432
static inline void
432
- write_u32 (uint16_t p [ 2 ] , uint32_t val )
433
+ write_u32 (uint16_t * p , uint32_t val )
433
434
{
434
- p [0 ] = val >> 16 ;
435
- p [1 ] = (uint16_t )val ;
436
- }
437
-
438
- static inline uint32_t
439
- read_u32 (uint16_t p [2 ])
440
- {
441
- return (p [0 ] << 16 ) | p [1 ];
435
+ p [0 ] = (uint16_t )(val >> 16 );
436
+ p [1 ] = (uint16_t )(val >> 0 );
442
437
}
443
438
444
439
static inline void
445
- write_obj (uint16_t p [ 4 ], PyObject * obj )
440
+ write_u64 (uint16_t * p , uint64_t val )
446
441
{
447
- uint64_t val = (uintptr_t )obj ;
448
442
p [0 ] = (uint16_t )(val >> 48 );
449
443
p [1 ] = (uint16_t )(val >> 32 );
450
444
p [2 ] = (uint16_t )(val >> 16 );
451
445
p [3 ] = (uint16_t )(val >> 0 );
452
446
}
453
447
454
- static inline PyObject *
455
- read_obj (uint16_t p [4 ])
448
+ static inline uint32_t
449
+ read_u32 (uint16_t * p )
450
+ {
451
+ uint32_t val = 0 ;
452
+ val |= (uint32_t )p [0 ] << 16 ;
453
+ val |= (uint32_t )p [1 ] << 0 ;
454
+ return val ;
455
+ }
456
+
457
+ static inline uint64_t
458
+ read_u64 (uint16_t * p )
456
459
{
457
- uintptr_t val = 0 ;
460
+ uint64_t val = 0 ;
458
461
val |= (uint64_t )p [0 ] << 48 ;
459
462
val |= (uint64_t )p [1 ] << 32 ;
460
463
val |= (uint64_t )p [2 ] << 16 ;
461
464
val |= (uint64_t )p [3 ] << 0 ;
462
- return ( PyObject * ) val ;
465
+ return val ;
463
466
}
464
467
465
468
#else
466
469
467
470
static inline void
468
- write_u32 (uint16_t p [2 ], uint32_t val )
469
- {
470
- p [0 ] = (uint16_t )val ;
471
- p [1 ] = val >> 16 ;
472
- }
473
-
474
- static inline uint32_t
475
- read_u32 (uint16_t p [2 ])
471
+ write_u32 (uint16_t * p , uint32_t val )
476
472
{
477
- return p [0 ] | (p [1 ] << 16 );
473
+ p [0 ] = (uint16_t )(val >> 0 );
474
+ p [1 ] = (uint16_t )(val >> 16 );
478
475
}
479
476
480
477
static inline void
481
- write_obj (uint16_t p [ 4 ], PyObject * obj )
478
+ write_u64 (uint16_t * p , uint64_t val )
482
479
{
483
- uint64_t val = (uintptr_t )obj ;
484
480
p [0 ] = (uint16_t )(val >> 0 );
485
481
p [1 ] = (uint16_t )(val >> 16 );
486
482
p [2 ] = (uint16_t )(val >> 32 );
487
483
p [3 ] = (uint16_t )(val >> 48 );
488
484
}
489
485
490
- static inline PyObject *
491
- read_obj (uint16_t p [ 4 ] )
486
+ static inline uint32_t
487
+ read_u32 (uint16_t * p )
492
488
{
493
- uintptr_t val = 0 ;
489
+ uint32_t val = 0 ;
490
+ val |= (uint32_t )p [0 ] << 0 ;
491
+ val |= (uint32_t )p [1 ] << 16 ;
492
+ return val ;
493
+ }
494
+
495
+ static inline uint64_t
496
+ read_u64 (uint16_t * p )
497
+ {
498
+ uint64_t val = 0 ;
494
499
val |= (uint64_t )p [0 ] << 0 ;
495
500
val |= (uint64_t )p [1 ] << 16 ;
496
501
val |= (uint64_t )p [2 ] << 32 ;
497
502
val |= (uint64_t )p [3 ] << 48 ;
498
- return ( PyObject * ) val ;
503
+ return val ;
499
504
}
500
505
501
506
#endif
502
507
508
+ static inline void
509
+ write_obj (uint16_t * p , PyObject * obj )
510
+ {
511
+ uintptr_t val = (uintptr_t )obj ;
512
+ #if SIZEOF_UINTPTR_T == 8
513
+ write_u64 (p , val );
514
+ #elif SIZEOF_UINTPTR_T == 4
515
+ write_u32 (p , val );
516
+ #else
517
+ #error "sizeof(uintptr_t) must be 4 or 8"
518
+ #endif
519
+ }
520
+
521
+ static inline PyObject *
522
+ read_obj (uint16_t * p )
523
+ {
524
+ uintptr_t val ;
525
+ #if SIZEOF_UINTPTR_T == 8
526
+ val = read_u64 (p );
527
+ #elif SIZE_OF_UINTPTR_T == 4
528
+ val = read_u32 (p );
529
+ #else
530
+ #error "sizeof(uintptr_t) must be 4 or 8"
531
+ #endif
532
+ return (PyObject * )val ;
533
+ }
534
+
503
535
#ifdef __cplusplus
504
536
}
505
537
#endif
0 commit comments