@@ -2640,49 +2640,83 @@ _PyBytes_FromBuffer(PyObject *x)
26402640 return NULL ;
26412641}
26422642
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-
26762643static PyObject *
26772644_PyBytes_FromList (PyObject * x )
26782645{
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 ;
26802686}
26812687
26822688static PyObject *
26832689_PyBytes_FromTuple (PyObject * x )
26842690{
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 ;
26862720}
26872721
26882722static PyObject *
0 commit comments