mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
merge heads.
This commit is contained in:
commit
d64b2bae9b
223 changed files with 11831 additions and 3529 deletions
|
|
@ -36,6 +36,7 @@ PyObject *_PyIO_str_nl;
|
|||
PyObject *_PyIO_str_read;
|
||||
PyObject *_PyIO_str_read1;
|
||||
PyObject *_PyIO_str_readable;
|
||||
PyObject *_PyIO_str_readall;
|
||||
PyObject *_PyIO_str_readinto;
|
||||
PyObject *_PyIO_str_readline;
|
||||
PyObject *_PyIO_str_reset;
|
||||
|
|
@ -767,6 +768,8 @@ PyInit__io(void)
|
|||
goto fail;
|
||||
if (!(_PyIO_str_readable = PyUnicode_InternFromString("readable")))
|
||||
goto fail;
|
||||
if (!(_PyIO_str_readall = PyUnicode_InternFromString("readall")))
|
||||
goto fail;
|
||||
if (!(_PyIO_str_readinto = PyUnicode_InternFromString("readinto")))
|
||||
goto fail;
|
||||
if (!(_PyIO_str_readline = PyUnicode_InternFromString("readline")))
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ extern PyObject *_PyIO_str_nl;
|
|||
extern PyObject *_PyIO_str_read;
|
||||
extern PyObject *_PyIO_str_read1;
|
||||
extern PyObject *_PyIO_str_readable;
|
||||
extern PyObject *_PyIO_str_readall;
|
||||
extern PyObject *_PyIO_str_readinto;
|
||||
extern PyObject *_PyIO_str_readline;
|
||||
extern PyObject *_PyIO_str_reset;
|
||||
|
|
|
|||
|
|
@ -589,7 +589,7 @@ _bufferedreader_reset_buf(buffered *self);
|
|||
static void
|
||||
_bufferedwriter_reset_buf(buffered *self);
|
||||
static PyObject *
|
||||
_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t);
|
||||
_bufferedreader_peek_unlocked(buffered *self);
|
||||
static PyObject *
|
||||
_bufferedreader_read_all(buffered *self);
|
||||
static PyObject *
|
||||
|
|
@ -797,7 +797,7 @@ buffered_peek(buffered *self, PyObject *args)
|
|||
goto end;
|
||||
Py_CLEAR(res);
|
||||
}
|
||||
res = _bufferedreader_peek_unlocked(self, n);
|
||||
res = _bufferedreader_peek_unlocked(self);
|
||||
|
||||
end:
|
||||
LEAVE_BUFFERED(self)
|
||||
|
|
@ -1407,32 +1407,57 @@ static PyObject *
|
|||
_bufferedreader_read_all(buffered *self)
|
||||
{
|
||||
Py_ssize_t current_size;
|
||||
PyObject *res, *data = NULL;
|
||||
PyObject *chunks = PyList_New(0);
|
||||
|
||||
if (chunks == NULL)
|
||||
return NULL;
|
||||
PyObject *res, *data = NULL, *chunk, *chunks;
|
||||
|
||||
/* First copy what we have in the current buffer. */
|
||||
current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
|
||||
if (current_size) {
|
||||
data = PyBytes_FromStringAndSize(
|
||||
self->buffer + self->pos, current_size);
|
||||
if (data == NULL) {
|
||||
Py_DECREF(chunks);
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
_bufferedreader_reset_buf(self);
|
||||
/* We're going past the buffer's bounds, flush it */
|
||||
if (self->writable) {
|
||||
res = _bufferedwriter_flush_unlocked(self, 1);
|
||||
if (res == NULL) {
|
||||
Py_DECREF(chunks);
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
}
|
||||
Py_CLEAR(res);
|
||||
}
|
||||
|
||||
if (PyObject_HasAttr(self->raw, _PyIO_str_readall)) {
|
||||
chunk = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readall, NULL);
|
||||
if (chunk == NULL)
|
||||
return NULL;
|
||||
if (chunk != Py_None && !PyBytes_Check(chunk)) {
|
||||
Py_XDECREF(data);
|
||||
Py_DECREF(chunk);
|
||||
PyErr_SetString(PyExc_TypeError, "readall() should return bytes");
|
||||
return NULL;
|
||||
}
|
||||
if (chunk == Py_None) {
|
||||
if (current_size == 0)
|
||||
return chunk;
|
||||
else {
|
||||
Py_DECREF(chunk);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
else if (current_size) {
|
||||
PyBytes_Concat(&data, chunk);
|
||||
Py_DECREF(chunk);
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
return data;
|
||||
} else
|
||||
return chunk;
|
||||
}
|
||||
|
||||
chunks = PyList_New(0);
|
||||
if (chunks == NULL)
|
||||
return NULL;
|
||||
|
||||
while (1) {
|
||||
if (data) {
|
||||
if (PyList_Append(chunks, data) < 0) {
|
||||
|
|
@ -1586,7 +1611,7 @@ error:
|
|||
}
|
||||
|
||||
static PyObject *
|
||||
_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t n)
|
||||
_bufferedreader_peek_unlocked(buffered *self)
|
||||
{
|
||||
Py_ssize_t have, r;
|
||||
|
||||
|
|
|
|||
|
|
@ -547,14 +547,14 @@ fileio_readinto(fileio *self, PyObject *args)
|
|||
}
|
||||
|
||||
static size_t
|
||||
new_buffersize(fileio *self, size_t currentsize)
|
||||
new_buffersize(fileio *self, size_t currentsize
|
||||
#ifdef HAVE_FSTAT
|
||||
, off_t pos, off_t end
|
||||
#endif
|
||||
)
|
||||
{
|
||||
#ifdef HAVE_FSTAT
|
||||
off_t pos, end;
|
||||
struct stat st;
|
||||
if (fstat(self->fd, &st) == 0) {
|
||||
end = st.st_size;
|
||||
pos = lseek(self->fd, 0L, SEEK_CUR);
|
||||
if (end != (off_t)-1) {
|
||||
/* Files claiming a size smaller than SMALLCHUNK may
|
||||
actually be streaming pseudo-files. In this case, we
|
||||
apply the more aggressive algorithm below.
|
||||
|
|
@ -579,10 +579,17 @@ new_buffersize(fileio *self, size_t currentsize)
|
|||
static PyObject *
|
||||
fileio_readall(fileio *self)
|
||||
{
|
||||
#ifdef HAVE_FSTAT
|
||||
struct stat st;
|
||||
off_t pos, end;
|
||||
#endif
|
||||
PyObject *result;
|
||||
Py_ssize_t total = 0;
|
||||
int n;
|
||||
size_t newsize;
|
||||
|
||||
if (self->fd < 0)
|
||||
return err_closed();
|
||||
if (!_PyVerify_fd(self->fd))
|
||||
return PyErr_SetFromErrno(PyExc_IOError);
|
||||
|
||||
|
|
@ -590,8 +597,23 @@ fileio_readall(fileio *self)
|
|||
if (result == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef HAVE_FSTAT
|
||||
#if defined(MS_WIN64) || defined(MS_WINDOWS)
|
||||
pos = _lseeki64(self->fd, 0L, SEEK_CUR);
|
||||
#else
|
||||
pos = lseek(self->fd, 0L, SEEK_CUR);
|
||||
#endif
|
||||
if (fstat(self->fd, &st) == 0)
|
||||
end = st.st_size;
|
||||
else
|
||||
end = (off_t)-1;
|
||||
#endif
|
||||
while (1) {
|
||||
size_t newsize = new_buffersize(self, total);
|
||||
#ifdef HAVE_FSTAT
|
||||
newsize = new_buffersize(self, total, pos, end);
|
||||
#else
|
||||
newsize = new_buffersize(self, total);
|
||||
#endif
|
||||
if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"unbounded read returned more bytes "
|
||||
|
|
@ -630,6 +652,9 @@ fileio_readall(fileio *self)
|
|||
return NULL;
|
||||
}
|
||||
total += n;
|
||||
#ifdef HAVE_FSTAT
|
||||
pos += n;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (PyBytes_GET_SIZE(result) > total) {
|
||||
|
|
|
|||
|
|
@ -815,6 +815,14 @@ rawiobase_readall(PyObject *self, PyObject *args)
|
|||
Py_DECREF(chunks);
|
||||
return NULL;
|
||||
}
|
||||
if (data == Py_None) {
|
||||
if (PyList_GET_SIZE(chunks) == 0) {
|
||||
Py_DECREF(chunks);
|
||||
return data;
|
||||
}
|
||||
Py_DECREF(data);
|
||||
break;
|
||||
}
|
||||
if (!PyBytes_Check(data)) {
|
||||
Py_DECREF(chunks);
|
||||
Py_DECREF(data);
|
||||
|
|
|
|||
|
|
@ -1513,8 +1513,13 @@ textiowrapper_read(textio *self, PyObject *args)
|
|||
PyObject *decoded;
|
||||
if (bytes == NULL)
|
||||
goto fail;
|
||||
decoded = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_decode,
|
||||
bytes, Py_True, NULL);
|
||||
|
||||
if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type)
|
||||
decoded = _PyIncrementalNewlineDecoder_decode(self->decoder,
|
||||
bytes, 1);
|
||||
else
|
||||
decoded = PyObject_CallMethodObjArgs(
|
||||
self->decoder, _PyIO_str_decode, bytes, Py_True, NULL);
|
||||
Py_DECREF(bytes);
|
||||
if (decoded == NULL)
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* Authors: Gregory P. Smith & Jeffrey Yasskin */
|
||||
#include "Python.h"
|
||||
#ifdef HAVE_PIPE2
|
||||
#define _GNU_SOURCE
|
||||
#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE)
|
||||
# define _GNU_SOURCE
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
|
|
|||
|
|
@ -200,11 +200,13 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset
|
|||
weakref = PyList_GetItem(self->statements, i);
|
||||
statement = PyWeakref_GetObject(weakref);
|
||||
if (statement != Py_None) {
|
||||
Py_INCREF(statement);
|
||||
if (action == ACTION_RESET) {
|
||||
(void)pysqlite_statement_reset((pysqlite_Statement*)statement);
|
||||
} else {
|
||||
(void)pysqlite_statement_finalize((pysqlite_Statement*)statement);
|
||||
}
|
||||
Py_DECREF(statement);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1886,6 +1886,69 @@ PyDoc_STRVAR(PySSL_RAND_add_doc,
|
|||
Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
|
||||
bound on the entropy contained in string. See RFC 1750.");
|
||||
|
||||
static PyObject *
|
||||
PySSL_RAND(int len, int pseudo)
|
||||
{
|
||||
int ok;
|
||||
PyObject *bytes;
|
||||
unsigned long err;
|
||||
const char *errstr;
|
||||
PyObject *v;
|
||||
|
||||
bytes = PyBytes_FromStringAndSize(NULL, len);
|
||||
if (bytes == NULL)
|
||||
return NULL;
|
||||
if (pseudo) {
|
||||
ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
|
||||
if (ok == 0 || ok == 1)
|
||||
return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
|
||||
}
|
||||
else {
|
||||
ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
|
||||
if (ok == 1)
|
||||
return bytes;
|
||||
}
|
||||
Py_DECREF(bytes);
|
||||
|
||||
err = ERR_get_error();
|
||||
errstr = ERR_reason_error_string(err);
|
||||
v = Py_BuildValue("(ks)", err, errstr);
|
||||
if (v != NULL) {
|
||||
PyErr_SetObject(PySSLErrorObject, v);
|
||||
Py_DECREF(v);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
PySSL_RAND_bytes(PyObject *self, PyObject *args)
|
||||
{
|
||||
int len;
|
||||
if (!PyArg_ParseTuple(args, "i:RAND_bytes", &len))
|
||||
return NULL;
|
||||
return PySSL_RAND(len, 0);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(PySSL_RAND_bytes_doc,
|
||||
"RAND_bytes(n) -> bytes\n\
|
||||
\n\
|
||||
Generate n cryptographically strong pseudo-random bytes.");
|
||||
|
||||
static PyObject *
|
||||
PySSL_RAND_pseudo_bytes(PyObject *self, PyObject *args)
|
||||
{
|
||||
int len;
|
||||
if (!PyArg_ParseTuple(args, "i:RAND_pseudo_bytes", &len))
|
||||
return NULL;
|
||||
return PySSL_RAND(len, 1);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(PySSL_RAND_pseudo_bytes_doc,
|
||||
"RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)\n\
|
||||
\n\
|
||||
Generate n pseudo-random bytes. is_cryptographic is True if the bytes\
|
||||
generated are cryptographically strong.");
|
||||
|
||||
static PyObject *
|
||||
PySSL_RAND_status(PyObject *self)
|
||||
{
|
||||
|
|
@ -1939,6 +2002,10 @@ static PyMethodDef PySSL_methods[] = {
|
|||
#ifdef HAVE_OPENSSL_RAND
|
||||
{"RAND_add", PySSL_RAND_add, METH_VARARGS,
|
||||
PySSL_RAND_add_doc},
|
||||
{"RAND_bytes", PySSL_RAND_bytes, METH_VARARGS,
|
||||
PySSL_RAND_bytes_doc},
|
||||
{"RAND_pseudo_bytes", PySSL_RAND_pseudo_bytes, METH_VARARGS,
|
||||
PySSL_RAND_pseudo_bytes_doc},
|
||||
{"RAND_egd", PySSL_RAND_egd, METH_VARARGS,
|
||||
PySSL_RAND_egd_doc},
|
||||
{"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
|
||||
|
|
|
|||
|
|
@ -1098,7 +1098,7 @@ thread_PyThread_exit_thread(PyObject *self)
|
|||
|
||||
PyDoc_STRVAR(exit_doc,
|
||||
"exit()\n\
|
||||
(PyThread_exit_thread() is an obsolete synonym)\n\
|
||||
(exit_thread() is an obsolete synonym)\n\
|
||||
\n\
|
||||
This is synonymous to ``raise SystemExit''. It will cause the current\n\
|
||||
thread to exit silently unless the exception is caught.");
|
||||
|
|
|
|||
|
|
@ -115,55 +115,56 @@ DECODER(big5hkscs)
|
|||
|
||||
REQUIRE_INBUF(2)
|
||||
|
||||
if (0xc6 <= c && c <= 0xc8 && (c >= 0xc7 || IN2 >= 0xa1))
|
||||
goto hkscsdec;
|
||||
|
||||
TRYMAP_DEC(big5, **outbuf, c, IN2) {
|
||||
NEXT(2, 1)
|
||||
if (0xc6 > c || c > 0xc8 || (c < 0xc7 && IN2 < 0xa1)) {
|
||||
TRYMAP_DEC(big5, **outbuf, c, IN2) {
|
||||
NEXT(2, 1)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
hkscsdec: TRYMAP_DEC(big5hkscs, decoded, c, IN2) {
|
||||
int s = BH2S(c, IN2);
|
||||
const unsigned char *hintbase;
|
||||
|
||||
assert(0x87 <= c && c <= 0xfe);
|
||||
assert(0x40 <= IN2 && IN2 <= 0xfe);
|
||||
TRYMAP_DEC(big5hkscs, decoded, c, IN2)
|
||||
{
|
||||
int s = BH2S(c, IN2);
|
||||
const unsigned char *hintbase;
|
||||
|
||||
if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
|
||||
hintbase = big5hkscs_phint_0;
|
||||
s -= BH2S(0x87, 0x40);
|
||||
}
|
||||
else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){
|
||||
hintbase = big5hkscs_phint_12130;
|
||||
s -= BH2S(0xc6, 0xa1);
|
||||
}
|
||||
else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){
|
||||
hintbase = big5hkscs_phint_21924;
|
||||
s -= BH2S(0xf9, 0xd6);
|
||||
}
|
||||
else
|
||||
return MBERR_INTERNAL;
|
||||
assert(0x87 <= c && c <= 0xfe);
|
||||
assert(0x40 <= IN2 && IN2 <= 0xfe);
|
||||
|
||||
if (hintbase[s >> 3] & (1 << (s & 7))) {
|
||||
WRITEUCS4(decoded | 0x20000)
|
||||
NEXT_IN(2)
|
||||
}
|
||||
else {
|
||||
OUT1(decoded)
|
||||
NEXT(2, 1)
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch ((c << 8) | IN2) {
|
||||
case 0x8862: WRITE2(0x00ca, 0x0304); break;
|
||||
case 0x8864: WRITE2(0x00ca, 0x030c); break;
|
||||
case 0x88a3: WRITE2(0x00ea, 0x0304); break;
|
||||
case 0x88a5: WRITE2(0x00ea, 0x030c); break;
|
||||
default: return 2;
|
||||
}
|
||||
if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
|
||||
hintbase = big5hkscs_phint_0;
|
||||
s -= BH2S(0x87, 0x40);
|
||||
}
|
||||
else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){
|
||||
hintbase = big5hkscs_phint_12130;
|
||||
s -= BH2S(0xc6, 0xa1);
|
||||
}
|
||||
else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){
|
||||
hintbase = big5hkscs_phint_21924;
|
||||
s -= BH2S(0xf9, 0xd6);
|
||||
}
|
||||
else
|
||||
return MBERR_INTERNAL;
|
||||
|
||||
NEXT(2, 2) /* all decoded codepoints are pairs, above. */
|
||||
if (hintbase[s >> 3] & (1 << (s & 7))) {
|
||||
WRITEUCS4(decoded | 0x20000)
|
||||
NEXT_IN(2)
|
||||
}
|
||||
else {
|
||||
OUT1(decoded)
|
||||
NEXT(2, 1)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch ((c << 8) | IN2) {
|
||||
case 0x8862: WRITE2(0x00ca, 0x0304); break;
|
||||
case 0x8864: WRITE2(0x00ca, 0x030c); break;
|
||||
case 0x88a3: WRITE2(0x00ea, 0x0304); break;
|
||||
case 0x88a5: WRITE2(0x00ea, 0x030c); break;
|
||||
default: return 2;
|
||||
}
|
||||
|
||||
NEXT(2, 2) /* all decoded codepoints are pairs, above. */
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -371,11 +371,11 @@ DECODER(euc_jp)
|
|||
|
||||
REQUIRE_OUTBUF(1)
|
||||
|
||||
if (c < 0x80) {
|
||||
OUT1(c)
|
||||
NEXT(1, 1)
|
||||
continue;
|
||||
}
|
||||
if (c < 0x80) {
|
||||
OUT1(c)
|
||||
NEXT(1, 1)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c == 0x8e) {
|
||||
/* JIS X 0201 half-width katakana */
|
||||
|
|
|
|||
|
|
@ -479,7 +479,7 @@ multibytecodec_encode(MultibyteCodec *codec,
|
|||
MultibyteEncodeBuffer buf;
|
||||
Py_ssize_t finalsize, r = 0;
|
||||
|
||||
if (datalen == 0)
|
||||
if (datalen == 0 && !(flags & MBENC_RESET))
|
||||
return PyBytes_FromStringAndSize(NULL, 0);
|
||||
|
||||
buf.excobj = NULL;
|
||||
|
|
@ -515,7 +515,7 @@ multibytecodec_encode(MultibyteCodec *codec,
|
|||
break;
|
||||
}
|
||||
|
||||
if (codec->encreset != NULL)
|
||||
if (codec->encreset != NULL && (flags & MBENC_RESET))
|
||||
for (;;) {
|
||||
Py_ssize_t outleft;
|
||||
|
||||
|
|
@ -785,8 +785,8 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
|
|||
inbuf_end = inbuf + datalen;
|
||||
|
||||
r = multibytecodec_encode(ctx->codec, &ctx->state,
|
||||
(const Py_UNICODE **)&inbuf,
|
||||
datalen, ctx->errors, final ? MBENC_FLUSH : 0);
|
||||
(const Py_UNICODE **)&inbuf, datalen,
|
||||
ctx->errors, final ? MBENC_FLUSH | MBENC_RESET : 0);
|
||||
if (r == NULL) {
|
||||
/* recover the original pending buffer */
|
||||
if (origpending > 0)
|
||||
|
|
@ -901,11 +901,17 @@ mbiencoder_encode(MultibyteIncrementalEncoderObject *self,
|
|||
static PyObject *
|
||||
mbiencoder_reset(MultibyteIncrementalEncoderObject *self)
|
||||
{
|
||||
if (self->codec->decreset != NULL &&
|
||||
self->codec->decreset(&self->state, self->codec->config) != 0)
|
||||
return NULL;
|
||||
/* Longest output: 4 bytes (b'\x0F\x1F(B') with ISO 2022 */
|
||||
unsigned char buffer[4], *outbuf;
|
||||
Py_ssize_t r;
|
||||
if (self->codec->encreset != NULL) {
|
||||
outbuf = buffer;
|
||||
r = self->codec->encreset(&self->state, self->codec->config,
|
||||
&outbuf, sizeof(buffer));
|
||||
if (r != 0)
|
||||
return NULL;
|
||||
}
|
||||
self->pendingsize = 0;
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -854,7 +854,7 @@ faulthandler_fatal_error_py(PyObject *self, PyObject *args)
|
|||
}
|
||||
|
||||
#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
|
||||
void*
|
||||
static void*
|
||||
stack_overflow(void *min_sp, void *max_sp, size_t *depth)
|
||||
{
|
||||
/* allocate 4096 bytes on the stack at each call */
|
||||
|
|
@ -1005,9 +1005,10 @@ static int
|
|||
faulthandler_env_options(void)
|
||||
{
|
||||
PyObject *xoptions, *key, *module, *res;
|
||||
int enable;
|
||||
|
||||
if (!Py_GETENV("PYTHONFAULTHANDLER")) {
|
||||
int has_key;
|
||||
|
||||
xoptions = PySys_GetXOptions();
|
||||
if (xoptions == NULL)
|
||||
return -1;
|
||||
|
|
@ -1016,13 +1017,11 @@ faulthandler_env_options(void)
|
|||
if (key == NULL)
|
||||
return -1;
|
||||
|
||||
enable = PyDict_Contains(xoptions, key);
|
||||
has_key = PyDict_Contains(xoptions, key);
|
||||
Py_DECREF(key);
|
||||
if (!enable)
|
||||
if (!has_key)
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
enable = 1;
|
||||
|
||||
module = PyImport_ImportModule("faulthandler");
|
||||
if (module == NULL) {
|
||||
|
|
|
|||
|
|
@ -581,10 +581,11 @@ parser_do_parse(PyObject *args, PyObject *kw, char *argspec, int type)
|
|||
if (res)
|
||||
((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK;
|
||||
}
|
||||
else
|
||||
else {
|
||||
PyParser_SetError(&err);
|
||||
PyParser_ClearError(&err);
|
||||
}
|
||||
}
|
||||
PyParser_ClearError(&err);
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6547,6 +6547,31 @@ posix_pipe(PyObject *self, PyObject *noargs)
|
|||
}
|
||||
#endif /* HAVE_PIPE */
|
||||
|
||||
#ifdef HAVE_PIPE2
|
||||
PyDoc_STRVAR(posix_pipe2__doc__,
|
||||
"pipe2(flags=0) -> (read_end, write_end)\n\n\
|
||||
Create a pipe with flags set atomically.\
|
||||
flags is optional and can be constructed by ORing together zero or more\n\
|
||||
of these values: O_NONBLOCK, O_CLOEXEC.\n\
|
||||
");
|
||||
|
||||
static PyObject *
|
||||
posix_pipe2(PyObject *self, PyObject *args)
|
||||
{
|
||||
int flags = 0;
|
||||
int fds[2];
|
||||
int res;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|i:pipe2", &flags))
|
||||
return NULL;
|
||||
|
||||
res = pipe2(fds, flags);
|
||||
if (res != 0)
|
||||
return posix_error();
|
||||
return Py_BuildValue("(ii)", fds[0], fds[1]);
|
||||
}
|
||||
#endif /* HAVE_PIPE2 */
|
||||
|
||||
#ifdef HAVE_WRITEV
|
||||
PyDoc_STRVAR(posix_writev__doc__,
|
||||
"writev(fd, buffers) -> byteswritten\n\n\
|
||||
|
|
@ -8495,6 +8520,9 @@ static PyObject *
|
|||
device_encoding(PyObject *self, PyObject *args)
|
||||
{
|
||||
int fd;
|
||||
#if defined(MS_WINDOWS) || defined(MS_WIN64)
|
||||
UINT cp;
|
||||
#endif
|
||||
if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
|
||||
return NULL;
|
||||
if (!_PyVerify_fd(fd) || !isatty(fd)) {
|
||||
|
|
@ -8502,16 +8530,16 @@ device_encoding(PyObject *self, PyObject *args)
|
|||
return Py_None;
|
||||
}
|
||||
#if defined(MS_WINDOWS) || defined(MS_WIN64)
|
||||
if (fd == 0) {
|
||||
char buf[100];
|
||||
sprintf(buf, "cp%d", GetConsoleCP());
|
||||
return PyUnicode_FromString(buf);
|
||||
}
|
||||
if (fd == 1 || fd == 2) {
|
||||
char buf[100];
|
||||
sprintf(buf, "cp%d", GetConsoleOutputCP());
|
||||
return PyUnicode_FromString(buf);
|
||||
}
|
||||
if (fd == 0)
|
||||
cp = GetConsoleCP();
|
||||
else if (fd == 1 || fd == 2)
|
||||
cp = GetConsoleOutputCP();
|
||||
else
|
||||
cp = 0;
|
||||
/* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application
|
||||
has no console */
|
||||
if (cp != 0)
|
||||
return PyUnicode_FromFormat("cp%u", (unsigned int)cp);
|
||||
#elif defined(CODESET)
|
||||
{
|
||||
char *codeset = nl_langinfo(CODESET);
|
||||
|
|
@ -9438,6 +9466,9 @@ static PyMethodDef posix_methods[] = {
|
|||
#ifdef HAVE_PIPE
|
||||
{"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__},
|
||||
#endif
|
||||
#ifdef HAVE_PIPE2
|
||||
{"pipe2", posix_pipe2, METH_VARARGS, posix_pipe2__doc__},
|
||||
#endif
|
||||
#ifdef HAVE_MKFIFO
|
||||
{"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1622,26 +1622,6 @@ static struct PyMethodDef pyexpat_methods[] = {
|
|||
PyDoc_STRVAR(pyexpat_module_documentation,
|
||||
"Python wrapper for Expat parser.");
|
||||
|
||||
/* Return a Python string that represents the version number without the
|
||||
* extra cruft added by revision control, even if the right options were
|
||||
* given to the "cvs export" command to make it not include the extra
|
||||
* cruft.
|
||||
*/
|
||||
static PyObject *
|
||||
get_version_string(void)
|
||||
{
|
||||
static char *rcsid = "$Revision$";
|
||||
char *rev = rcsid;
|
||||
int i = 0;
|
||||
|
||||
while (!isdigit(Py_CHARMASK(*rev)))
|
||||
++rev;
|
||||
while (rev[i] != ' ' && rev[i] != '\0')
|
||||
++i;
|
||||
|
||||
return PyUnicode_FromStringAndSize(rev, i);
|
||||
}
|
||||
|
||||
/* Initialization function for the module */
|
||||
|
||||
#ifndef MODULE_NAME
|
||||
|
|
@ -1718,7 +1698,6 @@ MODULE_INITFUNC(void)
|
|||
Py_INCREF(&Xmlparsetype);
|
||||
PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);
|
||||
|
||||
PyModule_AddObject(m, "__version__", get_version_string());
|
||||
PyModule_AddStringConstant(m, "EXPAT_VERSION",
|
||||
(char *) XML_ExpatVersion());
|
||||
{
|
||||
|
|
|
|||
|
|
@ -177,17 +177,18 @@ static void
|
|||
trip_signal(int sig_num)
|
||||
{
|
||||
unsigned char byte;
|
||||
|
||||
Handlers[sig_num].tripped = 1;
|
||||
if (wakeup_fd != -1) {
|
||||
byte = (unsigned char)sig_num;
|
||||
write(wakeup_fd, &byte, 1);
|
||||
}
|
||||
if (is_tripped)
|
||||
return;
|
||||
/* Set is_tripped after setting .tripped, as it gets
|
||||
cleared in PyErr_CheckSignals() before .tripped. */
|
||||
is_tripped = 1;
|
||||
Py_AddPendingCall(checksignals_witharg, NULL);
|
||||
if (wakeup_fd != -1) {
|
||||
byte = (unsigned char)sig_num;
|
||||
write(wakeup_fd, &byte, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -2782,6 +2782,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
|
|||
PyErr_Format(PyExc_TypeError,
|
||||
"sendto() takes 2 or 3 arguments (%d given)",
|
||||
arglen);
|
||||
return NULL;
|
||||
}
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
@ -3144,7 +3145,7 @@ socket_gethostname(PyObject *self, PyObject *unused)
|
|||
}
|
||||
return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError());
|
||||
}
|
||||
return PyUnicode_FromUnicode(buf, size);
|
||||
return PyUnicode_FromUnicode(buf, size);
|
||||
#else
|
||||
char buf[1024];
|
||||
int res;
|
||||
|
|
@ -4038,7 +4039,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
|
|||
static PyObject *
|
||||
socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
|
||||
{
|
||||
static char* kwnames[] = {"host", "port", "family", "type", "proto",
|
||||
static char* kwnames[] = {"host", "port", "family", "type", "proto",
|
||||
"flags", 0};
|
||||
struct addrinfo hints, *res;
|
||||
struct addrinfo *res0 = NULL;
|
||||
|
|
@ -4053,7 +4054,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
|
|||
|
||||
family = socktype = protocol = flags = 0;
|
||||
family = AF_UNSPEC;
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
|
||||
kwnames, &hobj, &pobj, &family, &socktype,
|
||||
&protocol, &flags)) {
|
||||
return NULL;
|
||||
|
|
@ -4289,7 +4290,7 @@ socket_if_nameindex(PyObject *self, PyObject *arg)
|
|||
PyObject *list;
|
||||
int i;
|
||||
struct if_nameindex *ni;
|
||||
|
||||
|
||||
ni = if_nameindex();
|
||||
if (ni == NULL) {
|
||||
PyErr_SetFromErrno(socket_error);
|
||||
|
|
|
|||
|
|
@ -1196,7 +1196,7 @@ get_module_code(ZipImporter *self, PyObject *fullname,
|
|||
int *p_ispackage, PyObject **p_modpath)
|
||||
{
|
||||
PyObject *code = NULL, *toc_entry, *subname;
|
||||
PyObject *path, *fullpath;
|
||||
PyObject *path, *fullpath = NULL;
|
||||
struct st_zip_searchorder *zso;
|
||||
|
||||
subname = get_subname(fullname);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue