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