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