42
42
43
43
#include <stdio.h>
44
44
45
+ #define FLAG_SIZE_T 1
46
+
45
47
static int getbuffer (PyObject * arg , Py_buffer * view , const char * * errmsg ) {
46
48
if (PyObject_GetBuffer (arg , view , PyBUF_SIMPLE ) != 0 ) {
47
49
* errmsg = "bytes-like object" ;
@@ -287,7 +289,7 @@ typedef struct _build_stack {
287
289
struct _build_stack * prev ;
288
290
} build_stack ;
289
291
290
- MUST_INLINE static PyObject * _PyTruffle_BuildValue (const char * format , va_list va ) {
292
+ MUST_INLINE static PyObject * _PyTruffle_BuildValue (const char * format , va_list va , int flags ) {
291
293
PyObject * (* converter )(void * ) = NULL ;
292
294
int offset = 0 ;
293
295
char argchar [2 ] = {'\0' };
@@ -343,8 +345,36 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
343
345
}
344
346
break ;
345
347
case 'u' :
346
- fprintf (stderr , "error: unsupported format 'u'\n" );
347
- break ;
348
+ {
349
+ PyObject * v ;
350
+ Py_UNICODE * u = va_arg (va , Py_UNICODE * );
351
+ Py_ssize_t n ;
352
+ if (format [format_idx + 1 ] == '#' ) {
353
+ if (flags & FLAG_SIZE_T )
354
+ n = va_arg (va , Py_ssize_t );
355
+ else {
356
+ n = va_arg (va , int );
357
+ if (PyErr_WarnEx (PyExc_DeprecationWarning ,
358
+ "PY_SSIZE_T_CLEAN will be required for '#' formats" , 1 )) {
359
+ return NULL ;
360
+ }
361
+ }
362
+ format_idx ++ ;
363
+ } else {
364
+ n = -1 ;
365
+ }
366
+ if (u == NULL ) {
367
+ v = Py_None ;
368
+ Py_INCREF (v );
369
+ }
370
+ else {
371
+ if (n < 0 ) {
372
+ n = wcslen (u );
373
+ }
374
+ v = PyUnicode_FromWideChar (u , n );
375
+ }
376
+ return v ;
377
+ }
348
378
case 'i' :
349
379
case 'b' :
350
380
case 'h' :
@@ -496,18 +526,18 @@ MUST_INLINE static PyObject* _PyTruffle_BuildValue(const char* format, va_list v
496
526
}
497
527
498
528
PyObject * Py_VaBuildValue (const char * format , va_list va ) {
499
- return _Py_VaBuildValue_SizeT (format , va );
529
+ return _PyTruffle_BuildValue (format , va , FLAG_SIZE_T );
500
530
}
501
531
502
532
PyObject * _Py_VaBuildValue_SizeT (const char * format , va_list va ) {
503
- return _PyTruffle_BuildValue (format , va );
533
+ return _PyTruffle_BuildValue (format , va , FLAG_SIZE_T );
504
534
}
505
535
506
536
NO_INLINE
507
537
PyObject * Py_BuildValue (const char * format , ...) {
508
538
va_list args ;
509
539
va_start (args , format );
510
- PyObject * result = _PyTruffle_BuildValue (format , args );
540
+ PyObject * result = _PyTruffle_BuildValue (format , args , 0 );
511
541
va_end (args );
512
542
return result ;
513
543
}
@@ -516,7 +546,7 @@ NO_INLINE
516
546
PyObject * _Py_BuildValue_SizeT (const char * format , ...) {
517
547
va_list args ;
518
548
va_start (args , format );
519
- PyObject * result = _PyTruffle_BuildValue (format , args );
549
+ PyObject * result = _PyTruffle_BuildValue (format , args , FLAG_SIZE_T );
520
550
va_end (args );
521
551
return result ;
522
552
}
0 commit comments