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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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