@@ -20,14 +20,8 @@ typedef struct {
2020 uint32_t version ;
2121} _PyAdaptiveEntry ;
2222
23-
2423typedef struct {
25- uint32_t tp_version ;
26- uint32_t dk_version ;
27- } _PyAttrCache ;
28-
29- typedef struct {
30- /* Borrowed ref in LOAD_METHOD */
24+ /* Borrowed ref */
3125 PyObject * obj ;
3226} _PyObjectCache ;
3327
@@ -51,7 +45,6 @@ typedef struct {
5145typedef union {
5246 _PyEntryZero zero ;
5347 _PyAdaptiveEntry adaptive ;
54- _PyAttrCache attr ;
5548 _PyObjectCache obj ;
5649 _PyCallCache call ;
5750} SpecializedCacheEntry ;
@@ -65,8 +58,7 @@ typedef union {
6558typedef struct {
6659 _Py_CODEUNIT counter ;
6760 _Py_CODEUNIT index ;
68- _Py_CODEUNIT module_keys_version ;
69- _Py_CODEUNIT _m1 ;
61+ _Py_CODEUNIT module_keys_version [2 ];
7062 _Py_CODEUNIT builtin_keys_version ;
7163} _PyLoadGlobalCache ;
7264
@@ -94,13 +86,32 @@ typedef struct {
9486
9587typedef struct {
9688 _Py_CODEUNIT counter ;
97- _Py_CODEUNIT type_version ;
98- _Py_CODEUNIT _t1 ;
89+ _Py_CODEUNIT type_version [2 ];
9990 _Py_CODEUNIT func_version ;
10091} _PyBinarySubscrCache ;
10192
10293#define INLINE_CACHE_ENTRIES_BINARY_SUBSCR CACHE_ENTRIES(_PyBinarySubscrCache)
10394
95+ typedef struct {
96+ _Py_CODEUNIT counter ;
97+ _Py_CODEUNIT version [2 ];
98+ _Py_CODEUNIT index ;
99+ } _PyAttrCache ;
100+
101+ #define INLINE_CACHE_ENTRIES_LOAD_ATTR CACHE_ENTRIES(_PyAttrCache)
102+
103+ #define INLINE_CACHE_ENTRIES_STORE_ATTR CACHE_ENTRIES(_PyAttrCache)
104+
105+ typedef struct {
106+ _Py_CODEUNIT counter ;
107+ _Py_CODEUNIT type_version [2 ];
108+ _Py_CODEUNIT dict_offset ;
109+ _Py_CODEUNIT keys_version [2 ];
110+ _Py_CODEUNIT descr [4 ];
111+ } _PyLoadMethodCache ;
112+
113+ #define INLINE_CACHE_ENTRIES_LOAD_METHOD CACHE_ENTRIES(_PyLoadMethodCache)
114+
104115/* Maximum size of code to quicken, in code units. */
105116#define MAX_SIZE_TO_QUICKEN 5000
106117
@@ -328,10 +339,13 @@ cache_backoff(_PyAdaptiveEntry *entry) {
328339
329340/* Specialization functions */
330341
331- extern int _Py_Specialize_LoadAttr (PyObject * owner , _Py_CODEUNIT * instr , PyObject * name , SpecializedCacheEntry * cache );
332- extern int _Py_Specialize_StoreAttr (PyObject * owner , _Py_CODEUNIT * instr , PyObject * name , SpecializedCacheEntry * cache );
342+ extern int _Py_Specialize_LoadAttr (PyObject * owner , _Py_CODEUNIT * instr ,
343+ PyObject * name );
344+ extern int _Py_Specialize_StoreAttr (PyObject * owner , _Py_CODEUNIT * instr ,
345+ PyObject * name );
333346extern int _Py_Specialize_LoadGlobal (PyObject * globals , PyObject * builtins , _Py_CODEUNIT * instr , PyObject * name );
334- extern int _Py_Specialize_LoadMethod (PyObject * owner , _Py_CODEUNIT * instr , PyObject * name , SpecializedCacheEntry * cache );
347+ extern int _Py_Specialize_LoadMethod (PyObject * owner , _Py_CODEUNIT * instr ,
348+ PyObject * name );
335349extern int _Py_Specialize_BinarySubscr (PyObject * sub , PyObject * container , _Py_CODEUNIT * instr );
336350extern int _Py_Specialize_StoreSubscr (PyObject * container , PyObject * sub , _Py_CODEUNIT * instr );
337351extern int _Py_Specialize_Call (PyObject * callable , _Py_CODEUNIT * instr , int nargs ,
@@ -416,34 +430,107 @@ extern PyObject* _Py_GetSpecializationStats(void);
416430#ifdef WORDS_BIGENDIAN
417431
418432static inline void
419- write32 (uint16_t * p , uint32_t val )
433+ write_u32 (uint16_t * p , uint32_t val )
420434{
421- p [0 ] = val >> 16 ;
422- p [1 ] = (uint16_t )val ;
435+ p [0 ] = (uint16_t )(val >> 16 );
436+ p [1 ] = (uint16_t )(val >> 0 );
437+ }
438+
439+ static inline void
440+ write_u64 (uint16_t * p , uint64_t val )
441+ {
442+ p [0 ] = (uint16_t )(val >> 48 );
443+ p [1 ] = (uint16_t )(val >> 32 );
444+ p [2 ] = (uint16_t )(val >> 16 );
445+ p [3 ] = (uint16_t )(val >> 0 );
423446}
424447
425448static inline uint32_t
426- read32 (uint16_t * p )
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 )
427459{
428- return (p [0 ] << 16 ) | p [1 ];
460+ uint64_t val = 0 ;
461+ val |= (uint64_t )p [0 ] << 48 ;
462+ val |= (uint64_t )p [1 ] << 32 ;
463+ val |= (uint64_t )p [2 ] << 16 ;
464+ val |= (uint64_t )p [3 ] << 0 ;
465+ return val ;
429466}
430467
431468#else
432469
433470static inline void
434- write32 (uint16_t * p , uint32_t val )
471+ write_u32 (uint16_t * p , uint32_t val )
472+ {
473+ p [0 ] = (uint16_t )(val >> 0 );
474+ p [1 ] = (uint16_t )(val >> 16 );
475+ }
476+
477+ static inline void
478+ write_u64 (uint16_t * p , uint64_t val )
435479{
436- p [0 ] = (uint16_t )val ;
437- p [1 ] = val >> 16 ;
480+ p [0 ] = (uint16_t )(val >> 0 );
481+ p [1 ] = (uint16_t )(val >> 16 );
482+ p [2 ] = (uint16_t )(val >> 32 );
483+ p [3 ] = (uint16_t )(val >> 48 );
438484}
439485
440486static inline uint32_t
441- read32 (uint16_t * p )
487+ read_u32 (uint16_t * p )
488+ {
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 ;
499+ val |= (uint64_t )p [0 ] << 0 ;
500+ val |= (uint64_t )p [1 ] << 16 ;
501+ val |= (uint64_t )p [2 ] << 32 ;
502+ val |= (uint64_t )p [3 ] << 48 ;
503+ return val ;
504+ }
505+
506+ #endif
507+
508+ static inline void
509+ write_obj (uint16_t * p , PyObject * obj )
442510{
443- return p [0 ] | (p [1 ] << 16 );
511+ uintptr_t val = (uintptr_t )obj ;
512+ #if SIZEOF_VOID_P == 8
513+ write_u64 (p , val );
514+ #elif SIZEOF_VOID_P == 4
515+ write_u32 (p , val );
516+ #else
517+ #error "SIZEOF_VOID_P must be 4 or 8"
518+ #endif
444519}
445520
521+ static inline PyObject *
522+ read_obj (uint16_t * p )
523+ {
524+ uintptr_t val ;
525+ #if SIZEOF_VOID_P == 8
526+ val = read_u64 (p );
527+ #elif SIZEOF_VOID_P == 4
528+ val = read_u32 (p );
529+ #else
530+ #error "SIZEOF_VOID_P must be 4 or 8"
446531#endif
532+ return (PyObject * )val ;
533+ }
447534
448535#ifdef __cplusplus
449536}
0 commit comments