bpo-45439: Move _PyObject_VectorcallTstate() to pycore_call.h (GH-28893) · python/cpython@3cc56c8 (original) (raw)

`@@ -58,72 +58,13 @@ PyVectorcall_NARGS(size_t n)

`

58

58

`return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET;

`

59

59

`}

`

60

60

``

61

``

`-

static inline vectorcallfunc

`

62

``

`-

PyVectorcall_Function(PyObject *callable)

`

63

``

`-

{

`

64

``

`-

PyTypeObject *tp;

`

65

``

`-

Py_ssize_t offset;

`

66

``

`-

vectorcallfunc ptr;

`

67

``

-

68

``

`-

assert(callable != NULL);

`

69

``

`-

tp = Py_TYPE(callable);

`

70

``

`-

if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) {

`

71

``

`-

return NULL;

`

72

``

`-

}

`

73

``

`-

assert(PyCallable_Check(callable));

`

74

``

-

75

``

`-

offset = tp->tp_vectorcall_offset;

`

76

``

`-

assert(offset > 0);

`

77

``

`-

memcpy(&ptr, (char *) callable + offset, sizeof(ptr));

`

78

``

`-

return ptr;

`

79

``

`-

}

`

80

``

-

81

``

`-

/* Call the callable object 'callable' with the "vectorcall" calling

`

82

``

`-

convention.

`

83

``

-

84

``

`-

args is a C array for positional arguments.

`

85

``

-

86

``

`-

nargsf is the number of positional arguments plus optionally the flag

`

87

``

`-

PY_VECTORCALL_ARGUMENTS_OFFSET which means that the caller is allowed to

`

88

``

`-

modify args[-1].

`

89

``

-

90

``

`-

kwnames is a tuple of keyword names. The values of the keyword arguments

`

91

``

`-

are stored in "args" after the positional arguments (note that the number

`

92

``

`-

of keyword arguments does not change nargsf). kwnames can also be NULL if

`

93

``

`-

there are no keyword arguments.

`

``

61

`+

PyAPI_FUNC(vectorcallfunc) PyVectorcall_Function(PyObject *callable);

`

94

62

``

95

``

`-

keywords must only contain strings and all keys must be unique.

`

96

``

-

97

``

`-

Return the result on success. Raise an exception and return NULL on

`

98

``

`-

error. */

`

99

``

`-

static inline PyObject *

`

100

``

`-

_PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable,

`

101

``

`-

PyObject *const *args, size_t nargsf,

`

102

``

`-

PyObject *kwnames)

`

103

``

`-

{

`

104

``

`-

vectorcallfunc func;

`

105

``

`-

PyObject *res;

`

106

``

-

107

``

`-

assert(kwnames == NULL || PyTuple_Check(kwnames));

`

108

``

`-

assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0);

`

109

``

-

110

``

`-

func = PyVectorcall_Function(callable);

`

111

``

`-

if (func == NULL) {

`

112

``

`-

Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);

`

113

``

`-

return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames);

`

114

``

`-

}

`

115

``

`-

res = func(callable, args, nargsf, kwnames);

`

116

``

`-

return _Py_CheckFunctionResult(tstate, callable, res, NULL);

`

117

``

`-

}

`

118

``

-

119

``

`-

static inline PyObject *

`

120

``

`-

PyObject_Vectorcall(PyObject *callable, PyObject *const *args,

`

121

``

`-

size_t nargsf, PyObject *kwnames)

`

122

``

`-

{

`

123

``

`-

PyThreadState *tstate = PyThreadState_Get();

`

124

``

`-

return _PyObject_VectorcallTstate(tstate, callable,

`

125

``

`-

args, nargsf, kwnames);

`

126

``

`-

}

`

``

63

`+

PyAPI_FUNC(PyObject *) PyObject_Vectorcall(

`

``

64

`+

PyObject *callable,

`

``

65

`+

PyObject *const *args,

`

``

66

`+

size_t nargsf,

`

``

67

`+

PyObject *kwnames);

`

127

68

``

128

69

`// Backwards compatibility aliases for API that was provisional in Python 3.8

`

129

70

`#define _PyObject_Vectorcall PyObject_Vectorcall

`

`@@ -146,35 +87,13 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallDict(

`

146

87

` "tuple" and keyword arguments "dict". "dict" may also be NULL */

`

147

88

`PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict);

`

148

89

``

149

``

`-

static inline PyObject *

`

150

``

`-

_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs)

`

151

``

`-

{

`

152

``

`-

return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL);

`

153

``

`-

}

`

154

``

-

155

``

`-

/* Same as PyObject_Vectorcall except without keyword arguments */

`

156

``

`-

static inline PyObject *

`

157

``

`-

_PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs)

`

158

``

`-

{

`

159

``

`-

PyThreadState *tstate = PyThreadState_Get();

`

160

``

`-

return _PyObject_FastCallTstate(tstate, func, args, nargs);

`

161

``

`-

}

`

162

``

-

163

``

`-

static inline PyObject *

`

164

``

`-

PyObject_CallOneArg(PyObject *func, PyObject *arg)

`

165

``

`-

{

`

166

``

`-

PyObject *_args[2];

`

167

``

`-

PyObject **args;

`

168

``

`-

PyThreadState *tstate;

`

169

``

`-

size_t nargsf;

`

``

90

`+

// Same as PyObject_Vectorcall(), except without keyword arguments

`

``

91

`+

PyAPI_FUNC(PyObject *) _PyObject_FastCall(

`

``

92

`+

PyObject *func,

`

``

93

`+

PyObject *const *args,

`

``

94

`+

Py_ssize_t nargs);

`

170

95

``

171

``

`-

assert(arg != NULL);

`

172

``

`-

args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET

`

173

``

`-

args[0] = arg;

`

174

``

`-

tstate = PyThreadState_Get();

`

175

``

`-

nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;

`

176

``

`-

return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);

`

177

``

`-

}

`

``

96

`+

PyAPI_FUNC(PyObject *) PyObject_CallOneArg(PyObject *func, PyObject *arg);

`

178

97

``

179

98

`PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod(

`

180

99

`PyObject *name, PyObject *const *args,

`