Mercurial > cpython-lru_cache-weakref
annotate Objects/stringlib/join.h @ 80605:c28f593ea0cb
#16556: merge with 3.3.
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Tue, 27 Nov 2012 19:19:01 +0200 |
| parents | bfa715f98c0f |
| children | 9af5a2611202 |
| rev | line source |
|---|---|
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1 /* stringlib: bytes joining implementation */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
3 #if STRINGLIB_SIZEOF_CHAR != 1 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
4 #error join.h only compatible with byte-wise strings |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
5 #endif |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
6 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
7 Py_LOCAL_INLINE(PyObject *) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
8 STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
9 { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
10 char *sepstr = STRINGLIB_STR(sep); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
11 const Py_ssize_t seplen = STRINGLIB_LEN(sep); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
12 PyObject *res = NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
13 char *p; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
14 Py_ssize_t seqlen = 0; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
15 Py_ssize_t sz = 0; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
16 Py_ssize_t i, nbufs; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
17 PyObject *seq, *item; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
18 Py_buffer *buffers = NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
19 #define NB_STATIC_BUFFERS 10 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
20 Py_buffer static_buffers[NB_STATIC_BUFFERS]; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
21 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
22 seq = PySequence_Fast(iterable, "can only join an iterable"); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
23 if (seq == NULL) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
24 return NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
25 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
26 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
27 seqlen = PySequence_Fast_GET_SIZE(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
28 if (seqlen == 0) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
29 Py_DECREF(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
30 return STRINGLIB_NEW(NULL, 0); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
31 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
32 #ifndef STRINGLIB_MUTABLE |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
33 if (seqlen == 1) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
34 item = PySequence_Fast_GET_ITEM(seq, 0); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
35 if (STRINGLIB_CHECK_EXACT(item)) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
36 Py_INCREF(item); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
37 Py_DECREF(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
38 return item; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
39 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
40 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
41 #endif |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
42 if (seqlen > NB_STATIC_BUFFERS) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
43 buffers = PyMem_NEW(Py_buffer, seqlen); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
44 if (buffers == NULL) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
45 Py_DECREF(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
46 return NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
47 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
48 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
49 else { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
50 buffers = static_buffers; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
51 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
52 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
53 /* Here is the general case. Do a pre-pass to figure out the total |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
54 * amount of space we'll need (sz), and see whether all arguments are |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
55 * buffer-compatible. |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
56 */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
57 for (i = 0, nbufs = 0; i < seqlen; i++) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
58 Py_ssize_t itemlen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
59 item = PySequence_Fast_GET_ITEM(seq, i); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
60 if (_getbuffer(item, &buffers[i]) < 0) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
61 PyErr_Format(PyExc_TypeError, |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
62 "sequence item %zd: expected bytes, bytearray, " |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
63 "or an object with the buffer interface, %.80s found", |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
64 i, Py_TYPE(item)->tp_name); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
65 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
66 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
67 nbufs = i + 1; /* for error cleanup */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
68 itemlen = buffers[i].len; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
69 if (itemlen > PY_SSIZE_T_MAX - sz) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
70 PyErr_SetString(PyExc_OverflowError, |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
71 "join() result is too long"); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
72 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
73 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
74 sz += itemlen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
75 if (i != 0) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
76 if (seplen > PY_SSIZE_T_MAX - sz) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
77 PyErr_SetString(PyExc_OverflowError, |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
78 "join() result is too long"); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
79 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
80 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
81 sz += seplen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
82 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
83 if (seqlen != PySequence_Fast_GET_SIZE(seq)) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
84 PyErr_SetString(PyExc_RuntimeError, |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
85 "sequence changed size during iteration"); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
86 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
87 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
88 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
89 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
90 /* Allocate result space. */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
91 res = STRINGLIB_NEW(NULL, sz); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
92 if (res == NULL) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
93 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
94 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
95 /* Catenate everything. */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
96 p = STRINGLIB_STR(res); |
|
79859
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
97 if (!seplen) { |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
98 /* fast path */ |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
99 for (i = 0; i < nbufs; i++) { |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
100 Py_ssize_t n = buffers[i].len; |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
101 char *q = buffers[i].buf; |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
102 Py_MEMCPY(p, q, n); |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
103 p += n; |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
104 } |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
105 goto done; |
|
bfa715f98c0f
Issue #12805: Make bytes.join and bytearray.join faster when the separator is empty.
Antoine Pitrou <solipsis@pitrou.net>
parents:
79766
diff
changeset
|
106 } |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
107 for (i = 0; i < nbufs; i++) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
108 Py_ssize_t n; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
109 char *q; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
110 if (i) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
111 Py_MEMCPY(p, sepstr, seplen); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
112 p += seplen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
113 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
114 n = buffers[i].len; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
115 q = buffers[i].buf; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
116 Py_MEMCPY(p, q, n); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
117 p += n; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
118 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
119 goto done; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
120 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
121 error: |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
122 res = NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
123 done: |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
124 Py_DECREF(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
125 for (i = 0; i < nbufs; i++) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
126 PyBuffer_Release(&buffers[i]); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
127 if (buffers != static_buffers) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
128 PyMem_FREE(buffers); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
129 return res; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
130 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
131 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
132 #undef NB_STATIC_BUFFERS |
