##// END OF EJS Templates
auto-upgrade: add a test case with no permission to lock the repository...
auto-upgrade: add a test case with no permission to lock the repository This show the current behavior when the repository is unlockable. The current behavior is to abort, which is probably not great. Now that we have a proper test, we can think about the behavior we want in a later changeset. Differential Revision: https://phab.mercurial-scm.org/D12615

File last commit:

r49676:b0dd39b9 default
r50091:1c233af9 default
Show More
charencode.c
404 lines | 10.8 KiB | text/x-c | CLexer
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 /*
charencode.c - miscellaneous character encoding
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 Copyright 2008 Olivia Mackall <olivia@selenic.com> and others
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
This software may be used and distributed according to the terms of
the GNU General Public License, incorporated herein by reference.
*/
Yuya Nishihara
cext: modernize charencode.c to use Py_ssize_t
r33754 #define PY_SSIZE_T_CLEAN
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 #include <Python.h>
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 #include <assert.h>
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
Yuya Nishihara
cext: factor out header for charencode.c...
r33753 #include "charencode.h"
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 #include "compat.h"
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 #include "util.h"
Augie Fackler
parsers: protect some case-folding tables from clang-format...
r34861 /* clang-format off */
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 static const char lowertable[128] = {
'\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
'\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
'\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
'\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
'\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27',
'\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
'\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
'\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
'\x40',
'\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', /* A-G */
'\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', /* H-O */
'\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', /* P-W */
'\x78', '\x79', '\x7a', /* X-Z */
'\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
'\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67',
'\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f',
'\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77',
'\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f'
};
static const char uppertable[128] = {
'\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
'\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
'\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
'\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
'\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27',
'\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
'\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
'\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
'\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47',
'\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f',
'\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57',
'\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
'\x60',
'\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', /* a-g */
'\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', /* h-o */
'\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', /* p-w */
'\x58', '\x59', '\x5a', /* x-z */
'\x7b', '\x7c', '\x7d', '\x7e', '\x7f'
};
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 /* 1: no escape, 2: \<c>, 6: \u<x> */
static const uint8_t jsonlentable[256] = {
6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 6, 2, 2, 6, 6, /* b, t, n, f, r */
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* " */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, /* \\ */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, /* DEL */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
static const uint8_t jsonparanoidlentable[128] = {
6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 6, 2, 2, 6, 6, /* b, t, n, f, r */
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* " */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 6, 1, /* <, > */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, /* \\ */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, /* DEL */
};
static const char hexchartable[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
};
Augie Fackler
charencode: adjust clang-format enable/disable comments...
r36075 /* clang-format on */
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 /*
* Turn a hex-encoded string into binary.
*/
Yuya Nishihara
cext: modernize charencode.c to use Py_ssize_t
r33754 PyObject *unhexlify(const char *str, Py_ssize_t len)
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 {
PyObject *ret;
char *d;
Yuya Nishihara
cext: modernize charencode.c to use Py_ssize_t
r33754 Py_ssize_t i;
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
ret = PyBytes_FromStringAndSize(NULL, len / 2);
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (!ret) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
d = PyBytes_AsString(ret);
for (i = 0; i < len;) {
int hi = hexdigit(str, i++);
int lo = hexdigit(str, i++);
*d++ = (hi << 4) | lo;
}
return ret;
}
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 PyObject *isasciistr(PyObject *self, PyObject *args)
{
const char *buf;
Py_ssize_t i, len;
Gregory Szorc
cext: remove PY23()...
r49676 if (!PyArg_ParseTuple(args, "y#:isasciistr", &buf, &len)) {
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 i = 0;
/* char array in PyStringObject should be at least 4-byte aligned */
if (((uintptr_t)buf & 3) == 0) {
const uint32_t *p = (const uint32_t *)buf;
for (; i < len / 4; i++) {
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (p[i] & 0x80808080U) {
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 Py_RETURN_FALSE;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 }
i *= 4;
}
for (; i < len; i++) {
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (buf[i] & 0x80) {
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 Py_RETURN_FALSE;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 }
Py_RETURN_TRUE;
}
Augie Fackler
charencode: allow clang-format oversight...
r36243 static inline PyObject *
_asciitransform(PyObject *str_obj, const char table[128], PyObject *fallback_fn)
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 {
char *str, *newstr;
Py_ssize_t i, len;
PyObject *newobj = NULL;
PyObject *ret = NULL;
str = PyBytes_AS_STRING(str_obj);
len = PyBytes_GET_SIZE(str_obj);
newobj = PyBytes_FromStringAndSize(NULL, len);
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (!newobj) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 goto quit;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
newstr = PyBytes_AS_STRING(newobj);
for (i = 0; i < len; i++) {
char c = str[i];
if (c & 0x80) {
if (fallback_fn != NULL) {
Augie Fackler
charencode: allow clang-format oversight...
r36243 ret = PyObject_CallFunctionObjArgs(
fallback_fn, str_obj, NULL);
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 } else {
PyObject *err = PyUnicodeDecodeError_Create(
Augie Fackler
charencode: allow clang-format oversight...
r36243 "ascii", str, len, i, (i + 1),
"unexpected code byte");
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 PyErr_SetObject(PyExc_UnicodeDecodeError, err);
Py_XDECREF(err);
}
goto quit;
}
newstr[i] = table[(unsigned char)c];
}
ret = newobj;
Py_INCREF(ret);
quit:
Py_XDECREF(newobj);
return ret;
}
PyObject *asciilower(PyObject *self, PyObject *args)
{
PyObject *str_obj;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj)) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 return _asciitransform(str_obj, lowertable, NULL);
}
PyObject *asciiupper(PyObject *self, PyObject *args)
{
PyObject *str_obj;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj)) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 return _asciitransform(str_obj, uppertable, NULL);
}
PyObject *make_file_foldmap(PyObject *self, PyObject *args)
{
PyObject *dmap, *spec_obj, *normcase_fallback;
PyObject *file_foldmap = NULL;
enum normcase_spec spec;
PyObject *k, *v;
dirstate-item: rename the class to DirstateItem...
r48328 dirstateItemObject *tuple;
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 Py_ssize_t pos = 0;
const char *table;
Augie Fackler
charencode: allow clang-format oversight...
r36243 if (!PyArg_ParseTuple(args, "O!O!O!:make_file_foldmap", &PyDict_Type,
Gregory Szorc
cext: drop preprocessor PyInt aliases...
r49666 &dmap, &PyLong_Type, &spec_obj, &PyFunction_Type,
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 &normcase_fallback)) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 goto quit;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
Gregory Szorc
cext: drop preprocessor PyInt aliases...
r49666 spec = (int)PyLong_AS_LONG(spec_obj);
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 switch (spec) {
case NORMCASE_LOWER:
table = lowertable;
break;
case NORMCASE_UPPER:
table = uppertable;
break;
case NORMCASE_OTHER:
table = NULL;
break;
default:
PyErr_SetString(PyExc_TypeError, "invalid normcasespec");
goto quit;
}
/* Add some more entries to deal with additions outside this
function. */
file_foldmap = _dict_new_presized((PyDict_Size(dmap) / 10) * 11);
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (file_foldmap == NULL) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 goto quit;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752
while (PyDict_Next(dmap, &pos, &k, &v)) {
if (!dirstate_tuple_check(v)) {
PyErr_SetString(PyExc_TypeError,
Augie Fackler
charencode: allow clang-format oversight...
r36243 "expected a dirstate tuple");
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 goto quit;
}
dirstate-item: rename the class to DirstateItem...
r48328 tuple = (dirstateItemObject *)v;
dirstate-item: move the C implementation to the same logic...
r48760 if (tuple->flags | dirstate_flag_wc_tracked) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 PyObject *normed;
if (table != NULL) {
normed = _asciitransform(k, table,
Augie Fackler
charencode: allow clang-format oversight...
r36243 normcase_fallback);
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 } else {
normed = PyObject_CallFunctionObjArgs(
Augie Fackler
charencode: allow clang-format oversight...
r36243 normcase_fallback, k, NULL);
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 }
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (normed == NULL) {
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 goto quit;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
cext: split character encoding functions to new compilation unit...
r33752 if (PyDict_SetItem(file_foldmap, normed, k) == -1) {
Py_DECREF(normed);
goto quit;
}
Py_DECREF(normed);
}
}
return file_foldmap;
quit:
Py_XDECREF(file_foldmap);
return NULL;
}
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926
/* calculate length of JSON-escaped string; returns -1 if unsupported */
static Py_ssize_t jsonescapelen(const char *buf, Py_ssize_t len, bool paranoid)
{
Py_ssize_t i, esclen = 0;
if (paranoid) {
/* don't want to process multi-byte escapes in C */
for (i = 0; i < len; i++) {
char c = buf[i];
if (c & 0x80) {
PyErr_SetString(PyExc_ValueError,
Augie Fackler
charencode: allow clang-format oversight...
r36243 "cannot process non-ascii str");
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 return -1;
}
esclen += jsonparanoidlentable[(unsigned char)c];
Yuya Nishihara
encoding: check overflow while calculating size of JSON escape buffer...
r34032 if (esclen < 0) {
PyErr_SetString(PyExc_MemoryError,
Augie Fackler
charencode: allow clang-format oversight...
r36243 "overflow in jsonescapelen");
Yuya Nishihara
encoding: check overflow while calculating size of JSON escape buffer...
r34032 return -1;
}
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 }
} else {
for (i = 0; i < len; i++) {
char c = buf[i];
esclen += jsonlentable[(unsigned char)c];
Yuya Nishihara
encoding: check overflow while calculating size of JSON escape buffer...
r34032 if (esclen < 0) {
PyErr_SetString(PyExc_MemoryError,
Augie Fackler
charencode: allow clang-format oversight...
r36243 "overflow in jsonescapelen");
Yuya Nishihara
encoding: check overflow while calculating size of JSON escape buffer...
r34032 return -1;
}
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 }
}
return esclen;
}
/* map '\<c>' escape character */
static char jsonescapechar2(char c)
{
switch (c) {
Gregory Szorc
cext: put case statements on separate line...
r34440 case '\b':
return 'b';
case '\t':
return 't';
case '\n':
return 'n';
case '\f':
return 'f';
case '\r':
return 'r';
case '"':
return '"';
case '\\':
return '\\';
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 }
Augie Fackler
charencode: allow clang-format oversight...
r36243 return '\0'; /* should not happen */
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 }
/* convert 'origbuf' to JSON-escaped form 'escbuf'; 'origbuf' should only
include characters mappable by json(paranoid)lentable */
static void encodejsonescape(char *escbuf, Py_ssize_t esclen,
Augie Fackler
charencode: allow clang-format oversight...
r36243 const char *origbuf, Py_ssize_t origlen,
bool paranoid)
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 {
const uint8_t *lentable =
Augie Fackler
charencode: allow clang-format oversight...
r36243 (paranoid) ? jsonparanoidlentable : jsonlentable;
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 Py_ssize_t i, j;
for (i = 0, j = 0; i < origlen; i++) {
char c = origbuf[i];
uint8_t l = lentable[(unsigned char)c];
assert(j + l <= esclen);
switch (l) {
case 1:
escbuf[j] = c;
break;
case 2:
escbuf[j] = '\\';
escbuf[j + 1] = jsonescapechar2(c);
break;
case 6:
memcpy(escbuf + j, "\\u00", 4);
escbuf[j + 4] = hexchartable[(unsigned char)c >> 4];
escbuf[j + 5] = hexchartable[(unsigned char)c & 0xf];
break;
}
j += l;
}
}
PyObject *jsonescapeu8fast(PyObject *self, PyObject *args)
{
PyObject *origstr, *escstr;
const char *origbuf;
Py_ssize_t origlen, esclen;
int paranoid;
Augie Fackler
charencode: allow clang-format oversight...
r36243 if (!PyArg_ParseTuple(args, "O!i:jsonescapeu8fast", &PyBytes_Type,
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 &origstr, &paranoid)) {
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926
origbuf = PyBytes_AS_STRING(origstr);
origlen = PyBytes_GET_SIZE(origstr);
esclen = jsonescapelen(origbuf, origlen, paranoid);
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (esclen < 0) {
Augie Fackler
charencode: allow clang-format oversight...
r36243 return NULL; /* unsupported char found or overflow */
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 if (origlen == esclen) {
Py_INCREF(origstr);
return origstr;
}
escstr = PyBytes_FromStringAndSize(NULL, esclen);
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 if (!escstr) {
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 return NULL;
Augie Fackler
cleanup: use clang-tidy to add missing {} around one-line statements...
r41367 }
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926 encodejsonescape(PyBytes_AS_STRING(escstr), esclen, origbuf, origlen,
Augie Fackler
charencode: allow clang-format oversight...
r36243 paranoid);
Yuya Nishihara
encoding: add fast path of jsonescape() (issue5533)...
r33926
return escstr;
}