summaryrefslogtreecommitdiff
path: root/simplejson/encoder.py
diff options
context:
space:
mode:
authorBob Ippolito <bob@redivi.com>2008-09-26 08:00:20 +0000
committerBob Ippolito <bob@redivi.com>2008-09-26 08:00:20 +0000
commit516cb02410e0bf2d539e52a9d8a3db34cc934b68 (patch)
treedafb728ed45d3ad5781932dc6bddde690339b38e /simplejson/encoder.py
parentf9118892a3f51d673a97bf94f1d33fd75d17dffd (diff)
downloadsimplejson-516cb02410e0bf2d539e52a9d8a3db34cc934b68.tar.gz
C fast path for encoding
git-svn-id: http://simplejson.googlecode.com/svn/trunk@121 a4795897-2c25-0410-b006-0d3caba88fa1
Diffstat (limited to 'simplejson/encoder.py')
-rw-r--r--simplejson/encoder.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/simplejson/encoder.py b/simplejson/encoder.py
index 4af4fd7..9922c80 100644
--- a/simplejson/encoder.py
+++ b/simplejson/encoder.py
@@ -7,6 +7,10 @@ try:
from simplejson._speedups import encode_basestring_ascii as c_encode_basestring_ascii
except ImportError:
c_encode_basestring_ascii = None
+try:
+ from simplejson._speedups import make_encoder as c_make_encoder
+except ImportError:
+ c_make_encoder = None
ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
@@ -189,10 +193,12 @@ class JSONEncoder(object):
# This doesn't pass the iterator directly to ''.join() because the
# exceptions aren't as detailed. The list call should be roughly
# equivalent to the PySequence_Fast that ''.join() would do.
- chunks = list(self.iterencode(o))
+ chunks = self.iterencode(o, _one_shot=True)
+ if not isinstance(chunks, (list, tuple)):
+ chunks = list(chunks)
return ''.join(chunks)
- def iterencode(self, o):
+ def iterencode(self, o, _one_shot=False):
"""
Encode the given object and yield each string
representation as available.
@@ -236,20 +242,26 @@ class JSONEncoder(object):
return text
- _iterencode = _make_iterencode(
- markers, self.default, _encoder, self.indent, floatstr,
- self.key_separator, self.item_separator, self.sort_keys, self.skipkeys)
+ if _one_shot and c_make_encoder is not None and not self.indent and not self.sort_keys:
+ c_encoder = c_make_encoder(
+ markers, self.default, _encoder, self.indent, floatstr,
+ self.key_separator, self.item_separator, self.sort_keys,
+ self.skipkeys)
+ _iterencode = c_encoder._iterencode
+ else:
+ _iterencode = _make_iterencode(
+ markers, self.default, _encoder, self.indent, floatstr,
+ self.key_separator, self.item_separator, self.sort_keys,
+ self.skipkeys, _one_shot)
return _iterencode(o, 0)
-def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys,
+def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
## HACK: hand-optimized bytecode; turn globals into locals
False=False,
True=True,
ValueError=ValueError,
basestring=basestring,
dict=dict,
- encode_basestring_ascii=encode_basestring_ascii,
- encode_basestring=encode_basestring,
float=float,
id=id,
int=int,
@@ -260,7 +272,6 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separ
tuple=tuple,
):
-
def _iterencode_list(lst, _current_indent_level):
if not lst:
yield '[]'