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