15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Python.h" 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "structmember.h" 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if PY_VERSION_HEX < 0x02070000 && !defined(PyOS_string_to_double) 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyOS_string_to_double json_PyOS_string_to_double 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static double 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception); 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static double 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) { 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double x; 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(endptr == NULL); 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(overflow_exception == NULL); 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyFPE_START_PROTECT("json_PyOS_string_to_double", return -1.0;) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x = PyOS_ascii_atof(s); 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyFPE_END_PROTECT(x) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return x; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if PY_VERSION_HEX < 0x02060000 && !defined(Py_SIZE) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int Py_ssize_t; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PY_SSIZE_T_MAX INT_MAX 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PY_SSIZE_T_MIN INT_MIN 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyInt_FromSsize_t PyInt_FromLong 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyInt_AsSsize_t PyInt_AsLong 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef Py_IS_FINITE 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef __GNUC__ 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UNUSED __attribute__((__unused__)) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UNUSED 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEFAULT_ENCODING "utf-8" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyTypeObject PyScannerType; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyTypeObject PyEncoderType; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct _PyScannerObject { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_HEAD 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoding; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *strict; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *object_hook; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pairs_hook; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *parse_float; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *parse_int; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *parse_constant; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *memo; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} PyScannerObject; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyMemberDef scanner_members[] = { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"encoding", T_OBJECT, offsetof(PyScannerObject, encoding), READONLY, "encoding"}, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"}, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"}, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, pairs_hook), READONLY, "object_pairs_hook"}, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"}, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"}, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"}, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {NULL} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct _PyEncoderObject { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_HEAD 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *markers; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *defaultfn; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoder; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *indent; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *key_separator; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item_separator; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *sort_keys; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *skipkeys; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *key_memo; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *Decimal; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int fast_encode; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int allow_nan; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int use_decimal; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int namedtuple_as_object; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int tuple_as_array; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bigint_as_string; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item_sort_key; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} PyEncoderObject; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyMemberDef encoder_members[] = { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"markers", T_OBJECT, offsetof(PyEncoderObject, markers), READONLY, "markers"}, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"default", T_OBJECT, offsetof(PyEncoderObject, defaultfn), READONLY, "default"}, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"encoder", T_OBJECT, offsetof(PyEncoderObject, encoder), READONLY, "encoder"}, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"indent", T_OBJECT, offsetof(PyEncoderObject, indent), READONLY, "indent"}, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"key_separator", T_OBJECT, offsetof(PyEncoderObject, key_separator), READONLY, "key_separator"}, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"item_separator", T_OBJECT, offsetof(PyEncoderObject, item_separator), READONLY, "item_separator"}, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"sort_keys", T_OBJECT, offsetof(PyEncoderObject, sort_keys), READONLY, "sort_keys"}, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"skipkeys", T_OBJECT, offsetof(PyEncoderObject, skipkeys), READONLY, "skipkeys"}, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"key_memo", T_OBJECT, offsetof(PyEncoderObject, key_memo), READONLY, "key_memo"}, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"item_sort_key", T_OBJECT, offsetof(PyEncoderObject, item_sort_key), READONLY, "item_sort_key"}, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {NULL} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)maybe_quote_bigint(PyObject *encoded, PyObject *obj); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Py_ssize_t 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ascii_escape_unicode(PyObject *pystr); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ascii_escape_str(PyObject *pystr); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void init_speedups(void); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_init(PyObject *self, PyObject *args, PyObject *kwds); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_dealloc(PyObject *self); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_clear(PyObject *self); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_init(PyObject *self, PyObject *args, PyObject *kwds); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_dealloc(PyObject *self); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_clear(PyObject *self); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_encoded_const(PyObject *obj); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)raise_errmsg(char *msg, PyObject *s, Py_ssize_t end); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_encode_string(PyEncoderObject *s, PyObject *obj); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_encode_float(PyEncoderObject *s, PyObject *obj); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_is_namedtuple(PyObject *obj); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"') 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r')) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MIN_EXPANSION 6 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef Py_UNICODE_WIDE 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_EXPANSION (2 * MIN_EXPANSION) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_EXPANSION MIN_EXPANSION 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)maybe_quote_bigint(PyObject *encoded, PyObject *obj) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *big_long = NULL; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *small_long = NULL; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (big_long == NULL) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) big_long = PyLong_FromLongLong(1LL << 53); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (big_long == NULL) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(encoded); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (small_long == NULL) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) small_long = PyLong_FromLongLong(-1LL << 53); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (small_long == NULL) { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(encoded); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyObject_RichCompareBool(obj, big_long, Py_GE) || 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_RichCompareBool(obj, small_long, Py_LE)) { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject* quoted = PyString_FromFormat("\"%s\"", 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyString_AsString(encoded)); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(encoded); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoded = quoted; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return encoded; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_is_namedtuple(PyObject *obj) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rval = 0; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *_asdict = PyObject_GetAttrString(obj, "_asdict"); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (_asdict == NULL) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Clear(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyCallable_Check(_asdict); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(_asdict); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* PyObject to Py_ssize_t converter */ 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *size_ptr = PyInt_AsSsize_t(o); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*size_ptr == -1 && PyErr_Occurred()) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Py_ssize_t to PyObject converter */ 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyInt_FromSsize_t(*size_ptr); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Py_ssize_t 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Escape unicode code point c to ASCII escape sequences 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) in char *output. output must have at least 12 bytes unused to 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accommodate an escaped surrogate pair "\uXXXX\uXXXX" */ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = '\\'; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (c) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\\': output[chars++] = (char)c; break; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '"': output[chars++] = (char)c; break; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\b': output[chars++] = 'b'; break; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\f': output[chars++] = 'f'; break; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\n': output[chars++] = 'n'; break; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\r': output[chars++] = 'r'; break; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\t': output[chars++] = 't'; break; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef Py_UNICODE_WIDE 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (c >= 0x10000) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* UTF-16 surrogate pair */ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_UNICODE v = c - 0x10000; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 0xd800 | ((v >> 10) & 0x3ff); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = 'u'; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c ) & 0xf]; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = 0xdc00 | (v & 0x3ff); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = '\\'; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = 'u'; 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[chars++] = "0123456789abcdef"[(c ) & 0xf]; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chars; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ascii_escape_unicode(PyObject *pystr) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Take a PyUnicode pystr and return a new ASCII-only escaped PyString */ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t i; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t input_chars; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t output_size; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t max_output_size; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t chars; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *rval; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *output; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_UNICODE *input_unicode; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_chars = PyUnicode_GET_SIZE(pystr); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_unicode = PyUnicode_AS_UNICODE(pystr); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* One char input can be up to 6 chars output, estimate 4 of these */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_size = 2 + (MIN_EXPANSION * 4) + input_chars; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_output_size = 2 + (input_chars * MAX_EXPANSION); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rval = PyString_FromStringAndSize(NULL, output_size); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rval == NULL) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output = PyString_AS_STRING(rval); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chars = 0; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = '"'; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < input_chars; i++) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_UNICODE c = input_unicode[i]; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (S_CHAR(c)) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = (char)c; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chars = ascii_escape_char(c, output, chars); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output_size - chars < (1 + MAX_EXPANSION)) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* There's more than four, so let's resize by a lot */ 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t new_output_size = output_size * 2; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This is an upper bound */ 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_output_size > max_output_size) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_output_size = max_output_size; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Make sure that the output size changed before resizing */ 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_output_size != output_size) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_size = new_output_size; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (_PyString_Resize(&rval, output_size) == -1) { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output = PyString_AS_STRING(rval); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = '"'; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_PyString_Resize(&rval, chars) == -1) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rval; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ascii_escape_str(PyObject *pystr) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Take a PyString pystr and return a new ASCII-only escaped PyString */ 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t i; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t input_chars; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t output_size; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Py_ssize_t chars; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PyObject *rval; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *output; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *input_str; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_chars = PyString_GET_SIZE(pystr); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_str = PyString_AS_STRING(pystr); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Fast path for a string that's already ASCII */ 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (i = 0; i < input_chars; i++) { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!S_CHAR(c)) { 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* If we have to escape something, scan the string for unicode */ 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t j; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (j = i; j < input_chars; j++) { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = (Py_UNICODE)(unsigned char)input_str[j]; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c > 0x7f) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* We hit a non-ASCII character, bail to unicode mode */ 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *uni; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uni = PyUnicode_DecodeUTF8(input_str, input_chars, "strict"); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (uni == NULL) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = ascii_escape_unicode(uni); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(uni); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i == input_chars) { 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Input is already ASCII */ 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_size = 2 + input_chars; 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* One char input can be up to 6 chars output, estimate 4 of these */ 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_size = 2 + (MIN_EXPANSION * 4) + input_chars; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rval = PyString_FromStringAndSize(NULL, output_size); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rval == NULL) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output = PyString_AS_STRING(rval); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output[0] = '"'; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* We know that everything up to i is ASCII already */ 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chars = i + 1; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(&output[1], input_str, i); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; i < input_chars; i++) { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (S_CHAR(c)) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = (char)c; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chars = ascii_escape_char(c, output, chars); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* An ASCII char can't possibly expand to a surrogate! */ 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output_size - chars < (1 + MIN_EXPANSION)) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* There's more than four, so let's resize by a lot */ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_size *= 2; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output_size > 2 + (input_chars * MIN_EXPANSION)) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_size = 2 + (input_chars * MIN_EXPANSION); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_PyString_Resize(&rval, output_size) == -1) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output = PyString_AS_STRING(rval); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[chars++] = '"'; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_PyString_Resize(&rval, chars) == -1) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rval; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)raise_errmsg(char *msg, PyObject *s, Py_ssize_t end) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Use the Python function simplejson.decoder.errmsg to raise a nice 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) looking ValueError exception */ 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *JSONDecodeError = NULL; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *exc; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (JSONDecodeError == NULL) { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *decoder = PyImport_ImportModule("simplejson.decoder"); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decoder == NULL) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONDecodeError = PyObject_GetAttrString(decoder, "JSONDecodeError"); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(decoder); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (JSONDecodeError == NULL) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exc = PyObject_CallFunction(JSONDecodeError, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exc) { 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetObject(JSONDecodeError, exc); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(exc); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)join_list_unicode(PyObject *lst) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* return u''.join(lst) */ 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *joinfn = NULL; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (joinfn == NULL) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ustr = PyUnicode_FromUnicode(NULL, 0); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ustr == NULL) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) joinfn = PyObject_GetAttrString(ustr, "join"); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(ustr); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (joinfn == NULL) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyObject_CallFunctionObjArgs(joinfn, lst, NULL); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)join_list_string(PyObject *lst) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* return ''.join(lst) */ 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *joinfn = NULL; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (joinfn == NULL) { 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ustr = PyString_FromStringAndSize(NULL, 0); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ustr == NULL) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) joinfn = PyObject_GetAttrString(ustr, "join"); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(ustr); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (joinfn == NULL) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyObject_CallFunctionObjArgs(joinfn, lst, NULL); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* return (rval, idx) tuple, stealing reference to rval */ 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *tpl; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pyidx; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) steal a reference to rval, returns (rval, idx) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) { 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pyidx = PyInt_FromSsize_t(idx); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pyidx == NULL) { 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tpl = PyTuple_New(2); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tpl == NULL) { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(pyidx); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyTuple_SET_ITEM(tpl, 0, rval); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyTuple_SET_ITEM(tpl, 1, pyidx); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tpl; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define APPEND_OLD_CHUNK \ 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk != NULL) { \ 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunks == NULL) { \ 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunks = PyList_New(0); \ 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunks == NULL) { \ 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; \ 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } \ 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } \ 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(chunks, chunk)) { \ 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; \ 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } \ 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(chunk); \ 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_ssize_t *next_end_ptr) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read the JSON string from PyString pystr. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end is the index of the first character after the quote. 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoding is the encoding of pystr (must be an ASCII superset) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if strict is zero then literal control characters are allowed 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr is a return-by-reference index of the character 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) after the end quote 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Return value is a new PyString (if ASCII-only) or PyUnicode 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t len = PyString_GET_SIZE(pystr); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t begin = end - 1; 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next = begin; 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_unicode = 0; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *buf = PyString_AS_STRING(pystr); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *chunks = NULL; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *chunk = NULL; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (len == end) { 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (end < 0 || len < end) { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "end is out of bounds"); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (1) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Find the end of the string or the next escape */ 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c = 0; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (next = end; next < len; next++) { 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = (unsigned char)buf[next]; 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == '"' || c == '\\') { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (strict && c <= 0x1f) { 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid control character at", pystr, next); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (c > 0x7f) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_unicode = 1; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!(c == '"' || c == '\\')) { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Pick up this chunk if it's not zero length */ 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next != end) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *strchunk; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strchunk = PyString_FromStringAndSize(&buf[end], next - end); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (strchunk == NULL) { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_unicode) { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(strchunk); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk == NULL) { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = strchunk; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next++; 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == '"') { 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next == len) { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = buf[next]; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c != 'u') { 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Non-unicode backslash escapes */ 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next + 1; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (c) { 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '"': break; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '\\': break; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '/': break; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'b': c = '\b'; break; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': c = '\f'; break; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'n': c = '\n'; break; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'r': c = '\r'; break; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 't': c = '\t'; break; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: c = 0; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == 0) { 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\escape", pystr, end - 2); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 0; 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next++; 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next + 4; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end >= len) { 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Decode 4 hex digits */ 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; next < end; next++) { 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE digit = buf[next]; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c <<= 4; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (digit) { 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '0': case '1': case '2': case '3': case '4': 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '5': case '6': case '7': case '8': case '9': 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - '0'); break; 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'a': case 'b': case 'c': case 'd': case 'e': 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - 'a' + 10); break; 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'A': case 'B': case 'C': case 'D': case 'E': 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'F': 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - 'A' + 10); break; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef Py_UNICODE_WIDE 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Surrogate pair */ 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((c & 0xfc00) == 0xd800) { 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c2 = 0; 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end + 6 >= len) { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buf[next++] != '\\' || buf[next++] != 'u') { 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end += 6; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Decode 4 hex digits */ 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; next < end; next++) { 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 <<= 4; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE digit = buf[next]; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (digit) { 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '0': case '1': case '2': case '3': case '4': 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '5': case '6': case '7': case '8': case '9': 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - '0'); break; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'a': case 'b': case 'c': case 'd': case 'e': 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - 'a' + 10); break; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'A': case 'B': case 'C': case 'D': case 'E': 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'F': 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - 'A' + 10); break; 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((c2 & 0xfc00) != 0xdc00) { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if ((c & 0xfc00) == 0xdc00) { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired low surrogate", pystr, end - 5); 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c > 0x7f) { 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_unicode = 1; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_unicode) { 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = PyUnicode_FromUnicode(&c, 1); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk == NULL) { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char c_char = Py_CHARMASK(c); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = PyString_FromStringAndSize(&c_char, 1); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk == NULL) { 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunks == NULL) { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk != NULL) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = chunk; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyString_FromStringAndSize("", 0); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = join_list_string(chunks); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(chunks); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr = end; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr = -1; 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(chunk); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(chunks); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read the JSON string from PyUnicode pystr. 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end is the index of the first character after the quote. 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if strict is zero then literal control characters are allowed 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr is a return-by-reference index of the character 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) after the end quote 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Return value is a new PyUnicode 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t len = PyUnicode_GET_SIZE(pystr); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t begin = end - 1; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next = begin; 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *chunks = NULL; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *chunk = NULL; 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (len == end) { 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (end < 0 || len < end) { 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "end is out of bounds"); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (1) { 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Find the end of the string or the next escape */ 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c = 0; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (next = end; next < len; next++) { 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = buf[next]; 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == '"' || c == '\\') { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (strict && c <= 0x1f) { 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid control character at", pystr, next); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!(c == '"' || c == '\\')) { 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Pick up this chunk if it's not zero length */ 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next != end) { 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = PyUnicode_FromUnicode(&buf[end], next - end); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk == NULL) { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next++; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == '"') { 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next; 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (next == len) { 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unterminated string starting at", pystr, begin); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = buf[next]; 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c != 'u') { 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Non-unicode backslash escapes */ 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next + 1; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (c) { 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '"': break; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '\\': break; 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '/': break; 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'b': c = '\b'; break; 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': c = '\f'; break; 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'n': c = '\n'; break; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'r': c = '\r'; break; 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 't': c = '\t'; break; 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: c = 0; 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (c == 0) { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\escape", pystr, end - 2); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 0; 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next++; 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = next + 4; 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end >= len) { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Decode 4 hex digits */ 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; next < end; next++) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE digit = buf[next]; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c <<= 4; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (digit) { 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '0': case '1': case '2': case '3': case '4': 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '5': case '6': case '7': case '8': case '9': 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - '0'); break; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'a': case 'b': case 'c': case 'd': case 'e': 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - 'a' + 10); break; 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'A': case 'B': case 'C': case 'D': case 'E': 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'F': 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c |= (digit - 'A' + 10); break; 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef Py_UNICODE_WIDE 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Surrogate pair */ 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((c & 0xfc00) == 0xd800) { 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE c2 = 0; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end + 6 >= len) { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buf[next++] != '\\' || buf[next++] != 'u') { 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end += 6; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Decode 4 hex digits */ 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; next < end; next++) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 <<= 4; 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE digit = buf[next]; 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (digit) { 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '0': case '1': case '2': case '3': case '4': 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '5': case '6': case '7': case '8': case '9': 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - '0'); break; 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'a': case 'b': case 'c': case 'd': case 'e': 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - 'a' + 10); break; 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'A': case 'B': case 'C': case 'D': case 'E': 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'F': 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c2 |= (digit - 'A' + 10); break; 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((c2 & 0xfc00) != 0xdc00) { 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired high surrogate", pystr, end - 5); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if ((c & 0xfc00) == 0xdc00) { 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Unpaired low surrogate", pystr, end - 5); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk = PyUnicode_FromUnicode(&c, 1); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk == NULL) { 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunks == NULL) { 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chunk != NULL) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = chunk; 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyUnicode_FromUnicode(NULL, 0); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APPEND_OLD_CHUNK 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = join_list_unicode(chunks); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) { 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(chunks); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr = end; 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_end_ptr = -1; 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(chunk); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(chunks); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyDoc_STRVAR(pydoc_scanstring, 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "scanstring(basestring, end, encoding, strict=True) -> (str, end)\n" 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\n" 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Scan the string s for a JSON string. End is the index of the\n" 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "character in s after the quote that started the JSON string.\n" 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Unescapes all valid JSON string escape sequences and raises ValueError\n" 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "on attempt to decode an invalid string. If strict is False then literal\n" 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "control characters are allowed in the string.\n" 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\n" 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Returns a tuple of the decoded string and the index of the character in s\n" 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "after the end quote." 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)py_scanstring(PyObject* self UNUSED, PyObject *args) 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pystr; 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end; 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_end = -1; 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *encoding = NULL; 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int strict = 1; 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyArg_ParseTuple(args, "OO&|zi:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &encoding, &strict)) { 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoding == NULL) { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoding = DEFAULT_ENCODING; 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyString_Check(pystr)) { 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scanstring_str(pystr, end, encoding, strict, &next_end); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyUnicode_Check(pystr)) { 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scanstring_unicode(pystr, end, strict, &next_end); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Format(PyExc_TypeError, 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "first argument must be a string, not %.80s", 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TYPE(pystr)->tp_name); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _build_rval_index_tuple(rval, next_end); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PyDoc_STRVAR(pydoc_encode_basestring_ascii, 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "encode_basestring_ascii(basestring) -> str\n" 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n" 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Return an ASCII-only JSON representation of a Python string" 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PyObject * 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Return an ASCII-only JSON representation of a Python string */ 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* METH_O */ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PyString_Check(pystr)) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ascii_escape_str(pystr); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyUnicode_Check(pystr)) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ascii_escape_unicode(pystr); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Format(PyExc_TypeError, 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "first argument must be a string, not %.80s", 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TYPE(pystr)->tp_name); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_dealloc(PyObject *self) 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Deallocate scanner object */ 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_clear(self); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TYPE(self)->tp_free(self); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_traverse(PyObject *self, visitproc visit, void *arg) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerObject *s; 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyScanner_Check(self)); 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyScannerObject *)self; 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->encoding); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->strict); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->object_hook); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->pairs_hook); 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->parse_float); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->parse_int); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->parse_constant); 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->memo); 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_clear(PyObject *self) 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerObject *s; 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyScanner_Check(self)); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyScannerObject *)self; 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->encoding); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->strict); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->object_hook); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->pairs_hook); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_float); 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_int); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_constant); 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->memo); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_parse_object_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON object from PyString pystr. 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character after the opening curly brace. 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the closing curly brace. 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject (usually a dict, but object_hook or 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_pairs_hook can change that) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *str = PyString_AS_STRING(pystr); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = NULL; 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pairs = NULL; 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item; 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *key = NULL; 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *val = NULL; 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *encoding = PyString_AS_STRING(s->encoding); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int strict = PyObject_IsTrue(s->strict); 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_pairs_hook = (s->pairs_hook != Py_None); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_idx; 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_pairs_hook) { 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pairs = PyList_New(0); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pairs == NULL) 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyDict_New(); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after { */ 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* only loop if the object is non-empty */ 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx <= end_idx && str[idx] != '}') { 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx) { 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *memokey; 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read key */ 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] != '"') { 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg( 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Expecting property name enclosed in double quotes", 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pystr, idx); 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = scanstring_str(pystr, idx + 1, encoding, strict, &next_idx); 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == NULL) 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memokey = PyDict_GetItem(s->memo, key); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (memokey != NULL) { 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(memokey); 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(key); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = memokey; 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->memo, key, key) < 0) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace between key and : delimiter, read :, skip whitespace */ 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != ':') { 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ':' delimiter", pystr, idx); 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read any JSON data type */ 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = scan_once_str(s, pystr, idx, &next_idx); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_pairs_hook) { 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = PyTuple_Pack(2, key, val); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item == NULL) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(key); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(pairs, item) == -1) { 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(item); 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(item); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(rval, key, val) < 0) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(key); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace before } or , */ 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* bail if the object is closed or we didn't get the , delimiter */ 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) break; 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == '}') { 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] != ',') { 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ',' delimiter", pystr, idx); 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after , delimiter */ 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* verify that idx < end_idx, str[idx] should be '}' */ 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != '}') { 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, end_idx); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->pairs_hook != Py_None) { 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(pairs); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if object_hook is not None: rval = object_hook(rval) */ 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->object_hook != Py_None) { 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = val; 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = NULL; 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(rval); 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(key); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(val); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(pairs); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON object from PyUnicode pystr. 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character after the opening curly brace. 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the closing curly brace. 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject (usually a dict, but object_hook can change that) 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = NULL; 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pairs = NULL; 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item; 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *key = NULL; 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *val = NULL; 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int strict = PyObject_IsTrue(s->strict); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_pairs_hook = (s->pairs_hook != Py_None); 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_idx; 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_pairs_hook) { 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pairs = PyList_New(0); 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pairs == NULL) 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyDict_New(); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after { */ 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* only loop if the object is non-empty */ 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx <= end_idx && str[idx] != '}') { 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx) { 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *memokey; 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read key */ 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] != '"') { 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg( 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Expecting property name enclosed in double quotes", 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pystr, idx); 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = scanstring_unicode(pystr, idx + 1, strict, &next_idx); 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == NULL) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memokey = PyDict_GetItem(s->memo, key); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (memokey != NULL) { 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(memokey); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(key); 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = memokey; 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->memo, key, key) < 0) 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace between key and : delimiter, read :, skip 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) whitespace */ 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != ':') { 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ':' delimiter", pystr, idx); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read any JSON term */ 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = scan_once_unicode(s, pystr, idx, &next_idx); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_pairs_hook) { 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = PyTuple_Pack(2, key, val); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item == NULL) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(key); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(pairs, item) == -1) { 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(item); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(item); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(rval, key, val) < 0) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(key); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace before } or , */ 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* bail if the object is closed or we didn't get the , 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delimiter */ 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) break; 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == '}') { 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] != ',') { 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ',' delimiter", pystr, idx); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after , delimiter */ 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* verify that idx < end_idx, str[idx] should be '}' */ 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != '}') { 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, end_idx); 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->pairs_hook != Py_None) { 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(pairs); 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return val; 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if object_hook is not None: rval = object_hook(rval) */ 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->object_hook != Py_None) { 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = val; 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = NULL; 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(rval); 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(key); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(val); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(pairs); 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_parse_array_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON array from PyString pystr. 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character after the opening brace. 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the closing brace. 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyList 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *str = PyString_AS_STRING(pystr); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *val = NULL; 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = PyList_New(0); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_idx; 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after [ */ 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* only loop if the array is non-empty */ 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx <= end_idx && str[idx] != ']') { 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx) { 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read any JSON term and de-tuplefy the (rval, idx) */ 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = scan_once_str(s, pystr, idx, &next_idx); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) { 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyErr_ExceptionMatches(PyExc_StopIteration)) { 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Clear(); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, idx); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, val) == -1) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace between term and , */ 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* bail if the array is closed or we didn't get the , delimiter */ 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) break; 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == ']') { 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] != ',') { 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ',' delimiter", pystr, idx); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after , */ 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* verify that idx < end_idx, str[idx] should be ']' */ 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != ']') { 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, end_idx); 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(val); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON array from PyString pystr. 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character after the opening brace. 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the closing brace. 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyList 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *val = NULL; 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = PyList_New(0); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_idx; 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after [ */ 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* only loop if the array is non-empty */ 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx <= end_idx && str[idx] != ']') { 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx) { 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read any JSON term */ 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val = scan_once_unicode(s, pystr, idx, &next_idx); 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (val == NULL) { 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyErr_ExceptionMatches(PyExc_StopIteration)) { 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Clear(); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, idx); 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, val) == -1) 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(val); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = next_idx; 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace between term and , */ 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* bail if the array is closed or we didn't get the , delimiter */ 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) break; 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == ']') { 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] != ',') { 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting ',' delimiter", pystr, idx); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* skip whitespace after , */ 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* verify that idx < end_idx, str[idx] should be ']' */ 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx || str[idx] != ']') { 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raise_errmsg("Expecting object", pystr, end_idx); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 1; 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(val); 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON constant from PyString pystr. 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) constant is the constant string that was found 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ("NaN", "Infinity", "-Infinity"). 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character of the constant 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the constant. 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns the result of parse_constant 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *cstr; 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* constant is "NaN", "Infinity", or "-Infinity" */ 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cstr = PyString_InternFromString(constant); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cstr == NULL) 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* rval = parse_constant(constant) */ 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx += PyString_GET_SIZE(cstr); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(cstr); 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx; 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON number from PyString pystr. 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character of the number 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the number. 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject representation of that number: 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyInt, PyLong, or PyFloat. 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) May return other types if parse_int or parse_float are set 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *str = PyString_AS_STRING(pystr); 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t idx = start; 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int is_float = 0; 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *numstr; 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read a sign if it's there, make sure it's not the end of the string */ 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == '-') { 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) { 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read as many integer digits as we find as long as it doesn't start with 0 */ 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] >= '1' && str[idx] <= '9') { 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if it starts with 0 we only expect one integer digit */ 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] == '0') { 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* no integer digits, error */ 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if the next char is '.' followed by a digit then read all float digits */ 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_float = 1; 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx += 2; 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* save the index of the 'e' or 'E' just in case we need to backtrack */ 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t e_start = idx; 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read an exponent sign if present */ 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read all digits */ 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if we got a digit, then parse as float. if not, backtrack */ 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_float = 1; 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = e_start; 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* copy the section we determined to be a number */ 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) numstr = PyString_FromStringAndSize(&str[start], idx - start); 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (numstr == NULL) 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_float) { 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* parse as a float using a fast path if available, otherwise call user defined method */ 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_float != (PyObject *)&PyFloat_Type) { 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* rval = PyFloat_FromDouble(PyOS_ascii_atof(PyString_AS_STRING(numstr))); */ 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double d = PyOS_string_to_double(PyString_AS_STRING(numstr), 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, NULL); 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (d == -1.0 && PyErr_Occurred()) 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyFloat_FromDouble(d); 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* parse as an int using a fast path if available, otherwise call user defined method */ 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_int != (PyObject *)&PyInt_Type) { 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL); 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyInt_FromString(PyString_AS_STRING(numstr), NULL, 10); 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(numstr); 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx; 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read a JSON number from PyUnicode pystr. 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character of the number 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the number. 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject representation of that number: 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyInt, PyLong, or PyFloat. 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) May return other types if parse_int or parse_float are set 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t idx = start; 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int is_float = 0; 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *numstr; 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read a sign if it's there, make sure it's not the end of the string */ 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] == '-') { 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx > end_idx) { 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read as many integer digits as we find as long as it doesn't start with 0 */ 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx] >= '1' && str[idx] <= '9') { 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if it starts with 0 we only expect one integer digit */ 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (str[idx] == '0') { 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* no integer digits, error */ 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if the next char is '.' followed by a digit then read all float digits */ 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_float = 1; 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx += 2; 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t e_start = idx; 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx++; 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read an exponent sign if present */ 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* read all digits */ 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* if we got a digit, then parse as float. if not, backtrack */ 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_float = 1; 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = e_start; 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* copy the section we determined to be a number */ 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) numstr = PyUnicode_FromUnicode(&str[start], idx - start); 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (numstr == NULL) 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_float) { 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* parse as a float using a fast path if available, otherwise call user defined method */ 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_float != (PyObject *)&PyFloat_Type) { 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyFloat_FromString(numstr, NULL); 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* no fast path for unicode -> int, just call */ 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL); 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(numstr); 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx; 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read one JSON term (of any kind) from PyString pystr. 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character of the term 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the number. 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject representation of the term. 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char *str = PyString_AS_STRING(pystr); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t length = PyString_GET_SIZE(pystr); 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = NULL; 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int fallthrough = 0; 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx >= length) { 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Py_EnterRecursiveCall(" while decoding a JSON document")) 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (str[idx]) { 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '"': 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* string */ 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scanstring_str(pystr, idx + 1, 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyString_AS_STRING(s->encoding), 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_IsTrue(s->strict), 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_idx_ptr); 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '{': 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* object */ 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_object_str(s, pystr, idx + 1, next_idx_ptr); 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '[': 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* array */ 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_array_str(s, pystr, idx + 1, next_idx_ptr); 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'n': 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* null */ 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_None); 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 4; 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_None; 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 't': 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* true */ 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_True); 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 4; 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_True; 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* false */ 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_False); 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 5; 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_False; 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'N': 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* NaN */ 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "NaN", idx, next_idx_ptr); 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'I': 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Infinity */ 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') { 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "Infinity", idx, next_idx_ptr); 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '-': 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* -Infinity */ 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') { 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "-Infinity", idx, next_idx_ptr); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Didn't find a string, object, array, or named constant. Look for a number. */ 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fallthrough) 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _match_number_str(s, pystr, idx, next_idx_ptr); 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_LeaveRecursiveCall(); 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Read one JSON term (of any kind) from PyUnicode pystr. 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx is the index of the first character of the term 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr is a return-by-reference index to the first character after 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) the number. 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns a new PyObject representation of the term. 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t length = PyUnicode_GET_SIZE(pystr); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval = NULL; 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int fallthrough = 0; 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx >= length) { 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetNone(PyExc_StopIteration); 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Py_EnterRecursiveCall(" while decoding a JSON document")) 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (str[idx]) { 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '"': 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* string */ 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scanstring_unicode(pystr, idx + 1, 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_IsTrue(s->strict), 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_idx_ptr); 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '{': 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* object */ 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr); 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '[': 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* array */ 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr); 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'n': 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* null */ 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_None); 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 4; 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_None; 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 't': 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* true */ 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_True); 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 4; 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_True; 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'f': 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* false */ 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(Py_False); 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *next_idx_ptr = idx + 5; 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = Py_False; 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'N': 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* NaN */ 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "NaN", idx, next_idx_ptr); 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 'I': 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Infinity */ 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') { 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "Infinity", idx, next_idx_ptr); 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case '-': 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* -Infinity */ 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') { 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _parse_constant(s, "-Infinity", idx, next_idx_ptr); 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fallthrough = 1; 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Didn't find a string, object, array, or named constant. Look for a number. */ 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fallthrough) 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = _match_number_unicode(s, pystr, idx, next_idx_ptr); 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_LeaveRecursiveCall(); 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_call(PyObject *self, PyObject *args, PyObject *kwds) 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Python callable interface to scan_once_{str,unicode} */ 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *pystr; 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t idx; 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t next_idx = -1; 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static char *kwlist[] = {"string", "idx", NULL}; 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerObject *s; 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyScanner_Check(self)); 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyScannerObject *)self; 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx)) 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyString_Check(pystr)) { 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scan_once_str(s, pystr, idx, &next_idx); 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyUnicode_Check(pystr)) { 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = scan_once_unicode(s, pystr, idx, &next_idx); 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_Format(PyExc_TypeError, 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "first argument must be a string, not %.80s", 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TYPE(pystr)->tp_name); 19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyDict_Clear(s->memo); 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _build_rval_index_tuple(rval, next_idx); 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerObject *s; 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyScannerObject *)type->tp_alloc(type, 0); 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s != NULL) { 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoding = NULL; 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->strict = NULL; 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->object_hook = NULL; 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->pairs_hook = NULL; 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_float = NULL; 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_int = NULL; 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_constant = NULL; 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (PyObject *)s; 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scanner_init(PyObject *self, PyObject *args, PyObject *kwds) 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Initialize Scanner object */ 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ctx; 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static char *kwlist[] = {"context", NULL}; 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerObject *s; 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyScanner_Check(self)); 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyScannerObject *)self; 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->memo == NULL) { 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->memo = PyDict_New(); 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->memo == NULL) 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* PyString_AS_STRING is used on encoding */ 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoding = PyObject_GetAttrString(ctx, "encoding"); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->encoding == NULL) 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->encoding == Py_None) { 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(Py_None); 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoding = PyString_InternFromString(DEFAULT_ENCODING); 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyUnicode_Check(s->encoding)) { 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *tmp = PyUnicode_AsEncodedString(s->encoding, NULL, NULL); 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(s->encoding); 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoding = tmp; 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->encoding == NULL || !PyString_Check(s->encoding)) 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* All of these will fail "gracefully" so we don't need to verify them */ 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->strict = PyObject_GetAttrString(ctx, "strict"); 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->strict == NULL) 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->object_hook = PyObject_GetAttrString(ctx, "object_hook"); 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->object_hook == NULL) 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook"); 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->pairs_hook == NULL) 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_float = PyObject_GetAttrString(ctx, "parse_float"); 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_float == NULL) 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_int = PyObject_GetAttrString(ctx, "parse_int"); 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_int == NULL) 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->parse_constant = PyObject_GetAttrString(ctx, "parse_constant"); 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->parse_constant == NULL) 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->encoding); 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->strict); 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->object_hook); 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->pairs_hook); 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_float); 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_int); 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->parse_constant); 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyDoc_STRVAR(scanner_doc, "JSON scanner object"); 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyTypeObject PyScannerType = { 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_HEAD_INIT(NULL) 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_internal */ 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "simplejson._speedups.Scanner", /* tp_name */ 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(PyScannerObject), /* tp_basicsize */ 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_itemsize */ 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_dealloc, /* tp_dealloc */ 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_print */ 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_getattr */ 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_setattr */ 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_compare */ 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_repr */ 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_number */ 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_sequence */ 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_mapping */ 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_hash */ 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_call, /* tp_call */ 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_str */ 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_buffer */ 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_doc, /* tp_doc */ 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_traverse, /* tp_traverse */ 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_clear, /* tp_clear */ 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_richcompare */ 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_weaklistoffset */ 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_iter */ 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_iternext */ 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_methods */ 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_members, /* tp_members */ 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_getset */ 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_base */ 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_dict */ 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_descr_get */ 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_descr_set */ 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_dictoffset */ 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_init, /* tp_init */ 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0,/* PyType_GenericAlloc, */ /* tp_alloc */ 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scanner_new, /* tp_new */ 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0,/* PyObject_GC_Del, */ /* tp_free */ 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderObject *s; 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyEncoderObject *)type->tp_alloc(type, 0); 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s != NULL) { 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->markers = NULL; 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->defaultfn = NULL; 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoder = NULL; 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->indent = NULL; 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->key_separator = NULL; 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->item_separator = NULL; 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->sort_keys = NULL; 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->skipkeys = NULL; 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->key_memo = NULL; 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->item_sort_key = NULL; 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->Decimal = NULL; 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (PyObject *)s; 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_init(PyObject *self, PyObject *args, PyObject *kwds) 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* initialize Encoder object */ 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", "key_memo", "use_decimal", "namedtuple_as_object", "tuple_as_array", "bigint_as_string", "item_sort_key", "Decimal", NULL}; 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderObject *s; 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *markers, *defaultfn, *encoder, *indent, *key_separator; 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item_separator, *sort_keys, *skipkeys, *allow_nan, *key_memo; 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *use_decimal, *namedtuple_as_object, *tuple_as_array; 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *bigint_as_string, *item_sort_key, *Decimal; 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyEncoder_Check(self)); 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyEncoderObject *)self; 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOOOOOOOOO:make_encoder", kwlist, 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sort_keys, &skipkeys, &allow_nan, &key_memo, &use_decimal, 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &namedtuple_as_object, &tuple_as_array, &bigint_as_string, 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &item_sort_key, &Decimal)) 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->markers = markers; 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->defaultfn = defaultfn; 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->encoder = encoder; 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->indent = indent; 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->key_separator = key_separator; 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->item_separator = item_separator; 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->sort_keys = sort_keys; 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->skipkeys = skipkeys; 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->key_memo = key_memo; 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii); 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->allow_nan = PyObject_IsTrue(allow_nan); 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->use_decimal = PyObject_IsTrue(use_decimal); 21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->namedtuple_as_object = PyObject_IsTrue(namedtuple_as_object); 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->tuple_as_array = PyObject_IsTrue(tuple_as_array); 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->bigint_as_string = PyObject_IsTrue(bigint_as_string); 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->item_sort_key = item_sort_key; 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s->Decimal = Decimal; 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->markers); 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->defaultfn); 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->encoder); 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->indent); 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->key_separator); 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->item_separator); 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->sort_keys); 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->skipkeys); 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->key_memo); 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->item_sort_key); 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s->Decimal); 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_call(PyObject *self, PyObject *args, PyObject *kwds) 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Python callable interface to encode_listencode_obj */ 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static char *kwlist[] = {"obj", "_current_indent_level", NULL}; 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *obj; 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *rval; 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t indent_level; 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderObject *s; 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyEncoder_Check(self)); 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyEncoderObject *)self; 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist, 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &obj, _convertPyInt_AsSsize_t, &indent_level)) 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rval = PyList_New(0); 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rval == NULL) 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoder_listencode_obj(s, rval, obj, indent_level)) { 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(rval); 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_encoded_const(PyObject *obj) 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Return the JSON string representation of None, True, False */ 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (obj == Py_None) { 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *s_null = NULL; 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s_null == NULL) { 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s_null = PyString_InternFromString("null"); 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s_null); 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return s_null; 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (obj == Py_True) { 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *s_true = NULL; 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s_true == NULL) { 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s_true = PyString_InternFromString("true"); 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s_true); 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return s_true; 21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (obj == Py_False) { 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *s_false = NULL; 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s_false == NULL) { 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s_false = PyString_InternFromString("false"); 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(s_false); 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return s_false; 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "not a const"); 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_encode_float(PyEncoderObject *s, PyObject *obj) 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Return the JSON representation of a PyFloat */ 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double i = PyFloat_AS_DOUBLE(obj); 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!Py_IS_FINITE(i)) { 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!s->allow_nan) { 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant"); 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0) { 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyString_FromString("Infinity"); 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (i < 0) { 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyString_FromString("-Infinity"); 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyString_FromString("NaN"); 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Use a better float format here? */ 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyObject_Repr(obj); 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyObject * 22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_encode_string(PyEncoderObject *s, PyObject *obj) 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Return the JSON representation of a string */ 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->fast_encode) 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return py_encode_basestring_ascii(NULL, obj); 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_steal_list_append(PyObject *lst, PyObject *stolen) 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Append stolen and then decrement its reference count */ 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rval = PyList_Append(lst, stolen); 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(stolen); 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rval; 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level) 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Encode Python object obj to a JSON term, rval is a PyList */ 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rv = -1; 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Py_EnterRecursiveCall(" while encoding a JSON document")) 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) do { 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (obj == Py_None || obj == Py_True || obj == Py_False) { 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *cstr = _encoded_const(obj); 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cstr != NULL) 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = _steal_list_append(rval, cstr); 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyString_Check(obj) || PyUnicode_Check(obj)) 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded = encoder_encode_string(s, obj); 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded != NULL) 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = _steal_list_append(rval, encoded); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyInt_Check(obj) || PyLong_Check(obj)) { 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded = PyObject_Str(obj); 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded != NULL) { 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->bigint_as_string) { 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoded = maybe_quote_bigint(encoded, obj); 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded == NULL) 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = _steal_list_append(rval, encoded); 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyFloat_Check(obj)) { 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded = encoder_encode_float(s, obj); 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded != NULL) 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = _steal_list_append(rval, encoded); 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (s->namedtuple_as_object && _is_namedtuple(obj)) { 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *newobj = PyObject_CallMethod(obj, "_asdict", NULL); 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (newobj != NULL) { 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = encoder_listencode_dict(s, rval, newobj, indent_level); 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(newobj); 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyList_Check(obj) || (s->tuple_as_array && PyTuple_Check(obj))) { 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = encoder_listencode_list(s, rval, obj, indent_level); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyDict_Check(obj)) { 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = encoder_listencode_dict(s, rval, obj, indent_level); 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (s->use_decimal && PyObject_TypeCheck(obj, s->Decimal)) { 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded = PyObject_Str(obj); 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded != NULL) 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = _steal_list_append(rval, encoded); 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ident = NULL; 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *newobj; 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->markers != Py_None) { 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_key; 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ident = PyLong_FromVoidPtr(obj); 22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ident == NULL) 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_key = PyDict_Contains(s->markers, ident); 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key) { 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key != -1) 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "Circular reference detected"); 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(ident); 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->markers, ident, obj)) { 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(ident); 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (newobj == NULL) { 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = encoder_listencode_obj(s, rval, newobj, indent_level); 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(newobj); 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv) { 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = -1; 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (ident != NULL) { 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_DelItem(s->markers, ident)) { 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rv = -1; 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } while (0); 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_LeaveRecursiveCall(); 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level) 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Encode Python dict dct a JSON term, rval is a PyList */ 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *open_dict = NULL; 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *close_dict = NULL; 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *empty_dict = NULL; 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *iteritems = NULL; 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *kstr = NULL; 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ident = NULL; 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *iter = NULL; 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *item = NULL; 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *items = NULL; 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded = NULL; 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int skipkeys; 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t idx; 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL) { 23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_dict = PyString_InternFromString("{"); 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_dict = PyString_InternFromString("}"); 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) empty_dict = PyString_InternFromString("{}"); 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iteritems = PyString_InternFromString("iteritems"); 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL) 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_Size(dct) == 0) 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyList_Append(rval, empty_dict); 23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->markers != Py_None) { 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_key; 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ident = PyLong_FromVoidPtr(dct); 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ident == NULL) 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_key = PyDict_Contains(s->markers, ident); 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key) { 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key != -1) 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "Circular reference detected"); 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->markers, ident, dct)) { 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, open_dict)) 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->indent != Py_None) { 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* TODO: DOES NOT RUN */ 23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indent_level += 1; 23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) newline_indent = '\n' + (_indent * _current_indent_level) 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) separator = _item_separator + newline_indent 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buf += newline_indent 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyCallable_Check(s->item_sort_key)) { 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_CheckExact(dct)) 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyDict_Items(dct); 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyMapping_Items(dct); 23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_CallMethod(items, "sort", "OO", Py_None, s->item_sort_key); 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyObject_IsTrue(s->sort_keys)) { 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* First sort the keys then replace them with (key, value) tuples. */ 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_ssize_t i, nitems; 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_CheckExact(dct)) 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyDict_Keys(dct); 23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyMapping_Keys(dct); 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (items == NULL) 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyList_Check(items)) { 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "keys must return list"); 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Sort(items) < 0) 23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nitems = PyList_GET_SIZE(items); 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (i = 0; i < nitems; i++) { 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *key, *value; 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = PyList_GET_ITEM(items, i); 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = PyDict_GetItem(dct, key); 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item = PyTuple_Pack(2, key, value); 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (item == NULL) 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyList_SET_ITEM(items, i, item); 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(key); 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_CheckExact(dct)) 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyDict_Items(dct); 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items = PyMapping_Items(dct); 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (items == NULL) 24162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter = PyObject_GetIter(items); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(items); 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == NULL) 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skipkeys = PyObject_IsTrue(s->skipkeys); 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx = 0; 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while ((item = PyIter_Next(iter))) { 24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *encoded, *key, *value; 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!PyTuple_Check(item) || Py_SIZE(item) != 2) { 24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "items must return 2-tuples"); 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key = PyTuple_GET_ITEM(item, 0); 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == NULL) 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = PyTuple_GET_ITEM(item, 1); 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value == NULL) 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoded = PyDict_GetItem(s->key_memo, key); 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded != NULL) { 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(encoded); 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyString_Check(key) || PyUnicode_Check(key)) { 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF(key); 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kstr = key; 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyFloat_Check(key)) { 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kstr = encoder_encode_float(s, key); 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (kstr == NULL) 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (key == Py_True || key == Py_False || key == Py_None) { 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* This must come before the PyInt_Check because 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) True and False are also 1 and 0.*/ 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kstr = _encoded_const(key); 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (kstr == NULL) 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (PyInt_Check(key) || PyLong_Check(key)) { 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kstr = PyObject_Str(key); 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (kstr == NULL) 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (skipkeys) { 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_DECREF(item); 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else { 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* TODO: include repr of key */ 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_TypeError, "keys must be a string"); 24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (idx) { 24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, s->item_separator)) 24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded == NULL) { 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoded = encoder_encode_string(s, kstr); 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(kstr); 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoded == NULL) 24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->key_memo, key, encoded)) 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, encoded)) { 24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(encoded); 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, s->key_separator)) 24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoder_listencode_obj(s, rval, value, indent_level)) 24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(item); 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idx += 1; 24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(iter); 24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyErr_Occurred()) 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ident != NULL) { 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_DelItem(s->markers, ident)) 25012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(ident); 25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->indent != Py_None) { 25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* TODO: DOES NOT RUN */ 25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indent_level -= 1; 25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) yield '\n' + (_indent * _current_indent_level) 25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, close_dict)) 25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 25162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(encoded); 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(items); 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(iter); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(kstr); 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level) 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Encode Python list seq to a JSON term, rval is a PyList */ 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *open_array = NULL; 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *close_array = NULL; 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PyObject *empty_array = NULL; 25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *ident = NULL; 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *iter = NULL; 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *obj = NULL; 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int is_true; 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int i = 0; 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_array == NULL || close_array == NULL || empty_array == NULL) { 25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_array = PyString_InternFromString("["); 25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_array = PyString_InternFromString("]"); 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) empty_array = PyString_InternFromString("[]"); 25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_array == NULL || close_array == NULL || empty_array == NULL) 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ident = NULL; 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_true = PyObject_IsTrue(seq); 25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_true == -1) 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (is_true == 0) 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PyList_Append(rval, empty_array); 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->markers != Py_None) { 25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int has_key; 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ident = PyLong_FromVoidPtr(seq); 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ident == NULL) 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_key = PyDict_Contains(s->markers, ident); 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key) { 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_key != -1) 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyErr_SetString(PyExc_ValueError, "Circular reference detected"); 25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_SetItem(s->markers, ident, seq)) { 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter = PyObject_GetIter(seq); 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == NULL) 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, open_array)) 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->indent != Py_None) { 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* TODO: DOES NOT RUN */ 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indent_level += 1; 25772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) newline_indent = '\n' + (_indent * _current_indent_level) 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) separator = _item_separator + newline_indent 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buf += newline_indent 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while ((obj = PyIter_Next(iter))) { 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i) { 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, s->item_separator)) 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encoder_listencode_obj(s, rval, obj, indent_level)) 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) i++; 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(obj); 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(iter); 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyErr_Occurred()) 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ident != NULL) { 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyDict_DelItem(s->markers, ident)) 25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(ident); 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (s->indent != Py_None) { 26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* TODO: DOES NOT RUN */ 26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) indent_level -= 1; 26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) yield '\n' + (_indent * _current_indent_level) 26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyList_Append(rval, close_array)) 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) goto bail; 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bail: 26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(obj); 26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(iter); 26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_XDECREF(ident); 26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void 26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_dealloc(PyObject *self) 26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Deallocate Encoder */ 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_clear(self); 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TYPE(self)->tp_free(self); 26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_traverse(PyObject *self, visitproc visit, void *arg) 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderObject *s; 26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyEncoder_Check(self)); 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyEncoderObject *)self; 26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->markers); 26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->defaultfn); 26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->encoder); 26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->indent); 26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->key_separator); 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->item_separator); 26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->sort_keys); 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->skipkeys); 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->key_memo); 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_VISIT(s->item_sort_key); 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)encoder_clear(PyObject *self) 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Deallocate Encoder */ 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderObject *s; 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(PyEncoder_Check(self)); 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) s = (PyEncoderObject *)self; 26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->markers); 26542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->defaultfn); 26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->encoder); 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->indent); 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->key_separator); 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->item_separator); 26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->sort_keys); 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->skipkeys); 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->key_memo); 26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->item_sort_key); 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_CLEAR(s->Decimal); 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable"); 26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyTypeObject PyEncoderType = { 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject_HEAD_INIT(NULL) 26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_internal */ 26732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "simplejson._speedups.Encoder", /* tp_name */ 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(PyEncoderObject), /* tp_basicsize */ 26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_itemsize */ 26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_dealloc, /* tp_dealloc */ 26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_print */ 26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_getattr */ 26792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_setattr */ 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_compare */ 26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_repr */ 26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_number */ 26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_sequence */ 26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_mapping */ 26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_hash */ 26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_call, /* tp_call */ 26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_str */ 26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_getattro */ 26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_setattro */ 26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_as_buffer */ 26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_doc, /* tp_doc */ 26932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_traverse, /* tp_traverse */ 26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_clear, /* tp_clear */ 26952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_richcompare */ 26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_weaklistoffset */ 26972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_iter */ 26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_iternext */ 26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_methods */ 27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_members, /* tp_members */ 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_getset */ 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_base */ 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_dict */ 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_descr_get */ 27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_descr_set */ 27062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_dictoffset */ 27072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_init, /* tp_init */ 27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_alloc */ 27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encoder_new, /* tp_new */ 27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, /* tp_free */ 27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static PyMethodDef speedups_methods[] = { 27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"encode_basestring_ascii", 27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (PyCFunction)py_encode_basestring_ascii, 27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) METH_O, 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pydoc_encode_basestring_ascii}, 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {"scanstring", 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (PyCFunction)py_scanstring, 27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) METH_VARARGS, 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pydoc_scanstring}, 27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {NULL, NULL, 0, NULL} 27232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PyDoc_STRVAR(module_doc, 27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"simplejson speedups\n"); 27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)init_speedups(void) 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyObject *m; 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyScannerType.tp_new = PyType_GenericNew; 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyType_Ready(&PyScannerType) < 0) 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyEncoderType.tp_new = PyType_GenericNew; 27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (PyType_Ready(&PyEncoderType) < 0) 27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m = Py_InitModule3("_speedups", speedups_methods, module_doc); 27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF((PyObject*)&PyScannerType); 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType); 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Py_INCREF((PyObject*)&PyEncoderType); 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2746