annotate Objects/stringlib/join.h @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
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