annotate Modules/_json.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 5f7326ed850f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
120 static PyObject *
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
171 void *input;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
172 unsigned char *output;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
173 int kind;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
174
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
175 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
176 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
177
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
178 input_chars = PyUnicode_GET_LENGTH(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
179 input = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
182 /* Compute the output size */
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
183 for (i = 0, output_size = 2; i < input_chars; i++) {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
184 Py_UCS4 c = PyUnicode_READ(kind, input, i);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
185 if (S_CHAR(c))
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
186 output_size++;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
187 else {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
190 case '\n': case '\r': case '\t':
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
191 output_size += 2; break;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
192 default:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
193 output_size += c >= 0x10000 ? 12 : 6;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
194 }
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
195 }
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
196 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
197
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
311 const void *buf;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
316 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
317 return 0;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
318
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
319 len = PyUnicode_GET_LENGTH(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
320 buf = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
321 kind = PyUnicode_KIND(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
347 chunk = PyUnicode_FromKindAndData(
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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 */
87588
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
412 if (Py_UNICODE_IS_HIGH_SURROGATE(c) && end + 6 < len &&
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
413 PyUnicode_READ(kind, buf, next++) == '\\' &&
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
414 PyUnicode_READ(kind, buf, next++) == 'u') {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
415 Py_UCS4 c2 = 0;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
416 end += 6;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
417 /* Decode 4 hex digits */
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
418 for (; next < end; next++) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
419 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
420 c2 <<= 4;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
421 switch (digit) {
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
422 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
423 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
424 c2 |= (digit - '0'); break;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
425 case 'a': case 'b': case 'c': case 'd': case 'e':
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
426 case 'f':
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
427 c2 |= (digit - 'a' + 10); break;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
428 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
429 case 'F':
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
430 c2 |= (digit - 'A' + 10); break;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
431 default:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
432 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
433 goto bail;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
434 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
435 }
87588
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
436 if (Py_UNICODE_IS_LOW_SURROGATE(c2))
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
437 c = Py_UNICODE_JOIN_SURROGATES(c, c2);
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
438 else
8abbdbe86c01 Issue #11489: JSON decoder now accepts lone surrogates.
Serhiy Storchaka <storchaka@gmail.com>
parents: 81271
diff changeset
439 end -= 6;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
440 }
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
441 }
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
442 APPEND_OLD_CHUNK
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
443 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
444 if (chunk == NULL) {
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
445 goto bail;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
446 }
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
447 }
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
448
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
449 if (chunks == NULL) {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
450 if (chunk != NULL)
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
451 rval = chunk;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
452 else
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
453 rval = PyUnicode_FromStringAndSize("", 0);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
454 }
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
455 else {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
456 APPEND_OLD_CHUNK
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
457 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
458 if (rval == NULL) {
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
459 goto bail;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
460 }
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
461 Py_CLEAR(chunks);
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
462 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
463
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
464 *next_end_ptr = end;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
465 return rval;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
466 bail:
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
467 *next_end_ptr = -1;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
468 Py_XDECREF(chunks);
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
469 Py_XDECREF(chunk);
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
470 return NULL;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
471 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
472
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
473 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
474 "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
475 "\n"
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
476 "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
477 "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
478 "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
479 "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
480 "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
481 "\n"
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
482 "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
483 "after the end quote."
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
484 );
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
485
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
486 static PyObject *
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
487 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
488 {
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
489 PyObject *pystr;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
490 PyObject *rval;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
491 Py_ssize_t end;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
492 Py_ssize_t next_end = -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
493 int strict = 1;
80669
2c04d2102534 Issue #16590: remove obsolete compatibility code from the _json module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80159
diff changeset
494 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
495 return NULL;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
496 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
497 if (PyUnicode_Check(pystr)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
498 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
499 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
500 else {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
501 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
502 "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
503 Py_TYPE(pystr)->tp_name);
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
504 return NULL;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
505 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
506 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
507 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
508
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
509 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
510 "encode_basestring_ascii(string) -> string\n"
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
511 "\n"
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
512 "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
513 );
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
514
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
515 static PyObject *
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
516 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
517 {
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
518 PyObject *rval;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
519 /* 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
520 /* METH_O */
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
521 if (PyUnicode_Check(pystr)) {
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
522 rval = ascii_escape_unicode(pystr);
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
523 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
524 else {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
525 PyErr_Format(PyExc_TypeError,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
526 "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
527 Py_TYPE(pystr)->tp_name);
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
528 return NULL;
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 return rval;
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
531 }
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
532
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
533 static void
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
534 scanner_dealloc(PyObject *self)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
535 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
536 /* Deallocate scanner object */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
537 scanner_clear(self);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
538 Py_TYPE(self)->tp_free(self);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
539 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
540
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
541 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
542 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
543 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
544 PyScannerObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
545 assert(PyScanner_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
546 s = (PyScannerObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
547 Py_VISIT(s->strict);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
548 Py_VISIT(s->object_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
549 Py_VISIT(s->object_pairs_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
550 Py_VISIT(s->parse_float);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
551 Py_VISIT(s->parse_int);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
552 Py_VISIT(s->parse_constant);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
553 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
554 }
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 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
557 scanner_clear(PyObject *self)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
558 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
559 PyScannerObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
560 assert(PyScanner_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
561 s = (PyScannerObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
562 Py_CLEAR(s->strict);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
563 Py_CLEAR(s->object_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
564 Py_CLEAR(s->object_pairs_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
565 Py_CLEAR(s->parse_float);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
566 Py_CLEAR(s->parse_int);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
567 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
568 Py_CLEAR(s->memo);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
569 return 0;
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
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
572 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
573 _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
574 /* Read a JSON object from PyUnicode pystr.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
575 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
576 *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
577 the closing curly brace.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
578
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
579 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
580 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
581 void *str;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
582 int kind;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
583 Py_ssize_t end_idx;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
584 PyObject *val = NULL;
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
585 PyObject *rval = NULL;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
586 PyObject *key = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
587 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
588 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
589 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
590
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
591 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
592 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
593
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
594 str = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
595 kind = PyUnicode_KIND(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
596 end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
597
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
598 if (has_pairs_hook)
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
599 rval = PyList_New(0);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
600 else
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
601 rval = PyDict_New();
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
602 if (rval == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
603 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
604
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
605 /* skip whitespace after { */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
606 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
607
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
608 /* 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
609 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
610 while (1) {
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
611 PyObject *memokey;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
612
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
613 /* 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
614 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
615 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
616 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
617 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
618 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
619 if (key == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
620 goto bail;
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
621 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
622 if (memokey != NULL) {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
623 Py_INCREF(memokey);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
624 Py_DECREF(key);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
625 key = memokey;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
626 }
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
627 else {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
628 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
629 goto bail;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
630 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
631 idx = next_idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
632
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
633 /* skip whitespace between key and : delimiter, read :, skip whitespace */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
634 while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
635 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
636 raise_errmsg("Expecting ':' delimiter", pystr, idx);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
637 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
638 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
639 idx++;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
640 while (idx <= end_idx && IS_WHITESPACE(PyUnicode_READ(kind, str, idx))) idx++;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
641
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
642 /* read any JSON term */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
643 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
644 if (val == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
645 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
646
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
647 if (has_pairs_hook) {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
648 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
649 if (item == NULL)
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
650 goto bail;
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
651 Py_CLEAR(key);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
652 Py_CLEAR(val);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
653 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
654 Py_DECREF(item);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
655 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
656 }
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
657 Py_DECREF(item);
53667
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 else {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
660 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
661 goto bail;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
662 Py_CLEAR(key);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
663 Py_CLEAR(val);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
664 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
665 idx = next_idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
666
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
667 /* skip whitespace before } or , */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
668 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
669
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
670 /* 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
671 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
672 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
673 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
674 raise_errmsg("Expecting ',' delimiter", pystr, idx);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
675 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
676 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
677 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 after , delimiter */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
683
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
684 *next_idx_ptr = idx + 1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
685
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
686 if (has_pairs_hook) {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
687 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
688 Py_DECREF(rval);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
689 return val;
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
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
692 /* 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
693 if (s->object_hook != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
694 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
695 Py_DECREF(rval);
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
696 return val;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
697 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
698 return rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
699 bail:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
700 Py_XDECREF(key);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
701 Py_XDECREF(val);
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
702 Py_XDECREF(rval);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
703 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
704 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
705
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
706 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
707 _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
708 /* Read a JSON array from PyString pystr.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
709 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
710 *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
711 the closing brace.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
712
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
713 Returns a new PyList
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
714 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
715 void *str;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
716 int kind;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
717 Py_ssize_t end_idx;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
718 PyObject *val = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
719 PyObject *rval = PyList_New(0);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
720 Py_ssize_t next_idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
721 if (rval == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
722 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
723
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
724 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
725 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
726
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
727 str = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
728 kind = PyUnicode_KIND(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
729 end_idx = PyUnicode_GET_LENGTH(pystr) - 1;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
730
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
731 /* skip whitespace after [ */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
732 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
733
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
734 /* 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
735 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
736 while (1) {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
737
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
738 /* read any JSON term */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
739 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
740 if (val == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
741 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
742
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
743 if (PyList_Append(rval, val) == -1)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
744 goto bail;
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 Py_CLEAR(val);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
747 idx = next_idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
748
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
749 /* skip whitespace between term and , */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
750 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
751
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
752 /* 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
753 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
754 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
755 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
756 raise_errmsg("Expecting ',' delimiter", pystr, idx);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
757 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
758 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
759 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 after , */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
765
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
766 /* verify that idx < end_idx, PyUnicode_READ(kind, str, idx) should be ']' */
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
767 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
768 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
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 *next_idx_ptr = idx + 1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
772 return rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
773 bail:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
774 Py_XDECREF(val);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
775 Py_DECREF(rval);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
776 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
777 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
778
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
779 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
780 _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
781 /* Read a JSON constant from PyString pystr.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
782 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
783 ("NaN", "Infinity", "-Infinity").
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
784 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
785 *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
786 the constant.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
787
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
788 Returns the result of parse_constant
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 PyObject *cstr;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
791 PyObject *rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
792 /* constant is "NaN", "Infinity", or "-Infinity" */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
793 cstr = PyUnicode_InternFromString(constant);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
794 if (cstr == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
795 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
796
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
797 /* rval = parse_constant(constant) */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
798 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
799 idx += PyUnicode_GET_LENGTH(cstr);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
800 Py_DECREF(cstr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
801 *next_idx_ptr = idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
802 return rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
803 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
804
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
805 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
806 _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
807 /* Read a JSON number from PyUnicode pystr.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
808 idx is the index of the first character of the number
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
809 *next_idx_ptr is a return-by-reference index to the first character after
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
810 the number.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
811
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
812 Returns a new PyObject representation of that number:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
813 PyInt, PyLong, or PyFloat.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
814 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
815 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
816 void *str;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
817 int kind;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
818 Py_ssize_t end_idx;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
819 Py_ssize_t idx = start;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
820 int is_float = 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
821 PyObject *rval;
69552
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
822 PyObject *numstr = NULL;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
823 PyObject *custom_func;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
824
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
825 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
826 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
827
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
828 str = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
829 kind = PyUnicode_KIND(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
830 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
831
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
832 /* read a sign if it's there, make sure it's not the end of the string */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
833 if (PyUnicode_READ(kind, str, idx) == '-') {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
834 idx++;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
835 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
836 raise_stop_iteration(start);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
837 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
838 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
839 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
840
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
841 /* read as many integer digits as we find as long as it doesn't start with 0 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
842 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
843 idx++;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
844 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
845 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
846 /* if it starts with 0 we only expect one integer digit */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
847 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
848 idx++;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
849 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
850 /* no integer digits, error */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
851 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
852 raise_stop_iteration(start);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
853 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
854 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
855
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
856 /* if the next char is '.' followed by a digit then read all float digits */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
857 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
858 is_float = 1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
859 idx += 2;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
860 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
861 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
862
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
863 /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
864 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
865 Py_ssize_t e_start = idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
866 idx++;
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 /* read an exponent sign if present */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
869 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
870
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
871 /* read all digits */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
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 /* if we got a digit, then parse as float. if not, backtrack */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
875 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
876 is_float = 1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
877 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
878 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
879 idx = e_start;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
880 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
881 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
882
69552
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
883 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
884 custom_func = s->parse_float;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
885 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
886 custom_func = s->parse_int;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
887 else
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
888 custom_func = NULL;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
889
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
890 if (custom_func) {
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
891 /* copy the section we determined to be a number */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
892 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
893 (char*)str + kind * start,
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
894 idx - start);
69552
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
895 if (numstr == NULL)
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
896 return NULL;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
897 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
898 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
899 else {
69552
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
900 Py_ssize_t i, n;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
901 char *buf;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
902 /* 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
903 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
904 n = idx - start;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
905 numstr = PyBytes_FromStringAndSize(NULL, n);
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
906 if (numstr == NULL)
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
907 return NULL;
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
908 buf = PyBytes_AS_STRING(numstr);
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
909 for (i = 0; i < n; i++) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
910 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
911 }
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
912 if (is_float)
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
913 rval = PyFloat_FromString(numstr);
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
914 else
d60f9d9983bb Issue #11856: Speed up parsing of JSON numbers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
915 rval = PyLong_FromString(buf, NULL, 10);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
916 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
917 Py_DECREF(numstr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
918 *next_idx_ptr = idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
919 return rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
920 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
921
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
922 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
923 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
924 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
925 /* 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
926 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
927 *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
928 the number.
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
929
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
930 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
931 */
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
932 PyObject *res;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
933 void *str;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
934 int kind;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
935 Py_ssize_t length;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
936
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
937 if (PyUnicode_READY(pystr) == -1)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
938 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
939
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
940 str = PyUnicode_DATA(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
941 kind = PyUnicode_KIND(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
942 length = PyUnicode_GET_LENGTH(pystr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
943
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
944 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
945 raise_stop_iteration(idx);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
946 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
947 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
948
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
949 switch (PyUnicode_READ(kind, str, idx)) {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
950 case '"':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
951 /* string */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
952 return scanstring_unicode(pystr, idx + 1,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
953 PyObject_IsTrue(s->strict),
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
954 next_idx_ptr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
955 case '{':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
956 /* 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
957 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
958 "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
959 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
960 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
961 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
962 return res;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
963 case '[':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
964 /* 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
965 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
966 "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
967 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
968 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
969 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
970 return res;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
971 case 'n':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
972 /* null */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
973 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
974 Py_INCREF(Py_None);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
975 *next_idx_ptr = idx + 4;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
976 return Py_None;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
977 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
978 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
979 case 't':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
980 /* true */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
981 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
982 Py_INCREF(Py_True);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
983 *next_idx_ptr = idx + 4;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
984 return Py_True;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
985 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
986 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
987 case 'f':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
988 /* false */
72864
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
989 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
990 PyUnicode_READ(kind, str, idx + 2) == 'l' &&
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
991 PyUnicode_READ(kind, str, idx + 3) == 's' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
992 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
993 Py_INCREF(Py_False);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
994 *next_idx_ptr = idx + 5;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
995 return Py_False;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
996 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
997 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
998 case 'N':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
999 /* NaN */
72864
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
1000 if ((idx + 2 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1001 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
1002 return _parse_constant(s, "NaN", idx, next_idx_ptr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1003 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1004 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1005 case 'I':
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1006 /* Infinity */
72864
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
1007 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
1008 PyUnicode_READ(kind, str, idx + 2) == 'f' &&
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
1009 PyUnicode_READ(kind, str, idx + 3) == 'i' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1010 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
1011 PyUnicode_READ(kind, str, idx + 5) == 'i' &&
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
1012 PyUnicode_READ(kind, str, idx + 6) == 't' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1013 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
1014 return _parse_constant(s, "Infinity", idx, next_idx_ptr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1015 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1016 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1017 case '-':
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 + 8 < length) && PyUnicode_READ(kind, str, idx + 1) == 'I' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1020 PyUnicode_READ(kind, str, idx + 2) == 'n' &&
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1021 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
1022 PyUnicode_READ(kind, str, idx + 4) == 'i' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1023 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
1024 PyUnicode_READ(kind, str, idx + 6) == 'i' &&
dbfd77c15051 Strip trailing spaces in _json.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72863
diff changeset
1025 PyUnicode_READ(kind, str, idx + 7) == 't' &&
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71977
diff changeset
1026 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
1027 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
1028 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1029 break;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1030 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1031 /* 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
1032 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
1033 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1034
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1035 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1036 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
1037 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1038 /* 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
1039 PyObject *pystr;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1040 PyObject *rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1041 Py_ssize_t idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1042 Py_ssize_t next_idx = -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1043 static char *kwlist[] = {"string", "idx", NULL};
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1044 PyScannerObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1045 assert(PyScanner_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1046 s = (PyScannerObject *)self;
80669
2c04d2102534 Issue #16590: remove obsolete compatibility code from the _json module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80159
diff changeset
1047 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
1048 return NULL;
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 if (PyUnicode_Check(pystr)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1051 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
1052 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1053 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1054 PyErr_Format(PyExc_TypeError,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1055 "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
1056 Py_TYPE(pystr)->tp_name);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1057 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1058 }
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1059 PyDict_Clear(s->memo);
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1060 if (rval == NULL)
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1061 return NULL;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1062 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
1063 }
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 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1066 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
1067 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1068 PyScannerObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1069 s = (PyScannerObject *)type->tp_alloc(type, 0);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1070 if (s != NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1071 s->strict = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1072 s->object_hook = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1073 s->object_pairs_hook = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1074 s->parse_float = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1075 s->parse_int = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1076 s->parse_constant = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1077 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1078 return (PyObject *)s;
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
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1081 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1082 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
1083 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1084 /* Initialize Scanner object */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1085 PyObject *ctx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1086 static char *kwlist[] = {"context", NULL};
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1087 PyScannerObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1088
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1089 assert(PyScanner_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1090 s = (PyScannerObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1091
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1092 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
1093 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1094
64443
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1095 if (s->memo == NULL) {
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1096 s->memo = PyDict_New();
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1097 if (s->memo == NULL)
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1098 goto bail;
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1099 }
c3ad883b940b Issue #7451: Improve decoding performance of JSON objects, and reduce
Antoine Pitrou <solipsis@pitrou.net>
parents: 63575
diff changeset
1100
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1101 /* 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
1102 s->strict = PyObject_GetAttrString(ctx, "strict");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1103 if (s->strict == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1104 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1105 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
1106 if (s->object_hook == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1107 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1108 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
1109 if (s->object_pairs_hook == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1110 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1111 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
1112 if (s->parse_float == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1113 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1114 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
1115 if (s->parse_int == 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->parse_constant = PyObject_GetAttrString(ctx, "parse_constant");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1118 if (s->parse_constant == 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
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1121 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1122
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1123 bail:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1124 Py_CLEAR(s->strict);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1125 Py_CLEAR(s->object_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1126 Py_CLEAR(s->object_pairs_hook);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1127 Py_CLEAR(s->parse_float);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1128 Py_CLEAR(s->parse_int);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1129 Py_CLEAR(s->parse_constant);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1130 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1131 }
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 PyDoc_STRVAR(scanner_doc, "JSON scanner object");
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 static
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1136 PyTypeObject PyScannerType = {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1137 PyVarObject_HEAD_INIT(NULL, 0)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1138 "_json.Scanner", /* tp_name */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1139 sizeof(PyScannerObject), /* tp_basicsize */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1140 0, /* tp_itemsize */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1141 scanner_dealloc, /* tp_dealloc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1142 0, /* tp_print */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1143 0, /* tp_getattr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1144 0, /* tp_setattr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1145 0, /* tp_compare */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1146 0, /* tp_repr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1147 0, /* tp_as_number */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1148 0, /* tp_as_sequence */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1149 0, /* tp_as_mapping */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1150 0, /* tp_hash */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1151 scanner_call, /* tp_call */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1152 0, /* tp_str */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1153 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1154 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1155 0, /* tp_as_buffer */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1156 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
1157 scanner_doc, /* tp_doc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1158 scanner_traverse, /* tp_traverse */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1159 scanner_clear, /* tp_clear */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1160 0, /* tp_richcompare */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1161 0, /* tp_weaklistoffset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1162 0, /* tp_iter */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1163 0, /* tp_iternext */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1164 0, /* tp_methods */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1165 scanner_members, /* tp_members */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1166 0, /* tp_getset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1167 0, /* tp_base */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1168 0, /* tp_dict */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1169 0, /* tp_descr_get */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1170 0, /* tp_descr_set */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1171 0, /* tp_dictoffset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1172 scanner_init, /* tp_init */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1173 0,/* PyType_GenericAlloc, */ /* tp_alloc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1174 scanner_new, /* tp_new */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1175 0,/* PyObject_GC_Del, */ /* tp_free */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1176 };
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1177
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1178 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1179 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
1180 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1181 PyEncoderObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1182 s = (PyEncoderObject *)type->tp_alloc(type, 0);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1183 if (s != NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1184 s->markers = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1185 s->defaultfn = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1186 s->encoder = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1187 s->indent = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1188 s->key_separator = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1189 s->item_separator = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1190 s->sort_keys = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1191 s->skipkeys = NULL;
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 return (PyObject *)s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1194 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1195
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1196 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1197 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
1198 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1199 /* initialize Encoder object */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1200 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
1201
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1202 PyEncoderObject *s;
57610
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1203 PyObject *markers, *defaultfn, *encoder, *indent, *key_separator;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1204 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
1205
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1206 assert(PyEncoder_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1207 s = (PyEncoderObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1208
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1209 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
1210 &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator,
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1211 &sort_keys, &skipkeys, &allow_nan))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1212 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1213
57610
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1214 s->markers = markers;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1215 s->defaultfn = defaultfn;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1216 s->encoder = encoder;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1217 s->indent = indent;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1218 s->key_separator = key_separator;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1219 s->item_separator = item_separator;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1220 s->sort_keys = sort_keys;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1221 s->skipkeys = skipkeys;
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1222 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
1223 s->allow_nan = PyObject_IsTrue(allow_nan);
6efb46c2b3c3 Merged revisions 76710 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54374
diff changeset
1224
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1225 Py_INCREF(s->markers);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1226 Py_INCREF(s->defaultfn);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1227 Py_INCREF(s->encoder);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1228 Py_INCREF(s->indent);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1229 Py_INCREF(s->key_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1230 Py_INCREF(s->item_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1231 Py_INCREF(s->sort_keys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1232 Py_INCREF(s->skipkeys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1233 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1234 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1235
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1236 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1237 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
1238 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1239 /* Python callable interface to encode_listencode_obj */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1240 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
1241 PyObject *obj;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1242 Py_ssize_t indent_level;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1243 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
1244 _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
1245
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1246 assert(PyEncoder_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1247 s = (PyEncoderObject *)self;
80669
2c04d2102534 Issue #16590: remove obsolete compatibility code from the _json module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80159
diff changeset
1248 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
1249 &obj, &indent_level))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1250 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
1251 if (_PyAccu_Init(&acc))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1252 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
1253 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
1254 _PyAccu_Destroy(&acc);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1255 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1256 }
72757
e685b02ddcac Remove now duplicate code in _json.c; instead, reuse the new private lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 72475
diff changeset
1257 return _PyAccu_FinishAsList(&acc);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1258 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1259
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1260 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1261 _encoded_const(PyObject *obj)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1262 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1263 /* 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
1264 if (obj == Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1265 static PyObject *s_null = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1266 if (s_null == NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1267 s_null = PyUnicode_InternFromString("null");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1268 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1269 Py_INCREF(s_null);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1270 return s_null;
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 else if (obj == Py_True) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1273 static PyObject *s_true = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1274 if (s_true == NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1275 s_true = PyUnicode_InternFromString("true");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1276 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1277 Py_INCREF(s_true);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1278 return s_true;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1279 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1280 else if (obj == Py_False) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1281 static PyObject *s_false = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1282 if (s_false == NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1283 s_false = PyUnicode_InternFromString("false");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1284 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1285 Py_INCREF(s_false);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1286 return s_false;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1287 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1288 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1289 PyErr_SetString(PyExc_ValueError, "not a const");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1290 return NULL;
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 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1293
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1294 static PyObject *
85103
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1295 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
1296 {
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1297 /* 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
1298 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
1299 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
1300 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
1301 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
1302 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
1303 }
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1304 else {
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1305 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
1306 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
1307 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
1308 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
1309 "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
1310 );
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1311 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
1312 }
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1313 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
1314 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
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 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
1317 }
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1318
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1319
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1320 static PyObject *
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1321 encoder_encode_float(PyEncoderObject *s, PyObject *obj)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1322 {
85103
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 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
1324 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
1325 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
1326 PyObject *encoded, *floatobj;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1327 double i = PyFloat_AS_DOUBLE(obj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1328 if (!Py_IS_FINITE(i)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1329 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
1330 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
1331 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
1332 "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
1333 );
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1334 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1335 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1336 if (i > 0) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1337 return PyUnicode_FromString("Infinity");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1338 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1339 else if (i < 0) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1340 return PyUnicode_FromString("-Infinity");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1341 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1342 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1343 return PyUnicode_FromString("NaN");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1344 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1345 }
85103
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1346 /* 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
1347 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
1348 /* 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
1349 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
1350 }
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1351 else {
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1352 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
1353 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
1354 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
1355 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
1356 "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
1357 );
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1358 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
1359 }
ae1a7c420f08 Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents: 81272
diff changeset
1360 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
1361 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
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 return encoded;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1364 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1365
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1366 static PyObject *
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1367 encoder_encode_string(PyEncoderObject *s, PyObject *obj)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1368 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1369 /* Return the JSON representation of a string */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1370 if (s->fast_encode)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1371 return py_encode_basestring_ascii(NULL, obj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1372 else
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1373 return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1374 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1375
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1376 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
1377 _steal_accumulate(_PyAccu *acc, PyObject *stolen)
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1378 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1379 /* 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
1380 int rval = _PyAccu_Accumulate(acc, stolen);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1381 Py_DECREF(stolen);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1382 return rval;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1383 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1384
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1385 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
1386 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
1387 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
1388 {
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
1389 /* 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
1390 PyObject *newobj;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1391 int rv;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1392
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1393 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
1394 PyObject *cstr = _encoded_const(obj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1395 if (cstr == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1396 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
1397 return _steal_accumulate(acc, cstr);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1398 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1399 else if (PyUnicode_Check(obj))
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1400 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1401 PyObject *encoded = encoder_encode_string(s, obj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1402 if (encoded == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1403 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
1404 return _steal_accumulate(acc, encoded);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1405 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1406 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
1407 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
1408 if (encoded == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1409 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
1410 return _steal_accumulate(acc, encoded);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1411 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1412 else if (PyFloat_Check(obj)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1413 PyObject *encoded = encoder_encode_float(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 (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
1419 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
1420 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
1421 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
1422 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
1423 return rv;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1424 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1425 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
1426 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
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 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
1429 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
1430 return rv;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1431 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1432 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1433 PyObject *ident = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1434 if (s->markers != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1435 int has_key;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1436 ident = PyLong_FromVoidPtr(obj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1437 if (ident == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1438 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1439 has_key = PyDict_Contains(s->markers, ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1440 if (has_key) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1441 if (has_key != -1)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1442 PyErr_SetString(PyExc_ValueError, "Circular reference detected");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1443 Py_DECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1444 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1445 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1446 if (PyDict_SetItem(s->markers, ident, obj)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1447 Py_DECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1448 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1449 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1450 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1451 newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1452 if (newobj == NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1453 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1454 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1455 }
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
1456
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
1457 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
1458 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
1459 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
1460 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
1461
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1462 Py_DECREF(newobj);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1463 if (rv) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1464 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1465 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1466 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1467 if (ident != NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1468 if (PyDict_DelItem(s->markers, ident)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1469 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1470 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1471 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1472 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1473 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1474 return rv;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1475 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1476 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1477
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1478 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
1479 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
1480 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
1481 {
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
1482 /* 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
1483 static PyObject *open_dict = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1484 static PyObject *close_dict = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1485 static PyObject *empty_dict = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1486 PyObject *kstr = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1487 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
1488 PyObject *it = NULL;
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1489 PyObject *items;
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1490 PyObject *item = NULL;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1491 int skipkeys;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1492 Py_ssize_t idx;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1493
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1494 if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1495 open_dict = PyUnicode_InternFromString("{");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1496 close_dict = PyUnicode_InternFromString("}");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1497 empty_dict = PyUnicode_InternFromString("{}");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1498 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
1499 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1500 }
54371
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1501 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
1502 return _PyAccu_Accumulate(acc, empty_dict);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1503
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1504 if (s->markers != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1505 int has_key;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1506 ident = PyLong_FromVoidPtr(dct);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1507 if (ident == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1508 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1509 has_key = PyDict_Contains(s->markers, ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1510 if (has_key) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1511 if (has_key != -1)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1512 PyErr_SetString(PyExc_ValueError, "Circular reference detected");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1513 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1514 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1515 if (PyDict_SetItem(s->markers, ident, dct)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1516 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1517 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1518 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1519
72757
e685b02ddcac Remove now duplicate code in _json.c; instead, reuse the new private lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 72475
diff changeset
1520 if (_PyAccu_Accumulate(acc, open_dict))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1521 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1522
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1523 if (s->indent != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1524 /* TODO: DOES NOT RUN */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1525 indent_level += 1;
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 newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1528 separator = _item_separator + newline_indent
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1529 buf += newline_indent
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 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1532
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1533 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
1534 /* 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
1535 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
1536 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
1537 if (items == NULL)
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1538 goto bail;
65939
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1539 if (!PyList_Check(items)) {
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1540 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
1541 goto bail;
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1542 }
65939
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1543 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
1544 goto bail;
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1545 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
1546 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
1547 PyObject *key, *value;
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1548 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
1549 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
1550 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
1551 if (item == NULL)
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1552 goto bail;
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1553 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
1554 Py_DECREF(key);
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1555 }
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1556 }
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1557 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
1558 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
1559 }
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1560 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
1561 goto bail;
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1562 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
1563 Py_DECREF(items);
6631e5f6d2ce Issue #10314: improve performance of JSON encoding with sort_keys=True
Antoine Pitrou <solipsis@pitrou.net>
parents: 65195
diff changeset
1564 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
1565 goto bail;
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1566 skipkeys = PyObject_IsTrue(s->skipkeys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1567 idx = 0;
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1568 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
1569 PyObject *encoded, *key, *value;
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1570 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
1571 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
1572 goto bail;
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1573 }
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1574 key = PyTuple_GET_ITEM(item, 0);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1575 if (PyUnicode_Check(key)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1576 Py_INCREF(key);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1577 kstr = key;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1578 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1579 else if (PyFloat_Check(key)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1580 kstr = encoder_encode_float(s, key);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1581 if (kstr == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1582 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1583 }
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1584 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
1585 /* 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
1586 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
1587 kstr = _encoded_const(key);
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1588 if (kstr == NULL)
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1589 goto bail;
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1590 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1591 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
1592 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
1593 if (kstr == NULL) {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1594 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
1595 }
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1596 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1597 else if (skipkeys) {
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1598 Py_DECREF(item);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1599 continue;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1600 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1601 else {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1602 /* 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
1603 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
1604 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1605 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1606
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1607 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
1608 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
1609 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1610 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1611
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1612 encoded = encoder_encode_string(s, kstr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1613 Py_CLEAR(kstr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1614 if (encoded == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1615 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
1616 if (_PyAccu_Accumulate(acc, encoded)) {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1617 Py_DECREF(encoded);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1618 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1619 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1620 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
1621 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
1622 goto bail;
54371
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1623
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1624 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
1625 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
1626 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1627 idx += 1;
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1628 Py_DECREF(item);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1629 }
54371
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1630 if (PyErr_Occurred())
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1631 goto bail;
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1632 Py_CLEAR(it);
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1633
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1634 if (ident != NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1635 if (PyDict_DelItem(s->markers, ident))
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1636 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1637 Py_CLEAR(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1638 }
68102
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 65939
diff changeset
1639 /* TODO DOES NOT RUN; dead code
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1640 if (s->indent != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1641 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
1642
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 65939
diff changeset
1643 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
1644 }*/
72757
e685b02ddcac Remove now duplicate code in _json.c; instead, reuse the new private lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 72475
diff changeset
1645 if (_PyAccu_Accumulate(acc, close_dict))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1646 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1647 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1648
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1649 bail:
54371
1c078bbca233 Issue 6105: json encoder to respect iteration order of its inputs.
Raymond Hettinger <python@rcn.com>
parents: 53769
diff changeset
1650 Py_XDECREF(it);
54373
22fd967518ee * Fix-up a TODO (support the sort_key option).
Raymond Hettinger <python@rcn.com>
parents: 54371
diff changeset
1651 Py_XDECREF(item);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1652 Py_XDECREF(kstr);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1653 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1654 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1655 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1656
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1657
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1658 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
1659 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
1660 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
1661 {
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
1662 /* 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
1663 static PyObject *open_array = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1664 static PyObject *close_array = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1665 static PyObject *empty_array = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1666 PyObject *ident = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1667 PyObject *s_fast = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1668 Py_ssize_t i;
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 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
1671 open_array = PyUnicode_InternFromString("[");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1672 close_array = PyUnicode_InternFromString("]");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1673 empty_array = PyUnicode_InternFromString("[]");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1674 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
1675 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1676 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1677 ident = NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1678 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
1679 if (s_fast == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1680 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
1681 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
1682 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
1683 return _PyAccu_Accumulate(acc, empty_array);
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1684 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1685
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1686 if (s->markers != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1687 int has_key;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1688 ident = PyLong_FromVoidPtr(seq);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1689 if (ident == NULL)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1690 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1691 has_key = PyDict_Contains(s->markers, ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1692 if (has_key) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1693 if (has_key != -1)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1694 PyErr_SetString(PyExc_ValueError, "Circular reference detected");
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1695 goto bail;
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 if (PyDict_SetItem(s->markers, ident, seq)) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1698 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1699 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1700 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1701
72757
e685b02ddcac Remove now duplicate code in _json.c; instead, reuse the new private lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 72475
diff changeset
1702 if (_PyAccu_Accumulate(acc, open_array))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1703 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1704 if (s->indent != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1705 /* TODO: DOES NOT RUN */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1706 indent_level += 1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1707 /*
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1708 newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1709 separator = _item_separator + newline_indent
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1710 buf += newline_indent
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 }
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
1713 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
1714 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
1715 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
1716 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
1717 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1718 }
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
1719 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
1720 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1721 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1722 if (ident != NULL) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1723 if (PyDict_DelItem(s->markers, ident))
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1724 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1725 Py_CLEAR(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1726 }
68102
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 65939
diff changeset
1727
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 65939
diff changeset
1728 /* TODO: DOES NOT RUN
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1729 if (s->indent != Py_None) {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1730 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
1731
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 65939
diff changeset
1732 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
1733 }*/
72757
e685b02ddcac Remove now duplicate code in _json.c; instead, reuse the new private lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 72475
diff changeset
1734 if (_PyAccu_Accumulate(acc, close_array))
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1735 goto bail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1736 Py_DECREF(s_fast);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1737 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1738
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1739 bail:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1740 Py_XDECREF(ident);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1741 Py_DECREF(s_fast);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1742 return -1;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1743 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1744
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1745 static void
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1746 encoder_dealloc(PyObject *self)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1747 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1748 /* Deallocate Encoder */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1749 encoder_clear(self);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1750 Py_TYPE(self)->tp_free(self);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1751 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1752
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1753 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1754 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
1755 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1756 PyEncoderObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1757 assert(PyEncoder_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1758 s = (PyEncoderObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1759 Py_VISIT(s->markers);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1760 Py_VISIT(s->defaultfn);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1761 Py_VISIT(s->encoder);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1762 Py_VISIT(s->indent);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1763 Py_VISIT(s->key_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1764 Py_VISIT(s->item_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1765 Py_VISIT(s->sort_keys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1766 Py_VISIT(s->skipkeys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1767 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1768 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1769
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1770 static int
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1771 encoder_clear(PyObject *self)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1772 {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1773 /* Deallocate Encoder */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1774 PyEncoderObject *s;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1775 assert(PyEncoder_Check(self));
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1776 s = (PyEncoderObject *)self;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1777 Py_CLEAR(s->markers);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1778 Py_CLEAR(s->defaultfn);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1779 Py_CLEAR(s->encoder);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1780 Py_CLEAR(s->indent);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1781 Py_CLEAR(s->key_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1782 Py_CLEAR(s->item_separator);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1783 Py_CLEAR(s->sort_keys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1784 Py_CLEAR(s->skipkeys);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1785 return 0;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1786 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1787
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1788 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
1789
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1790 static
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1791 PyTypeObject PyEncoderType = {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1792 PyVarObject_HEAD_INIT(NULL, 0)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1793 "_json.Encoder", /* tp_name */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1794 sizeof(PyEncoderObject), /* tp_basicsize */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1795 0, /* tp_itemsize */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1796 encoder_dealloc, /* tp_dealloc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1797 0, /* tp_print */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1798 0, /* tp_getattr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1799 0, /* tp_setattr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1800 0, /* tp_compare */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1801 0, /* tp_repr */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1802 0, /* tp_as_number */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1803 0, /* tp_as_sequence */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1804 0, /* tp_as_mapping */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1805 0, /* tp_hash */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1806 encoder_call, /* tp_call */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1807 0, /* tp_str */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1808 0, /* tp_getattro */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1809 0, /* tp_setattro */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1810 0, /* tp_as_buffer */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1811 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
1812 encoder_doc, /* tp_doc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1813 encoder_traverse, /* tp_traverse */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1814 encoder_clear, /* tp_clear */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1815 0, /* tp_richcompare */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1816 0, /* tp_weaklistoffset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1817 0, /* tp_iter */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1818 0, /* tp_iternext */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1819 0, /* tp_methods */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1820 encoder_members, /* tp_members */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1821 0, /* tp_getset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1822 0, /* tp_base */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1823 0, /* tp_dict */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1824 0, /* tp_descr_get */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1825 0, /* tp_descr_set */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1826 0, /* tp_dictoffset */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1827 encoder_init, /* tp_init */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1828 0, /* tp_alloc */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1829 encoder_new, /* tp_new */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1830 0, /* tp_free */
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1831 };
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1832
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1833 static PyMethodDef speedups_methods[] = {
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1834 {"encode_basestring_ascii",
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1835 (PyCFunction)py_encode_basestring_ascii,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1836 METH_O,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1837 pydoc_encode_basestring_ascii},
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1838 {"scanstring",
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1839 (PyCFunction)py_scanstring,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1840 METH_VARARGS,
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1841 pydoc_scanstring},
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1842 {NULL, NULL, 0, NULL}
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1843 };
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1844
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1845 PyDoc_STRVAR(module_doc,
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1846 "json speedups\n");
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1847
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1848 static struct PyModuleDef jsonmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1849 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1850 "_json",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1851 module_doc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1852 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1853 speedups_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1854 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1855 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1856 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57610
diff changeset
1857 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1858 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1859
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1860 PyObject*
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1861 PyInit__json(void)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1862 {
53667
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1863 PyObject *m = PyModule_Create(&jsonmodule);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1864 if (!m)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1865 return NULL;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1866 PyScannerType.tp_new = PyType_GenericNew;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1867 if (PyType_Ready(&PyScannerType) < 0)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1868 goto fail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1869 PyEncoderType.tp_new = PyType_GenericNew;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1870 if (PyType_Ready(&PyEncoderType) < 0)
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1871 goto fail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1872 Py_INCREF((PyObject*)&PyScannerType);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1873 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
1874 Py_DECREF((PyObject*)&PyScannerType);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1875 goto fail;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1876 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1877 Py_INCREF((PyObject*)&PyEncoderType);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1878 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
1879 Py_DECREF((PyObject*)&PyEncoderType);
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 }
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1882 return m;
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1883 fail:
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1884 Py_DECREF(m);
f686aced02a3 port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents: 49531
diff changeset
1885 return NULL;
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1886 }