Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-117139: Convert the evaluation stack to stack refs #118450

Merged
merged 152 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
a6275f1
merge from upstream
Fidget-Spinner Apr 30, 2024
7e7627f
remove test tags
Fidget-Spinner Apr 30, 2024
00dde8e
add test for immortal
Fidget-Spinner Apr 30, 2024
eadc4fc
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Apr 30, 2024
64e2800
minor cleanups
Fidget-Spinner Apr 30, 2024
bf6b7e4
Create 2024-05-01-05-09-16.gh-issue-117139.t41w_D.rst
Fidget-Spinner Apr 30, 2024
865ff8d
remove bad assert
Fidget-Spinner Apr 30, 2024
b1777c4
rename tagged -> stackref
Fidget-Spinner May 1, 2024
50cfefa
trivial fixes first
Fidget-Spinner May 2, 2024
39e9057
fix anti-patterns (use deferred everywhere)
Fidget-Spinner May 2, 2024
1bb3c51
Delete 2024-03-26-20-31-34.gh-issue-117139.eELvoZ.rst
Fidget-Spinner May 2, 2024
18ef669
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 2, 2024
3fedc6f
replace and use macro
Fidget-Spinner May 2, 2024
1942d78
fix refcounting issues
Fidget-Spinner May 4, 2024
5a1c46f
Fix decref inputs problem
Fidget-Spinner May 4, 2024
dcc55b0
fix cases generator
Fidget-Spinner May 4, 2024
ec70b3b
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 4, 2024
542cfbb
fix problems from upstream
Fidget-Spinner May 4, 2024
3af1ef1
cleanup
Fidget-Spinner May 4, 2024
6bc29a1
formatting
Fidget-Spinner May 4, 2024
9052526
change used tags to 0b01
Fidget-Spinner May 5, 2024
c38de34
alignment
Fidget-Spinner May 5, 2024
106058c
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 6, 2024
f545b2f
fix merge problems
Fidget-Spinner May 6, 2024
0d1b38f
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 8, 2024
a597536
use PyStackRef_IsNull
Fidget-Spinner May 8, 2024
9d43727
tagged ->stackref
Fidget-Spinner May 8, 2024
bc96ae6
use Mark's naming scheme
Fidget-Spinner May 8, 2024
1d71dd1
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 8, 2024
e12337a
Update pycore_object_deferred.h
Fidget-Spinner May 8, 2024
91a8c81
tag all pointers, address some comments
Fidget-Spinner May 9, 2024
64bdfe2
fix free threaded, address more reviews
Fidget-Spinner May 9, 2024
88e0ea8
remove GC changes
Fidget-Spinner May 9, 2024
64b237c
address all of Mark's review
Fidget-Spinner May 10, 2024
97f6e14
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 10, 2024
834cdf0
fix refcounting issue
Fidget-Spinner May 10, 2024
99611cb
fix gdb failures
Fidget-Spinner May 10, 2024
512cd2e
fix specialization
Fidget-Spinner May 10, 2024
df176bf
fix tier 2
Fidget-Spinner May 10, 2024
576909d
fix optimizer builds
Fidget-Spinner May 10, 2024
adb54d8
don't check immortal when tagging
Fidget-Spinner May 10, 2024
d86652f
remove immortal check for tagging
Fidget-Spinner May 10, 2024
bca14a8
remove unsafe ptr conversions
Fidget-Spinner May 10, 2024
4eaece7
Revert "remove immortal check for tagging"
Fidget-Spinner May 10, 2024
4930f6f
Revert "don't check immortal when tagging"
Fidget-Spinner May 10, 2024
8670ee4
tag immortal objects
Fidget-Spinner May 10, 2024
144a6fa
Remove PyObject_To_StackRef_Steal
Fidget-Spinner May 10, 2024
c2bbe17
minor clenaups
Fidget-Spinner May 11, 2024
a6bfc97
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 27, 2024
e21a76a
Use Sam's and Mark's naming scheme
Fidget-Spinner May 28, 2024
e12942d
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner May 28, 2024
64c070d
regen
Fidget-Spinner May 28, 2024
4a103fb
fix test_generated_cases
Fidget-Spinner May 28, 2024
0bd7435
address partially reviews
Fidget-Spinner Jun 4, 2024
51908e9
convert the rest to stackrefs
Fidget-Spinner Jun 4, 2024
e99f019
fix tests
Fidget-Spinner Jun 4, 2024
fde830d
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 4, 2024
c73f8ac
ifdef out on default builds
Fidget-Spinner Jun 4, 2024
6a6bae2
add back XCLOSE and XDUP for perf reasons
Fidget-Spinner Jun 4, 2024
3d23f56
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 5, 2024
99fa382
Low the C recursion limit in WASI, it's failing
Fidget-Spinner Jun 5, 2024
5a5e329
Revert "Low the C recursion limit in WASI, it's failing"
Fidget-Spinner Jun 5, 2024
4a5ae8c
use macros instead of static inline for most things
Fidget-Spinner Jun 5, 2024
4e9740d
Revert "use macros instead of static inline for most things"
Fidget-Spinner Jun 5, 2024
c49cf1c
double WASI stack size of pydebug
Fidget-Spinner Jun 5, 2024
1b45992
Revert "Revert "use macros instead of static inline for most things""
Fidget-Spinner Jun 5, 2024
e5130a9
Revert "double WASI stack size of pydebug"
Fidget-Spinner Jun 5, 2024
505d640
inline functions directly for non-gil to pass on WASI debug
Fidget-Spinner Jun 5, 2024
5053536
Update configure
Fidget-Spinner Jun 5, 2024
0242212
convert more stuff to macros to try fix wasi
Fidget-Spinner Jun 5, 2024
12f8c0e
Increase wasm limit to 32kb
Fidget-Spinner Jun 5, 2024
db89f64
Revert "Increase wasm limit to 32kb"
Fidget-Spinner Jun 5, 2024
79714c2
skip test on WASI
Fidget-Spinner Jun 5, 2024
9a33b7f
fix uses of dup
Fidget-Spinner Jun 6, 2024
18894ca
refactor calls according to Mark
Fidget-Spinner Jun 6, 2024
67e0d25
fix bug
Fidget-Spinner Jun 6, 2024
4423794
fix macro
Fidget-Spinner Jun 6, 2024
66eb526
regen frozemain?
Fidget-Spinner Jun 6, 2024
2eda2f9
add PyStackRef_IsFalse/True
Fidget-Spinner Jun 6, 2024
8f97ae2
skip bad test
Fidget-Spinner Jun 6, 2024
58c3c55
fix tier 2 and JIT builds
Fidget-Spinner Jun 6, 2024
ca92d4a
fix macro
Fidget-Spinner Jun 7, 2024
3356eda
fix error handling
Fidget-Spinner Jun 7, 2024
8274425
revert unicode
Fidget-Spinner Jun 7, 2024
4405a5c
DCE hack
Fidget-Spinner Jun 7, 2024
2d69426
revert dictionary
Fidget-Spinner Jun 7, 2024
4f4107a
revert slice
Fidget-Spinner Jun 7, 2024
65be3fd
revert lists
Fidget-Spinner Jun 7, 2024
78dbf36
revert tuple
Fidget-Spinner Jun 7, 2024
a21eddd
Address review
Fidget-Spinner Jun 10, 2024
d744c8a
address changes (woops)
Fidget-Spinner Jun 10, 2024
6c76fe3
Address half of Mark's review
Fidget-Spinner Jun 11, 2024
8dc4fc6
Address rest of review
Fidget-Spinner Jun 11, 2024
8044c7e
Address rest of review
Fidget-Spinner Jun 11, 2024
90ebfc4
rename for clarity
Fidget-Spinner Jun 11, 2024
e4ccb65
rename PyStackRef_AsPyObjectDeferredToNew -> PyStackRef_AsPyObjectDef…
Fidget-Spinner Jun 12, 2024
2ff4f36
Drop defer, just steal
Fidget-Spinner Jun 12, 2024
992731d
Address half of Mark's review
Fidget-Spinner Jun 13, 2024
12f19ce
revert test frozenmain changes
Fidget-Spinner Jun 13, 2024
268eb0e
remove istrue
Fidget-Spinner Jun 13, 2024
d3b9e51
remove isfalse
Fidget-Spinner Jun 13, 2024
680e828
remove isnone
Fidget-Spinner Jun 13, 2024
27eda47
rename gen_frame_o
Fidget-Spinner Jun 13, 2024
be25a04
Fixup
Fidget-Spinner Jun 13, 2024
ae8c050
rename
Fidget-Spinner Jun 13, 2024
6e84d69
rename true and false to static const
Fidget-Spinner Jun 13, 2024
c523386
try fix on msvc
Fidget-Spinner Jun 13, 2024
d565b0d
try fix
Fidget-Spinner Jun 13, 2024
983764c
fix codegen
Fidget-Spinner Jun 14, 2024
7f3c02d
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 14, 2024
656f35c
Use macro
Fidget-Spinner Jun 14, 2024
92ada68
rename to PyStackRef_none
Fidget-Spinner Jun 14, 2024
24bd03f
Fix tier 2 generation
Fidget-Spinner Jun 14, 2024
fd1140c
cleanup code generator
Fidget-Spinner Jun 14, 2024
fc66d1c
Change is_abstract to extract_bits
Fidget-Spinner Jun 14, 2024
9dda41f
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 17, 2024
233f9e2
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 17, 2024
ef5a057
address review: use macro for conversion
Fidget-Spinner Jun 17, 2024
d2c14f7
fix space issue
Fidget-Spinner Jun 17, 2024
09a3848
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 18, 2024
40e72e1
(test) remove skips
Fidget-Spinner Jun 18, 2024
b33d161
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 18, 2024
b160409
fix upstream changes
Fidget-Spinner Jun 18, 2024
8ffd7ff
Convert functions back to static inline
Fidget-Spinner Jun 19, 2024
cbc1b6f
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 19, 2024
6adbcbf
Update test_frozenmain.h
Fidget-Spinner Jun 19, 2024
fdd24d6
Tighten diff
Fidget-Spinner Jun 20, 2024
9acd39d
Apply all suggestions and reviews by Mark
Fidget-Spinner Jun 21, 2024
e600102
Apply comment from line 1112
Fidget-Spinner Jun 21, 2024
add5f75
borrow, not steal
Fidget-Spinner Jun 21, 2024
f811462
Add documentation and guide
Fidget-Spinner Jun 22, 2024
c4dd69b
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 22, 2024
60e2bb4
Address review by Mark
Fidget-Spinner Jun 22, 2024
c7eac22
fix for free-threaded builds
Fidget-Spinner Jun 22, 2024
8bf685a
fix typo
Fidget-Spinner Jun 22, 2024
7cf0369
Rename Py_STACKREF_NULL to PyStackRef_NULL
Fidget-Spinner Jun 23, 2024
37c31d1
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 24, 2024
2d38baa
Reduce scratch size on apple
Fidget-Spinner Jun 25, 2024
8d82237
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 25, 2024
a959249
Address review, increase scratch
Fidget-Spinner Jun 25, 2024
cab1d5b
Apply most suggestions
Fidget-Spinner Jun 26, 2024
ee6630f
Fix write underflow
Fidget-Spinner Jun 26, 2024
9b67932
reduce stack requirements
Fidget-Spinner Jun 26, 2024
475e2dc
Update ceval_macros.h
Fidget-Spinner Jun 26, 2024
126b60d
fix off by one
Fidget-Spinner Jun 26, 2024
197e1ba
regen
Fidget-Spinner Jun 26, 2024
4074bc3
undo immortal changes (they caused asserts to fail)
Fidget-Spinner Jun 26, 2024
50c92d0
Merge remote-tracking branch 'upstream/main' into stackref_all
Fidget-Spinner Jun 26, 2024
ce77fe4
Fix bug in malloc case
Fidget-Spinner Jun 26, 2024
193e216
Use immortal
Fidget-Spinner Jun 26, 2024
30f7a09
Remove borrowed load in counter_optimize
Fidget-Spinner Jun 26, 2024
ff41e0c
silence warning
Fidget-Spinner Jun 26, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Include/internal/pycore_ceval.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,8 +261,11 @@ PyAPI_FUNC(void) _PyEval_FormatExcUnbound(PyThreadState *tstate, PyCodeObject *c
PyAPI_FUNC(void) _PyEval_FormatKwargsError(PyThreadState *tstate, PyObject *func, PyObject *kwargs);
PyAPI_FUNC(PyObject *)_PyEval_MatchClass(PyThreadState *tstate, PyObject *subject, PyObject *type, Py_ssize_t nargs, PyObject *kwargs);
PyAPI_FUNC(PyObject *)_PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys);
PyAPI_FUNC(int) _PyEval_UnpackIterable(PyThreadState *tstate, PyObject *v, int argcnt, int argcntafter, PyObject **sp);
PyAPI_FUNC(int) _PyEval_UnpackIterableStackRef(PyThreadState *tstate, _PyStackRef v, int argcnt, int argcntafter, _PyStackRef *sp);
PyAPI_FUNC(void) _PyEval_FrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame);
PyAPI_FUNC(PyObject **) _PyObjectArray_FromStackRefArray(_PyStackRef *input, Py_ssize_t nargs, PyObject **scratch);

