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