Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