PyAPI_FUNC(void) _PyObjectArray_Free(PyObject **array, PyObject **scratch);


/* Bits that can be set in PyThreadState.eval_breaker */
Expand Down
29 changes: 15 additions & 14 deletions Include/internal/pycore_code.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif

#include "pycore_stackref.h" // _PyStackRef
#include "pycore_lock.h" // PyMutex
#include "pycore_backoff.h" // _Py_BackoffCounter

Expand Down Expand Up @@ -317,30 +318,30 @@ extern void _PyCode_Clear_Executors(PyCodeObject *code);

/* Specialization functions */

extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *cls,
extern void _Py_Specialize_LoadSuperAttr(_PyStackRef global_super, _PyStackRef cls,
_Py_CODEUNIT *instr, int load_method);
extern void _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr,
extern void _Py_Specialize_LoadAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
PyObject *name);
extern void _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr,
extern void _Py_Specialize_StoreAttr(_PyStackRef owner, _Py_CODEUNIT *instr,
PyObject *name);
extern void _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins,
_Py_CODEUNIT *instr, PyObject *name);
extern void _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container,
extern void _Py_Specialize_BinarySubscr(_PyStackRef sub, _PyStackRef container,
_Py_CODEUNIT *instr);
extern void _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub,
extern void _Py_Specialize_StoreSubscr(_PyStackRef container, _PyStackRef sub,
_Py_CODEUNIT *instr);
extern void _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr,
extern void _Py_Specialize_Call(_PyStackRef callable, _Py_CODEUNIT *instr,
int nargs);
extern void _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr,
int oparg, PyObject **locals);
extern void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs,
extern void _Py_Specialize_BinaryOp(_PyStackRef lhs, _PyStackRef rhs, _Py_CODEUNIT *instr,
int oparg, _PyStackRef *locals);
extern void _Py_Specialize_CompareOp(_PyStackRef lhs, _PyStackRef rhs,
_Py_CODEUNIT *instr, int oparg);
extern void _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr,
extern void _Py_Specialize_UnpackSequence(_PyStackRef seq, _Py_CODEUNIT *instr,
int oparg);
extern void _Py_Specialize_ForIter(PyObject *iter, _Py_CODEUNIT *instr, int oparg);
extern void _Py_Specialize_Send(PyObject *receiver, _Py_CODEUNIT *instr);
extern void _Py_Specialize_ToBool(PyObject *value, _Py_CODEUNIT *instr);
extern void _Py_Specialize_ContainsOp(PyObject *value, _Py_CODEUNIT *instr);
extern void _Py_Specialize_ForIter(_PyStackRef iter, _Py_CODEUNIT *instr, int oparg);
extern void _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr);
extern void _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr);
extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr);

