@@ -10,6 +10,7 @@ extern "C" {
10
10
11
11
#include "pycore_typedefs.h" // _PyInterpreterFrame
12
12
#include "pycore_uop_ids.h"
13
+ #include "pycore_stackref.h"
13
14
#include <stdbool.h>
14
15
15
16
@@ -226,15 +227,58 @@ typedef union _jit_opt_symbol {
226
227
} JitOptSymbol ;
227
228
228
229
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
+ }
229
273
230
274
struct _Py_UOpsAbstractFrame {
231
275
// Max stacklen
232
276
int stack_len ;
233
277
int locals_len ;
234
278
235
- JitOptSymbol * * stack_pointer ;
236
- JitOptSymbol * * stack ;
237
- JitOptSymbol * * locals ;
279
+ JitOptRef * stack_pointer ;
280
+ JitOptRef * stack ;
281
+ JitOptRef * locals ;
238
282
};
239
283
240
284
typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame ;
@@ -257,41 +301,40 @@ typedef struct _JitOptContext {
257
301
// Arena for the symbolic types.
258
302
ty_arena t_arena ;
259
303
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 ];
263
307
} JitOptContext ;
264
308
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 (
272
316
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 );
294
317
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 );
295
338
296
339
extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
297
340
extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
@@ -300,7 +343,7 @@ extern _Py_UOpsAbstractFrame *_Py_uop_frame_new(
300
343
JitOptContext * ctx ,
301
344
PyCodeObject * co ,
302
345
int curr_stackentries ,
303
- JitOptSymbol * * args ,
346
+ JitOptRef * args ,
304
347
int arg_len );
305
348
extern int _Py_uop_frame_pop (JitOptContext * ctx );
306
349
0 commit comments