blob: 743d00222914e3f9e15b7b2cc27759399528af24 [file] [log] [blame]
Brett Cannonfd4d0502014-05-30 11:21:14 -04001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(_imp_lock_held__doc__,
6"lock_held($module, /)\n"
7"--\n"
8"\n"
9"Return True if the import lock is currently held, else False.\n"
10"\n"
11"On platforms without threads, return False.");
12
13#define _IMP_LOCK_HELD_METHODDEF \
14 {"lock_held", (PyCFunction)_imp_lock_held, METH_NOARGS, _imp_lock_held__doc__},
15
16static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030017_imp_lock_held_impl(PyObject *module);
Brett Cannonfd4d0502014-05-30 11:21:14 -040018
19static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030020_imp_lock_held(PyObject *module, PyObject *Py_UNUSED(ignored))
Brett Cannonfd4d0502014-05-30 11:21:14 -040021{
22 return _imp_lock_held_impl(module);
23}
24
25PyDoc_STRVAR(_imp_acquire_lock__doc__,
26"acquire_lock($module, /)\n"
27"--\n"
28"\n"
29"Acquires the interpreter\'s import lock for the current thread.\n"
30"\n"
31"This lock should be used by import hooks to ensure thread-safety when importing\n"
32"modules. On platforms without threads, this function does nothing.");
33
34#define _IMP_ACQUIRE_LOCK_METHODDEF \
35 {"acquire_lock", (PyCFunction)_imp_acquire_lock, METH_NOARGS, _imp_acquire_lock__doc__},
36
37static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030038_imp_acquire_lock_impl(PyObject *module);
Brett Cannonfd4d0502014-05-30 11:21:14 -040039
40static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030041_imp_acquire_lock(PyObject *module, PyObject *Py_UNUSED(ignored))
Brett Cannonfd4d0502014-05-30 11:21:14 -040042{
43 return _imp_acquire_lock_impl(module);
44}
45
46PyDoc_STRVAR(_imp_release_lock__doc__,
47"release_lock($module, /)\n"
48"--\n"
49"\n"
50"Release the interpreter\'s import lock.\n"
51"\n"
52"On platforms without threads, this function does nothing.");
53
54#define _IMP_RELEASE_LOCK_METHODDEF \
55 {"release_lock", (PyCFunction)_imp_release_lock, METH_NOARGS, _imp_release_lock__doc__},
56
57static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030058_imp_release_lock_impl(PyObject *module);
Brett Cannonfd4d0502014-05-30 11:21:14 -040059
60static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030061_imp_release_lock(PyObject *module, PyObject *Py_UNUSED(ignored))
Brett Cannonfd4d0502014-05-30 11:21:14 -040062{
63 return _imp_release_lock_impl(module);
64}
65
66PyDoc_STRVAR(_imp__fix_co_filename__doc__,
67"_fix_co_filename($module, code, path, /)\n"
68"--\n"
69"\n"
70"Changes code.co_filename to specify the passed-in file path.\n"
71"\n"
72" code\n"
73" Code object to change.\n"
74" path\n"
75" File path to use.");
76
77#define _IMP__FIX_CO_FILENAME_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020078 {"_fix_co_filename", (PyCFunction)(void(*)(void))_imp__fix_co_filename, METH_FASTCALL, _imp__fix_co_filename__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -040079
80static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030081_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -040082 PyObject *path);
Brett Cannonfd4d0502014-05-30 11:21:14 -040083
84static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020085_imp__fix_co_filename(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Brett Cannonfd4d0502014-05-30 11:21:14 -040086{
87 PyObject *return_value = NULL;
88 PyCodeObject *code;
89 PyObject *path;
90
Serhiy Storchaka4fa95912019-01-11 16:01:14 +020091 if (!_PyArg_CheckPositional("_fix_co_filename", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +010092 goto exit;
93 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +020094 if (!PyObject_TypeCheck(args[0], &PyCode_Type)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +020095 _PyArg_BadArgument("_fix_co_filename", "argument 1", (&PyCode_Type)->tp_name, args[0]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +020096 goto exit;
97 }
98 code = (PyCodeObject *)args[0];
99 if (!PyUnicode_Check(args[1])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200100 _PyArg_BadArgument("_fix_co_filename", "argument 2", "str", args[1]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200101 goto exit;
102 }
103 if (PyUnicode_READY(args[1]) == -1) {
104 goto exit;
105 }
106 path = args[1];
Brett Cannonfd4d0502014-05-30 11:21:14 -0400107 return_value = _imp__fix_co_filename_impl(module, code, path);
108
109exit:
110 return return_value;
111}
112
Nick Coghland5cacbb2015-05-23 22:24:10 +1000113PyDoc_STRVAR(_imp_create_builtin__doc__,
114"create_builtin($module, spec, /)\n"
115"--\n"
116"\n"
117"Create an extension module.");
118
119#define _IMP_CREATE_BUILTIN_METHODDEF \
120 {"create_builtin", (PyCFunction)_imp_create_builtin, METH_O, _imp_create_builtin__doc__},
121
Brett Cannonfd4d0502014-05-30 11:21:14 -0400122PyDoc_STRVAR(_imp_extension_suffixes__doc__,
123"extension_suffixes($module, /)\n"
124"--\n"
125"\n"
126"Returns the list of file suffixes used to identify extension modules.");
127
128#define _IMP_EXTENSION_SUFFIXES_METHODDEF \
129 {"extension_suffixes", (PyCFunction)_imp_extension_suffixes, METH_NOARGS, _imp_extension_suffixes__doc__},
130
131static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300132_imp_extension_suffixes_impl(PyObject *module);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400133
134static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300135_imp_extension_suffixes(PyObject *module, PyObject *Py_UNUSED(ignored))
Brett Cannonfd4d0502014-05-30 11:21:14 -0400136{
137 return _imp_extension_suffixes_impl(module);
138}
139
Brett Cannonfd4d0502014-05-30 11:21:14 -0400140PyDoc_STRVAR(_imp_init_frozen__doc__,
141"init_frozen($module, name, /)\n"
142"--\n"
143"\n"
144"Initializes a frozen module.");
145
146#define _IMP_INIT_FROZEN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300147 {"init_frozen", (PyCFunction)_imp_init_frozen, METH_O, _imp_init_frozen__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400148
149static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300150_imp_init_frozen_impl(PyObject *module, PyObject *name);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400151
152static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300153_imp_init_frozen(PyObject *module, PyObject *arg)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400154{
155 PyObject *return_value = NULL;
156 PyObject *name;
157
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200158 if (!PyUnicode_Check(arg)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200159 _PyArg_BadArgument("init_frozen", "argument", "str", arg);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400160 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300161 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200162 if (PyUnicode_READY(arg) == -1) {
163 goto exit;
164 }
165 name = arg;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400166 return_value = _imp_init_frozen_impl(module, name);
167
168exit:
169 return return_value;
170}
171
172PyDoc_STRVAR(_imp_get_frozen_object__doc__,
173"get_frozen_object($module, name, /)\n"
174"--\n"
175"\n"
176"Create a code object for a frozen module.");
177
178#define _IMP_GET_FROZEN_OBJECT_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300179 {"get_frozen_object", (PyCFunction)_imp_get_frozen_object, METH_O, _imp_get_frozen_object__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400180
181static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300182_imp_get_frozen_object_impl(PyObject *module, PyObject *name);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400183
184static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300185_imp_get_frozen_object(PyObject *module, PyObject *arg)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400186{
187 PyObject *return_value = NULL;
188 PyObject *name;
189
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200190 if (!PyUnicode_Check(arg)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200191 _PyArg_BadArgument("get_frozen_object", "argument", "str", arg);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400192 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300193 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200194 if (PyUnicode_READY(arg) == -1) {
195 goto exit;
196 }
197 name = arg;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400198 return_value = _imp_get_frozen_object_impl(module, name);
199
200exit:
201 return return_value;
202}
203
204PyDoc_STRVAR(_imp_is_frozen_package__doc__,
205"is_frozen_package($module, name, /)\n"
206"--\n"
207"\n"
208"Returns True if the module name is of a frozen package.");
209
210#define _IMP_IS_FROZEN_PACKAGE_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300211 {"is_frozen_package", (PyCFunction)_imp_is_frozen_package, METH_O, _imp_is_frozen_package__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400212
213static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300214_imp_is_frozen_package_impl(PyObject *module, PyObject *name);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400215
216static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300217_imp_is_frozen_package(PyObject *module, PyObject *arg)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400218{
219 PyObject *return_value = NULL;
220 PyObject *name;
221
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200222 if (!PyUnicode_Check(arg)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200223 _PyArg_BadArgument("is_frozen_package", "argument", "str", arg);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400224 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300225 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200226 if (PyUnicode_READY(arg) == -1) {
227 goto exit;
228 }
229 name = arg;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400230 return_value = _imp_is_frozen_package_impl(module, name);
231
232exit:
233 return return_value;
234}
235
236PyDoc_STRVAR(_imp_is_builtin__doc__,
237"is_builtin($module, name, /)\n"
238"--\n"
239"\n"
240"Returns True if the module name corresponds to a built-in module.");
241
242#define _IMP_IS_BUILTIN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300243 {"is_builtin", (PyCFunction)_imp_is_builtin, METH_O, _imp_is_builtin__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400244
245static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300246_imp_is_builtin_impl(PyObject *module, PyObject *name);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400247
248static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300249_imp_is_builtin(PyObject *module, PyObject *arg)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400250{
251 PyObject *return_value = NULL;
252 PyObject *name;
253
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200254 if (!PyUnicode_Check(arg)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200255 _PyArg_BadArgument("is_builtin", "argument", "str", arg);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400256 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300257 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200258 if (PyUnicode_READY(arg) == -1) {
259 goto exit;
260 }
261 name = arg;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400262 return_value = _imp_is_builtin_impl(module, name);
263
264exit:
265 return return_value;
266}
267
268PyDoc_STRVAR(_imp_is_frozen__doc__,
269"is_frozen($module, name, /)\n"
270"--\n"
271"\n"
272"Returns True if the module name corresponds to a frozen module.");
273
274#define _IMP_IS_FROZEN_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300275 {"is_frozen", (PyCFunction)_imp_is_frozen, METH_O, _imp_is_frozen__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400276
277static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300278_imp_is_frozen_impl(PyObject *module, PyObject *name);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400279
280static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300281_imp_is_frozen(PyObject *module, PyObject *arg)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400282{
283 PyObject *return_value = NULL;
284 PyObject *name;
285
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200286 if (!PyUnicode_Check(arg)) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200287 _PyArg_BadArgument("is_frozen", "argument", "str", arg);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400288 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300289 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200290 if (PyUnicode_READY(arg) == -1) {
291 goto exit;
292 }
293 name = arg;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400294 return_value = _imp_is_frozen_impl(module, name);
295
296exit:
297 return return_value;
298}
299
300#if defined(HAVE_DYNAMIC_LOADING)
301
Nick Coghland5cacbb2015-05-23 22:24:10 +1000302PyDoc_STRVAR(_imp_create_dynamic__doc__,
303"create_dynamic($module, spec, file=None, /)\n"
Brett Cannonfd4d0502014-05-30 11:21:14 -0400304"--\n"
305"\n"
Nick Coghland5cacbb2015-05-23 22:24:10 +1000306"Create an extension module.");
Brett Cannonfd4d0502014-05-30 11:21:14 -0400307
Nick Coghland5cacbb2015-05-23 22:24:10 +1000308#define _IMP_CREATE_DYNAMIC_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200309 {"create_dynamic", (PyCFunction)(void(*)(void))_imp_create_dynamic, METH_FASTCALL, _imp_create_dynamic__doc__},
Brett Cannonfd4d0502014-05-30 11:21:14 -0400310
311static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300312_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400313
314static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200315_imp_create_dynamic(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Brett Cannonfd4d0502014-05-30 11:21:14 -0400316{
317 PyObject *return_value = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000318 PyObject *spec;
Brett Cannonfd4d0502014-05-30 11:21:14 -0400319 PyObject *file = NULL;
320
Serhiy Storchaka2a39d252019-01-11 18:01:42 +0200321 if (!_PyArg_CheckPositional("create_dynamic", nargs, 1, 2)) {
Victor Stinner0c4a8282017-01-17 02:21:47 +0100322 goto exit;
323 }
Serhiy Storchaka2a39d252019-01-11 18:01:42 +0200324 spec = args[0];
325 if (nargs < 2) {
326 goto skip_optional;
327 }
328 file = args[1];
329skip_optional:
Nick Coghland5cacbb2015-05-23 22:24:10 +1000330 return_value = _imp_create_dynamic_impl(module, spec, file);
Brett Cannonfd4d0502014-05-30 11:21:14 -0400331
332exit:
333 return return_value;
334}
335
336#endif /* defined(HAVE_DYNAMIC_LOADING) */
337
Nick Coghland5cacbb2015-05-23 22:24:10 +1000338#if defined(HAVE_DYNAMIC_LOADING)
339
340PyDoc_STRVAR(_imp_exec_dynamic__doc__,
341"exec_dynamic($module, mod, /)\n"
342"--\n"
343"\n"
344"Initialize an extension module.");
345
346#define _IMP_EXEC_DYNAMIC_METHODDEF \
347 {"exec_dynamic", (PyCFunction)_imp_exec_dynamic, METH_O, _imp_exec_dynamic__doc__},
348
349static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300350_imp_exec_dynamic_impl(PyObject *module, PyObject *mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000351
352static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300353_imp_exec_dynamic(PyObject *module, PyObject *mod)
Nick Coghland5cacbb2015-05-23 22:24:10 +1000354{
355 PyObject *return_value = NULL;
356 int _return_value;
357
358 _return_value = _imp_exec_dynamic_impl(module, mod);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300359 if ((_return_value == -1) && PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000360 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300361 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000362 return_value = PyLong_FromLong((long)_return_value);
363
364exit:
365 return return_value;
366}
367
368#endif /* defined(HAVE_DYNAMIC_LOADING) */
369
Larry Hastings1df0b352015-08-24 19:53:56 -0700370PyDoc_STRVAR(_imp_exec_builtin__doc__,
371"exec_builtin($module, mod, /)\n"
372"--\n"
373"\n"
Larry Hastings01b1ff62015-08-24 20:23:27 -0700374"Initialize a built-in module.");
Larry Hastings1df0b352015-08-24 19:53:56 -0700375
376#define _IMP_EXEC_BUILTIN_METHODDEF \
377 {"exec_builtin", (PyCFunction)_imp_exec_builtin, METH_O, _imp_exec_builtin__doc__},
378
379static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300380_imp_exec_builtin_impl(PyObject *module, PyObject *mod);
Larry Hastings1df0b352015-08-24 19:53:56 -0700381
382static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300383_imp_exec_builtin(PyObject *module, PyObject *mod)
Larry Hastings1df0b352015-08-24 19:53:56 -0700384{
385 PyObject *return_value = NULL;
386 int _return_value;
387
388 _return_value = _imp_exec_builtin_impl(module, mod);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300389 if ((_return_value == -1) && PyErr_Occurred()) {
Larry Hastings1df0b352015-08-24 19:53:56 -0700390 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300391 }
Larry Hastings1df0b352015-08-24 19:53:56 -0700392 return_value = PyLong_FromLong((long)_return_value);
393
394exit:
395 return return_value;
396}
397
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800398PyDoc_STRVAR(_imp_source_hash__doc__,
399"source_hash($module, /, key, source)\n"
400"--\n"
401"\n");
402
403#define _IMP_SOURCE_HASH_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200404 {"source_hash", (PyCFunction)(void(*)(void))_imp_source_hash, METH_FASTCALL|METH_KEYWORDS, _imp_source_hash__doc__},
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800405
406static PyObject *
407_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source);
408
409static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200410_imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800411{
412 PyObject *return_value = NULL;
413 static const char * const _keywords[] = {"key", "source", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200414 static _PyArg_Parser _parser = {NULL, _keywords, "source_hash", 0};
415 PyObject *argsbuf[2];
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800416 long key;
417 Py_buffer source = {NULL, NULL};
418
Serhiy Storchaka31913912019-03-14 10:32:22 +0200419 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
420 if (!args) {
421 goto exit;
422 }
423 if (PyFloat_Check(args[0])) {
424 PyErr_SetString(PyExc_TypeError,
425 "integer argument expected, got float" );
426 goto exit;
427 }
428 key = PyLong_AsLong(args[0]);
429 if (key == -1 && PyErr_Occurred()) {
430 goto exit;
431 }
432 if (PyObject_GetBuffer(args[1], &source, PyBUF_SIMPLE) != 0) {
433 goto exit;
434 }
435 if (!PyBuffer_IsContiguous(&source, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200436 _PyArg_BadArgument("source_hash", "argument 'source'", "contiguous buffer", args[1]);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800437 goto exit;
438 }
439 return_value = _imp_source_hash_impl(module, key, &source);
440
441exit:
442 /* Cleanup for source */
443 if (source.obj) {
444 PyBuffer_Release(&source);
445 }
446
447 return return_value;
448}
449
Nick Coghland5cacbb2015-05-23 22:24:10 +1000450#ifndef _IMP_CREATE_DYNAMIC_METHODDEF
451 #define _IMP_CREATE_DYNAMIC_METHODDEF
452#endif /* !defined(_IMP_CREATE_DYNAMIC_METHODDEF) */
453
454#ifndef _IMP_EXEC_DYNAMIC_METHODDEF
455 #define _IMP_EXEC_DYNAMIC_METHODDEF
456#endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200457/*[clinic end generated code: output=ff06f7cf4b73eb76 input=a9049054013a1b77]*/