mirror of
https://github.com/python/cpython.git
synced 2026-01-06 07:22:09 +00:00
GH-139922: Tail calling for MSVC (VS 2026) (GH-143068)
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Co-authored-by: Brandt Bucher <brandt@python.org> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
parent
665d2807a0
commit
be3c131640
12 changed files with 528 additions and 683 deletions
433
Python/generated_cases.c.h
generated
433
Python/generated_cases.c.h
generated
|
|
@ -1667,90 +1667,30 @@
|
|||
frame->return_offset = 4u ;
|
||||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o);
|
||||
if (CONVERSION_FAILED(args_o)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp;
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject* res_o = _Py_VectorCallInstrumentation_StackRefSteal(
|
||||
callable,
|
||||
arguments,
|
||||
total_args,
|
||||
PyStackRef_NULL,
|
||||
opcode == INSTRUMENTED_CALL,
|
||||
frame,
|
||||
this_instr,
|
||||
tstate);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (res_o == NULL) {
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *res_o = PyObject_Vectorcall(
|
||||
callable_o, args_o,
|
||||
total_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
|
||||
NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
|
||||
if (opcode == INSTRUMENTED_CALL) {
|
||||
PyObject *arg = total_args == 0 ?
|
||||
&_PyInstrumentation_MISSING : PyStackRef_AsPyObjectBorrow(arguments[0]);
|
||||
if (res_o == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_Py_call_instrumentation_exc2(
|
||||
tstate, PY_MONITORING_EVENT_C_RAISE,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
else {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = _Py_call_instrumentation_2args(
|
||||
tstate, PY_MONITORING_EVENT_C_RETURN,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_CLEAR(res_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp;
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
if (res_o == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
// _CHECK_PERIODIC_AT_END
|
||||
{
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
stack_pointer[-2 - oparg] = res;
|
||||
stack_pointer += -1 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = check_periodics(tstate);
|
||||
|
|
@ -2858,93 +2798,28 @@
|
|||
frame->return_offset = 4u ;
|
||||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o);
|
||||
if (CONVERSION_FAILED(args_o)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = kwnames;
|
||||
kwnames = PyStackRef_NULL;
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
stack_pointer[-1] = kwnames;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject* res_o = _Py_VectorCallInstrumentation_StackRefSteal(
|
||||
callable,
|
||||
arguments,
|
||||
total_args,
|
||||
kwnames,
|
||||
opcode == INSTRUMENTED_CALL_KW,
|
||||
frame,
|
||||
this_instr,
|
||||
tstate);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (res_o == NULL) {
|
||||
stack_pointer += -3 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *res_o = PyObject_Vectorcall(
|
||||
callable_o, args_o,
|
||||
positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
|
||||
kwnames_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
|
||||
if (opcode == INSTRUMENTED_CALL_KW) {
|
||||
PyObject *arg = total_args == 0 ?
|
||||
&_PyInstrumentation_MISSING : PyStackRef_AsPyObjectBorrow(arguments[0]);
|
||||
if (res_o == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_Py_call_instrumentation_exc2(
|
||||
tstate, PY_MONITORING_EVENT_C_RAISE,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
else {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = _Py_call_instrumentation_2args(
|
||||
tstate, PY_MONITORING_EVENT_C_RETURN,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_CLEAR(res_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = kwnames;
|
||||
kwnames = PyStackRef_NULL;
|
||||
stack_pointer[-1] = kwnames;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -3 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
if (res_o == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
stack_pointer[-3 - oparg] = res;
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
DISPATCH();
|
||||
}
|
||||
|
|
@ -6180,86 +6055,28 @@
|
|||
frame->return_offset = 4u ;
|
||||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o);
|
||||
if (CONVERSION_FAILED(args_o)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp;
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject* res_o = _Py_VectorCallInstrumentation_StackRefSteal(
|
||||
callable,
|
||||
arguments,
|
||||
total_args,
|
||||
PyStackRef_NULL,
|
||||
opcode == INSTRUMENTED_CALL,
|
||||
frame,
|
||||
this_instr,
|
||||
tstate);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (res_o == NULL) {
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *res_o = PyObject_Vectorcall(
|
||||
callable_o, args_o,
|
||||
total_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
|
||||
NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
|
||||
if (opcode == INSTRUMENTED_CALL) {
|
||||
PyObject *arg = total_args == 0 ?
|
||||
&_PyInstrumentation_MISSING : PyStackRef_AsPyObjectBorrow(arguments[0]);
|
||||
if (res_o == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_Py_call_instrumentation_exc2(
|
||||
tstate, PY_MONITORING_EVENT_C_RAISE,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
else {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = _Py_call_instrumentation_2args(
|
||||
tstate, PY_MONITORING_EVENT_C_RETURN,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_CLEAR(res_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp;
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-1 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
if (res_o == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
// _CHECK_PERIODIC_AT_END
|
||||
{
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
stack_pointer[-2 - oparg] = res;
|
||||
stack_pointer += -1 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = check_periodics(tstate);
|
||||
|
|
@ -6537,89 +6354,26 @@
|
|||
frame->return_offset = 4u ;
|
||||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o);
|
||||
if (CONVERSION_FAILED(args_o)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = kwnames;
|
||||
kwnames = PyStackRef_NULL;
|
||||
stack_pointer[-1] = kwnames;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject* res_o = _Py_VectorCallInstrumentation_StackRefSteal(
|
||||
callable,
|
||||
arguments,
|
||||
total_args,
|
||||
kwnames,
|
||||
opcode == INSTRUMENTED_CALL_KW,
|
||||
frame,
|
||||
this_instr,
|
||||
tstate);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (res_o == NULL) {
|
||||
stack_pointer += -3 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *res_o = PyObject_Vectorcall(
|
||||
callable_o, args_o,
|
||||
positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
|
||||
kwnames_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
|
||||
if (opcode == INSTRUMENTED_CALL_KW) {
|
||||
PyObject *arg = total_args == 0 ?
|
||||
&_PyInstrumentation_MISSING : PyStackRef_AsPyObjectBorrow(arguments[0]);
|
||||
if (res_o == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_Py_call_instrumentation_exc2(
|
||||
tstate, PY_MONITORING_EVENT_C_RAISE,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
else {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = _Py_call_instrumentation_2args(
|
||||
tstate, PY_MONITORING_EVENT_C_RETURN,
|
||||
frame, this_instr, callable_o, arg);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
Py_CLEAR(res_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = kwnames;
|
||||
kwnames = PyStackRef_NULL;
|
||||
stack_pointer[-1] = kwnames;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
for (int _i = oparg; --_i >= 0;) {
|
||||
tmp = args[_i];
|
||||
args[_i] = PyStackRef_NULL;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
}
|
||||
tmp = self_or_null;
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer[-2 - oparg] = self_or_null;
|
||||
PyStackRef_XCLOSE(tmp);
|
||||
tmp = callable;
|
||||
callable = PyStackRef_NULL;
|
||||
stack_pointer[-3 - oparg] = callable;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -3 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
if (res_o == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
stack_pointer[-3 - oparg] = res;
|
||||
stack_pointer += -2 - oparg;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
DISPATCH();
|
||||
}
|
||||
|
|
@ -6936,10 +6690,13 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
}
|
||||
PyObject *stack[] = {class, self};
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *super = PyObject_Vectorcall(global_super, stack, oparg & 2, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
PyObject *super;
|
||||
{
|
||||
PyObject *stack[] = {class, self};
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
super = PyObject_Vectorcall(global_super, stack, oparg & 2, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
if (opcode == INSTRUMENTED_LOAD_SUPER_ATTR) {
|
||||
PyObject *arg = oparg & 2 ? class : &_PyInstrumentation_MISSING;
|
||||
if (super == NULL) {
|
||||
|
|
@ -8629,9 +8386,9 @@
|
|||
next_instr += 1;
|
||||
INSTRUCTION_STATS(LOAD_BUILD_CLASS);
|
||||
_PyStackRef bc;
|
||||
PyObject *bc_o;
|
||||
int err;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(BUILTINS(), &_Py_ID(__build_class__), &bc_o);
|
||||
PyObject *bc_o = _PyMapping_GetOptionalItem2(BUILTINS(), &_Py_ID(__build_class__), &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
JUMP_TO_LABEL(error);
|
||||
|
|
@ -8842,14 +8599,14 @@
|
|||
_PyStackRef class_dict_st;
|
||||
_PyStackRef value;
|
||||
class_dict_st = stack_pointer[-1];
|
||||
PyObject *value_o;
|
||||
PyObject *name;
|
||||
PyObject *class_dict = PyStackRef_AsPyObjectBorrow(class_dict_st);
|
||||
assert(class_dict);
|
||||
assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
|
||||
name = PyTuple_GET_ITEM(_PyFrame_GetCode(frame)->co_localsplusnames, oparg);
|
||||
int err;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(class_dict, name, &value_o);
|
||||
PyObject* value_o = _PyMapping_GetOptionalItem2(class_dict, name, &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
JUMP_TO_LABEL(error);
|
||||
|
|
@ -8888,9 +8645,9 @@
|
|||
_PyStackRef v;
|
||||
mod_or_class_dict = stack_pointer[-1];
|
||||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
|
||||
PyObject *v_o;
|
||||
int err;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(PyStackRef_AsPyObjectBorrow(mod_or_class_dict), name, &v_o);
|
||||
PyObject *v_o = _PyMapping_GetOptionalItem2(PyStackRef_AsPyObjectBorrow(mod_or_class_dict), name, &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -1;
|
||||
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
|
||||
|
|
@ -8921,14 +8678,14 @@
|
|||
}
|
||||
else {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(GLOBALS(), name, &v_o);
|
||||
v_o = _PyMapping_GetOptionalItem2(GLOBALS(), name, &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
if (v_o == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(BUILTINS(), name, &v_o);
|
||||
v_o = _PyMapping_GetOptionalItem2(BUILTINS(), name, &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
JUMP_TO_LABEL(error);
|
||||
|
|
@ -9334,10 +9091,13 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
}
|
||||
PyObject *stack[] = {class, self};
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *super = PyObject_Vectorcall(global_super, stack, oparg & 2, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
PyObject *super;
|
||||
{
|
||||
PyObject *stack[] = {class, self};
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
super = PyObject_Vectorcall(global_super, stack, oparg & 2, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
if (opcode == INSTRUMENTED_LOAD_SUPER_ATTR) {
|
||||
PyObject *arg = oparg & 2 ? class : &_PyInstrumentation_MISSING;
|
||||
if (super == NULL) {
|
||||
|
|
@ -9502,10 +9262,14 @@
|
|||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
|
||||
PyTypeObject *cls = (PyTypeObject *)class;
|
||||
int method_found = 0;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *attr_o = _PySuper_Lookup(cls, self, name,
|
||||
Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr ? &method_found : NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
PyObject *attr_o;
|
||||
{
|
||||
int *method_found_ptr = &method_found;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
attr_o = _PySuper_Lookup(cls, self, name,
|
||||
Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr ? method_found_ptr : NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
if (attr_o == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
|
@ -10435,7 +10199,6 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 1;
|
||||
INSTRUCTION_STATS(SETUP_ANNOTATIONS);
|
||||
PyObject *ann_dict;
|
||||
if (LOCALS() == NULL) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyErr_Format(tstate, PyExc_SystemError,
|
||||
|
|
@ -10443,8 +10206,9 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
int err;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
int err = PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict);
|
||||
PyObject* ann_dict = _PyMapping_GetOptionalItem2(LOCALS(), &_Py_ID(__annotations__), &err);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (err < 0) {
|
||||
JUMP_TO_LABEL(error);
|
||||
|
|
@ -12003,11 +11767,16 @@
|
|||
}
|
||||
assert(PyStackRef_IsTaggedInt(lasti));
|
||||
(void)lasti;
|
||||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||
int has_self = !PyStackRef_IsNull(exit_self);
|
||||
PyObject* res_o;
|
||||
{
|
||||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||
int has_self = !PyStackRef_IsNull(exit_self);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
|
||||
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
|
||||
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
|
||||
Py_XDECREF(original_tb);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (res_o == NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue