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