Mercurial > cpython-lru_cache-weakref
annotate Objects/stringlib/join.h @ 81922:4ab386b00aaf
Fix tests for issue #11159.
| author | Serhiy Storchaka <storchaka@gmail.com> |
|---|---|
| date | Sat, 02 Feb 2013 12:17:50 +0200 |
| parents | 9af5a2611202 |
| children |
| 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); |
|
80672
9af5a2611202
Issue #16592: stringlib_bytes_join doesn't raise MemoryError on allocation failure
Christian Heimes <christian@cheimes.de>
parents:
79859
diff
changeset
|
46 PyErr_NoMemory(); |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
47 return NULL; |
|
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 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
50 else { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
51 buffers = static_buffers; |
|
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 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
54 /* 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
|
55 * 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
|
56 * buffer-compatible. |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
57 */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 "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
|
64 "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
|
65 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
|
66 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
67 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
68 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
|
69 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
|
70 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
|
71 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
|
72 "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
|
73 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
74 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
75 sz += itemlen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
76 if (i != 0) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
77 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
|
78 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
|
79 "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
|
80 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
81 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
82 sz += seplen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
83 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
84 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
|
85 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
|
86 "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
|
87 goto error; |
|
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 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
91 /* Allocate result space. */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
92 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
|
93 if (res == NULL) |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
94 goto error; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
95 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
96 /* Catenate everything. */ |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
97 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
|
98 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
|
99 /* 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 } |
|
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 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
|
107 } |
|
79766
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
108 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
|
109 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
|
110 char *q; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
111 if (i) { |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
112 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
|
113 p += seplen; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
114 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 p += n; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
119 } |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
120 goto done; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
121 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
122 error: |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
123 res = NULL; |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
124 done: |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
125 Py_DECREF(seq); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
126 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
|
127 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
|
128 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
|
129 PyMem_FREE(buffers); |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
130 return res; |
|
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 |
|
16285c1b4dda
Issue #15958: bytes.join and bytearray.join now accept arbitrary buffer objects.
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
133 #undef NB_STATIC_BUFFERS |
