@@ -10,6 +10,7 @@ extern "C" {
1010
1111#include "pycore_typedefs.h" // _PyInterpreterFrame
1212#include "pycore_uop_ids.h"
13+ #include "pycore_stackref.h"
1314#include <stdbool.h>
1415
1516
@@ -180,13 +181,10 @@ typedef enum _JitSymType {
180181 JIT_SYM_TRUTHINESS_TAG = 9 ,
181182} JitSymType ;
182183
183- #define DONT_SKIP_REFCOUNT 0
184- #define SKIP_REFCOUNT 1
185184
186185typedef struct _jit_opt_known_class {
187186 struct {
188187 uint8_t tag ;
189- uint8_t skip_refcount ;
190188 };
191189 uint32_t version ;
192190 PyTypeObject * type ;
@@ -195,15 +193,13 @@ typedef struct _jit_opt_known_class {
195193typedef struct _jit_opt_known_version {
196194 struct {
197195 uint8_t tag ;
198- uint8_t skip_refcount ;
199196 };
200197 uint32_t version ;
201198} JitOptKnownVersion ;
202199
203200typedef struct _jit_opt_known_value {
204201 struct {
205202 uint8_t tag ;
206- uint8_t skip_refcount ;
207203 };
208204 PyObject * value ;
209205} JitOptKnownValue ;
@@ -213,7 +209,6 @@ typedef struct _jit_opt_known_value {
213209typedef struct _jit_opt_tuple {
214210 struct {
215211 uint8_t tag ;
216- uint8_t skip_refcount ;
217212 };
218213 uint8_t length ;
219214 uint16_t items [MAX_SYMBOLIC_TUPLE_SIZE ];
@@ -222,7 +217,6 @@ typedef struct _jit_opt_tuple {
222217typedef struct {
223218 struct {
224219 uint8_t tag ;
225- uint8_t skip_refcount ;
226220 };
227221 bool invert ;
228222 uint16_t value ;
@@ -231,11 +225,6 @@ typedef struct {
231225typedef union _jit_opt_symbol {
232226 struct {
233227 uint8_t tag ;
234- // Whether this object skips refcount on the stack
235- // (using the _PyStackRef API), or not.
236- // 0 - normal refcounting
237- // 1 - skip refcounting
238- int8_t skip_refcount ;
239228 };
240229 JitOptKnownClass cls ;
241230 JitOptKnownValue value ;
@@ -245,15 +234,65 @@ typedef union _jit_opt_symbol {
245234} JitOptSymbol ;
246235
247236
237+ // This mimics the _PyStackRef API
238+ typedef union {
239+ uintptr_t bits ;
240+ } JitOptRef ;
241+
242+ #define JIT_BITS_TO_PTR (REF ) ((JitOptSymbol *)((REF).bits))
243+ #define JIT_BITS_TO_PTR_MASKED (REF ) ((JitOptSymbol *)(((REF).bits) & (~Py_TAG_REFCNT)))
244+
245+ static inline JitOptSymbol *
246+ PyJitRef_AsSymbolBorrow (JitOptRef ref )
247+ {
248+ return JIT_BITS_TO_PTR_MASKED (ref );
249+ }
250+
251+ bool _Py_uop_sym_is_immortal (JitOptSymbol * sym );
252+
253+ static inline JitOptRef
254+ PyJitRef_FromSymbolSteal (JitOptSymbol * sym )
255+ {
256+ if (sym == NULL || _Py_uop_sym_is_immortal (sym )) {
257+ return (JitOptRef ){.bits = (uintptr_t )sym | Py_TAG_REFCNT };
258+ }
259+ return (JitOptRef ){.bits = (uintptr_t )sym };
260+ }
261+
262+ static inline JitOptRef
263+ PyJitRef_FromSymbolBorrow (JitOptSymbol * sym )
264+ {
265+ return (JitOptRef ){.bits = (uintptr_t )sym | Py_TAG_REFCNT };
266+ }
267+
268+ static inline JitOptRef
269+ PyJitRef_Borrow (JitOptRef ref )
270+ {
271+ return (JitOptRef ){ .bits = ref .bits | Py_TAG_REFCNT };
272+ }
273+
274+ static const JitOptRef PyJitRef_NULL = { .bits = PyStackRef_NULL_BITS };
275+
276+ static inline bool
277+ PyJitRef_IsNull (JitOptRef ref )
278+ {
279+ return ref .bits == PyStackRef_NULL_BITS ;
280+ }
281+
282+ static inline int
283+ PyJitRef_IsBorrowed (JitOptRef ref )
284+ {
285+ return (ref .bits & Py_TAG_REFCNT ) == Py_TAG_REFCNT ;
286+ }
248287
249288struct _Py_UOpsAbstractFrame {
250289 // Max stacklen
251290 int stack_len ;
252291 int locals_len ;
253292
254- JitOptSymbol * * stack_pointer ;
255- JitOptSymbol * * stack ;
256- JitOptSymbol * * locals ;
293+ JitOptRef * stack_pointer ;
294+ JitOptRef * stack ;
295+ JitOptRef * locals ;
257296};
258297
259298typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame ;
@@ -276,41 +315,36 @@ typedef struct _JitOptContext {
276315 // Arena for the symbolic types.
277316 ty_arena t_arena ;
278317
279- JitOptSymbol * * n_consumed ;
280- JitOptSymbol * * limit ;
281- JitOptSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
318+ JitOptRef * n_consumed ;
319+ JitOptRef * limit ;
320+ JitOptRef locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
282321} JitOptContext ;
283322
284- extern bool _Py_uop_sym_is_null ( JitOptSymbol * sym );
285- extern bool _Py_uop_sym_is_not_null ( JitOptSymbol * sym );
286- extern bool _Py_uop_sym_is_const (JitOptContext * ctx , JitOptSymbol * sym );
287- extern PyObject * _Py_uop_sym_get_const (JitOptContext * ctx , JitOptSymbol * sym );
288- extern JitOptSymbol * _Py_uop_sym_new_unknown (JitOptContext * ctx );
289- extern JitOptSymbol * _Py_uop_sym_new_not_null (JitOptContext * ctx );
290- extern JitOptSymbol * _Py_uop_sym_new_type (
323+ extern bool _Py_uop_ref_is_null ( JitOptRef sym );
324+ extern bool _Py_uop_ref_is_not_null ( JitOptRef sym );
325+ extern bool _Py_uop_ref_is_const (JitOptContext * ctx , JitOptRef sym );
326+ extern PyObject * _Py_uop_ref_get_const (JitOptContext * ctx , JitOptRef sym );
327+ extern JitOptRef _Py_uop_ref_new_unknown (JitOptContext * ctx );
328+ extern JitOptRef _Py_uop_ref_new_not_null (JitOptContext * ctx );
329+ extern JitOptRef _Py_uop_ref_new_type (
291330 JitOptContext * ctx , PyTypeObject * typ );
292- extern JitOptSymbol * _Py_uop_sym_new_const (JitOptContext * ctx , PyObject * const_val );
293- extern JitOptSymbol * _Py_uop_sym_new_null (JitOptContext * ctx );
294- extern bool _Py_uop_sym_has_type (JitOptSymbol * sym );
295- extern bool _Py_uop_sym_matches_type (JitOptSymbol * sym , PyTypeObject * typ );
296- extern bool _Py_uop_sym_matches_type_version (JitOptSymbol * sym , unsigned int version );
297- extern void _Py_uop_sym_set_null (JitOptContext * ctx , JitOptSymbol * sym );
298- extern void _Py_uop_sym_set_non_null (JitOptContext * ctx , JitOptSymbol * sym );
299- extern void _Py_uop_sym_set_type (JitOptContext * ctx , JitOptSymbol * sym , PyTypeObject * typ );
300- extern bool _Py_uop_sym_set_type_version (JitOptContext * ctx , JitOptSymbol * sym , unsigned int version );
301- extern void _Py_uop_sym_set_const (JitOptContext * ctx , JitOptSymbol * sym , PyObject * const_val );
302- extern bool _Py_uop_sym_is_bottom (JitOptSymbol * sym );
303- extern int _Py_uop_sym_truthiness (JitOptContext * ctx , JitOptSymbol * sym );
304- extern PyTypeObject * _Py_uop_sym_get_type (JitOptSymbol * sym );
305- extern bool _Py_uop_sym_is_immortal (JitOptSymbol * sym );
306- extern JitOptSymbol * _Py_uop_sym_new_tuple (JitOptContext * ctx , int size , JitOptSymbol * * args );
307- extern JitOptSymbol * _Py_uop_sym_tuple_getitem (JitOptContext * ctx , JitOptSymbol * sym , int item );
308- extern int _Py_uop_sym_tuple_length (JitOptSymbol * sym );
309- extern JitOptSymbol * _Py_uop_sym_new_truthiness (JitOptContext * ctx , JitOptSymbol * value , bool truthy );
310-
311- extern void _Py_uop_sym_set_dont_skip_refcount (JitOptContext * ctx , JitOptSymbol * sym );
312- extern bool _Py_uop_sym_is_skip_refcount (JitOptContext * ctx , JitOptSymbol * sym );
313- extern void _Py_uop_sym_set_skip_refcount (JitOptContext * ctx , JitOptSymbol * sym );
331+ extern JitOptRef _Py_uop_ref_new_const (JitOptContext * ctx , PyObject * const_val );
332+ extern JitOptRef _Py_uop_ref_new_null (JitOptContext * ctx );
333+ extern bool _Py_uop_ref_has_type (JitOptRef sym );
334+ extern bool _Py_uop_ref_matches_type (JitOptRef sym , PyTypeObject * typ );
335+ extern bool _Py_uop_ref_matches_type_version (JitOptRef sym , unsigned int version );
336+ extern void _Py_uop_ref_set_null (JitOptContext * ctx , JitOptRef sym );
337+ extern void _Py_uop_ref_set_non_null (JitOptContext * ctx , JitOptRef sym );
338+ extern void _Py_uop_ref_set_type (JitOptContext * ctx , JitOptRef sym , PyTypeObject * typ );
339+ extern bool _Py_uop_ref_set_type_version (JitOptContext * ctx , JitOptRef sym , unsigned int version );
340+ extern void _Py_uop_ref_set_const (JitOptContext * ctx , JitOptRef sym , PyObject * const_val );
341+ extern bool _Py_uop_ref_is_bottom (JitOptRef sym );
342+ extern int _Py_uop_ref_truthiness (JitOptContext * ctx , JitOptRef sym );
343+ extern PyTypeObject * _Py_uop_ref_get_type (JitOptRef sym );
344+ extern JitOptRef _Py_uop_ref_new_tuple (JitOptContext * ctx , int size , JitOptRef * args );
345+ extern JitOptRef _Py_uop_ref_tuple_getitem (JitOptContext * ctx , JitOptRef sym , int item );
346+ extern int _Py_uop_ref_tuple_length (JitOptRef sym );
347+ extern JitOptRef _Py_uop_ref_new_truthiness (JitOptContext * ctx , JitOptRef value , bool truthy );
314348
315349extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
316350extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
@@ -319,7 +353,7 @@ extern _Py_UOpsAbstractFrame *_Py_uop_frame_new(
319353 JitOptContext * ctx ,
320354 PyCodeObject * co ,
321355 int curr_stackentries ,
322- JitOptSymbol * * args ,
356+ JitOptRef * args ,
323357 int arg_len );
324358extern int _Py_uop_frame_pop (JitOptContext * ctx );
325359
0 commit comments