Mercurial > cpython-lru_cache-weakref
annotate Modules/_json.c @ 69778:07613ea46dbc
Merge: I was right, hardconding the localhost IP doesn't work in linux-vserver.
| author | R David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Mon, 02 May 2011 08:48:00 -0400 |
| parents | d60f9d9983bb |
| children | 389620c9e609 |
| rev | line source |
|---|---|
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1 #include "Python.h" |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
2 #include "structmember.h" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
3 #if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
4 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
5 #endif |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
6 #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
7 typedef int Py_ssize_t; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
8 #define PY_SSIZE_T_MAX INT_MAX |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
9 #define PY_SSIZE_T_MIN INT_MIN |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
10 #define PyInt_FromSsize_t PyInt_FromLong |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
11 #define PyInt_AsSsize_t PyInt_AsLong |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
12 #endif |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
13 #ifndef Py_IS_FINITE |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
14 #define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
15 #endif |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
16 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
17 #ifdef __GNUC__ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
18 #define UNUSED __attribute__((__unused__)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
19 #else |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
20 #define UNUSED |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
21 #endif |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
22 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
23 #define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
24 #define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
25 #define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
26 #define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
27 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
28 static PyTypeObject PyScannerType; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
29 static PyTypeObject PyEncoderType; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
30 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
31 typedef struct _PyScannerObject { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
32 PyObject_HEAD |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
33 PyObject *strict; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
34 PyObject *object_hook; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
35 PyObject *object_pairs_hook; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
36 PyObject *parse_float; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
37 PyObject *parse_int; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
38 PyObject *parse_constant; |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
39 PyObject *memo; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
40 } PyScannerObject; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
41 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
42 static PyMemberDef scanner_members[] = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
43 {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
44 {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
45 {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, object_pairs_hook), READONLY}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
46 {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
47 {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
48 {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
49 {NULL} |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
50 }; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
51 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
52 typedef struct _PyEncoderObject { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
53 PyObject_HEAD |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
54 PyObject *markers; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
55 PyObject *defaultfn; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
56 PyObject *encoder; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
57 PyObject *indent; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
58 PyObject *key_separator; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
59 PyObject *item_separator; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
60 PyObject *sort_keys; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
61 PyObject *skipkeys; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
62 int fast_encode; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
63 int allow_nan; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
64 } PyEncoderObject; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
65 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
66 static PyMemberDef encoder_members[] = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
67 {"markers", T_OBJECT, offsetof(PyEncoderObject, markers), READONLY, "markers"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
68 {"default", T_OBJECT, offsetof(PyEncoderObject, defaultfn), READONLY, "default"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
69 {"encoder", T_OBJECT, offsetof(PyEncoderObject, encoder), READONLY, "encoder"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
70 {"indent", T_OBJECT, offsetof(PyEncoderObject, indent), READONLY, "indent"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
71 {"key_separator", T_OBJECT, offsetof(PyEncoderObject, key_separator), READONLY, "key_separator"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
72 {"item_separator", T_OBJECT, offsetof(PyEncoderObject, item_separator), READONLY, "item_separator"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
73 {"sort_keys", T_OBJECT, offsetof(PyEncoderObject, sort_keys), READONLY, "sort_keys"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
74 {"skipkeys", T_OBJECT, offsetof(PyEncoderObject, skipkeys), READONLY, "skipkeys"}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
75 {NULL} |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
76 }; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
77 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
78 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
79 ascii_escape_unicode(PyObject *pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
80 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
81 py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
82 void init_json(void); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
83 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
84 scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
85 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
86 _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
87 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
88 scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
89 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
90 scanner_init(PyObject *self, PyObject *args, PyObject *kwds); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
91 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
92 scanner_dealloc(PyObject *self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
93 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
94 scanner_clear(PyObject *self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
95 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
96 encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
97 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
98 encoder_init(PyObject *self, PyObject *args, PyObject *kwds); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
99 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
100 encoder_dealloc(PyObject *self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
101 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
102 encoder_clear(PyObject *self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
103 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
104 encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
105 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
106 encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
107 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
108 encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
109 static PyObject * |
|
53669
206ccf9aa025
Fixed warning. (Should not use *const* as variable name)
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
53667
diff
changeset
|
110 _encoded_const(PyObject *obj); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
111 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
112 raise_errmsg(char *msg, PyObject *s, Py_ssize_t end); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
113 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
114 encoder_encode_string(PyEncoderObject *s, PyObject *obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
115 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
116 _convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
117 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
118 _convertPyInt_FromSsize_t(Py_ssize_t *size_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
119 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
120 encoder_encode_float(PyEncoderObject *s, PyObject *obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
121 |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
122 #define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"') |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
123 #define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r')) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
124 |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
125 #define MIN_EXPANSION 6 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
126 #ifdef Py_UNICODE_WIDE |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
127 #define MAX_EXPANSION (2 * MIN_EXPANSION) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
128 #else |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
129 #define MAX_EXPANSION MIN_EXPANSION |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
130 #endif |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
131 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
132 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
133 _convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
134 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
135 /* PyObject to Py_ssize_t converter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
136 *size_ptr = PyLong_AsSsize_t(o); |
|
53769
2e044c9f4b40
Merged revisions 72314 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53669
diff
changeset
|
137 if (*size_ptr == -1 && PyErr_Occurred()) |
|
2e044c9f4b40
Merged revisions 72314 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53669
diff
changeset
|
138 return 0; |
|
2e044c9f4b40
Merged revisions 72314 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53669
diff
changeset
|
139 return 1; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
140 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
141 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
142 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
143 _convertPyInt_FromSsize_t(Py_ssize_t *size_ptr) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
144 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
145 /* Py_ssize_t to PyObject converter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
146 return PyLong_FromSsize_t(*size_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
147 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
148 |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
149 static Py_ssize_t |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
150 ascii_escape_unichar(Py_UNICODE c, Py_UNICODE *output, Py_ssize_t chars) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
151 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
152 /* Escape unicode code point c to ASCII escape sequences |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
153 in char *output. output must have at least 12 bytes unused to |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
154 accommodate an escaped surrogate pair "\uXXXX\uXXXX" */ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
155 output[chars++] = '\\'; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
156 switch (c) { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
157 case '\\': output[chars++] = c; break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
158 case '"': output[chars++] = c; break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
159 case '\b': output[chars++] = 'b'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
160 case '\f': output[chars++] = 'f'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
161 case '\n': output[chars++] = 'n'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
162 case '\r': output[chars++] = 'r'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
163 case '\t': output[chars++] = 't'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
164 default: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
165 #ifdef Py_UNICODE_WIDE |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
166 if (c >= 0x10000) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
167 /* UTF-16 surrogate pair */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
168 Py_UNICODE v = c - 0x10000; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
169 c = 0xd800 | ((v >> 10) & 0x3ff); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
170 output[chars++] = 'u'; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
171 output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
172 output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
173 output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
174 output[chars++] = "0123456789abcdef"[(c ) & 0xf]; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
175 c = 0xdc00 | (v & 0x3ff); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
176 output[chars++] = '\\'; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
177 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
178 #endif |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
179 output[chars++] = 'u'; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
180 output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
181 output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
182 output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
183 output[chars++] = "0123456789abcdef"[(c ) & 0xf]; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
184 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
185 return chars; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
186 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
187 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
188 static PyObject * |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
189 ascii_escape_unicode(PyObject *pystr) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
190 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
191 /* Take a PyUnicode pystr and return a new ASCII-only escaped PyUnicode */ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
192 Py_ssize_t i; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
193 Py_ssize_t input_chars; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
194 Py_ssize_t output_size; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
195 Py_ssize_t max_output_size; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
196 Py_ssize_t chars; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
197 PyObject *rval; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
198 Py_UNICODE *output; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
199 Py_UNICODE *input_unicode; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
200 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
201 input_chars = PyUnicode_GET_SIZE(pystr); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
202 input_unicode = PyUnicode_AS_UNICODE(pystr); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
203 |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
204 /* One char input can be up to 6 chars output, estimate 4 of these */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
205 output_size = 2 + (MIN_EXPANSION * 4) + input_chars; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
206 max_output_size = 2 + (input_chars * MAX_EXPANSION); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
207 rval = PyUnicode_FromStringAndSize(NULL, output_size); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
208 if (rval == NULL) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
209 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
210 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
211 output = PyUnicode_AS_UNICODE(rval); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
212 chars = 0; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
213 output[chars++] = '"'; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
214 for (i = 0; i < input_chars; i++) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
215 Py_UNICODE c = input_unicode[i]; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
216 if (S_CHAR(c)) { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
217 output[chars++] = c; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
218 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
219 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
220 chars = ascii_escape_unichar(c, output, chars); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
221 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
222 if (output_size - chars < (1 + MAX_EXPANSION)) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
223 /* There's more than four, so let's resize by a lot */ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
224 Py_ssize_t new_output_size = output_size * 2; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
225 /* This is an upper bound */ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
226 if (new_output_size > max_output_size) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
227 new_output_size = max_output_size; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
228 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
229 /* Make sure that the output size changed before resizing */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
230 if (new_output_size != output_size) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
231 output_size = new_output_size; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
232 if (PyUnicode_Resize(&rval, output_size) == -1) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
233 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
234 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
235 output = PyUnicode_AS_UNICODE(rval); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
236 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
237 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
238 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
239 output[chars++] = '"'; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
240 if (PyUnicode_Resize(&rval, chars) == -1) { |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
241 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
242 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
243 return rval; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
244 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
245 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
246 static void |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
247 raise_errmsg(char *msg, PyObject *s, Py_ssize_t end) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
248 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
249 /* Use the Python function json.decoder.errmsg to raise a nice |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
250 looking ValueError exception */ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
251 static PyObject *errmsg_fn = NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
252 PyObject *pymsg; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
253 if (errmsg_fn == NULL) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
254 PyObject *decoder = PyImport_ImportModule("json.decoder"); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
255 if (decoder == NULL) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
256 return; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
257 errmsg_fn = PyObject_GetAttrString(decoder, "errmsg"); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
258 Py_DECREF(decoder); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
259 if (errmsg_fn == NULL) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
260 return; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
261 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
262 pymsg = PyObject_CallFunction(errmsg_fn, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end); |
|
49524
00e467db6182
merge r66932 and add a few py3k only checks
Benjamin Peterson <benjamin@python.org>
parents:
48770
diff
changeset
|
263 if (pymsg) { |
|
00e467db6182
merge r66932 and add a few py3k only checks
Benjamin Peterson <benjamin@python.org>
parents:
48770
diff
changeset
|
264 PyErr_SetObject(PyExc_ValueError, pymsg); |
|
00e467db6182
merge r66932 and add a few py3k only checks
Benjamin Peterson <benjamin@python.org>
parents:
48770
diff
changeset
|
265 Py_DECREF(pymsg); |
|
00e467db6182
merge r66932 and add a few py3k only checks
Benjamin Peterson <benjamin@python.org>
parents:
48770
diff
changeset
|
266 } |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
267 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
268 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
269 static PyObject * |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
270 join_list_unicode(PyObject *lst) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
271 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
272 /* return u''.join(lst) */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
273 static PyObject *sep = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
274 if (sep == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
275 sep = PyUnicode_FromStringAndSize("", 0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
276 if (sep == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
277 return NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
278 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
279 return PyUnicode_Join(sep, lst); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
280 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
281 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
282 static PyObject * |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
283 _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
284 /* return (rval, idx) tuple, stealing reference to rval */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
285 PyObject *tpl; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
286 PyObject *pyidx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
287 /* |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
288 steal a reference to rval, returns (rval, idx) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
289 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
290 if (rval == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
291 return NULL; |
|
48544
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
292 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
293 pyidx = PyLong_FromSsize_t(idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
294 if (pyidx == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
295 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
296 return NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
297 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
298 tpl = PyTuple_New(2); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
299 if (tpl == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
300 Py_DECREF(pyidx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
301 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
302 return NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
303 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
304 PyTuple_SET_ITEM(tpl, 0, rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
305 PyTuple_SET_ITEM(tpl, 1, pyidx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
306 return tpl; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
307 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
308 |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
309 #define APPEND_OLD_CHUNK \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
310 if (chunk != NULL) { \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
311 if (chunks == NULL) { \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
312 chunks = PyList_New(0); \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
313 if (chunks == NULL) { \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
314 goto bail; \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
315 } \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
316 } \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
317 if (PyList_Append(chunks, chunk)) { \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
318 Py_DECREF(chunk); \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
319 goto bail; \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
320 } \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
321 Py_CLEAR(chunk); \ |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
322 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
323 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
324 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
325 scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
326 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
327 /* Read the JSON string from PyUnicode pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
328 end is the index of the first character after the quote. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
329 if strict is zero then literal control characters are allowed |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
330 *next_end_ptr is a return-by-reference index of the character |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
331 after the end quote |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
332 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
333 Return value is a new PyUnicode |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
334 */ |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
335 PyObject *rval = NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
336 Py_ssize_t len = PyUnicode_GET_SIZE(pystr); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
337 Py_ssize_t begin = end - 1; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
338 Py_ssize_t next /* = begin */; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
339 const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
340 PyObject *chunks = NULL; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
341 PyObject *chunk = NULL; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
342 |
|
48544
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
343 if (end < 0 || len <= end) { |
|
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
344 PyErr_SetString(PyExc_ValueError, "end is out of bounds"); |
|
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
345 goto bail; |
|
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
346 } |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
347 while (1) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
348 /* Find the end of the string or the next escape */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
349 Py_UNICODE c = 0; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
350 for (next = end; next < len; next++) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
351 c = buf[next]; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
352 if (c == '"' || c == '\\') { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
353 break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
354 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
355 else if (strict && c <= 0x1f) { |
|
48544
8cdb181aa9af
Merged revisions 65147 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47580
diff
changeset
|
356 raise_errmsg("Invalid control character at", pystr, next); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
357 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
358 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
359 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
360 if (!(c == '"' || c == '\\')) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
361 raise_errmsg("Unterminated string starting at", pystr, begin); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
362 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
363 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
364 /* Pick up this chunk if it's not zero length */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
365 if (next != end) { |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
366 APPEND_OLD_CHUNK |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
367 chunk = PyUnicode_FromUnicode(&buf[end], next - end); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
368 if (chunk == NULL) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
369 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
370 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
371 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
372 next++; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
373 if (c == '"') { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
374 end = next; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
375 break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
376 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
377 if (next == len) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
378 raise_errmsg("Unterminated string starting at", pystr, begin); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
379 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
380 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
381 c = buf[next]; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
382 if (c != 'u') { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
383 /* Non-unicode backslash escapes */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
384 end = next + 1; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
385 switch (c) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
386 case '"': break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
387 case '\\': break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
388 case '/': break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
389 case 'b': c = '\b'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
390 case 'f': c = '\f'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
391 case 'n': c = '\n'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
392 case 'r': c = '\r'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
393 case 't': c = '\t'; break; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
394 default: c = 0; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
395 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
396 if (c == 0) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
397 raise_errmsg("Invalid \\escape", pystr, end - 2); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
398 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
399 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
400 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
401 else { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
402 c = 0; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
403 next++; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
404 end = next + 4; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
405 if (end >= len) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
406 raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
407 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
408 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
409 /* Decode 4 hex digits */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
410 for (; next < end; next++) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
411 Py_UNICODE digit = buf[next]; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
412 c <<= 4; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
413 switch (digit) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
414 case '0': case '1': case '2': case '3': case '4': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
415 case '5': case '6': case '7': case '8': case '9': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
416 c |= (digit - '0'); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
417 case 'a': case 'b': case 'c': case 'd': case 'e': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
418 case 'f': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
419 c |= (digit - 'a' + 10); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
420 case 'A': case 'B': case 'C': case 'D': case 'E': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
421 case 'F': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
422 c |= (digit - 'A' + 10); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
423 default: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
424 raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
425 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
426 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
427 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
428 #ifdef Py_UNICODE_WIDE |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
429 /* Surrogate pair */ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
430 if ((c & 0xfc00) == 0xd800) { |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
431 Py_UNICODE c2 = 0; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
432 if (end + 6 >= len) { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
433 raise_errmsg("Unpaired high surrogate", pystr, end - 5); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
434 goto bail; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
435 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
436 if (buf[next++] != '\\' || buf[next++] != 'u') { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
437 raise_errmsg("Unpaired high surrogate", pystr, end - 5); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
438 goto bail; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
439 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
440 end += 6; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
441 /* Decode 4 hex digits */ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
442 for (; next < end; next++) { |
|
65196
810b540ae650
Merged revisions 85342 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
443 Py_UNICODE digit = buf[next]; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
444 c2 <<= 4; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
445 switch (digit) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
446 case '0': case '1': case '2': case '3': case '4': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
447 case '5': case '6': case '7': case '8': case '9': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
448 c2 |= (digit - '0'); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
449 case 'a': case 'b': case 'c': case 'd': case 'e': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
450 case 'f': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
451 c2 |= (digit - 'a' + 10); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
452 case 'A': case 'B': case 'C': case 'D': case 'E': |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
453 case 'F': |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
454 c2 |= (digit - 'A' + 10); break; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
455 default: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
456 raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
457 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
458 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
459 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
460 if ((c2 & 0xfc00) != 0xdc00) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
461 raise_errmsg("Unpaired high surrogate", pystr, end - 5); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
462 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
463 } |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
464 c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
465 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
466 else if ((c & 0xfc00) == 0xdc00) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
467 raise_errmsg("Unpaired low surrogate", pystr, end - 5); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
468 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
469 } |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
470 #endif |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
471 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
472 APPEND_OLD_CHUNK |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
473 chunk = PyUnicode_FromUnicode(&c, 1); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
474 if (chunk == NULL) { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
475 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
476 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
477 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
478 |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
479 if (chunks == NULL) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
480 if (chunk != NULL) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
481 rval = chunk; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
482 else |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
483 rval = PyUnicode_FromStringAndSize("", 0); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
484 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
485 else { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
486 APPEND_OLD_CHUNK |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
487 rval = join_list_unicode(chunks); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
488 if (rval == NULL) { |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
489 goto bail; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
490 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
491 Py_CLEAR(chunks); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
492 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
493 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
494 *next_end_ptr = end; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
495 return rval; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
496 bail: |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
497 *next_end_ptr = -1; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
498 Py_XDECREF(chunks); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
499 Py_XDECREF(chunk); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
500 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
501 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
502 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
503 PyDoc_STRVAR(pydoc_scanstring, |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63122
diff
changeset
|
504 "scanstring(string, end, strict=True) -> (string, end)\n" |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
505 "\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
506 "Scan the string s for a JSON string. End is the index of the\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
507 "character in s after the quote that started the JSON string.\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
508 "Unescapes all valid JSON string escape sequences and raises ValueError\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
509 "on attempt to decode an invalid string. If strict is False then literal\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
510 "control characters are allowed in the string.\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
511 "\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
512 "Returns a tuple of the decoded string and the index of the character in s\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
513 "after the end quote." |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
514 ); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
515 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
516 static PyObject * |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
517 py_scanstring(PyObject* self UNUSED, PyObject *args) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
518 { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
519 PyObject *pystr; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
520 PyObject *rval; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
521 Py_ssize_t end; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
522 Py_ssize_t next_end = -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
523 int strict = 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
524 if (!PyArg_ParseTuple(args, "OO&|i:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &strict)) { |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
525 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
526 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
527 if (PyUnicode_Check(pystr)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
528 rval = scanstring_unicode(pystr, end, strict, &next_end); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
529 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
530 else { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
531 PyErr_Format(PyExc_TypeError, |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63122
diff
changeset
|
532 "first argument must be a string, not %.80s", |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
533 Py_TYPE(pystr)->tp_name); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
534 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
535 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
536 return _build_rval_index_tuple(rval, next_end); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
537 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
538 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
539 PyDoc_STRVAR(pydoc_encode_basestring_ascii, |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63122
diff
changeset
|
540 "encode_basestring_ascii(string) -> string\n" |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
541 "\n" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
542 "Return an ASCII-only JSON representation of a Python string" |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
543 ); |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
544 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
545 static PyObject * |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
546 py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
547 { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
548 PyObject *rval; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
549 /* Return an ASCII-only JSON representation of a Python string */ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
550 /* METH_O */ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
551 if (PyUnicode_Check(pystr)) { |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
552 rval = ascii_escape_unicode(pystr); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
553 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
554 else { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
555 PyErr_Format(PyExc_TypeError, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
556 "first argument must be a string, not %.80s", |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
557 Py_TYPE(pystr)->tp_name); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
558 return NULL; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
559 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
560 return rval; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
561 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
562 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
563 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
564 scanner_dealloc(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
565 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
566 /* Deallocate scanner object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
567 scanner_clear(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
568 Py_TYPE(self)->tp_free(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
569 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
570 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
571 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
572 scanner_traverse(PyObject *self, visitproc visit, void *arg) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
573 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
574 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
575 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
576 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
577 Py_VISIT(s->strict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
578 Py_VISIT(s->object_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
579 Py_VISIT(s->object_pairs_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
580 Py_VISIT(s->parse_float); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
581 Py_VISIT(s->parse_int); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
582 Py_VISIT(s->parse_constant); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
583 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
584 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
585 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
586 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
587 scanner_clear(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
588 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
589 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
590 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
591 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
592 Py_CLEAR(s->strict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
593 Py_CLEAR(s->object_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
594 Py_CLEAR(s->object_pairs_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
595 Py_CLEAR(s->parse_float); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
596 Py_CLEAR(s->parse_int); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
597 Py_CLEAR(s->parse_constant); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
598 Py_CLEAR(s->memo); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
599 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
600 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
601 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
602 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
603 _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
604 /* Read a JSON object from PyUnicode pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
605 idx is the index of the first character after the opening curly brace. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
606 *next_idx_ptr is a return-by-reference index to the first character after |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
607 the closing curly brace. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
608 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
609 Returns a new PyObject (usually a dict, but object_hook can change that) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
610 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
611 Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
612 Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
613 PyObject *val = NULL; |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
614 PyObject *rval = NULL; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
615 PyObject *key = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
616 int strict = PyObject_IsTrue(s->strict); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
617 int has_pairs_hook = (s->object_pairs_hook != Py_None); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
618 Py_ssize_t next_idx; |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
619 |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
620 if (has_pairs_hook) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
621 rval = PyList_New(0); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
622 else |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
623 rval = PyDict_New(); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
624 if (rval == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
625 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
626 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
627 /* skip whitespace after { */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
628 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
629 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
630 /* only loop if the object is non-empty */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
631 if (idx <= end_idx && str[idx] != '}') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
632 while (idx <= end_idx) { |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
633 PyObject *memokey; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
634 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
635 /* read key */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
636 if (str[idx] != '"') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
637 raise_errmsg("Expecting property name", pystr, idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
638 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
639 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
640 key = scanstring_unicode(pystr, idx + 1, strict, &next_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
641 if (key == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
642 goto bail; |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
643 memokey = PyDict_GetItem(s->memo, key); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
644 if (memokey != NULL) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
645 Py_INCREF(memokey); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
646 Py_DECREF(key); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
647 key = memokey; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
648 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
649 else { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
650 if (PyDict_SetItem(s->memo, key, key) < 0) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
651 goto bail; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
652 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
653 idx = next_idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
654 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
655 /* skip whitespace between key and : delimiter, read :, skip whitespace */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
656 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
657 if (idx > end_idx || str[idx] != ':') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
658 raise_errmsg("Expecting : delimiter", pystr, idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
659 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
660 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
661 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
662 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
663 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
664 /* read any JSON term */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
665 val = scan_once_unicode(s, pystr, idx, &next_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
666 if (val == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
667 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
668 |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
669 if (has_pairs_hook) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
670 PyObject *item = PyTuple_Pack(2, key, val); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
671 if (item == NULL) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
672 goto bail; |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
673 Py_CLEAR(key); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
674 Py_CLEAR(val); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
675 if (PyList_Append(rval, item) == -1) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
676 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
677 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
678 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
679 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
680 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
681 else { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
682 if (PyDict_SetItem(rval, key, val) < 0) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
683 goto bail; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
684 Py_CLEAR(key); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
685 Py_CLEAR(val); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
686 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
687 idx = next_idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
688 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
689 /* skip whitespace before } or , */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
690 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
691 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
692 /* bail if the object is closed or we didn't get the , delimiter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
693 if (idx > end_idx) break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
694 if (str[idx] == '}') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
695 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
696 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
697 else if (str[idx] != ',') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
698 raise_errmsg("Expecting , delimiter", pystr, idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
699 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
700 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
701 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
702 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
703 /* skip whitespace after , delimiter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
704 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
705 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
706 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
707 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
708 /* verify that idx < end_idx, str[idx] should be '}' */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
709 if (idx > end_idx || str[idx] != '}') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
710 raise_errmsg("Expecting object", pystr, end_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
711 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
712 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
713 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
714 *next_idx_ptr = idx + 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
715 |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
716 if (has_pairs_hook) { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
717 val = PyObject_CallFunctionObjArgs(s->object_pairs_hook, rval, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
718 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
719 return val; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
720 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
721 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
722 /* if object_hook is not None: rval = object_hook(rval) */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
723 if (s->object_hook != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
724 val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
725 Py_DECREF(rval); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
726 return val; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
727 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
728 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
729 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
730 Py_XDECREF(key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
731 Py_XDECREF(val); |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
732 Py_XDECREF(rval); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
733 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
734 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
735 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
736 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
737 _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
738 /* Read a JSON array from PyString pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
739 idx is the index of the first character after the opening brace. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
740 *next_idx_ptr is a return-by-reference index to the first character after |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
741 the closing brace. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
742 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
743 Returns a new PyList |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
744 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
745 Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
746 Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
747 PyObject *val = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
748 PyObject *rval = PyList_New(0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
749 Py_ssize_t next_idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
750 if (rval == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
751 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
752 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
753 /* skip whitespace after [ */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
754 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
755 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
756 /* only loop if the array is non-empty */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
757 if (idx <= end_idx && str[idx] != ']') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
758 while (idx <= end_idx) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
759 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
760 /* read any JSON term */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
761 val = scan_once_unicode(s, pystr, idx, &next_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
762 if (val == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
763 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
764 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
765 if (PyList_Append(rval, val) == -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
766 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
767 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
768 Py_CLEAR(val); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
769 idx = next_idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
770 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
771 /* skip whitespace between term and , */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
772 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
773 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
774 /* bail if the array is closed or we didn't get the , delimiter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
775 if (idx > end_idx) break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
776 if (str[idx] == ']') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
777 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
778 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
779 else if (str[idx] != ',') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
780 raise_errmsg("Expecting , delimiter", pystr, idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
781 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
782 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
783 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
784 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
785 /* skip whitespace after , */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
786 while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
787 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
788 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
789 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
790 /* verify that idx < end_idx, str[idx] should be ']' */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
791 if (idx > end_idx || str[idx] != ']') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
792 raise_errmsg("Expecting object", pystr, end_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
793 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
794 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
795 *next_idx_ptr = idx + 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
796 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
797 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
798 Py_XDECREF(val); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
799 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
800 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
801 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
802 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
803 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
804 _parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
805 /* Read a JSON constant from PyString pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
806 constant is the constant string that was found |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
807 ("NaN", "Infinity", "-Infinity"). |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
808 idx is the index of the first character of the constant |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
809 *next_idx_ptr is a return-by-reference index to the first character after |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
810 the constant. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
811 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
812 Returns the result of parse_constant |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
813 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
814 PyObject *cstr; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
815 PyObject *rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
816 /* constant is "NaN", "Infinity", or "-Infinity" */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
817 cstr = PyUnicode_InternFromString(constant); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
818 if (cstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
819 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
820 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
821 /* rval = parse_constant(constant) */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
822 rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
823 idx += PyUnicode_GET_SIZE(cstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
824 Py_DECREF(cstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
825 *next_idx_ptr = idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
826 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
827 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
828 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
829 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
830 _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
831 /* Read a JSON number from PyUnicode pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
832 idx is the index of the first character of the number |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
833 *next_idx_ptr is a return-by-reference index to the first character after |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
834 the number. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
835 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
836 Returns a new PyObject representation of that number: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
837 PyInt, PyLong, or PyFloat. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
838 May return other types if parse_int or parse_float are set |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
839 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
840 Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
841 Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
842 Py_ssize_t idx = start; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
843 int is_float = 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
844 PyObject *rval; |
|
69552
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
845 PyObject *numstr = NULL; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
846 PyObject *custom_func; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
847 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
848 /* read a sign if it's there, make sure it's not the end of the string */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
849 if (str[idx] == '-') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
850 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
851 if (idx > end_idx) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
852 PyErr_SetNone(PyExc_StopIteration); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
853 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
854 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
855 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
856 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
857 /* read as many integer digits as we find as long as it doesn't start with 0 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
858 if (str[idx] >= '1' && str[idx] <= '9') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
859 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
860 while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
861 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
862 /* if it starts with 0 we only expect one integer digit */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
863 else if (str[idx] == '0') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
864 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
865 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
866 /* no integer digits, error */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
867 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
868 PyErr_SetNone(PyExc_StopIteration); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
869 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
870 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
871 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
872 /* if the next char is '.' followed by a digit then read all float digits */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
873 if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
874 is_float = 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
875 idx += 2; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
876 while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
877 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
878 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
879 /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
880 if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
881 Py_ssize_t e_start = idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
882 idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
883 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
884 /* read an exponent sign if present */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
885 if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
886 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
887 /* read all digits */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
888 while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
889 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
890 /* if we got a digit, then parse as float. if not, backtrack */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
891 if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
892 is_float = 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
893 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
894 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
895 idx = e_start; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
896 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
897 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
898 |
|
69552
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
899 if (is_float && s->parse_float != (PyObject *)&PyFloat_Type) |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
900 custom_func = s->parse_float; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
901 else if (!is_float && s->parse_int != (PyObject *) &PyLong_Type) |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
902 custom_func = s->parse_int; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
903 else |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
904 custom_func = NULL; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
905 |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
906 if (custom_func) { |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
907 /* copy the section we determined to be a number */ |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
908 numstr = PyUnicode_FromUnicode(&str[start], idx - start); |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
909 if (numstr == NULL) |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
910 return NULL; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
911 rval = PyObject_CallFunctionObjArgs(custom_func, numstr, NULL); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
912 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
913 else { |
|
69552
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
914 Py_ssize_t i, n; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
915 char *buf; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
916 /* Straight conversion to ASCII, to avoid costly conversion of |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
917 decimal unicode digits (which cannot appear here) */ |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
918 n = idx - start; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
919 numstr = PyBytes_FromStringAndSize(NULL, n); |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
920 if (numstr == NULL) |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
921 return NULL; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
922 buf = PyBytes_AS_STRING(numstr); |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
923 for (i = 0; i < n; i++) { |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
924 buf[i] = (char) str[i + start]; |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
925 } |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
926 if (is_float) |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
927 rval = PyFloat_FromString(numstr); |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
928 else |
|
d60f9d9983bb
Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68258
diff
changeset
|
929 rval = PyLong_FromString(buf, NULL, 10); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
930 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
931 Py_DECREF(numstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
932 *next_idx_ptr = idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
933 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
934 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
935 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
936 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
937 scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
938 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
939 /* Read one JSON term (of any kind) from PyUnicode pystr. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
940 idx is the index of the first character of the term |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
941 *next_idx_ptr is a return-by-reference index to the first character after |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
942 the number. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
943 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
944 Returns a new PyObject representation of the term. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
945 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
946 Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
947 Py_ssize_t length = PyUnicode_GET_SIZE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
948 if (idx >= length) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
949 PyErr_SetNone(PyExc_StopIteration); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
950 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
951 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
952 switch (str[idx]) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
953 case '"': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
954 /* string */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
955 return scanstring_unicode(pystr, idx + 1, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
956 PyObject_IsTrue(s->strict), |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
957 next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
958 case '{': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
959 /* object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
960 return _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
961 case '[': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
962 /* array */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
963 return _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
964 case 'n': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
965 /* null */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
966 if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
967 Py_INCREF(Py_None); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
968 *next_idx_ptr = idx + 4; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
969 return Py_None; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
970 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
971 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
972 case 't': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
973 /* true */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
974 if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
975 Py_INCREF(Py_True); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
976 *next_idx_ptr = idx + 4; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
977 return Py_True; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
978 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
979 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
980 case 'f': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
981 /* false */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
982 if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
983 Py_INCREF(Py_False); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
984 *next_idx_ptr = idx + 5; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
985 return Py_False; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
986 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
987 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
988 case 'N': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
989 /* NaN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
990 if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
991 return _parse_constant(s, "NaN", idx, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
992 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
993 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
994 case 'I': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
995 /* Infinity */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
996 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') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
997 return _parse_constant(s, "Infinity", idx, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
998 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
999 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1000 case '-': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1001 /* -Infinity */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1002 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') { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1003 return _parse_constant(s, "-Infinity", idx, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1004 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1005 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1006 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1007 /* Didn't find a string, object, array, or named constant. Look for a number. */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1008 return _match_number_unicode(s, pystr, idx, next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1009 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1010 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1011 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1012 scanner_call(PyObject *self, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1013 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1014 /* Python callable interface to scan_once_{str,unicode} */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1015 PyObject *pystr; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1016 PyObject *rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1017 Py_ssize_t idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1018 Py_ssize_t next_idx = -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1019 static char *kwlist[] = {"string", "idx", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1020 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1021 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1022 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1023 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1024 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1025 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1026 if (PyUnicode_Check(pystr)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1027 rval = scan_once_unicode(s, pystr, idx, &next_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1028 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1029 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1030 PyErr_Format(PyExc_TypeError, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1031 "first argument must be a string, not %.80s", |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1032 Py_TYPE(pystr)->tp_name); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1033 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1034 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1035 PyDict_Clear(s->memo); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1036 if (rval == NULL) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1037 return NULL; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1038 return _build_rval_index_tuple(rval, next_idx); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1039 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1040 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1041 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1042 scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1043 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1044 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1045 s = (PyScannerObject *)type->tp_alloc(type, 0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1046 if (s != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1047 s->strict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1048 s->object_hook = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1049 s->object_pairs_hook = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1050 s->parse_float = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1051 s->parse_int = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1052 s->parse_constant = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1053 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1054 return (PyObject *)s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1055 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1056 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1057 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1058 scanner_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1059 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1060 /* Initialize Scanner object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1061 PyObject *ctx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1062 static char *kwlist[] = {"context", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1063 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1064 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1065 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1066 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1067 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1068 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1069 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1070 |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1071 if (s->memo == NULL) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1072 s->memo = PyDict_New(); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1073 if (s->memo == NULL) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1074 goto bail; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1075 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1076 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1077 /* All of these will fail "gracefully" so we don't need to verify them */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1078 s->strict = PyObject_GetAttrString(ctx, "strict"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1079 if (s->strict == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1080 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1081 s->object_hook = PyObject_GetAttrString(ctx, "object_hook"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1082 if (s->object_hook == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1083 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1084 s->object_pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1085 if (s->object_pairs_hook == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1086 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1087 s->parse_float = PyObject_GetAttrString(ctx, "parse_float"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1088 if (s->parse_float == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1089 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1090 s->parse_int = PyObject_GetAttrString(ctx, "parse_int"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1091 if (s->parse_int == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1092 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1093 s->parse_constant = PyObject_GetAttrString(ctx, "parse_constant"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1094 if (s->parse_constant == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1095 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1096 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1097 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1098 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1099 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1100 Py_CLEAR(s->strict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1101 Py_CLEAR(s->object_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1102 Py_CLEAR(s->object_pairs_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1103 Py_CLEAR(s->parse_float); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1104 Py_CLEAR(s->parse_int); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1105 Py_CLEAR(s->parse_constant); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1106 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1107 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1108 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1109 PyDoc_STRVAR(scanner_doc, "JSON scanner object"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1110 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1111 static |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1112 PyTypeObject PyScannerType = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1113 PyVarObject_HEAD_INIT(NULL, 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1114 "_json.Scanner", /* tp_name */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1115 sizeof(PyScannerObject), /* tp_basicsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1116 0, /* tp_itemsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1117 scanner_dealloc, /* tp_dealloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1118 0, /* tp_print */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1119 0, /* tp_getattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1120 0, /* tp_setattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1121 0, /* tp_compare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1122 0, /* tp_repr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1123 0, /* tp_as_number */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1124 0, /* tp_as_sequence */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1125 0, /* tp_as_mapping */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1126 0, /* tp_hash */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1127 scanner_call, /* tp_call */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1128 0, /* tp_str */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1129 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1130 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1131 0, /* tp_as_buffer */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1132 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1133 scanner_doc, /* tp_doc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1134 scanner_traverse, /* tp_traverse */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1135 scanner_clear, /* tp_clear */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1136 0, /* tp_richcompare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1137 0, /* tp_weaklistoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1138 0, /* tp_iter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1139 0, /* tp_iternext */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1140 0, /* tp_methods */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1141 scanner_members, /* tp_members */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1142 0, /* tp_getset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1143 0, /* tp_base */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1144 0, /* tp_dict */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1145 0, /* tp_descr_get */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1146 0, /* tp_descr_set */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1147 0, /* tp_dictoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1148 scanner_init, /* tp_init */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1149 0,/* PyType_GenericAlloc, */ /* tp_alloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1150 scanner_new, /* tp_new */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1151 0,/* PyObject_GC_Del, */ /* tp_free */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1152 }; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1153 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1154 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1155 encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1156 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1157 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1158 s = (PyEncoderObject *)type->tp_alloc(type, 0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1159 if (s != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1160 s->markers = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1161 s->defaultfn = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1162 s->encoder = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1163 s->indent = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1164 s->key_separator = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1165 s->item_separator = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1166 s->sort_keys = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1167 s->skipkeys = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1168 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1169 return (PyObject *)s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1170 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1171 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1172 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1173 encoder_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1174 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1175 /* initialize Encoder object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1176 static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1177 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1178 PyEncoderObject *s; |
|
57610
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1179 PyObject *markers, *defaultfn, *encoder, *indent, *key_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1180 PyObject *item_separator, *sort_keys, *skipkeys, *allow_nan; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1181 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1182 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1183 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1184 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1185 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOO:make_encoder", kwlist, |
|
57610
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1186 &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1187 &sort_keys, &skipkeys, &allow_nan)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1188 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1189 |
|
57610
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1190 s->markers = markers; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1191 s->defaultfn = defaultfn; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1192 s->encoder = encoder; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1193 s->indent = indent; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1194 s->key_separator = key_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1195 s->item_separator = item_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1196 s->sort_keys = sort_keys; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1197 s->skipkeys = skipkeys; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1198 s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii); |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1199 s->allow_nan = PyObject_IsTrue(allow_nan); |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1200 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1201 Py_INCREF(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1202 Py_INCREF(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1203 Py_INCREF(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1204 Py_INCREF(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1205 Py_INCREF(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1206 Py_INCREF(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1207 Py_INCREF(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1208 Py_INCREF(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1209 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1210 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1211 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1212 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1213 encoder_call(PyObject *self, PyObject *args, PyObject *kwds) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1214 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1215 /* Python callable interface to encode_listencode_obj */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1216 static char *kwlist[] = {"obj", "_current_indent_level", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1217 PyObject *obj; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1218 PyObject *rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1219 Py_ssize_t indent_level; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1220 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1221 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1222 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1223 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1224 &obj, _convertPyInt_AsSsize_t, &indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1225 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1226 rval = PyList_New(0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1227 if (rval == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1228 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1229 if (encoder_listencode_obj(s, rval, obj, indent_level)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1230 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1231 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1232 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1233 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1234 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1235 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1236 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1237 _encoded_const(PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1238 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1239 /* Return the JSON string representation of None, True, False */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1240 if (obj == Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1241 static PyObject *s_null = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1242 if (s_null == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1243 s_null = PyUnicode_InternFromString("null"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1244 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1245 Py_INCREF(s_null); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1246 return s_null; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1247 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1248 else if (obj == Py_True) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1249 static PyObject *s_true = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1250 if (s_true == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1251 s_true = PyUnicode_InternFromString("true"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1252 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1253 Py_INCREF(s_true); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1254 return s_true; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1255 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1256 else if (obj == Py_False) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1257 static PyObject *s_false = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1258 if (s_false == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1259 s_false = PyUnicode_InternFromString("false"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1260 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1261 Py_INCREF(s_false); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1262 return s_false; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1263 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1264 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1265 PyErr_SetString(PyExc_ValueError, "not a const"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1266 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1267 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1268 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1269 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1270 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1271 encoder_encode_float(PyEncoderObject *s, PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1272 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1273 /* Return the JSON representation of a PyFloat */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1274 double i = PyFloat_AS_DOUBLE(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1275 if (!Py_IS_FINITE(i)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1276 if (!s->allow_nan) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1277 PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1278 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1279 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1280 if (i > 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1281 return PyUnicode_FromString("Infinity"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1282 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1283 else if (i < 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1284 return PyUnicode_FromString("-Infinity"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1285 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1286 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1287 return PyUnicode_FromString("NaN"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1288 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1289 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1290 /* Use a better float format here? */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1291 return PyObject_Repr(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1292 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1293 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1294 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1295 encoder_encode_string(PyEncoderObject *s, PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1296 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1297 /* Return the JSON representation of a string */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1298 if (s->fast_encode) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1299 return py_encode_basestring_ascii(NULL, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1300 else |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1301 return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1302 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1303 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1304 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1305 _steal_list_append(PyObject *lst, PyObject *stolen) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1306 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1307 /* Append stolen and then decrement its reference count */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1308 int rval = PyList_Append(lst, stolen); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1309 Py_DECREF(stolen); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1310 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1311 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1312 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1313 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1314 encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1315 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1316 /* Encode Python object obj to a JSON term, rval is a PyList */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1317 PyObject *newobj; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1318 int rv; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1319 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1320 if (obj == Py_None || obj == Py_True || obj == Py_False) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1321 PyObject *cstr = _encoded_const(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1322 if (cstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1323 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1324 return _steal_list_append(rval, cstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1325 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1326 else if (PyUnicode_Check(obj)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1327 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1328 PyObject *encoded = encoder_encode_string(s, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1329 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1330 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1331 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1332 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1333 else if (PyLong_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1334 PyObject *encoded = PyObject_Str(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1335 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1336 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1337 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1338 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1339 else if (PyFloat_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1340 PyObject *encoded = encoder_encode_float(s, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1341 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1342 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1343 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1344 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1345 else if (PyList_Check(obj) || PyTuple_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1346 return encoder_listencode_list(s, rval, obj, indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1347 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1348 else if (PyDict_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1349 return encoder_listencode_dict(s, rval, obj, indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1350 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1351 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1352 PyObject *ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1353 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1354 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1355 ident = PyLong_FromVoidPtr(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1356 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1357 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1358 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1359 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1360 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1361 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1362 Py_DECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1363 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1364 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1365 if (PyDict_SetItem(s->markers, ident, obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1366 Py_DECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1367 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1368 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1369 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1370 newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1371 if (newobj == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1372 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1373 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1374 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1375 rv = encoder_listencode_obj(s, rval, newobj, indent_level); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1376 Py_DECREF(newobj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1377 if (rv) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1378 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1379 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1380 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1381 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1382 if (PyDict_DelItem(s->markers, ident)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1383 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1384 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1385 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1386 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1387 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1388 return rv; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1389 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1390 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1391 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1392 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1393 encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1394 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1395 /* Encode Python dict dct a JSON term, rval is a PyList */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1396 static PyObject *open_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1397 static PyObject *close_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1398 static PyObject *empty_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1399 PyObject *kstr = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1400 PyObject *ident = NULL; |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1401 PyObject *it = NULL; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1402 PyObject *items; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1403 PyObject *item = NULL; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1404 int skipkeys; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1405 Py_ssize_t idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1406 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1407 if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1408 open_dict = PyUnicode_InternFromString("{"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1409 close_dict = PyUnicode_InternFromString("}"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1410 empty_dict = PyUnicode_InternFromString("{}"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1411 if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1412 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1413 } |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1414 if (Py_SIZE(dct) == 0) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1415 return PyList_Append(rval, empty_dict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1416 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1417 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1418 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1419 ident = PyLong_FromVoidPtr(dct); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1420 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1421 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1422 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1423 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1424 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1425 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1426 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1427 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1428 if (PyDict_SetItem(s->markers, ident, dct)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1429 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1430 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1431 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1432 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1433 if (PyList_Append(rval, open_dict)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1434 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1435 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1436 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1437 /* TODO: DOES NOT RUN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1438 indent_level += 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1439 /* |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1440 newline_indent = '\n' + (' ' * (_indent * _current_indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1441 separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1442 buf += newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1443 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1444 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1445 |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1446 if (PyObject_IsTrue(s->sort_keys)) { |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1447 /* First sort the keys then replace them with (key, value) tuples. */ |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1448 Py_ssize_t i, nitems; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1449 items = PyMapping_Keys(dct); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1450 if (items == NULL) |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1451 goto bail; |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1452 if (!PyList_Check(items)) { |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1453 PyErr_SetString(PyExc_ValueError, "keys must return list"); |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1454 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1455 } |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1456 if (PyList_Sort(items) < 0) |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1457 goto bail; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1458 nitems = PyList_GET_SIZE(items); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1459 for (i = 0; i < nitems; i++) { |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1460 PyObject *key, *value; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1461 key = PyList_GET_ITEM(items, i); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1462 value = PyDict_GetItem(dct, key); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1463 item = PyTuple_Pack(2, key, value); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1464 if (item == NULL) |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1465 goto bail; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1466 PyList_SET_ITEM(items, i, item); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1467 Py_DECREF(key); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1468 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1469 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1470 else { |
|
54374
b61e6ad5ae70
Fix TODO: do the sort by just the key, not the key/value pair.
Raymond Hettinger <python@rcn.com>
parents:
54373
diff
changeset
|
1471 items = PyMapping_Items(dct); |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1472 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1473 if (items == NULL) |
|
54374
b61e6ad5ae70
Fix TODO: do the sort by just the key, not the key/value pair.
Raymond Hettinger <python@rcn.com>
parents:
54373
diff
changeset
|
1474 goto bail; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1475 it = PyObject_GetIter(items); |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1476 Py_DECREF(items); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1477 if (it == NULL) |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1478 goto bail; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1479 skipkeys = PyObject_IsTrue(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1480 idx = 0; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1481 while ((item = PyIter_Next(it)) != NULL) { |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1482 PyObject *encoded, *key, *value; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1483 if (!PyTuple_Check(item) || Py_SIZE(item) != 2) { |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1484 PyErr_SetString(PyExc_ValueError, "items must return 2-tuples"); |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1485 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1486 } |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1487 key = PyTuple_GET_ITEM(item, 0); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1488 if (PyUnicode_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1489 Py_INCREF(key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1490 kstr = key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1491 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1492 else if (PyFloat_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1493 kstr = encoder_encode_float(s, key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1494 if (kstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1495 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1496 } |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1497 else if (key == Py_True || key == Py_False || key == Py_None) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1498 /* This must come before the PyLong_Check because |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1499 True and False are also 1 and 0.*/ |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1500 kstr = _encoded_const(key); |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1501 if (kstr == NULL) |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1502 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1503 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1504 else if (PyLong_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1505 kstr = PyObject_Str(key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1506 if (kstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1507 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1508 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1509 else if (skipkeys) { |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1510 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1511 continue; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1512 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1513 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1514 /* TODO: include repr of key */ |
|
63122
5b468687768c
Apply patch from Ray Allen for issue 9296
Doug Hellmann <doug.hellmann@gmail.com>
parents:
61466
diff
changeset
|
1515 PyErr_SetString(PyExc_TypeError, "keys must be a string"); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1516 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1517 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1518 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1519 if (idx) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1520 if (PyList_Append(rval, s->item_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1521 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1522 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1523 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1524 encoded = encoder_encode_string(s, kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1525 Py_CLEAR(kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1526 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1527 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1528 if (PyList_Append(rval, encoded)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1529 Py_DECREF(encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1530 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1531 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1532 Py_DECREF(encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1533 if (PyList_Append(rval, s->key_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1534 goto bail; |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1535 |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1536 value = PyTuple_GET_ITEM(item, 1); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1537 if (encoder_listencode_obj(s, rval, value, indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1538 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1539 idx += 1; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1540 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1541 } |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1542 if (PyErr_Occurred()) |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1543 goto bail; |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1544 Py_CLEAR(it); |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1545 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1546 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1547 if (PyDict_DelItem(s->markers, ident)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1548 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1549 Py_CLEAR(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1550 } |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1551 /* TODO DOES NOT RUN; dead code |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1552 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1553 indent_level -= 1; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1554 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1555 yield '\n' + (' ' * (_indent * _current_indent_level)) |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1556 }*/ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1557 if (PyList_Append(rval, close_dict)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1558 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1559 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1560 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1561 bail: |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1562 Py_XDECREF(it); |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1563 Py_XDECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1564 Py_XDECREF(kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1565 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1566 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1567 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1568 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1569 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1570 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1571 encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1572 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1573 /* Encode Python list seq to a JSON term, rval is a PyList */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1574 static PyObject *open_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1575 static PyObject *close_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1576 static PyObject *empty_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1577 PyObject *ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1578 PyObject *s_fast = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1579 Py_ssize_t num_items; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1580 PyObject **seq_items; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1581 Py_ssize_t i; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1582 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1583 if (open_array == NULL || close_array == NULL || empty_array == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1584 open_array = PyUnicode_InternFromString("["); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1585 close_array = PyUnicode_InternFromString("]"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1586 empty_array = PyUnicode_InternFromString("[]"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1587 if (open_array == NULL || close_array == NULL || empty_array == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1588 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1589 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1590 ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1591 s_fast = PySequence_Fast(seq, "_iterencode_list needs a sequence"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1592 if (s_fast == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1593 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1594 num_items = PySequence_Fast_GET_SIZE(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1595 if (num_items == 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1596 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1597 return PyList_Append(rval, empty_array); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1598 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1599 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1600 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1601 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1602 ident = PyLong_FromVoidPtr(seq); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1603 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1604 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1605 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1606 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1607 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1608 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1609 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1610 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1611 if (PyDict_SetItem(s->markers, ident, seq)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1612 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1613 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1614 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1615 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1616 seq_items = PySequence_Fast_ITEMS(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1617 if (PyList_Append(rval, open_array)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1618 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1619 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1620 /* TODO: DOES NOT RUN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1621 indent_level += 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1622 /* |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1623 newline_indent = '\n' + (' ' * (_indent * _current_indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1624 separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1625 buf += newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1626 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1627 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1628 for (i = 0; i < num_items; i++) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1629 PyObject *obj = seq_items[i]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1630 if (i) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1631 if (PyList_Append(rval, s->item_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1632 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1633 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1634 if (encoder_listencode_obj(s, rval, obj, indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1635 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1636 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1637 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1638 if (PyDict_DelItem(s->markers, ident)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1639 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1640 Py_CLEAR(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1641 } |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1642 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1643 /* TODO: DOES NOT RUN |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1644 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1645 indent_level -= 1; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1646 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1647 yield '\n' + (' ' * (_indent * _current_indent_level)) |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1648 }*/ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1649 if (PyList_Append(rval, close_array)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1650 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1651 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1652 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1653 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1654 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1655 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1656 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1657 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1658 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1659 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1660 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1661 encoder_dealloc(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1662 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1663 /* Deallocate Encoder */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1664 encoder_clear(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1665 Py_TYPE(self)->tp_free(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1666 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1667 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1668 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1669 encoder_traverse(PyObject *self, visitproc visit, void *arg) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1670 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1671 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1672 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1673 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1674 Py_VISIT(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1675 Py_VISIT(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1676 Py_VISIT(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1677 Py_VISIT(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1678 Py_VISIT(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1679 Py_VISIT(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1680 Py_VISIT(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1681 Py_VISIT(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1682 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1683 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1684 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1685 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1686 encoder_clear(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1687 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1688 /* Deallocate Encoder */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1689 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1690 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1691 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1692 Py_CLEAR(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1693 Py_CLEAR(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1694 Py_CLEAR(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1695 Py_CLEAR(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1696 Py_CLEAR(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1697 Py_CLEAR(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1698 Py_CLEAR(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1699 Py_CLEAR(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1700 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1701 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1702 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1703 PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1704 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1705 static |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1706 PyTypeObject PyEncoderType = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1707 PyVarObject_HEAD_INIT(NULL, 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1708 "_json.Encoder", /* tp_name */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1709 sizeof(PyEncoderObject), /* tp_basicsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1710 0, /* tp_itemsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1711 encoder_dealloc, /* tp_dealloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1712 0, /* tp_print */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1713 0, /* tp_getattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1714 0, /* tp_setattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1715 0, /* tp_compare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1716 0, /* tp_repr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1717 0, /* tp_as_number */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1718 0, /* tp_as_sequence */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1719 0, /* tp_as_mapping */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1720 0, /* tp_hash */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1721 encoder_call, /* tp_call */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1722 0, /* tp_str */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1723 0, /* tp_getattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1724 0, /* tp_setattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1725 0, /* tp_as_buffer */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1726 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1727 encoder_doc, /* tp_doc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1728 encoder_traverse, /* tp_traverse */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1729 encoder_clear, /* tp_clear */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1730 0, /* tp_richcompare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1731 0, /* tp_weaklistoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1732 0, /* tp_iter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1733 0, /* tp_iternext */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1734 0, /* tp_methods */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1735 encoder_members, /* tp_members */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1736 0, /* tp_getset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1737 0, /* tp_base */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1738 0, /* tp_dict */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1739 0, /* tp_descr_get */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1740 0, /* tp_descr_set */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1741 0, /* tp_dictoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1742 encoder_init, /* tp_init */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1743 0, /* tp_alloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1744 encoder_new, /* tp_new */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1745 0, /* tp_free */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1746 }; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1747 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1748 static PyMethodDef speedups_methods[] = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1749 {"encode_basestring_ascii", |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1750 (PyCFunction)py_encode_basestring_ascii, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1751 METH_O, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1752 pydoc_encode_basestring_ascii}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1753 {"scanstring", |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1754 (PyCFunction)py_scanstring, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1755 METH_VARARGS, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1756 pydoc_scanstring}, |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1757 {NULL, NULL, 0, NULL} |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1758 }; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1759 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1760 PyDoc_STRVAR(module_doc, |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1761 "json speedups\n"); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1762 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1763 static struct PyModuleDef jsonmodule = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1764 PyModuleDef_HEAD_INIT, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1765 "_json", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1766 module_doc, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1767 -1, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1768 speedups_methods, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1769 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1770 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1771 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1772 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1773 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1774 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1775 PyObject* |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1776 PyInit__json(void) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1777 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1778 PyObject *m = PyModule_Create(&jsonmodule); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1779 if (!m) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1780 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1781 PyScannerType.tp_new = PyType_GenericNew; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1782 if (PyType_Ready(&PyScannerType) < 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1783 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1784 PyEncoderType.tp_new = PyType_GenericNew; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1785 if (PyType_Ready(&PyEncoderType) < 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1786 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1787 Py_INCREF((PyObject*)&PyScannerType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1788 if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1789 Py_DECREF((PyObject*)&PyScannerType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1790 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1791 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1792 Py_INCREF((PyObject*)&PyEncoderType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1793 if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1794 Py_DECREF((PyObject*)&PyEncoderType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1795 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1796 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1797 return m; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1798 fail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1799 Py_DECREF(m); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1800 return NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1801 } |
