@@ -2649,49 +2649,83 @@ _PyBytes_FromBuffer(PyObject *x)
2649
2649
return NULL ;
2650
2650
}
2651
2651
2652
- #define _PyBytes_FROM_LIST_BODY (x , GET_ITEM ) \
2653
- do { \
2654
- PyObject *bytes; \
2655
- Py_ssize_t i; \
2656
- Py_ssize_t value; \
2657
- char *str; \
2658
- PyObject *item; \
2659
- \
2660
- bytes = PyBytes_FromStringAndSize(NULL, Py_SIZE(x)); \
2661
- if (bytes == NULL) \
2662
- return NULL; \
2663
- str = ((PyBytesObject *)bytes)->ob_sval; \
2664
- \
2665
- for (i = 0; i < Py_SIZE(x); i++) { \
2666
- item = GET_ITEM((x), i); \
2667
- value = PyNumber_AsSsize_t(item, NULL); \
2668
- if (value == -1 && PyErr_Occurred()) \
2669
- goto error; \
2670
- \
2671
- if (value < 0 || value >= 256) { \
2672
- PyErr_SetString(PyExc_ValueError, \
2673
- "bytes must be in range(0, 256)"); \
2674
- goto error; \
2675
- } \
2676
- *str++ = (char) value; \
2677
- } \
2678
- return bytes; \
2679
- \
2680
- error: \
2681
- Py_DECREF(bytes); \
2682
- return NULL; \
2683
- } while (0)
2684
-
2685
2652
static PyObject *
2686
2653
_PyBytes_FromList (PyObject * x )
2687
2654
{
2688
- _PyBytes_FROM_LIST_BODY (x , PyList_GET_ITEM );
2655
+ Py_ssize_t i , size = PyList_GET_SIZE (x );
2656
+ Py_ssize_t value ;
2657
+ char * str ;
2658
+ PyObject * item ;
2659
+ _PyBytesWriter writer ;
2660
+
2661
+ _PyBytesWriter_Init (& writer );
2662
+ str = _PyBytesWriter_Alloc (& writer , size );
2663
+ if (str == NULL )
2664
+ return NULL ;
2665
+ writer .overallocate = 1 ;
2666
+ size = writer .allocated ;
2667
+
2668
+ for (i = 0 ; i < PyList_GET_SIZE (x ); i ++ ) {
2669
+ item = PyList_GET_ITEM (x , i );
2670
+ Py_INCREF (item );
2671
+ value = PyNumber_AsSsize_t (item , NULL );
2672
+ Py_DECREF (item );
2673
+ if (value == -1 && PyErr_Occurred ())
2674
+ goto error ;
2675
+
2676
+ if (value < 0 || value >= 256 ) {
2677
+ PyErr_SetString (PyExc_ValueError ,
2678
+ "bytes must be in range(0, 256)" );
2679
+ goto error ;
2680
+ }
2681
+
2682
+ if (i >= size ) {
2683
+ str = _PyBytesWriter_Resize (& writer , str , size + 1 );
2684
+ if (str == NULL )
2685
+ return NULL ;
2686
+ size = writer .allocated ;
2687
+ }
2688
+ * str ++ = (char ) value ;
2689
+ }
2690
+ return _PyBytesWriter_Finish (& writer , str );
2691
+
2692
+ error :
2693
+ _PyBytesWriter_Dealloc (& writer );
2694
+ return NULL ;
2689
2695
}
2690
2696
2691
2697
static PyObject *
2692
2698
_PyBytes_FromTuple (PyObject * x )
2693
2699
{
2694
- _PyBytes_FROM_LIST_BODY (x , PyTuple_GET_ITEM );
2700
+ PyObject * bytes ;
2701
+ Py_ssize_t i , size = PyTuple_GET_SIZE (x );
2702
+ Py_ssize_t value ;
2703
+ char * str ;
2704
+ PyObject * item ;
2705
+
2706
+ bytes = PyBytes_FromStringAndSize (NULL , size );
2707
+ if (bytes == NULL )
2708
+ return NULL ;
2709
+ str = ((PyBytesObject * )bytes )-> ob_sval ;
2710
+
2711
+ for (i = 0 ; i < size ; i ++ ) {
2712
+ item = PyTuple_GET_ITEM (x , i );
2713
+ value = PyNumber_AsSsize_t (item , NULL );
2714
+ if (value == -1 && PyErr_Occurred ())
2715
+ goto error ;
2716
+
2717
+ if (value < 0 || value >= 256 ) {
2718
+ PyErr_SetString (PyExc_ValueError ,
2719
+ "bytes must be in range(0, 256)" );
2720
+ goto error ;
2721
+ }
2722
+ * str ++ = (char ) value ;
2723
+ }
2724
+ return bytes ;
2725
+
2726
+ error :
2727
+ Py_DECREF (bytes );
2728
+ return NULL ;
2695
2729
}
2696
2730
2697
2731
static PyObject *
0 commit comments