summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-08-02 15:31:17 (GMT)
committerGitHub <noreply@github.com>2024-08-02 15:31:17 (GMT)
commit7aca84e557d0a6d242f322c493d53947a56bde91 (patch)
tree748b14a2221f090721673c936f20f21e7d87d323 /Python
parent498376d7a7d6f704f22a2c963130cc15c17e7a6f (diff)
downloadcpython-7aca84e557d0a6d242f322c493d53947a56bde91.zip
cpython-7aca84e557d0a6d242f322c493d53947a56bde91.tar.gz
cpython-7aca84e557d0a6d242f322c493d53947a56bde91.tar.bz2
GH-117224: Move the body of a few large-ish micro-ops into helper functions (GH-122601)
Diffstat (limited to 'Python')
-rw-r--r--Python/bytecodes.c125
-rw-r--r--Python/ceval.c135
-rw-r--r--Python/executor_cases.c.h117
-rw-r--r--Python/generated_cases.c.h117
4 files changed, 159 insertions, 335 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 4147255..48b74f9 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1010,77 +1010,16 @@ dummy_func(
}
inst(GET_ANEXT, (aiter -- aiter, awaitable)) {
- unaryfunc getter = NULL;
- PyObject *next_iter = NULL;
- PyObject *awaitable_o;
- PyObject *aiter_o = PyStackRef_AsPyObjectBorrow(aiter);
- PyTypeObject *type = Py_TYPE(aiter_o);
-
- if (PyAsyncGen_CheckExact(aiter_o)) {
- awaitable_o = type->tp_as_async->am_anext(aiter_o);
- if (awaitable_o == NULL) {
- ERROR_NO_POP();
- }
- } else {
- if (type->tp_as_async != NULL){
- getter = type->tp_as_async->am_anext;
- }
-
- if (getter != NULL) {
- next_iter = (*getter)(aiter_o);
- if (next_iter == NULL) {
- ERROR_NO_POP();
- }
- }
- else {
- _PyErr_Format(tstate, PyExc_TypeError,
- "'async for' requires an iterator with "
- "__anext__ method, got %.100s",
- type->tp_name);
- ERROR_NO_POP();
- }
-
- awaitable_o = _PyCoro_GetAwaitableIter(next_iter);
- if (awaitable_o == NULL) {
- _PyErr_FormatFromCause(
- PyExc_TypeError,
- "'async for' received an invalid object "
- "from __anext__: %.100s",
- Py_TYPE(next_iter)->tp_name);
-
- Py_DECREF(next_iter);
- ERROR_NO_POP();
- } else {
- Py_DECREF(next_iter);
- }
+ PyObject *awaitable_o = _PyEval_GetANext(PyStackRef_AsPyObjectBorrow(aiter));
+ if (awaitable_o == NULL) {
+ ERROR_NO_POP();
}
awaitable = PyStackRef_FromPyObjectSteal(awaitable_o);
}
inst(GET_AWAITABLE, (iterable -- iter)) {
- PyObject *iter_o = _PyCoro_GetAwaitableIter(PyStackRef_AsPyObjectBorrow(iterable));
-
- if (iter_o == NULL) {
- _PyEval_FormatAwaitableError(tstate,
- Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable)), oparg);
- }
-
+ PyObject *iter_o = _PyEval_GetAwaitable(PyStackRef_AsPyObjectBorrow(iterable), oparg);
DECREF_INPUTS();
-
- if (iter_o != NULL && PyCoro_CheckExact(iter_o)) {
- PyObject *yf = _PyGen_yf((PyGenObject*)iter_o);
- if (yf != NULL) {
- /* `iter` is a coroutine object that is being
- awaited, `yf` is a pointer to the current awaitable
- being awaited on. */
- Py_DECREF(yf);
- Py_CLEAR(iter_o);
- _PyErr_SetString(tstate, PyExc_RuntimeError,
- "coroutine is being awaited already");
- /* The code below jumps to `error` if `iter` is NULL. */
- }
- }
-
ERROR_IF(iter_o == NULL, error);
iter = PyStackRef_FromPyObjectSteal(iter_o);
}
@@ -1527,27 +1466,9 @@ dummy_func(
}
inst(LOAD_NAME, (-- v)) {
- PyObject *v_o;
- PyObject *mod_or_class_dict = LOCALS();
- if (mod_or_class_dict == NULL) {
- _PyErr_SetString(tstate, PyExc_SystemError,
- "no locals found");
- ERROR_IF(true, error);
- }
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- ERROR_IF(PyMapping_GetOptionalItem(mod_or_class_dict, name, &v_o) < 0, error);
- if (v_o == NULL) {
- ERROR_IF(PyDict_GetItemRef(GLOBALS(), name, &v_o) < 0, error);
- if (v_o == NULL) {
- ERROR_IF(PyMapping_GetOptionalItem(BUILTINS(), name, &v_o) < 0, error);
- if (v_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- ERROR_IF(true, error);
- }
- }
- }
+ PyObject *v_o = _PyEval_LoadName(tstate, frame, name);
+ ERROR_IF(v_o == NULL, error);
v = PyStackRef_FromPyObjectSteal(v_o);
}
@@ -1571,38 +1492,8 @@ dummy_func(
op(_LOAD_GLOBAL, ( -- res, null if (oparg & 1))) {
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
- PyObject *res_o;
- if (PyDict_CheckExact(GLOBALS())
- && PyDict_CheckExact(BUILTINS()))
- {
- res_o = _PyDict_LoadGlobal((PyDictObject *)GLOBALS(),
- (PyDictObject *)BUILTINS(),
- name);
- if (res_o == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- /* _PyDict_LoadGlobal() returns NULL without raising
- * an exception if the key doesn't exist */
- _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- }
- ERROR_IF(true, error);
- }
- }
- else {
- /* Slow-path if globals or builtins is not a dict */
- /* namespace 1: globals */
- ERROR_IF(PyMapping_GetOptionalItem(GLOBALS(), name, &res_o) < 0, error);
- if (res_o == NULL) {
- /* namespace 2: builtins */
- ERROR_IF(PyMapping_GetOptionalItem(BUILTINS(), name, &res_o) < 0, error);
- if (res_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- ERROR_IF(true, error);
- }
- }
- }
+ PyObject *res_o = _PyEval_LoadGlobal(GLOBALS(), BUILTINS(), name);
+ ERROR_IF(res_o == NULL, error);
null = PyStackRef_NULL;
res = PyStackRef_FromPyObjectSteal(res_o);
}
diff --git a/Python/ceval.c b/Python/ceval.c
index 425a2a0..f1663ee 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -720,6 +720,7 @@ _PyObjectArray_Free(PyObject **array, PyObject **scratch)
}
}
+
/* _PyEval_EvalFrameDefault() is a *big* function,
* so consume 3 units of C stack */
#define PY_EVAL_C_STACK_UNITS 2
@@ -3031,3 +3032,137 @@ void Py_LeaveRecursiveCall(void)
{
_Py_LeaveRecursiveCall();
}
+
+PyObject *
+_PyEval_GetANext(PyObject *aiter)
+{
+ unaryfunc getter = NULL;
+ PyObject *next_iter = NULL;
+ PyTypeObject *type = Py_TYPE(aiter);
+ if (PyAsyncGen_CheckExact(aiter)) {
+ return type->tp_as_async->am_anext(aiter);
+ }
+ if (type->tp_as_async != NULL){
+ getter = type->tp_as_async->am_anext;
+ }
+
+ if (getter != NULL) {
+ next_iter = (*getter)(aiter);
+ if (next_iter == NULL) {
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "'async for' requires an iterator with "
+ "__anext__ method, got %.100s",
+ type->tp_name);
+ return NULL;
+ }
+
+ PyObject *awaitable = _PyCoro_GetAwaitableIter(next_iter);
+ if (awaitable == NULL) {
+ _PyErr_FormatFromCause(
+ PyExc_TypeError,
+ "'async for' received an invalid object "
+ "from __anext__: %.100s",
+ Py_TYPE(next_iter)->tp_name);
+ }
+ Py_DECREF(next_iter);
+ return awaitable;
+}
+
+PyObject *
+_PyEval_LoadGlobal(PyObject *globals, PyObject *builtins, PyObject *name)
+{
+ PyObject *res;
+ if (PyDict_CheckExact(globals) && PyDict_CheckExact(builtins)) {
+ res = _PyDict_LoadGlobal((PyDictObject *)globals,
+ (PyDictObject *)builtins,
+ name);
+ if (res == NULL && !PyErr_Occurred()) {
+ /* _PyDict_LoadGlobal() returns NULL without raising
+ * an exception if the key doesn't exist */
+ _PyEval_FormatExcCheckArg(PyThreadState_GET(), PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ }
+ else {
+ /* Slow-path if globals or builtins is not a dict */
+ /* namespace 1: globals */
+ if (PyMapping_GetOptionalItem(globals, name, &res) < 0) {
+ return NULL;
+ }
+ if (res == NULL) {
+ /* namespace 2: builtins */
+ if (PyMapping_GetOptionalItem(builtins, name, &res) < 0) {
+ return NULL;
+ }
+ if (res == NULL) {
+ _PyEval_FormatExcCheckArg(
+ PyThreadState_GET(), PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ }
+ }
+ return res;
+}
+
+PyObject *
+_PyEval_GetAwaitable(PyObject *iterable, int oparg)
+{
+ PyObject *iter = _PyCoro_GetAwaitableIter(iterable);
+
+ if (iter == NULL) {
+ _PyEval_FormatAwaitableError(PyThreadState_GET(),
+ Py_TYPE(iterable), oparg);
+ }
+ else if (PyCoro_CheckExact(iter)) {
+ PyObject *yf = _PyGen_yf((PyGenObject*)iter);
+ if (yf != NULL) {
+ /* `iter` is a coroutine object that is being
+ awaited, `yf` is a pointer to the current awaitable
+ being awaited on. */
+ Py_DECREF(yf);
+ Py_CLEAR(iter);
+ _PyErr_SetString(PyThreadState_GET(), PyExc_RuntimeError,
+ "coroutine is being awaited already");
+ }
+ }
+ return iter;
+}
+
+PyObject *
+_PyEval_LoadName(PyThreadState *tstate, _PyInterpreterFrame *frame, PyObject *name)
+{
+
+ PyObject *value;
+ if (frame->f_locals == NULL) {
+ _PyErr_SetString(tstate, PyExc_SystemError,
+ "no locals found");
+ return NULL;
+ }
+ if (PyMapping_GetOptionalItem(frame->f_locals, name, &value) < 0) {
+ return NULL;
+ }
+ if (value != NULL) {
+ return value;
+ }
+ if (PyDict_GetItemRef(frame->f_globals, name, &value) < 0) {
+ return NULL;
+ }
+ if (value != NULL) {
+ return value;
+ }
+ if (PyMapping_GetOptionalItem(frame->f_builtins, name, &value) < 0) {
+ return NULL;
+ }
+ if (value == NULL) {
+ _PyEval_FormatExcCheckArg(
+ tstate, PyExc_NameError,
+ NAME_ERROR_MSG, name);
+ }
+ return value;
+}
+
+
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 61e1c5c..7f89196 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1243,45 +1243,9 @@
_PyStackRef aiter;
_PyStackRef awaitable;
aiter = stack_pointer[-1];
- unaryfunc getter = NULL;
- PyObject *next_iter = NULL;
- PyObject *awaitable_o;
- PyObject *aiter_o = PyStackRef_AsPyObjectBorrow(aiter);
- PyTypeObject *type = Py_TYPE(aiter_o);
- if (PyAsyncGen_CheckExact(aiter_o)) {
- awaitable_o = type->tp_as_async->am_anext(aiter_o);
- if (awaitable_o == NULL) {
- JUMP_TO_ERROR();
- }
- } else {
- if (type->tp_as_async != NULL){
- getter = type->tp_as_async->am_anext;
- }
- if (getter != NULL) {
- next_iter = (*getter)(aiter_o);
- if (next_iter == NULL) {
- JUMP_TO_ERROR();
- }
- }
- else {
- _PyErr_Format(tstate, PyExc_TypeError,
- "'async for' requires an iterator with "
- "__anext__ method, got %.100s",
- type->tp_name);
- JUMP_TO_ERROR();
- }
- awaitable_o = _PyCoro_GetAwaitableIter(next_iter);
- if (awaitable_o == NULL) {
- _PyErr_FormatFromCause(
- PyExc_TypeError,
- "'async for' received an invalid object "
- "from __anext__: %.100s",
- Py_TYPE(next_iter)->tp_name);
- Py_DECREF(next_iter);
- JUMP_TO_ERROR();
- } else {
- Py_DECREF(next_iter);
- }
+ PyObject *awaitable_o = _PyEval_GetANext(PyStackRef_AsPyObjectBorrow(aiter));
+ if (awaitable_o == NULL) {
+ JUMP_TO_ERROR();
}
awaitable = PyStackRef_FromPyObjectSteal(awaitable_o);
stack_pointer[0] = awaitable;
@@ -1295,25 +1259,8 @@
_PyStackRef iter;
oparg = CURRENT_OPARG();
iterable = stack_pointer[-1];
- PyObject *iter_o = _PyCoro_GetAwaitableIter(PyStackRef_AsPyObjectBorrow(iterable));
- if (iter_o == NULL) {
- _PyEval_FormatAwaitableError(tstate,
- Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable)), oparg);
- }
+ PyObject *iter_o = _PyEval_GetAwaitable(PyStackRef_AsPyObjectBorrow(iterable), oparg);
PyStackRef_CLOSE(iterable);
- if (iter_o != NULL && PyCoro_CheckExact(iter_o)) {
- PyObject *yf = _PyGen_yf((PyGenObject*)iter_o);
- if (yf != NULL) {
- /* `iter` is a coroutine object that is being
- awaited, `yf` is a pointer to the current awaitable
- being awaited on. */
- Py_DECREF(yf);
- Py_CLEAR(iter_o);
- _PyErr_SetString(tstate, PyExc_RuntimeError,
- "coroutine is being awaited already");
- /* The code below jumps to `error` if `iter` is NULL. */
- }
- }
if (iter_o == NULL) JUMP_TO_ERROR();
iter = PyStackRef_FromPyObjectSteal(iter_o);
stack_pointer[-1] = iter;
@@ -1676,27 +1623,9 @@
case _LOAD_NAME: {
_PyStackRef v;
oparg = CURRENT_OPARG();
- PyObject *v_o;
- PyObject *mod_or_class_dict = LOCALS();
- if (mod_or_class_dict == NULL) {
- _PyErr_SetString(tstate, PyExc_SystemError,
- "no locals found");
- if (true) JUMP_TO_ERROR();
- }
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v_o) < 0) JUMP_TO_ERROR();
- if (v_o == NULL) {
- if (PyDict_GetItemRef(GLOBALS(), name, &v_o) < 0) JUMP_TO_ERROR();
- if (v_o == NULL) {
- if (PyMapping_GetOptionalItem(BUILTINS(), name, &v_o) < 0) JUMP_TO_ERROR();
- if (v_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- if (true) JUMP_TO_ERROR();
- }
- }
- }
+ PyObject *v_o = _PyEval_LoadName(tstate, frame, name);
+ if (v_o == NULL) JUMP_TO_ERROR();
v = PyStackRef_FromPyObjectSteal(v_o);
stack_pointer[0] = v;
stack_pointer += 1;
@@ -1709,38 +1638,8 @@
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
- PyObject *res_o;
- if (PyDict_CheckExact(GLOBALS())
- && PyDict_CheckExact(BUILTINS()))
- {
- res_o = _PyDict_LoadGlobal((PyDictObject *)GLOBALS(),
- (PyDictObject *)BUILTINS(),
- name);
- if (res_o == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- /* _PyDict_LoadGlobal() returns NULL without raising
- * an exception if the key doesn't exist */
- _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- }
- if (true) JUMP_TO_ERROR();
- }
- }
- else {
- /* Slow-path if globals or builtins is not a dict */
- /* namespace 1: globals */
- if (PyMapping_GetOptionalItem(GLOBALS(), name, &res_o) < 0) JUMP_TO_ERROR();
- if (res_o == NULL) {
- /* namespace 2: builtins */
- if (PyMapping_GetOptionalItem(BUILTINS(), name, &res_o) < 0) JUMP_TO_ERROR();
- if (res_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- if (true) JUMP_TO_ERROR();
- }
- }
- }
+ PyObject *res_o = _PyEval_LoadGlobal(GLOBALS(), BUILTINS(), name);
+ if (res_o == NULL) JUMP_TO_ERROR();
null = PyStackRef_NULL;
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 4efaf89..bed194e 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -3468,45 +3468,9 @@
_PyStackRef aiter;
_PyStackRef awaitable;
aiter = stack_pointer[-1];
- unaryfunc getter = NULL;
- PyObject *next_iter = NULL;
- PyObject *awaitable_o;
- PyObject *aiter_o = PyStackRef_AsPyObjectBorrow(aiter);
- PyTypeObject *type = Py_TYPE(aiter_o);
- if (PyAsyncGen_CheckExact(aiter_o)) {
- awaitable_o = type->tp_as_async->am_anext(aiter_o);
- if (awaitable_o == NULL) {
- goto error;
- }
- } else {
- if (type->tp_as_async != NULL){
- getter = type->tp_as_async->am_anext;
- }
- if (getter != NULL) {
- next_iter = (*getter)(aiter_o);
- if (next_iter == NULL) {
- goto error;
- }
- }
- else {
- _PyErr_Format(tstate, PyExc_TypeError,
- "'async for' requires an iterator with "
- "__anext__ method, got %.100s",
- type->tp_name);
- goto error;
- }
- awaitable_o = _PyCoro_GetAwaitableIter(next_iter);
- if (awaitable_o == NULL) {
- _PyErr_FormatFromCause(
- PyExc_TypeError,
- "'async for' received an invalid object "
- "from __anext__: %.100s",
- Py_TYPE(next_iter)->tp_name);
- Py_DECREF(next_iter);
- goto error;
- } else {
- Py_DECREF(next_iter);
- }
+ PyObject *awaitable_o = _PyEval_GetANext(PyStackRef_AsPyObjectBorrow(aiter));
+ if (awaitable_o == NULL) {
+ goto error;
}
awaitable = PyStackRef_FromPyObjectSteal(awaitable_o);
stack_pointer[0] = awaitable;
@@ -3522,25 +3486,8 @@
_PyStackRef iterable;
_PyStackRef iter;
iterable = stack_pointer[-1];
- PyObject *iter_o = _PyCoro_GetAwaitableIter(PyStackRef_AsPyObjectBorrow(iterable));
- if (iter_o == NULL) {
- _PyEval_FormatAwaitableError(tstate,
- Py_TYPE(PyStackRef_AsPyObjectBorrow(iterable)), oparg);
- }
+ PyObject *iter_o = _PyEval_GetAwaitable(PyStackRef_AsPyObjectBorrow(iterable), oparg);
PyStackRef_CLOSE(iterable);
- if (iter_o != NULL && PyCoro_CheckExact(iter_o)) {
- PyObject *yf = _PyGen_yf((PyGenObject*)iter_o);
- if (yf != NULL) {
- /* `iter` is a coroutine object that is being
- awaited, `yf` is a pointer to the current awaitable
- being awaited on. */
- Py_DECREF(yf);
- Py_CLEAR(iter_o);
- _PyErr_SetString(tstate, PyExc_RuntimeError,
- "coroutine is being awaited already");
- /* The code below jumps to `error` if `iter` is NULL. */
- }
- }
if (iter_o == NULL) goto pop_1_error;
iter = PyStackRef_FromPyObjectSteal(iter_o);
stack_pointer[-1] = iter;
@@ -5231,38 +5178,8 @@
// _LOAD_GLOBAL
{
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
- PyObject *res_o;
- if (PyDict_CheckExact(GLOBALS())
- && PyDict_CheckExact(BUILTINS()))
- {
- res_o = _PyDict_LoadGlobal((PyDictObject *)GLOBALS(),
- (PyDictObject *)BUILTINS(),
- name);
- if (res_o == NULL) {
- if (!_PyErr_Occurred(tstate)) {
- /* _PyDict_LoadGlobal() returns NULL without raising
- * an exception if the key doesn't exist */
- _PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- }
- if (true) goto error;
- }
- }
- else {
- /* Slow-path if globals or builtins is not a dict */
- /* namespace 1: globals */
- if (PyMapping_GetOptionalItem(GLOBALS(), name, &res_o) < 0) goto error;
- if (res_o == NULL) {
- /* namespace 2: builtins */
- if (PyMapping_GetOptionalItem(BUILTINS(), name, &res_o) < 0) goto error;
- if (res_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- if (true) goto error;
- }
- }
- }
+ PyObject *res_o = _PyEval_LoadGlobal(GLOBALS(), BUILTINS(), name);
+ if (res_o == NULL) goto error;
null = PyStackRef_NULL;
res = PyStackRef_FromPyObjectSteal(res_o);
}
@@ -5375,27 +5292,9 @@
next_instr += 1;
INSTRUCTION_STATS(LOAD_NAME);
_PyStackRef v;
- PyObject *v_o;
- PyObject *mod_or_class_dict = LOCALS();
- if (mod_or_class_dict == NULL) {
- _PyErr_SetString(tstate, PyExc_SystemError,
- "no locals found");
- if (true) goto error;
- }
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
- if (PyMapping_GetOptionalItem(mod_or_class_dict, name, &v_o) < 0) goto error;
- if (v_o == NULL) {
- if (PyDict_GetItemRef(GLOBALS(), name, &v_o) < 0) goto error;
- if (v_o == NULL) {
- if (PyMapping_GetOptionalItem(BUILTINS(), name, &v_o) < 0) goto error;
- if (v_o == NULL) {
- _PyEval_FormatExcCheckArg(
- tstate, PyExc_NameError,
- NAME_ERROR_MSG, name);
- if (true) goto error;
- }
- }
- }
+ PyObject *v_o = _PyEval_LoadName(tstate, frame, name);
+ if (v_o == NULL) goto error;
v = PyStackRef_FromPyObjectSteal(v_o);
stack_pointer[0] = v;
stack_pointer += 1;