Mercurial > cpython-lru_cache-weakref
annotate Modules/_json.c @ 70626:aa07c1237f4e
(Merge 3.2) Issue #12016: Reindent decoders of HK and JP codecs
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Fri, 03 Jun 2011 23:34:32 +0200 |
| parents | 821d7885c7ec |
| children | 47176e8d7060 |
| 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 */ |
|
69910
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
946 PyObject *res; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
947 Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
948 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
|
949 if (idx >= length) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
950 PyErr_SetNone(PyExc_StopIteration); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
951 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
952 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
953 switch (str[idx]) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
954 case '"': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
955 /* string */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
956 return scanstring_unicode(pystr, idx + 1, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
957 PyObject_IsTrue(s->strict), |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
958 next_idx_ptr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
959 case '{': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
960 /* object */ |
|
69910
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
961 if (Py_EnterRecursiveCall(" while decoding a JSON object " |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
962 "from a unicode string")) |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
963 return NULL; |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
964 res = _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr); |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
965 Py_LeaveRecursiveCall(); |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
966 return res; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
967 case '[': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
968 /* array */ |
|
69910
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
969 if (Py_EnterRecursiveCall(" while decoding a JSON array " |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
970 "from a unicode string")) |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
971 return NULL; |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
972 res = _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr); |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
973 Py_LeaveRecursiveCall(); |
|
61164d09337e
#12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65196
diff
changeset
|
974 return res; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
975 case 'n': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
976 /* null */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
977 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
|
978 Py_INCREF(Py_None); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
979 *next_idx_ptr = idx + 4; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
980 return Py_None; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
981 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
982 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
983 case 't': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
984 /* true */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
985 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
|
986 Py_INCREF(Py_True); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
987 *next_idx_ptr = idx + 4; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
988 return Py_True; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
989 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
990 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
991 case 'f': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
992 /* false */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
993 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
|
994 Py_INCREF(Py_False); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
995 *next_idx_ptr = idx + 5; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
996 return Py_False; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
997 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
998 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
999 case 'N': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1000 /* NaN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1001 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
|
1002 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
|
1003 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1004 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1005 case 'I': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1006 /* Infinity */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1007 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
|
1008 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
|
1009 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1010 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1011 case '-': |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1012 /* -Infinity */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1013 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
|
1014 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
|
1015 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1016 break; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1017 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1018 /* 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
|
1019 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
|
1020 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1021 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1022 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1023 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
|
1024 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1025 /* 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
|
1026 PyObject *pystr; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1027 PyObject *rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1028 Py_ssize_t idx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1029 Py_ssize_t next_idx = -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1030 static char *kwlist[] = {"string", "idx", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1031 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1032 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1033 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1034 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
|
1035 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1036 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1037 if (PyUnicode_Check(pystr)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1038 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
|
1039 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1040 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1041 PyErr_Format(PyExc_TypeError, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1042 "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
|
1043 Py_TYPE(pystr)->tp_name); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1044 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1045 } |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1046 PyDict_Clear(s->memo); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1047 if (rval == NULL) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1048 return NULL; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1049 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
|
1050 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1051 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1052 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1053 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
|
1054 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1055 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1056 s = (PyScannerObject *)type->tp_alloc(type, 0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1057 if (s != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1058 s->strict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1059 s->object_hook = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1060 s->object_pairs_hook = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1061 s->parse_float = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1062 s->parse_int = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1063 s->parse_constant = NULL; |
|
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 return (PyObject *)s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1066 } |
|
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 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1069 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
|
1070 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1071 /* Initialize Scanner object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1072 PyObject *ctx; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1073 static char *kwlist[] = {"context", NULL}; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1074 PyScannerObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1075 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1076 assert(PyScanner_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1077 s = (PyScannerObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1078 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1079 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
|
1080 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1081 |
|
64443
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1082 if (s->memo == NULL) { |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1083 s->memo = PyDict_New(); |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1084 if (s->memo == NULL) |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1085 goto bail; |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1086 } |
|
c3ad883b940b
Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents:
63575
diff
changeset
|
1087 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1088 /* 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
|
1089 s->strict = PyObject_GetAttrString(ctx, "strict"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1090 if (s->strict == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1091 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1092 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
|
1093 if (s->object_hook == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1094 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1095 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
|
1096 if (s->object_pairs_hook == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1097 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1098 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
|
1099 if (s->parse_float == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1100 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1101 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
|
1102 if (s->parse_int == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1103 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1104 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
|
1105 if (s->parse_constant == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1106 goto bail; |
|
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 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1109 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1110 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1111 Py_CLEAR(s->strict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1112 Py_CLEAR(s->object_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1113 Py_CLEAR(s->object_pairs_hook); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1114 Py_CLEAR(s->parse_float); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1115 Py_CLEAR(s->parse_int); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1116 Py_CLEAR(s->parse_constant); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1117 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1118 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1119 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1120 PyDoc_STRVAR(scanner_doc, "JSON scanner object"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1121 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1122 static |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1123 PyTypeObject PyScannerType = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1124 PyVarObject_HEAD_INIT(NULL, 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1125 "_json.Scanner", /* tp_name */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1126 sizeof(PyScannerObject), /* tp_basicsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1127 0, /* tp_itemsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1128 scanner_dealloc, /* tp_dealloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1129 0, /* tp_print */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1130 0, /* tp_getattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1131 0, /* tp_setattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1132 0, /* tp_compare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1133 0, /* tp_repr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1134 0, /* tp_as_number */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1135 0, /* tp_as_sequence */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1136 0, /* tp_as_mapping */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1137 0, /* tp_hash */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1138 scanner_call, /* tp_call */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1139 0, /* tp_str */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1140 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1141 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1142 0, /* tp_as_buffer */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1143 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
|
1144 scanner_doc, /* tp_doc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1145 scanner_traverse, /* tp_traverse */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1146 scanner_clear, /* tp_clear */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1147 0, /* tp_richcompare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1148 0, /* tp_weaklistoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1149 0, /* tp_iter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1150 0, /* tp_iternext */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1151 0, /* tp_methods */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1152 scanner_members, /* tp_members */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1153 0, /* tp_getset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1154 0, /* tp_base */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1155 0, /* tp_dict */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1156 0, /* tp_descr_get */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1157 0, /* tp_descr_set */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1158 0, /* tp_dictoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1159 scanner_init, /* tp_init */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1160 0,/* PyType_GenericAlloc, */ /* tp_alloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1161 scanner_new, /* tp_new */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1162 0,/* PyObject_GC_Del, */ /* tp_free */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1163 }; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1164 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1165 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1166 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
|
1167 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1168 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1169 s = (PyEncoderObject *)type->tp_alloc(type, 0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1170 if (s != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1171 s->markers = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1172 s->defaultfn = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1173 s->encoder = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1174 s->indent = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1175 s->key_separator = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1176 s->item_separator = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1177 s->sort_keys = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1178 s->skipkeys = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1179 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1180 return (PyObject *)s; |
|
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 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1183 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1184 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
|
1185 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1186 /* initialize Encoder object */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1187 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
|
1188 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1189 PyEncoderObject *s; |
|
57610
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1190 PyObject *markers, *defaultfn, *encoder, *indent, *key_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1191 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
|
1192 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1193 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1194 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1195 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1196 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
|
1197 &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1198 &sort_keys, &skipkeys, &allow_nan)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1199 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1200 |
|
57610
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1201 s->markers = markers; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1202 s->defaultfn = defaultfn; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1203 s->encoder = encoder; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1204 s->indent = indent; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1205 s->key_separator = key_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1206 s->item_separator = item_separator; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1207 s->sort_keys = sort_keys; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1208 s->skipkeys = skipkeys; |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1209 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
|
1210 s->allow_nan = PyObject_IsTrue(allow_nan); |
|
6efb46c2b3c3
Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
54374
diff
changeset
|
1211 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1212 Py_INCREF(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1213 Py_INCREF(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1214 Py_INCREF(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1215 Py_INCREF(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1216 Py_INCREF(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1217 Py_INCREF(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1218 Py_INCREF(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1219 Py_INCREF(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1220 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1221 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1222 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1223 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1224 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
|
1225 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1226 /* Python callable interface to encode_listencode_obj */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1227 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
|
1228 PyObject *obj; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1229 PyObject *rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1230 Py_ssize_t indent_level; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1231 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1232 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1233 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1234 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
|
1235 &obj, _convertPyInt_AsSsize_t, &indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1236 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1237 rval = PyList_New(0); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1238 if (rval == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1239 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1240 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
|
1241 Py_DECREF(rval); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1242 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1243 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1244 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1245 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1246 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1247 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1248 _encoded_const(PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1249 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1250 /* 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
|
1251 if (obj == Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1252 static PyObject *s_null = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1253 if (s_null == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1254 s_null = PyUnicode_InternFromString("null"); |
|
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 Py_INCREF(s_null); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1257 return s_null; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1258 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1259 else if (obj == Py_True) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1260 static PyObject *s_true = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1261 if (s_true == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1262 s_true = PyUnicode_InternFromString("true"); |
|
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 Py_INCREF(s_true); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1265 return s_true; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1266 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1267 else if (obj == Py_False) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1268 static PyObject *s_false = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1269 if (s_false == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1270 s_false = PyUnicode_InternFromString("false"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1271 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1272 Py_INCREF(s_false); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1273 return s_false; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1274 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1275 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1276 PyErr_SetString(PyExc_ValueError, "not a const"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1277 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1278 } |
|
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 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1281 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1282 encoder_encode_float(PyEncoderObject *s, PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1283 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1284 /* Return the JSON representation of a PyFloat */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1285 double i = PyFloat_AS_DOUBLE(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1286 if (!Py_IS_FINITE(i)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1287 if (!s->allow_nan) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1288 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
|
1289 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1290 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1291 if (i > 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1292 return PyUnicode_FromString("Infinity"); |
|
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 else if (i < 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1295 return PyUnicode_FromString("-Infinity"); |
|
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 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1298 return PyUnicode_FromString("NaN"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1299 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1300 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1301 /* Use a better float format here? */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1302 return PyObject_Repr(obj); |
|
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 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1305 static PyObject * |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1306 encoder_encode_string(PyEncoderObject *s, PyObject *obj) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1307 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1308 /* Return the JSON representation of a string */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1309 if (s->fast_encode) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1310 return py_encode_basestring_ascii(NULL, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1311 else |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1312 return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1313 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1314 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1315 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1316 _steal_list_append(PyObject *lst, PyObject *stolen) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1317 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1318 /* 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
|
1319 int rval = PyList_Append(lst, stolen); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1320 Py_DECREF(stolen); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1321 return rval; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1322 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1323 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1324 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1325 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
|
1326 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1327 /* 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
|
1328 PyObject *newobj; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1329 int rv; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1330 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1331 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
|
1332 PyObject *cstr = _encoded_const(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1333 if (cstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1334 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1335 return _steal_list_append(rval, cstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1336 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1337 else if (PyUnicode_Check(obj)) |
|
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 PyObject *encoded = encoder_encode_string(s, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1340 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1341 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1342 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1343 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1344 else if (PyLong_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1345 PyObject *encoded = PyObject_Str(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1346 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1347 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1348 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1349 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1350 else if (PyFloat_Check(obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1351 PyObject *encoded = encoder_encode_float(s, obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1352 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1353 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1354 return _steal_list_append(rval, encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1355 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1356 else if (PyList_Check(obj) || PyTuple_Check(obj)) { |
|
70021
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1357 if (Py_EnterRecursiveCall(" while encoding a JSON object")) |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1358 return -1; |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1359 rv = encoder_listencode_list(s, rval, obj, indent_level); |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1360 Py_LeaveRecursiveCall(); |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1361 return rv; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1362 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1363 else if (PyDict_Check(obj)) { |
|
70021
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1364 if (Py_EnterRecursiveCall(" while encoding a JSON object")) |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1365 return -1; |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1366 rv = encoder_listencode_dict(s, rval, obj, indent_level); |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1367 Py_LeaveRecursiveCall(); |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1368 return rv; |
|
53667
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 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1371 PyObject *ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1372 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1373 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1374 ident = PyLong_FromVoidPtr(obj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1375 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1376 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1377 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1378 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1379 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1380 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1381 Py_DECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1382 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1383 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1384 if (PyDict_SetItem(s->markers, ident, obj)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1385 Py_DECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1386 return -1; |
|
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 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1389 newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1390 if (newobj == NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1391 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1392 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1393 } |
|
70021
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1394 |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1395 if (Py_EnterRecursiveCall(" while encoding a JSON object")) |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1396 return -1; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1397 rv = encoder_listencode_obj(s, rval, newobj, indent_level); |
|
70021
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1398 Py_LeaveRecursiveCall(); |
|
9557e4eeb291
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69910
diff
changeset
|
1399 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1400 Py_DECREF(newobj); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1401 if (rv) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1402 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1403 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1404 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1405 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1406 if (PyDict_DelItem(s->markers, ident)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1407 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1408 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1409 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1410 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1411 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1412 return rv; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1413 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1414 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1415 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1416 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1417 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
|
1418 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1419 /* 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
|
1420 static PyObject *open_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1421 static PyObject *close_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1422 static PyObject *empty_dict = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1423 PyObject *kstr = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1424 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
|
1425 PyObject *it = NULL; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1426 PyObject *items; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1427 PyObject *item = NULL; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1428 int skipkeys; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1429 Py_ssize_t idx; |
|
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 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
|
1432 open_dict = PyUnicode_InternFromString("{"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1433 close_dict = PyUnicode_InternFromString("}"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1434 empty_dict = PyUnicode_InternFromString("{}"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1435 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
|
1436 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1437 } |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1438 if (Py_SIZE(dct) == 0) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1439 return PyList_Append(rval, empty_dict); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1440 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1441 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1442 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1443 ident = PyLong_FromVoidPtr(dct); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1444 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1445 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1446 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1447 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1448 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1449 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1450 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1451 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1452 if (PyDict_SetItem(s->markers, ident, dct)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1453 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1454 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1455 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1456 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1457 if (PyList_Append(rval, open_dict)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1458 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1459 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1460 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1461 /* TODO: DOES NOT RUN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1462 indent_level += 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1463 /* |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1464 newline_indent = '\n' + (' ' * (_indent * _current_indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1465 separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1466 buf += newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1467 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1468 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1469 |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1470 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
|
1471 /* 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
|
1472 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
|
1473 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
|
1474 if (items == NULL) |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1475 goto bail; |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1476 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
|
1477 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
|
1478 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1479 } |
|
65939
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1480 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
|
1481 goto bail; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1482 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
|
1483 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
|
1484 PyObject *key, *value; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1485 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
|
1486 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
|
1487 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
|
1488 if (item == NULL) |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1489 goto bail; |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1490 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
|
1491 Py_DECREF(key); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1492 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1493 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1494 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
|
1495 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
|
1496 } |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1497 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
|
1498 goto bail; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1499 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
|
1500 Py_DECREF(items); |
|
6631e5f6d2ce
Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents:
65195
diff
changeset
|
1501 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
|
1502 goto bail; |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1503 skipkeys = PyObject_IsTrue(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1504 idx = 0; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1505 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
|
1506 PyObject *encoded, *key, *value; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1507 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
|
1508 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
|
1509 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1510 } |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1511 key = PyTuple_GET_ITEM(item, 0); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1512 if (PyUnicode_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1513 Py_INCREF(key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1514 kstr = key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1515 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1516 else if (PyFloat_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1517 kstr = encoder_encode_float(s, key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1518 if (kstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1519 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1520 } |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1521 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
|
1522 /* 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
|
1523 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
|
1524 kstr = _encoded_const(key); |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1525 if (kstr == NULL) |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1526 goto bail; |
|
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1527 } |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1528 else if (PyLong_Check(key)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1529 kstr = PyObject_Str(key); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1530 if (kstr == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1531 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1532 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1533 else if (skipkeys) { |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1534 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1535 continue; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1536 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1537 else { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1538 /* 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
|
1539 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
|
1540 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1541 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1542 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1543 if (idx) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1544 if (PyList_Append(rval, s->item_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1545 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1546 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1547 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1548 encoded = encoder_encode_string(s, kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1549 Py_CLEAR(kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1550 if (encoded == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1551 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1552 if (PyList_Append(rval, encoded)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1553 Py_DECREF(encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1554 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1555 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1556 Py_DECREF(encoded); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1557 if (PyList_Append(rval, s->key_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1558 goto bail; |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1559 |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1560 value = PyTuple_GET_ITEM(item, 1); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1561 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
|
1562 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1563 idx += 1; |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1564 Py_DECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1565 } |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1566 if (PyErr_Occurred()) |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1567 goto bail; |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1568 Py_CLEAR(it); |
|
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1569 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1570 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1571 if (PyDict_DelItem(s->markers, ident)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1572 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1573 Py_CLEAR(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1574 } |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1575 /* TODO DOES NOT RUN; dead code |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1576 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1577 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
|
1578 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1579 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
|
1580 }*/ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1581 if (PyList_Append(rval, close_dict)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1582 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1583 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1584 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1585 bail: |
|
54371
1c078bbca233
Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents:
53769
diff
changeset
|
1586 Py_XDECREF(it); |
|
54373
22fd967518ee
* Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents:
54371
diff
changeset
|
1587 Py_XDECREF(item); |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1588 Py_XDECREF(kstr); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1589 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1590 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1591 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1592 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1593 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1594 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1595 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
|
1596 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1597 /* 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
|
1598 static PyObject *open_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1599 static PyObject *close_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1600 static PyObject *empty_array = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1601 PyObject *ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1602 PyObject *s_fast = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1603 Py_ssize_t num_items; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1604 PyObject **seq_items; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1605 Py_ssize_t i; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1606 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1607 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
|
1608 open_array = PyUnicode_InternFromString("["); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1609 close_array = PyUnicode_InternFromString("]"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1610 empty_array = PyUnicode_InternFromString("[]"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1611 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
|
1612 return -1; |
|
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 ident = NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1615 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
|
1616 if (s_fast == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1617 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1618 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
|
1619 if (num_items == 0) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1620 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1621 return PyList_Append(rval, empty_array); |
|
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 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1624 if (s->markers != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1625 int has_key; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1626 ident = PyLong_FromVoidPtr(seq); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1627 if (ident == NULL) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1628 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1629 has_key = PyDict_Contains(s->markers, ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1630 if (has_key) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1631 if (has_key != -1) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1632 PyErr_SetString(PyExc_ValueError, "Circular reference detected"); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1633 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1634 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1635 if (PyDict_SetItem(s->markers, ident, seq)) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1636 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1637 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1638 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1639 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1640 seq_items = PySequence_Fast_ITEMS(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1641 if (PyList_Append(rval, open_array)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1642 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1643 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1644 /* TODO: DOES NOT RUN */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1645 indent_level += 1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1646 /* |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1647 newline_indent = '\n' + (' ' * (_indent * _current_indent_level)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1648 separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1649 buf += newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1650 */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1651 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1652 for (i = 0; i < num_items; i++) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1653 PyObject *obj = seq_items[i]; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1654 if (i) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1655 if (PyList_Append(rval, s->item_separator)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1656 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1657 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1658 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
|
1659 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1660 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1661 if (ident != NULL) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1662 if (PyDict_DelItem(s->markers, ident)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1663 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1664 Py_CLEAR(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1665 } |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1666 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1667 /* TODO: DOES NOT RUN |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1668 if (s->indent != Py_None) { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1669 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
|
1670 |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
65939
diff
changeset
|
1671 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
|
1672 }*/ |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1673 if (PyList_Append(rval, close_array)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1674 goto bail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1675 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1676 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1677 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1678 bail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1679 Py_XDECREF(ident); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1680 Py_DECREF(s_fast); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1681 return -1; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1682 } |
|
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 static void |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1685 encoder_dealloc(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1686 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1687 /* Deallocate Encoder */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1688 encoder_clear(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1689 Py_TYPE(self)->tp_free(self); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1690 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1691 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1692 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1693 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
|
1694 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1695 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1696 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1697 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1698 Py_VISIT(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1699 Py_VISIT(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1700 Py_VISIT(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1701 Py_VISIT(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1702 Py_VISIT(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1703 Py_VISIT(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1704 Py_VISIT(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1705 Py_VISIT(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1706 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1707 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1708 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1709 static int |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1710 encoder_clear(PyObject *self) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1711 { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1712 /* Deallocate Encoder */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1713 PyEncoderObject *s; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1714 assert(PyEncoder_Check(self)); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1715 s = (PyEncoderObject *)self; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1716 Py_CLEAR(s->markers); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1717 Py_CLEAR(s->defaultfn); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1718 Py_CLEAR(s->encoder); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1719 Py_CLEAR(s->indent); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1720 Py_CLEAR(s->key_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1721 Py_CLEAR(s->item_separator); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1722 Py_CLEAR(s->sort_keys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1723 Py_CLEAR(s->skipkeys); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1724 return 0; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1725 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1726 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1727 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
|
1728 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1729 static |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1730 PyTypeObject PyEncoderType = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1731 PyVarObject_HEAD_INIT(NULL, 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1732 "_json.Encoder", /* tp_name */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1733 sizeof(PyEncoderObject), /* tp_basicsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1734 0, /* tp_itemsize */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1735 encoder_dealloc, /* tp_dealloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1736 0, /* tp_print */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1737 0, /* tp_getattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1738 0, /* tp_setattr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1739 0, /* tp_compare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1740 0, /* tp_repr */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1741 0, /* tp_as_number */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1742 0, /* tp_as_sequence */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1743 0, /* tp_as_mapping */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1744 0, /* tp_hash */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1745 encoder_call, /* tp_call */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1746 0, /* tp_str */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1747 0, /* tp_getattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1748 0, /* tp_setattro */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1749 0, /* tp_as_buffer */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1750 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
|
1751 encoder_doc, /* tp_doc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1752 encoder_traverse, /* tp_traverse */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1753 encoder_clear, /* tp_clear */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1754 0, /* tp_richcompare */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1755 0, /* tp_weaklistoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1756 0, /* tp_iter */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1757 0, /* tp_iternext */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1758 0, /* tp_methods */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1759 encoder_members, /* tp_members */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1760 0, /* tp_getset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1761 0, /* tp_base */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1762 0, /* tp_dict */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1763 0, /* tp_descr_get */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1764 0, /* tp_descr_set */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1765 0, /* tp_dictoffset */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1766 encoder_init, /* tp_init */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1767 0, /* tp_alloc */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1768 encoder_new, /* tp_new */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1769 0, /* tp_free */ |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1770 }; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1771 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1772 static PyMethodDef speedups_methods[] = { |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1773 {"encode_basestring_ascii", |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1774 (PyCFunction)py_encode_basestring_ascii, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1775 METH_O, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1776 pydoc_encode_basestring_ascii}, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1777 {"scanstring", |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1778 (PyCFunction)py_scanstring, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1779 METH_VARARGS, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1780 pydoc_scanstring}, |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1781 {NULL, NULL, 0, NULL} |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1782 }; |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1783 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1784 PyDoc_STRVAR(module_doc, |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1785 "json speedups\n"); |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1786 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1787 static struct PyModuleDef jsonmodule = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1788 PyModuleDef_HEAD_INIT, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1789 "_json", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1790 module_doc, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1791 -1, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1792 speedups_methods, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1793 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1794 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1795 NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57610
diff
changeset
|
1796 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1797 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1798 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1799 PyObject* |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1800 PyInit__json(void) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1801 { |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1802 PyObject *m = PyModule_Create(&jsonmodule); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1803 if (!m) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1804 return NULL; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1805 PyScannerType.tp_new = PyType_GenericNew; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1806 if (PyType_Ready(&PyScannerType) < 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1807 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1808 PyEncoderType.tp_new = PyType_GenericNew; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1809 if (PyType_Ready(&PyEncoderType) < 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1810 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1811 Py_INCREF((PyObject*)&PyScannerType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1812 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
|
1813 Py_DECREF((PyObject*)&PyScannerType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1814 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1815 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1816 Py_INCREF((PyObject*)&PyEncoderType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1817 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
|
1818 Py_DECREF((PyObject*)&PyEncoderType); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1819 goto fail; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1820 } |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1821 return m; |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1822 fail: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1823 Py_DECREF(m); |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
49531
diff
changeset
|
1824 return NULL; |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1825 } |