#ifdef Py_STATS

Expand Down
27 changes: 14 additions & 13 deletions Include/internal/pycore_frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ extern "C" {
#include <stdbool.h>
#include <stddef.h> // offsetof()
#include "pycore_code.h" // STATS
#include "pycore_stackref.h" // _PyStackRef

/* See Objects/frame_layout.md for an explanation of the frame stack
* including explanation of the PyFrameObject and _PyInterpreterFrame
Expand Down Expand Up @@ -67,7 +68,7 @@ typedef struct _PyInterpreterFrame {
uint16_t return_offset; /* Only relevant during a function call */
char owner;
/* Locals and stack */
PyObject *localsplus[1];
_PyStackRef localsplus[1];
} _PyInterpreterFrame;

#define _PyInterpreterFrame_LASTI(IF) \
Expand All @@ -78,23 +79,23 @@ static inline PyCodeObject *_PyFrame_GetCode(_PyInterpreterFrame *f) {
return (PyCodeObject *)f->f_executable;
}

static inline PyObject **_PyFrame_Stackbase(_PyInterpreterFrame *f) {
return f->localsplus + _PyFrame_GetCode(f)->co_nlocalsplus;
static inline _PyStackRef *_PyFrame_Stackbase(_PyInterpreterFrame *f) {
return (f->localsplus + _PyFrame_GetCode(f)->co_nlocalsplus);
}

static inline PyObject *_PyFrame_StackPeek(_PyInterpreterFrame *f) {
static inline _PyStackRef _PyFrame_StackPeek(_PyInterpreterFrame *f) {
assert(f->stacktop > _PyFrame_GetCode(f)->co_nlocalsplus);
assert(f->localsplus[f->stacktop-1] != NULL);
assert(!PyStackRef_IsNull(f->localsplus[f->stacktop-1]));
return f->localsplus[f->stacktop-1];
}

static inline PyObject *_PyFrame_StackPop(_PyInterpreterFrame *f) {
static inline _PyStackRef _PyFrame_StackPop(_PyInterpreterFrame *f) {
assert(f->stacktop > _PyFrame_GetCode(f)->co_nlocalsplus);
f->stacktop--;
return f->localsplus[f->stacktop];
}

static inline void _PyFrame_StackPush(_PyInterpreterFrame *f, PyObject *value) {
static inline void _PyFrame_StackPush(_PyInterpreterFrame *f, _PyStackRef value) {
f->localsplus[f->stacktop] = value;
f->stacktop++;
}
Expand Down Expand Up @@ -143,14 +144,14 @@ _PyFrame_Initialize(
frame->owner = FRAME_OWNED_BY_THREAD;

for (int i = null_locals_from; i < code->co_nlocalsplus; i++) {
frame->localsplus[i] = NULL;
frame->localsplus[i] = PyStackRef_NULL;
}
}

/* Gets the pointer to the locals array
* that precedes this frame.
*/
static inline PyObject**
static inline _PyStackRef*
_PyFrame_GetLocalsArray(_PyInterpreterFrame *frame)
{
return frame->localsplus;
Expand All @@ -160,16 +161,16 @@ _PyFrame_GetLocalsArray(_PyInterpreterFrame *frame)
Having stacktop <= 0 ensures that invalid
values are not visible to the cycle GC.
We choose -1 rather than 0 to assist debugging. */
static inline PyObject**
static inline _PyStackRef*
_PyFrame_GetStackPointer(_PyInterpreterFrame *frame)
{
PyObject **sp = frame->localsplus + frame->stacktop;
_PyStackRef *sp = frame->localsplus + frame->stacktop;
frame->stacktop = -1;
return sp;
}

static inline void
_PyFrame_SetStackPointer(_PyInterpreterFrame *frame, PyObject **stack_pointer)
_PyFrame_SetStackPointer(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer)
{
frame->stacktop = (int)(stack_pointer - frame->localsplus);
}
Expand Down Expand Up @@ -309,7 +310,7 @@ _PyFrame_PushTrampolineUnchecked(PyThreadState *tstate, PyCodeObject *code, int

PyAPI_FUNC(_PyInterpreterFrame *)
_PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func,
PyObject *locals, PyObject* const* args,
PyObject *locals, _PyStackRef const* args,
size_t argcount, PyObject *kwnames);

#ifdef __cplusplus
Expand Down
2 changes: 1 addition & 1 deletion Include/internal/pycore_jit.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ extern "C" {

#ifdef _Py_JIT

typedef _Py_CODEUNIT *(*jit_func)(_PyInterpreterFrame *frame, PyObject **stack_pointer, PyThreadState *tstate);
typedef _Py_CODEUNIT *(*jit_func)(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, PyThreadState *tstate);

int _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction *trace, size_t length);
void _PyJIT_Free(_PyExecutorObject *executor);
Expand Down
15 changes: 0 additions & 15 deletions Include/internal/pycore_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,21 +159,6 @@ static inline void _Py_ClearImmortal(PyObject *op)
op = NULL; \
} while (0)

// Mark an object as supporting deferred reference counting. This is a no-op
// in the default (with GIL) build. Objects that use deferred reference
// counting should be tracked by the GC so that they are eventually collected.
extern void _PyObject_SetDeferredRefcount(PyObject *op);

static inline int
_PyObject_HasDeferredRefcount(PyObject *op)
{
#ifdef Py_GIL_DISABLED
return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_DEFERRED);
#else
return 0;
#endif
}

#if !defined(Py_GIL_DISABLED)
static inline void
_Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct)
Expand Down
32 changes: 32 additions & 0 deletions Include/internal/pycore_object_deferred.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef Py_INTERNAL_OBJECT_DEFERRED_H
Fidget-Spinner marked this conversation as resolved.
Show resolved Hide resolved
#define Py_INTERNAL_OBJECT_DEFERRED_H

#ifdef __cplusplus
extern "C" {
#endif

#include "pycore_gc.h"

#ifndef Py_BUILD_CORE
# error "this header requires Py_BUILD_CORE define"
#endif

// Mark an object as supporting deferred reference counting. This is a no-op
// in the default (with GIL) build. Objects that use deferred reference
// counting should be tracked by the GC so that they are eventually collected.
extern void _PyObject_SetDeferredRefcount(PyObject *op);

static inline int
_PyObject_HasDeferredRefcount(PyObject *op)
{
#ifdef Py_GIL_DISABLED
return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_DEFERRED);
#else
return 0;
#endif
}

#ifdef __cplusplus
}
#endif
#endif // !Py_INTERNAL_OBJECT_DEFERRED_H
2 changes: 1 addition & 1 deletion Include/internal/pycore_optimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ extern int _Py_uop_frame_pop(_Py_UOpsContext *ctx);

PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored);

PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, PyObject **stack_pointer, _PyExecutorObject **exec_ptr);
PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyStackRef *stack_pointer, _PyExecutorObject **exec_ptr);

#ifdef __cplusplus
}
Expand Down
Loading
Loading