@@ -20,14 +20,8 @@ typedef struct {
20
20
uint32_t version ;
21
21
} _PyAdaptiveEntry ;
22
22
23
-
24
23
typedef 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 */
31
25
PyObject * obj ;
32
26
} _PyObjectCache ;
33
27
@@ -51,7 +45,6 @@ typedef struct {
51
45
typedef union {
52
46
_PyEntryZero zero ;
53
47
_PyAdaptiveEntry adaptive ;
54
- _PyAttrCache attr ;
55
48
_PyObjectCache obj ;
56
49
_PyCallCache call ;
57
50
} SpecializedCacheEntry ;
@@ -65,8 +58,7 @@ typedef union {
65
58
typedef struct {
66
59
_Py_CODEUNIT counter ;
67
60
_Py_CODEUNIT index ;
68
- _Py_CODEUNIT module_keys_version ;
69
- _Py_CODEUNIT _m1 ;
61
+ _Py_CODEUNIT module_keys_version [2 ];
70
62
_Py_CODEUNIT builtin_keys_version ;
71
63
} _PyLoadGlobalCache ;
72
64
@@ -94,13 +86,32 @@ typedef struct {
94
86
95
87
typedef struct {
96
88
_Py_CODEUNIT counter ;
97
- _Py_CODEUNIT type_version ;
98
- _Py_CODEUNIT _t1 ;
89
+ _Py_CODEUNIT type_version [2 ];
99
90
_Py_CODEUNIT func_version ;
100
91
} _PyBinarySubscrCache ;
101
92
102
93
#define INLINE_CACHE_ENTRIES_BINARY_SUBSCR CACHE_ENTRIES(_PyBinarySubscrCache)
103
94
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
+
104
115
/* Maximum size of code to quicken, in code units. */
105
116
#define MAX_SIZE_TO_QUICKEN 5000
106
117
@@ -328,10 +339,13 @@ cache_backoff(_PyAdaptiveEntry *entry) {
328
339
329
340
/* Specialization functions */
330
341
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 );
333
346
extern 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 );
335
349
extern int _Py_Specialize_BinarySubscr (PyObject * sub , PyObject * container , _Py_CODEUNIT * instr );
336
350
extern int _Py_Specialize_StoreSubscr (PyObject * container , PyObject * sub , _Py_CODEUNIT * instr );
337
351
extern int _Py_Specialize_Call (PyObject * callable , _Py_CODEUNIT * instr , int nargs ,
@@ -416,34 +430,107 @@ extern PyObject* _Py_GetSpecializationStats(void);
416
430
#ifdef WORDS_BIGENDIAN
417
431
418
432
static inline void
419
- write32 (uint16_t * p , uint32_t val )
433
+ write_u32 (uint16_t * p , uint32_t val )
420
434
{
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 );
423
446
}
424
447
425
448
static 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 )
427
459
{
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 ;
429
466
}
430
467
431
468
#else
432
469
433
470
static 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 )
435
479
{
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 );
438
484
}
439
485
440
486
static 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 )
442
510
{
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
444
519
}
445
520
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"
446
531
#endif
532
+ return (PyObject * )val ;
533
+ }
447
534
448
535
#ifdef __cplusplus
449
536
}
0 commit comments