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