1 #ifndef Py_BUILD_CORE_BUILTIN
2 # define Py_BUILD_CORE_MODULE 1
3 #endif
4
5 /* Always enable assertions */
6 #undef NDEBUG
7
8 #define PY_SSIZE_T_CLEAN
9
10 #include "Python.h"
11
12 #include "clinic/_testclinic.c.h"
13
14
15 /* Pack arguments to a tuple, implicitly increase all the arguments' refcount.
16 * NULL arguments will be replaced to Py_None. */
17 static PyObject *
pack_arguments_newref(int argc,...)18 pack_arguments_newref(int argc, ...)
19 {
20 assert(!PyErr_Occurred());
21 PyObject *tuple = PyTuple_New(argc);
22 if (!tuple) {
23 return NULL;
24 }
25
26 va_list vargs;
27 va_start(vargs, argc);
28 for (int i = 0; i < argc; i++) {
29 PyObject *arg = va_arg(vargs, PyObject *);
30 if (arg) {
31 if (_PyObject_IsFreed(arg)) {
32 PyErr_Format(PyExc_AssertionError,
33 "argument %d at %p is freed or corrupted!",
34 i, arg);
35 va_end(vargs);
36 Py_DECREF(tuple);
37 return NULL;
38 }
39 }
40 else {
41 arg = Py_None;
42 }
43 PyTuple_SET_ITEM(tuple, i, Py_NewRef(arg));
44 }
45 va_end(vargs);
46 return tuple;
47 }
48
49 /* Pack arguments to a tuple.
50 * `wrapper` is function which converts primitive type to PyObject.
51 * `arg_type` is type that arguments should be converted to before wrapped. */
52 #define RETURN_PACKED_ARGS(argc, wrapper, arg_type, ...) do { \
53 assert(!PyErr_Occurred()); \
54 arg_type in[argc] = {__VA_ARGS__}; \
55 PyObject *out[argc] = {NULL,}; \
56 for (int _i = 0; _i < argc; _i++) { \
57 out[_i] = wrapper(in[_i]); \
58 assert(out[_i] || PyErr_Occurred()); \
59 if (!out[_i]) { \
60 for (int _j = 0; _j < _i; _j++) { \
61 Py_DECREF(out[_j]); \
62 } \
63 return NULL; \
64 } \
65 } \
66 PyObject *tuple = PyTuple_New(argc); \
67 if (!tuple) { \
68 for (int _i = 0; _i < argc; _i++) { \
69 Py_DECREF(out[_i]); \
70 } \
71 return NULL; \
72 } \
73 for (int _i = 0; _i < argc; _i++) { \
74 PyTuple_SET_ITEM(tuple, _i, out[_i]); \
75 } \
76 return tuple; \
77 } while (0)
78
79
80 /*[clinic input]
81 module _testclinic
82 [clinic start generated code]*/
83 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=d4981b80d6efdb12]*/
84
85
86 /*[clinic input]
87 test_empty_function
88
89 [clinic start generated code]*/
90
91 static PyObject *
test_empty_function_impl(PyObject * module)92 test_empty_function_impl(PyObject *module)
93 /*[clinic end generated code: output=0f8aeb3ddced55cb input=0dd7048651ad4ae4]*/
94 {
95 Py_RETURN_NONE;
96 }
97
98
99 /*[clinic input]
100 objects_converter
101
102 a: object
103 b: object = NULL
104 /
105
106 [clinic start generated code]*/
107
108 static PyObject *
objects_converter_impl(PyObject * module,PyObject * a,PyObject * b)109 objects_converter_impl(PyObject *module, PyObject *a, PyObject *b)
110 /*[clinic end generated code: output=3f9c9415ec86c695 input=1533b1bd94187de4]*/
111 {
112 return pack_arguments_newref(2, a, b);
113 }
114
115
116 /*[clinic input]
117 bytes_object_converter
118
119 a: PyBytesObject
120 /
121
122 [clinic start generated code]*/
123
124 static PyObject *
bytes_object_converter_impl(PyObject * module,PyBytesObject * a)125 bytes_object_converter_impl(PyObject *module, PyBytesObject *a)
126 /*[clinic end generated code: output=7732da869d74b784 input=94211751e7996236]*/
127 {
128 if (!PyBytes_Check(a)) {
129 PyErr_SetString(PyExc_AssertionError,
130 "argument a is not a PyBytesObject");
131 return NULL;
132 }
133 return pack_arguments_newref(1, a);
134 }
135
136
137 /*[clinic input]
138 byte_array_object_converter
139
140 a: PyByteArrayObject
141 /
142
143 [clinic start generated code]*/
144
145 static PyObject *
byte_array_object_converter_impl(PyObject * module,PyByteArrayObject * a)146 byte_array_object_converter_impl(PyObject *module, PyByteArrayObject *a)
147 /*[clinic end generated code: output=51f15c76f302b1f7 input=b04d253db51c6f56]*/
148 {
149 if (!PyByteArray_Check(a)) {
150 PyErr_SetString(PyExc_AssertionError,
151 "argument a is not a PyByteArrayObject");
152 return NULL;
153 }
154 return pack_arguments_newref(1, a);
155 }
156
157
158 /*[clinic input]
159 unicode_converter
160
161 a: unicode
162 /
163
164 [clinic start generated code]*/
165
166 static PyObject *
unicode_converter_impl(PyObject * module,PyObject * a)167 unicode_converter_impl(PyObject *module, PyObject *a)
168 /*[clinic end generated code: output=1b4a4adbb6ac6e34 input=de7b5adbf07435ba]*/
169 {
170 if (!PyUnicode_Check(a)) {
171 PyErr_SetString(PyExc_AssertionError,
172 "argument a is not a unicode object");
173 return NULL;
174 }
175 return pack_arguments_newref(1, a);
176 }
177
178
179 /*[clinic input]
180 bool_converter
181
182 a: bool = True
183 b: bool(accept={object}) = True
184 c: bool(accept={int}) = True
185 /
186
187 [clinic start generated code]*/
188
189 static PyObject *
bool_converter_impl(PyObject * module,int a,int b,int c)190 bool_converter_impl(PyObject *module, int a, int b, int c)
191 /*[clinic end generated code: output=17005b0c29afd590 input=7f6537705b2f32f4]*/
192 {
193 PyObject *obj_a = a ? Py_True : Py_False;
194 PyObject *obj_b = b ? Py_True : Py_False;
195 PyObject *obj_c = c ? Py_True : Py_False;
196 return pack_arguments_newref(3, obj_a, obj_b, obj_c);
197 }
198
199
200 /*[clinic input]
201 char_converter
202
203 a: char = b'A'
204 b: char = b'\a'
205 c: char = b'\b'
206 d: char = b'\t'
207 e: char = b'\n'
208 f: char = b'\v'
209 g: char = b'\f'
210 h: char = b'\r'
211 i: char = b'"'
212 j: char = b"'"
213 k: char = b'?'
214 l: char = b'\\'
215 m: char = b'\000'
216 n: char = b'\377'
217 /
218
219 [clinic start generated code]*/
220
221 static PyObject *
char_converter_impl(PyObject * module,char a,char b,char c,char d,char e,char f,char g,char h,char i,char j,char k,char l,char m,char n)222 char_converter_impl(PyObject *module, char a, char b, char c, char d, char e,
223 char f, char g, char h, char i, char j, char k, char l,
224 char m, char n)
225 /*[clinic end generated code: output=f929dbd2e55a9871 input=b601bc5bc7fe85e3]*/
226 {
227 RETURN_PACKED_ARGS(14, PyLong_FromUnsignedLong, unsigned char,
228 a, b, c, d, e, f, g, h, i, j, k, l, m, n);
229 }
230
231
232 /*[clinic input]
233 unsigned_char_converter
234
235 a: unsigned_char = 12
236 b: unsigned_char(bitwise=False) = 34
237 c: unsigned_char(bitwise=True) = 56
238 /
239
240 [clinic start generated code]*/
241
242 static PyObject *
unsigned_char_converter_impl(PyObject * module,unsigned char a,unsigned char b,unsigned char c)243 unsigned_char_converter_impl(PyObject *module, unsigned char a,
244 unsigned char b, unsigned char c)
245 /*[clinic end generated code: output=490af3b39ce0b199 input=e859502fbe0b3185]*/
246 {
247 RETURN_PACKED_ARGS(3, PyLong_FromUnsignedLong, unsigned char, a, b, c);
248 }
249
250
251 /*[clinic input]
252 short_converter
253
254 a: short = 12
255 /
256
257 [clinic start generated code]*/
258
259 static PyObject *
short_converter_impl(PyObject * module,short a)260 short_converter_impl(PyObject *module, short a)
261 /*[clinic end generated code: output=1ebb7ddb64248988 input=b4e2309a66f650ae]*/
262 {
263 RETURN_PACKED_ARGS(1, PyLong_FromLong, long, a);
264 }
265
266
267 /*[clinic input]
268 unsigned_short_converter
269
270 a: unsigned_short = 12
271 b: unsigned_short(bitwise=False) = 34
272 c: unsigned_short(bitwise=True) = 56
273 /
274
275 [clinic start generated code]*/
276
277 static PyObject *
unsigned_short_converter_impl(PyObject * module,unsigned short a,unsigned short b,unsigned short c)278 unsigned_short_converter_impl(PyObject *module, unsigned short a,
279 unsigned short b, unsigned short c)
280 /*[clinic end generated code: output=5f92cc72fc8707a7 input=9d15cd11e741d0c6]*/
281 {
282 RETURN_PACKED_ARGS(3, PyLong_FromUnsignedLong, unsigned long, a, b, c);
283 }
284
285
286 /*[clinic input]
287 int_converter
288
289 a: int = 12
290 b: int(accept={int}) = 34
291 c: int(accept={str}) = 45
292 /
293
294 [clinic start generated code]*/
295
296 static PyObject *
int_converter_impl(PyObject * module,int a,int b,int c)297 int_converter_impl(PyObject *module, int a, int b, int c)
298 /*[clinic end generated code: output=8e56b59be7d0c306 input=a1dbc6344853db7a]*/
299 {
300 RETURN_PACKED_ARGS(3, PyLong_FromLong, long, a, b, c);
301 }
302
303
304 /*[clinic input]
305 unsigned_int_converter
306
307 a: unsigned_int = 12
308 b: unsigned_int(bitwise=False) = 34
309 c: unsigned_int(bitwise=True) = 56
310 /
311
312 [clinic start generated code]*/
313
314 static PyObject *
unsigned_int_converter_impl(PyObject * module,unsigned int a,unsigned int b,unsigned int c)315 unsigned_int_converter_impl(PyObject *module, unsigned int a, unsigned int b,
316 unsigned int c)
317 /*[clinic end generated code: output=399a57a05c494cc7 input=8427ed9a3f96272d]*/
318 {
319 RETURN_PACKED_ARGS(3, PyLong_FromUnsignedLong, unsigned long, a, b, c);
320 }
321
322
323 /*[clinic input]
324 long_converter
325
326 a: long = 12
327 /
328
329 [clinic start generated code]*/
330
331 static PyObject *
long_converter_impl(PyObject * module,long a)332 long_converter_impl(PyObject *module, long a)
333 /*[clinic end generated code: output=9663d936a652707a input=84ad0ef28f24bd85]*/
334 {
335 RETURN_PACKED_ARGS(1, PyLong_FromLong, long, a);
336 }
337
338
339 /*[clinic input]
340 unsigned_long_converter
341
342 a: unsigned_long = 12
343 b: unsigned_long(bitwise=False) = 34
344 c: unsigned_long(bitwise=True) = 56
345 /
346
347 [clinic start generated code]*/
348
349 static PyObject *
unsigned_long_converter_impl(PyObject * module,unsigned long a,unsigned long b,unsigned long c)350 unsigned_long_converter_impl(PyObject *module, unsigned long a,
351 unsigned long b, unsigned long c)
352 /*[clinic end generated code: output=120b82ea9ebd93a8 input=440dd6f1817f5d91]*/
353 {
354 RETURN_PACKED_ARGS(3, PyLong_FromUnsignedLong, unsigned long, a, b, c);
355 }
356
357
358 /*[clinic input]
359 long_long_converter
360
361 a: long_long = 12
362 /
363
364 [clinic start generated code]*/
365
366 static PyObject *
long_long_converter_impl(PyObject * module,long long a)367 long_long_converter_impl(PyObject *module, long long a)
368 /*[clinic end generated code: output=5fb5f2220770c3e1 input=730fcb3eecf4d993]*/
369 {
370 RETURN_PACKED_ARGS(1, PyLong_FromLongLong, long long, a);
371 }
372
373
374 /*[clinic input]
375 unsigned_long_long_converter
376
377 a: unsigned_long_long = 12
378 b: unsigned_long_long(bitwise=False) = 34
379 c: unsigned_long_long(bitwise=True) = 56
380 /
381
382 [clinic start generated code]*/
383
384 static PyObject *
unsigned_long_long_converter_impl(PyObject * module,unsigned long long a,unsigned long long b,unsigned long long c)385 unsigned_long_long_converter_impl(PyObject *module, unsigned long long a,
386 unsigned long long b, unsigned long long c)
387 /*[clinic end generated code: output=65b7273e63501762 input=300737b0bdb230e9]*/
388 {
389 RETURN_PACKED_ARGS(3, PyLong_FromUnsignedLongLong, unsigned long long,
390 a, b, c);
391 }
392
393
394 /*[clinic input]
395 py_ssize_t_converter
396
397 a: Py_ssize_t = 12
398 b: Py_ssize_t(accept={int}) = 34
399 c: Py_ssize_t(accept={int, NoneType}) = 56
400 /
401
402 [clinic start generated code]*/
403
404 static PyObject *
py_ssize_t_converter_impl(PyObject * module,Py_ssize_t a,Py_ssize_t b,Py_ssize_t c)405 py_ssize_t_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b,
406 Py_ssize_t c)
407 /*[clinic end generated code: output=ce252143e0ed0372 input=76d0f342e9317a1f]*/
408 {
409 RETURN_PACKED_ARGS(3, PyLong_FromSsize_t, Py_ssize_t, a, b, c);
410 }
411
412
413 /*[clinic input]
414 slice_index_converter
415
416 a: slice_index = 12
417 b: slice_index(accept={int}) = 34
418 c: slice_index(accept={int, NoneType}) = 56
419 /
420
421 [clinic start generated code]*/
422
423 static PyObject *
slice_index_converter_impl(PyObject * module,Py_ssize_t a,Py_ssize_t b,Py_ssize_t c)424 slice_index_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b,
425 Py_ssize_t c)
426 /*[clinic end generated code: output=923c6cac77666a6b input=64f99f3f83265e47]*/
427 {
428 RETURN_PACKED_ARGS(3, PyLong_FromSsize_t, Py_ssize_t, a, b, c);
429 }
430
431
432 /*[clinic input]
433 size_t_converter
434
435 a: size_t = 12
436 /
437
438 [clinic start generated code]*/
439
440 static PyObject *
size_t_converter_impl(PyObject * module,size_t a)441 size_t_converter_impl(PyObject *module, size_t a)
442 /*[clinic end generated code: output=412b5b7334ab444d input=83ae7d9171fbf208]*/
443 {
444 RETURN_PACKED_ARGS(1, PyLong_FromSize_t, size_t, a);
445 }
446
447
448 /*[clinic input]
449 float_converter
450
451 a: float = 12.5
452 /
453
454 [clinic start generated code]*/
455
456 static PyObject *
float_converter_impl(PyObject * module,float a)457 float_converter_impl(PyObject *module, float a)
458 /*[clinic end generated code: output=1c98f64f2cf1d55c input=a625b59ad68047d8]*/
459 {
460 RETURN_PACKED_ARGS(1, PyFloat_FromDouble, double, a);
461 }
462
463
464 /*[clinic input]
465 double_converter
466
467 a: double = 12.5
468 /
469
470 [clinic start generated code]*/
471
472 static PyObject *
double_converter_impl(PyObject * module,double a)473 double_converter_impl(PyObject *module, double a)
474 /*[clinic end generated code: output=a4e8532d284d035d input=098df188f24e7c62]*/
475 {
476 RETURN_PACKED_ARGS(1, PyFloat_FromDouble, double, a);
477 }
478
479
480 /*[clinic input]
481 py_complex_converter
482
483 a: Py_complex
484 /
485
486 [clinic start generated code]*/
487
488 static PyObject *
py_complex_converter_impl(PyObject * module,Py_complex a)489 py_complex_converter_impl(PyObject *module, Py_complex a)
490 /*[clinic end generated code: output=9e6ca2eb53b14846 input=e9148a8ca1dbf195]*/
491 {
492 RETURN_PACKED_ARGS(1, PyComplex_FromCComplex, Py_complex, a);
493 }
494
495
496 /*[clinic input]
497 str_converter
498
499 a: str = "a"
500 b: str(accept={robuffer}) = "b"
501 c: str(accept={robuffer, str}, zeroes=True) = "c"
502 /
503
504 [clinic start generated code]*/
505
506 static PyObject *
str_converter_impl(PyObject * module,const char * a,const char * b,const char * c,Py_ssize_t c_length)507 str_converter_impl(PyObject *module, const char *a, const char *b,
508 const char *c, Py_ssize_t c_length)
509 /*[clinic end generated code: output=475bea40548c8cd6 input=bff2656c92ee25de]*/
510 {
511 assert(!PyErr_Occurred());
512 PyObject *out[3] = {NULL,};
513 int i = 0;
514 PyObject *arg;
515
516 arg = PyUnicode_FromString(a);
517 assert(arg || PyErr_Occurred());
518 if (!arg) {
519 goto error;
520 }
521 out[i++] = arg;
522
523 arg = PyUnicode_FromString(b);
524 assert(arg || PyErr_Occurred());
525 if (!arg) {
526 goto error;
527 }
528 out[i++] = arg;
529
530 arg = PyUnicode_FromStringAndSize(c, c_length);
531 assert(arg || PyErr_Occurred());
532 if (!arg) {
533 goto error;
534 }
535 out[i++] = arg;
536
537 PyObject *tuple = PyTuple_New(3);
538 if (!tuple) {
539 goto error;
540 }
541 for (int j = 0; j < 3; j++) {
542 PyTuple_SET_ITEM(tuple, j, out[j]);
543 }
544 return tuple;
545
546 error:
547 for (int j = 0; j < i; j++) {
548 Py_DECREF(out[j]);
549 }
550 return NULL;
551 }
552
553
554 /*[clinic input]
555 str_converter_encoding
556
557 a: str(encoding="idna")
558 b: str(encoding="idna", accept={bytes, bytearray, str})
559 c: str(encoding="idna", accept={bytes, bytearray, str}, zeroes=True)
560 /
561
562 [clinic start generated code]*/
563
564 static PyObject *
str_converter_encoding_impl(PyObject * module,char * a,char * b,char * c,Py_ssize_t c_length)565 str_converter_encoding_impl(PyObject *module, char *a, char *b, char *c,
566 Py_ssize_t c_length)
567 /*[clinic end generated code: output=af68766049248a1c input=0c5cf5159d0e870d]*/
568 {
569 assert(!PyErr_Occurred());
570 PyObject *out[3] = {NULL,};
571 int i = 0;
572 PyObject *arg;
573
574 arg = PyUnicode_FromString(a);
575 assert(arg || PyErr_Occurred());
576 if (!arg) {
577 goto error;
578 }
579 out[i++] = arg;
580
581 arg = PyUnicode_FromString(b);
582 assert(arg || PyErr_Occurred());
583 if (!arg) {
584 goto error;
585 }
586 out[i++] = arg;
587
588 arg = PyUnicode_FromStringAndSize(c, c_length);
589 assert(arg || PyErr_Occurred());
590 if (!arg) {
591 goto error;
592 }
593 out[i++] = arg;
594
595 PyObject *tuple = PyTuple_New(3);
596 if (!tuple) {
597 goto error;
598 }
599 for (int j = 0; j < 3; j++) {
600 PyTuple_SET_ITEM(tuple, j, out[j]);
601 }
602 return tuple;
603
604 error:
605 for (int j = 0; j < i; j++) {
606 Py_DECREF(out[j]);
607 }
608 return NULL;
609 }
610
611
612 static PyObject *
bytes_from_buffer(Py_buffer * buf)613 bytes_from_buffer(Py_buffer *buf)
614 {
615 PyObject *bytes_obj = PyBytes_FromStringAndSize(NULL, buf->len);
616 if (!bytes_obj) {
617 return NULL;
618 }
619 void *bytes_obj_buf = ((PyBytesObject *)bytes_obj)->ob_sval;
620 if (PyBuffer_ToContiguous(bytes_obj_buf, buf, buf->len, 'C') < 0) {
621 Py_DECREF(bytes_obj);
622 return NULL;
623 }
624 return bytes_obj;
625 }
626
627 /*[clinic input]
628 py_buffer_converter
629
630 a: Py_buffer(accept={str, buffer, NoneType})
631 b: Py_buffer(accept={rwbuffer})
632 /
633
634 [clinic start generated code]*/
635
636 static PyObject *
py_buffer_converter_impl(PyObject * module,Py_buffer * a,Py_buffer * b)637 py_buffer_converter_impl(PyObject *module, Py_buffer *a, Py_buffer *b)
638 /*[clinic end generated code: output=52fb13311e3d6d03 input=775de727de5c7421]*/
639 {
640 RETURN_PACKED_ARGS(2, bytes_from_buffer, Py_buffer *, a, b);
641 }
642
643
644 /*[clinic input]
645 keywords
646
647 a: object
648 b: object
649
650 [clinic start generated code]*/
651
652 static PyObject *
keywords_impl(PyObject * module,PyObject * a,PyObject * b)653 keywords_impl(PyObject *module, PyObject *a, PyObject *b)
654 /*[clinic end generated code: output=850aaed53e26729e input=f44b89e718c1a93b]*/
655 {
656 return pack_arguments_newref(2, a, b);
657 }
658
659
660 /*[clinic input]
661 keywords_kwonly
662
663 a: object
664 *
665 b: object
666
667 [clinic start generated code]*/
668
669 static PyObject *
keywords_kwonly_impl(PyObject * module,PyObject * a,PyObject * b)670 keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b)
671 /*[clinic end generated code: output=a45c48241da584dc input=1f08e39c3312b015]*/
672 {
673 return pack_arguments_newref(2, a, b);
674 }
675
676
677 /*[clinic input]
678 keywords_opt
679
680 a: object
681 b: object = None
682 c: object = None
683
684 [clinic start generated code]*/
685
686 static PyObject *
keywords_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c)687 keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c)
688 /*[clinic end generated code: output=25e4b67d91c76a66 input=b0ba0e4f04904556]*/
689 {
690 return pack_arguments_newref(3, a, b, c);
691 }
692
693
694 /*[clinic input]
695 keywords_opt_kwonly
696
697 a: object
698 b: object = None
699 *
700 c: object = None
701 d: object = None
702
703 [clinic start generated code]*/
704
705 static PyObject *
keywords_opt_kwonly_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)706 keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b,
707 PyObject *c, PyObject *d)
708 /*[clinic end generated code: output=6aa5b655a6e9aeb0 input=f79da689d6c51076]*/
709 {
710 return pack_arguments_newref(4, a, b, c, d);
711 }
712
713
714 /*[clinic input]
715 keywords_kwonly_opt
716
717 a: object
718 *
719 b: object = None
720 c: object = None
721
722 [clinic start generated code]*/
723
724 static PyObject *
keywords_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c)725 keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b,
726 PyObject *c)
727 /*[clinic end generated code: output=707f78eb0f55c2b1 input=e0fa1a0e46dca791]*/
728 {
729 return pack_arguments_newref(3, a, b, c);
730 }
731
732
733 /*[clinic input]
734 posonly_keywords
735
736 a: object
737 /
738 b: object
739
740 [clinic start generated code]*/
741
742 static PyObject *
posonly_keywords_impl(PyObject * module,PyObject * a,PyObject * b)743 posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b)
744 /*[clinic end generated code: output=6ac88f4a5f0bfc8d input=fde0a2f79fe82b06]*/
745 {
746 return pack_arguments_newref(2, a, b);
747 }
748
749
750 /*[clinic input]
751 posonly_kwonly
752
753 a: object
754 /
755 *
756 b: object
757
758 [clinic start generated code]*/
759
760 static PyObject *
posonly_kwonly_impl(PyObject * module,PyObject * a,PyObject * b)761 posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *b)
762 /*[clinic end generated code: output=483e6790d3482185 input=78b3712768da9a19]*/
763 {
764 return pack_arguments_newref(2, a, b);
765 }
766
767
768 /*[clinic input]
769 posonly_keywords_kwonly
770
771 a: object
772 /
773 b: object
774 *
775 c: object
776
777 [clinic start generated code]*/
778
779 static PyObject *
posonly_keywords_kwonly_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c)780 posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b,
781 PyObject *c)
782 /*[clinic end generated code: output=2fae573e8cc3fad8 input=a1ad5d2295eb803c]*/
783 {
784 return pack_arguments_newref(3, a, b, c);
785 }
786
787
788 /*[clinic input]
789 posonly_keywords_opt
790
791 a: object
792 /
793 b: object
794 c: object = None
795 d: object = None
796
797 [clinic start generated code]*/
798
799 static PyObject *
posonly_keywords_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)800 posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b,
801 PyObject *c, PyObject *d)
802 /*[clinic end generated code: output=f5eb66241bcf68fb input=51c10de2a120e279]*/
803 {
804 return pack_arguments_newref(4, a, b, c, d);
805 }
806
807
808 /*[clinic input]
809 posonly_opt_keywords_opt
810
811 a: object
812 b: object = None
813 /
814 c: object = None
815 d: object = None
816
817 [clinic start generated code]*/
818
819 static PyObject *
posonly_opt_keywords_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)820 posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b,
821 PyObject *c, PyObject *d)
822 /*[clinic end generated code: output=d54a30e549296ffd input=f408a1de7dfaf31f]*/
823 {
824 return pack_arguments_newref(4, a, b, c, d);
825 }
826
827
828 /*[clinic input]
829 posonly_kwonly_opt
830
831 a: object
832 /
833 *
834 b: object
835 c: object = None
836 d: object = None
837
838 [clinic start generated code]*/
839
840 static PyObject *
posonly_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)841 posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b,
842 PyObject *c, PyObject *d)
843 /*[clinic end generated code: output=a20503fe36b4fd62 input=3494253975272f52]*/
844 {
845 return pack_arguments_newref(4, a, b, c, d);
846 }
847
848
849 /*[clinic input]
850 posonly_opt_kwonly_opt
851
852 a: object
853 b: object = None
854 /
855 *
856 c: object = None
857 d: object = None
858
859 [clinic start generated code]*/
860
861 static PyObject *
posonly_opt_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)862 posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b,
863 PyObject *c, PyObject *d)
864 /*[clinic end generated code: output=64f3204a3a0413b6 input=d17516581e478412]*/
865 {
866 return pack_arguments_newref(4, a, b, c, d);
867 }
868
869
870 /*[clinic input]
871 posonly_keywords_kwonly_opt
872
873 a: object
874 /
875 b: object
876 *
877 c: object
878 d: object = None
879 e: object = None
880
881 [clinic start generated code]*/
882
883 static PyObject *
posonly_keywords_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d,PyObject * e)884 posonly_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b,
885 PyObject *c, PyObject *d, PyObject *e)
886 /*[clinic end generated code: output=dbd7e7ddd6257fa0 input=33529f29e97e5adb]*/
887 {
888 return pack_arguments_newref(5, a, b, c, d, e);
889 }
890
891
892 /*[clinic input]
893 posonly_keywords_opt_kwonly_opt
894
895 a: object
896 /
897 b: object
898 c: object = None
899 *
900 d: object = None
901 e: object = None
902
903 [clinic start generated code]*/
904
905 static PyObject *
posonly_keywords_opt_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d,PyObject * e)906 posonly_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a,
907 PyObject *b, PyObject *c, PyObject *d,
908 PyObject *e)
909 /*[clinic end generated code: output=775d12ae44653045 input=4d4cc62f11441301]*/
910 {
911 return pack_arguments_newref(5, a, b, c, d, e);
912 }
913
914
915 /*[clinic input]
916 posonly_opt_keywords_opt_kwonly_opt
917
918 a: object
919 b: object = None
920 /
921 c: object = None
922 *
923 d: object = None
924
925 [clinic start generated code]*/
926
927 static PyObject *
posonly_opt_keywords_opt_kwonly_opt_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * c,PyObject * d)928 posonly_opt_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a,
929 PyObject *b, PyObject *c,
930 PyObject *d)
931 /*[clinic end generated code: output=40c6dc422591eade input=3964960a68622431]*/
932 {
933 return pack_arguments_newref(4, a, b, c, d);
934 }
935
936
937 /*[clinic input]
938 keyword_only_parameter
939
940 *
941 a: object
942
943 [clinic start generated code]*/
944
945 static PyObject *
keyword_only_parameter_impl(PyObject * module,PyObject * a)946 keyword_only_parameter_impl(PyObject *module, PyObject *a)
947 /*[clinic end generated code: output=c454b6ce98232787 input=8d2868b8d0b27bdb]*/
948 {
949 return pack_arguments_newref(1, a);
950 }
951
952
953 /*[clinic input]
954 posonly_vararg
955
956 a: object
957 /
958 b: object
959 *args: object
960
961 [clinic start generated code]*/
962
963 static PyObject *
posonly_vararg_impl(PyObject * module,PyObject * a,PyObject * b,PyObject * args)964 posonly_vararg_impl(PyObject *module, PyObject *a, PyObject *b,
965 PyObject *args)
966 /*[clinic end generated code: output=ee6713acda6b954e input=783427fe7ec2b67a]*/
967 {
968 return pack_arguments_newref(3, a, b, args);
969 }
970
971
972 /*[clinic input]
973 vararg_and_posonly
974
975 a: object
976 *args: object
977 /
978
979 [clinic start generated code]*/
980
981 static PyObject *
vararg_and_posonly_impl(PyObject * module,PyObject * a,PyObject * args)982 vararg_and_posonly_impl(PyObject *module, PyObject *a, PyObject *args)
983 /*[clinic end generated code: output=42792f799465a14d input=defe017b19ba52e8]*/
984 {
985 return pack_arguments_newref(2, a, args);
986 }
987
988
989 /*[clinic input]
990 vararg
991
992 a: object
993 *args: object
994
995 [clinic start generated code]*/
996
997 static PyObject *
vararg_impl(PyObject * module,PyObject * a,PyObject * args)998 vararg_impl(PyObject *module, PyObject *a, PyObject *args)
999 /*[clinic end generated code: output=91ab7a0efc52dd5e input=02c0f772d05f591e]*/
1000 {
1001 return pack_arguments_newref(2, a, args);
1002 }
1003
1004
1005 /*[clinic input]
1006 vararg_with_default
1007
1008 a: object
1009 *args: object
1010 b: bool = False
1011
1012 [clinic start generated code]*/
1013
1014 static PyObject *
vararg_with_default_impl(PyObject * module,PyObject * a,PyObject * args,int b)1015 vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args,
1016 int b)
1017 /*[clinic end generated code: output=182c01035958ce92 input=68cafa6a79f89e36]*/
1018 {
1019 PyObject *obj_b = b ? Py_True : Py_False;
1020 return pack_arguments_newref(3, a, args, obj_b);
1021 }
1022
1023
1024 /*[clinic input]
1025 vararg_with_only_defaults
1026
1027 *args: object
1028 b: object = None
1029
1030 [clinic start generated code]*/
1031
1032 static PyObject *
vararg_with_only_defaults_impl(PyObject * module,PyObject * args,PyObject * b)1033 vararg_with_only_defaults_impl(PyObject *module, PyObject *args, PyObject *b)
1034 /*[clinic end generated code: output=c06b1826d91f2f7b input=678c069bc67550e1]*/
1035 {
1036 return pack_arguments_newref(2, args, b);
1037 }
1038
1039
1040
1041 /*[clinic input]
1042 gh_32092_oob
1043
1044 pos1: object
1045 pos2: object
1046 *varargs: object
1047 kw1: object = None
1048 kw2: object = None
1049
1050 Proof-of-concept of GH-32092 OOB bug.
1051
1052 [clinic start generated code]*/
1053
1054 static PyObject *
gh_32092_oob_impl(PyObject * module,PyObject * pos1,PyObject * pos2,PyObject * varargs,PyObject * kw1,PyObject * kw2)1055 gh_32092_oob_impl(PyObject *module, PyObject *pos1, PyObject *pos2,
1056 PyObject *varargs, PyObject *kw1, PyObject *kw2)
1057 /*[clinic end generated code: output=ee259c130054653f input=46d15c881608f8ff]*/
1058 {
1059 Py_RETURN_NONE;
1060 }
1061
1062
1063 /*[clinic input]
1064 gh_32092_kw_pass
1065
1066 pos: object
1067 *args: object
1068 kw: object = None
1069
1070 Proof-of-concept of GH-32092 keyword args passing bug.
1071
1072 [clinic start generated code]*/
1073
1074 static PyObject *
gh_32092_kw_pass_impl(PyObject * module,PyObject * pos,PyObject * args,PyObject * kw)1075 gh_32092_kw_pass_impl(PyObject *module, PyObject *pos, PyObject *args,
1076 PyObject *kw)
1077 /*[clinic end generated code: output=4a2bbe4f7c8604e9 input=5c0bd5b9079a0cce]*/
1078 {
1079 Py_RETURN_NONE;
1080 }
1081
1082
1083 /*[clinic input]
1084 gh_99233_refcount
1085
1086 *args: object
1087 /
1088
1089 Proof-of-concept of GH-99233 refcount error bug.
1090
1091 [clinic start generated code]*/
1092
1093 static PyObject *
gh_99233_refcount_impl(PyObject * module,PyObject * args)1094 gh_99233_refcount_impl(PyObject *module, PyObject *args)
1095 /*[clinic end generated code: output=585855abfbca9a7f input=85f5fb47ac91a626]*/
1096 {
1097 Py_RETURN_NONE;
1098 }
1099
1100
1101 /*[clinic input]
1102 gh_99240_double_free
1103
1104 a: str(encoding="idna")
1105 b: str(encoding="idna")
1106 /
1107
1108 Proof-of-concept of GH-99240 double-free bug.
1109
1110 [clinic start generated code]*/
1111
1112 static PyObject *
gh_99240_double_free_impl(PyObject * module,char * a,char * b)1113 gh_99240_double_free_impl(PyObject *module, char *a, char *b)
1114 /*[clinic end generated code: output=586dc714992fe2ed input=23db44aa91870fc7]*/
1115 {
1116 Py_RETURN_NONE;
1117 }
1118
1119
1120 static PyMethodDef tester_methods[] = {
1121 TEST_EMPTY_FUNCTION_METHODDEF
1122 OBJECTS_CONVERTER_METHODDEF
1123 BYTES_OBJECT_CONVERTER_METHODDEF
1124 BYTE_ARRAY_OBJECT_CONVERTER_METHODDEF
1125 UNICODE_CONVERTER_METHODDEF
1126 BOOL_CONVERTER_METHODDEF
1127 CHAR_CONVERTER_METHODDEF
1128 UNSIGNED_CHAR_CONVERTER_METHODDEF
1129 SHORT_CONVERTER_METHODDEF
1130 UNSIGNED_SHORT_CONVERTER_METHODDEF
1131 INT_CONVERTER_METHODDEF
1132 UNSIGNED_INT_CONVERTER_METHODDEF
1133 LONG_CONVERTER_METHODDEF
1134 UNSIGNED_LONG_CONVERTER_METHODDEF
1135 LONG_LONG_CONVERTER_METHODDEF
1136 UNSIGNED_LONG_LONG_CONVERTER_METHODDEF
1137 PY_SSIZE_T_CONVERTER_METHODDEF
1138 SLICE_INDEX_CONVERTER_METHODDEF
1139 SIZE_T_CONVERTER_METHODDEF
1140 FLOAT_CONVERTER_METHODDEF
1141 DOUBLE_CONVERTER_METHODDEF
1142 PY_COMPLEX_CONVERTER_METHODDEF
1143 STR_CONVERTER_METHODDEF
1144 STR_CONVERTER_ENCODING_METHODDEF
1145 PY_BUFFER_CONVERTER_METHODDEF
1146 KEYWORDS_METHODDEF
1147 KEYWORDS_KWONLY_METHODDEF
1148 KEYWORDS_OPT_METHODDEF
1149 KEYWORDS_OPT_KWONLY_METHODDEF
1150 KEYWORDS_KWONLY_OPT_METHODDEF
1151 POSONLY_KEYWORDS_METHODDEF
1152 POSONLY_KWONLY_METHODDEF
1153 POSONLY_KEYWORDS_KWONLY_METHODDEF
1154 POSONLY_KEYWORDS_OPT_METHODDEF
1155 POSONLY_OPT_KEYWORDS_OPT_METHODDEF
1156 POSONLY_KWONLY_OPT_METHODDEF
1157 POSONLY_OPT_KWONLY_OPT_METHODDEF
1158 POSONLY_KEYWORDS_KWONLY_OPT_METHODDEF
1159 POSONLY_KEYWORDS_OPT_KWONLY_OPT_METHODDEF
1160 POSONLY_OPT_KEYWORDS_OPT_KWONLY_OPT_METHODDEF
1161 KEYWORD_ONLY_PARAMETER_METHODDEF
1162 POSONLY_VARARG_METHODDEF
1163 VARARG_AND_POSONLY_METHODDEF
1164 VARARG_METHODDEF
1165 VARARG_WITH_DEFAULT_METHODDEF
1166 VARARG_WITH_ONLY_DEFAULTS_METHODDEF
1167 GH_32092_OOB_METHODDEF
1168 GH_32092_KW_PASS_METHODDEF
1169 GH_99233_REFCOUNT_METHODDEF
1170 GH_99240_DOUBLE_FREE_METHODDEF
1171 {NULL, NULL}
1172 };
1173
1174 static struct PyModuleDef _testclinic_module = {
1175 PyModuleDef_HEAD_INIT,
1176 .m_name = "_testclinic",
1177 .m_size = 0,
1178 .m_methods = tester_methods,
1179 };
1180
1181 PyMODINIT_FUNC
PyInit__testclinic(void)1182 PyInit__testclinic(void)
1183 {
1184 return PyModule_Create(&_testclinic_module);
1185 }
1186
1187 #undef RETURN_PACKED_ARGS
1188