Skip to content

Commit bf863cd

Browse files
committed
Avoid branch for known mortal objects
1 parent 17b97c6 commit bf863cd

File tree

5 files changed

+16
-3
lines changed

5 files changed

+16
-3
lines changed

Include/internal/pycore_stackref.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ PyStackRef_AsStrongReference(_PyStackRef stackref)
370370
} \
371371
} while (0)
372372

373+
#define PyStackRef_FromPyObjectNewMortal PyStackRef_FromPyObjectNew
373374

374375
#else // Py_GIL_DISABLED
375376

@@ -508,6 +509,17 @@ _PyStackRef_FromPyObjectNew(PyObject *obj)
508509
}
509510
#define PyStackRef_FromPyObjectNew(obj) _PyStackRef_FromPyObjectNew(_PyObject_CAST(obj))
510511

512+
static inline _PyStackRef
513+
_PyStackRef_FromPyObjectNewMortal(PyObject *obj)
514+
{
515+
assert(obj != NULL);
516+
Py_INCREF_MORTAL(obj);
517+
_PyStackRef ref = (_PyStackRef){ .bits = (uintptr_t)obj };
518+
PyStackRef_CheckValid(ref);
519+
return ref;
520+
}
521+
#define PyStackRef_FromPyObjectNewMortal(obj) _PyStackRef_FromPyObjectNewMortal(_PyObject_CAST(obj))
522+
511523
/* Create a new reference from an object with an embedded reference count */
512524
static inline _PyStackRef
513525
PyStackRef_FromPyObjectImmortal(PyObject *obj)

Python/bytecodes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ dummy_func(
311311

312312
inst(LOAD_CONST_MORTAL, (-- value)) {
313313
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
314-
value = PyStackRef_FromPyObjectNew(obj);
314+
value = PyStackRef_FromPyObjectNewMortal(obj);
315315
}
316316

317317
inst(LOAD_CONST_IMMORTAL, (-- value)) {

Python/executor_cases.c.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/cases_generator/analyzer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ def has_error_without_pop(op: parser.CodeDef) -> bool:
583583
"PySlice_New",
584584
"PyStackRef_AsPyObjectBorrow",
585585
"PyStackRef_AsPyObjectNew",
586+
"PyStackRef_FromPyObjectNewMortal",
586587
"PyStackRef_AsPyObjectSteal",
587588
"PyStackRef_CLEAR",
588589
"PyStackRef_CLOSE_SPECIALIZED",

0 commit comments

Comments
 (0)