@@ -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
@@ -226,15 +227,58 @@ typedef union _jit_opt_symbol {
226227} JitOptSymbol ;
227228
228229
230+ // This mimics the _PyStackRef API
231+ typedef union {
232+ uintptr_t bits ;
233+ } JitOptRef ;
234+
235+ #define REF_IS_BORROWED 1
236+
237+ #define JIT_BITS_TO_PTR_MASKED (REF ) ((JitOptSymbol *)(((REF).bits) & (~REF_IS_BORROWED)))
238+
239+ static inline JitOptSymbol *
240+ PyJitRef_Unwrap (JitOptRef ref )
241+ {
242+ return JIT_BITS_TO_PTR_MASKED (ref );
243+ }
244+
245+ bool _Py_uop_symbol_is_immortal (JitOptSymbol * sym );
246+
247+
248+ static inline JitOptRef
249+ PyJitRef_Wrap (JitOptSymbol * sym )
250+ {
251+ return (JitOptRef ){.bits = (uintptr_t )sym };
252+ }
253+
254+ static inline JitOptRef
255+ PyJitRef_Borrow (JitOptRef ref )
256+ {
257+ return (JitOptRef ){ .bits = ref .bits | REF_IS_BORROWED };
258+ }
259+
260+ static const JitOptRef PyJitRef_NULL = {.bits = REF_IS_BORROWED };
261+
262+ static inline bool
263+ PyJitRef_IsNull (JitOptRef ref )
264+ {
265+ return ref .bits == PyJitRef_NULL .bits ;
266+ }
267+
268+ static inline int
269+ PyJitRef_IsBorrowed (JitOptRef ref )
270+ {
271+ return (ref .bits & REF_IS_BORROWED ) == REF_IS_BORROWED ;
272+ }
229273
230274struct _Py_UOpsAbstractFrame {
231275 // Max stacklen
232276 int stack_len ;
233277 int locals_len ;
234278
235- JitOptSymbol * * stack_pointer ;
236- JitOptSymbol * * stack ;
237- JitOptSymbol * * locals ;
279+ JitOptRef * stack_pointer ;
280+ JitOptRef * stack ;
281+ JitOptRef * locals ;
238282};
239283
240284typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame ;
@@ -257,41 +301,40 @@ typedef struct _JitOptContext {
257301 // Arena for the symbolic types.
258302 ty_arena t_arena ;
259303
260- JitOptSymbol * * n_consumed ;
261- JitOptSymbol * * limit ;
262- JitOptSymbol * locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
304+ JitOptRef * n_consumed ;
305+ JitOptRef * limit ;
306+ JitOptRef locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
263307} JitOptContext ;
264308
265- extern bool _Py_uop_sym_is_null (JitOptSymbol * sym );
266- extern bool _Py_uop_sym_is_not_null (JitOptSymbol * sym );
267- extern bool _Py_uop_sym_is_const (JitOptContext * ctx , JitOptSymbol * sym );
268- extern PyObject * _Py_uop_sym_get_const (JitOptContext * ctx , JitOptSymbol * sym );
269- extern JitOptSymbol * _Py_uop_sym_new_unknown (JitOptContext * ctx );
270- extern JitOptSymbol * _Py_uop_sym_new_not_null (JitOptContext * ctx );
271- extern JitOptSymbol * _Py_uop_sym_new_type (
309+ extern bool _Py_uop_sym_is_null (JitOptRef sym );
310+ extern bool _Py_uop_sym_is_not_null (JitOptRef sym );
311+ extern bool _Py_uop_sym_is_const (JitOptContext * ctx , JitOptRef sym );
312+ extern PyObject * _Py_uop_sym_get_const (JitOptContext * ctx , JitOptRef sym );
313+ extern JitOptRef _Py_uop_sym_new_unknown (JitOptContext * ctx );
314+ extern JitOptRef _Py_uop_sym_new_not_null (JitOptContext * ctx );
315+ extern JitOptRef _Py_uop_sym_new_type (
272316 JitOptContext * ctx , PyTypeObject * typ );
273- extern JitOptSymbol * _Py_uop_sym_new_const (JitOptContext * ctx , PyObject * const_val );
274- extern JitOptSymbol * _Py_uop_sym_new_null (JitOptContext * ctx );
275- extern bool _Py_uop_sym_has_type (JitOptSymbol * sym );
276- extern bool _Py_uop_sym_matches_type (JitOptSymbol * sym , PyTypeObject * typ );
277- extern bool _Py_uop_sym_matches_type_version (JitOptSymbol * sym , unsigned int version );
278- extern void _Py_uop_sym_set_null (JitOptContext * ctx , JitOptSymbol * sym );
279- extern void _Py_uop_sym_set_non_null (JitOptContext * ctx , JitOptSymbol * sym );
280- extern void _Py_uop_sym_set_type (JitOptContext * ctx , JitOptSymbol * sym , PyTypeObject * typ );
281- extern bool _Py_uop_sym_set_type_version (JitOptContext * ctx , JitOptSymbol * sym , unsigned int version );
282- extern void _Py_uop_sym_set_const (JitOptContext * ctx , JitOptSymbol * sym , PyObject * const_val );
283- extern bool _Py_uop_sym_is_bottom (JitOptSymbol * sym );
284- extern int _Py_uop_sym_truthiness (JitOptContext * ctx , JitOptSymbol * sym );
285- extern PyTypeObject * _Py_uop_sym_get_type (JitOptSymbol * sym );
286- extern bool _Py_uop_sym_is_immortal (JitOptSymbol * sym );
287- extern JitOptSymbol * _Py_uop_sym_new_tuple (JitOptContext * ctx , int size , JitOptSymbol * * args );
288- extern JitOptSymbol * _Py_uop_sym_tuple_getitem (JitOptContext * ctx , JitOptSymbol * sym , int item );
289- extern int _Py_uop_sym_tuple_length (JitOptSymbol * sym );
290- extern JitOptSymbol * _Py_uop_sym_new_truthiness (JitOptContext * ctx , JitOptSymbol * value , bool truthy );
291- extern bool _Py_uop_sym_is_compact_int (JitOptSymbol * sym );
292- extern JitOptSymbol * _Py_uop_sym_new_compact_int (JitOptContext * ctx );
293- extern void _Py_uop_sym_set_compact_int (JitOptContext * ctx , JitOptSymbol * value );
294317
318+ extern JitOptRef _Py_uop_sym_new_const (JitOptContext * ctx , PyObject * const_val );
319+ extern JitOptRef _Py_uop_sym_new_null (JitOptContext * ctx );
320+ extern bool _Py_uop_sym_has_type (JitOptRef sym );
321+ extern bool _Py_uop_sym_matches_type (JitOptRef sym , PyTypeObject * typ );
322+ extern bool _Py_uop_sym_matches_type_version (JitOptRef sym , unsigned int version );
323+ extern void _Py_uop_sym_set_null (JitOptContext * ctx , JitOptRef sym );
324+ extern void _Py_uop_sym_set_non_null (JitOptContext * ctx , JitOptRef sym );
325+ extern void _Py_uop_sym_set_type (JitOptContext * ctx , JitOptRef sym , PyTypeObject * typ );
326+ extern bool _Py_uop_sym_set_type_version (JitOptContext * ctx , JitOptRef sym , unsigned int version );
327+ extern void _Py_uop_sym_set_const (JitOptContext * ctx , JitOptRef sym , PyObject * const_val );
328+ extern bool _Py_uop_sym_is_bottom (JitOptRef sym );
329+ extern int _Py_uop_sym_truthiness (JitOptContext * ctx , JitOptRef sym );
330+ extern PyTypeObject * _Py_uop_sym_get_type (JitOptRef sym );
331+ extern JitOptRef _Py_uop_sym_new_tuple (JitOptContext * ctx , int size , JitOptRef * args );
332+ extern JitOptRef _Py_uop_sym_tuple_getitem (JitOptContext * ctx , JitOptRef sym , int item );
333+ extern int _Py_uop_sym_tuple_length (JitOptRef sym );
334+ extern JitOptRef _Py_uop_sym_new_truthiness (JitOptContext * ctx , JitOptRef value , bool truthy );
335+ extern bool _Py_uop_sym_is_compact_int (JitOptRef sym );
336+ extern JitOptRef _Py_uop_sym_new_compact_int (JitOptContext * ctx );
337+ extern void _Py_uop_sym_set_compact_int (JitOptContext * ctx , JitOptRef sym );
295338
296339extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
297340extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
@@ -300,7 +343,7 @@ extern _Py_UOpsAbstractFrame *_Py_uop_frame_new(
300343 JitOptContext * ctx ,
301344 PyCodeObject * co ,
302345 int curr_stackentries ,
303- JitOptSymbol * * args ,
346+ JitOptRef * args ,
304347 int arg_len );
305348extern int _Py_uop_frame_pop (JitOptContext * ctx );
306349
0 commit comments