@@ -533,6 +533,8 @@ typedef struct _build_stack {
533
533
PyObject * _Py_BuildValue_SizeT (const char * format , ...) {
534
534
# define ARG polyglot_get_arg(value_idx)
535
535
# define APPEND_VALUE (list , value ) PyList_Append(list, value); value_idx++
536
+ # define AS_I64 (__arg__ ) (polyglot_fits_in_i64((__arg__)) ? polyglot_as_i64((__arg__)) : ((int64_t)(__arg__)))
537
+ # define AS_DOUBLE (__arg__ ) (polyglot_fits_in_double((__arg__)) ? polyglot_as_double((__arg__)) : ((double)(unsigned long long)(__arg__)))
536
538
537
539
PyObject * (* converter )(void * ) = NULL ;
538
540
char argchar [2 ] = {'\0' };
@@ -551,7 +553,7 @@ PyObject* _Py_BuildValue_SizeT(const char *format, ...) {
551
553
case 'z' :
552
554
case 'U' :
553
555
if (format [format_idx + 1 ] == '#' ) {
554
- int size = (int )polyglot_get_arg (value_idx + 1 );
556
+ int size = (int ) AS_I64 ( polyglot_get_arg (value_idx + 1 ) );
555
557
if (ARG == NULL ) {
556
558
APPEND_VALUE (list , Py_None );
557
559
} else {
@@ -569,7 +571,7 @@ PyObject* _Py_BuildValue_SizeT(const char *format, ...) {
569
571
break ;
570
572
case 'y' :
571
573
if (format [format_idx + 1 ] == '#' ) {
572
- int size = (int )polyglot_get_arg (value_idx + 1 );
574
+ int size = (int ) AS_I64 ( polyglot_get_arg (value_idx + 1 ) );
573
575
if (ARG == NULL ) {
574
576
APPEND_VALUE (list , Py_None );
575
577
} else {
@@ -591,39 +593,39 @@ PyObject* _Py_BuildValue_SizeT(const char *format, ...) {
591
593
case 'i' :
592
594
case 'b' :
593
595
case 'h' :
594
- APPEND_VALUE (list , PyLong_FromLong ((int )ARG ));
596
+ APPEND_VALUE (list , PyLong_FromLong ((int )AS_I64 ( ARG ) ));
595
597
break ;
596
598
case 'l' :
597
- APPEND_VALUE (list , PyLong_FromLong (( long ) ARG ));
599
+ APPEND_VALUE (list , PyLong_FromLong (AS_I64 ( ARG ) ));
598
600
break ;
599
601
case 'B' :
600
602
case 'H' :
601
603
case 'I' :
602
- APPEND_VALUE (list , PyLong_FromUnsignedLong ((unsigned int )ARG ));
604
+ APPEND_VALUE (list , PyLong_FromUnsignedLong ((unsigned int )AS_I64 ( ARG ) ));
603
605
break ;
604
606
case 'k' :
605
- APPEND_VALUE (list , PyLong_FromUnsignedLong ((unsigned long )ARG ));
607
+ APPEND_VALUE (list , PyLong_FromUnsignedLong ((unsigned long )AS_I64 ( ARG ) ));
606
608
break ;
607
609
case 'L' :
608
- APPEND_VALUE (list , PyLong_FromLongLong ((long long )ARG ));
610
+ APPEND_VALUE (list , PyLong_FromLongLong ((long long )AS_I64 ( ARG ) ));
609
611
break ;
610
612
case 'K' :
611
- APPEND_VALUE (list , PyLong_FromLongLong ((unsigned long long )ARG ));
613
+ APPEND_VALUE (list , PyLong_FromLongLong ((unsigned long long )AS_I64 ( ARG ) ));
612
614
break ;
613
615
case 'n' :
614
- APPEND_VALUE (list , PyLong_FromSsize_t ((Py_ssize_t )ARG ));
616
+ APPEND_VALUE (list , PyLong_FromSsize_t ((Py_ssize_t )AS_I64 ( ARG ) ));
615
617
break ;
616
618
case 'c' :
617
- argchar [0 ] = (char )ARG ;
619
+ argchar [0 ] = (char )AS_I64 ( ARG ) ;
618
620
APPEND_VALUE (list , PyBytes_FromStringAndSize (argchar , 1 ));
619
621
break ;
620
622
case 'C' :
621
- argchar [0 ] = (char )ARG ;
623
+ argchar [0 ] = (char )AS_I64 ( ARG ) ;
622
624
APPEND_VALUE (list , polyglot_from_string (argchar , "ascii" ));
623
625
break ;
624
626
case 'd' :
625
627
case 'f' :
626
- APPEND_VALUE (list , PyFloat_FromDouble ((double )( unsigned long long ) ARG ));
628
+ APPEND_VALUE (list , PyFloat_FromDouble ((double )AS_DOUBLE ( ARG ) ));
627
629
break ;
628
630
case 'D' :
629
631
fprintf (stderr , "error: unsupported format 'D'\n" );
0 commit comments