diff options
author | Bob Ippolito <bob@redivi.com> | 2011-03-12 14:48:50 -0500 |
---|---|---|
committer | Bob Ippolito <bob@redivi.com> | 2011-03-12 14:48:50 -0500 |
commit | cbeeecf3bd122f72d4e84de01cefd94846022190 (patch) | |
tree | 4dc0b4a54fb937baeda8c8f4f9c349a21941c0ad | |
parent | aa8540de9eae794a989269ce2b934a8f89536266 (diff) | |
download | simplejson-cbeeecf3bd122f72d4e84de01cefd94846022190.tar.gz |
simpler object parsing code
-rw-r--r-- | simplejson/_pypy_speedups.py | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/simplejson/_pypy_speedups.py b/simplejson/_pypy_speedups.py index 7c82a83..a65f4b1 100644 --- a/simplejson/_pypy_speedups.py +++ b/simplejson/_pypy_speedups.py @@ -122,42 +122,33 @@ def skip_whitespace(s, end): except IndexError: return '', len(s) -def obj_class_factory(object_hook, object_pairs_hook, memo): - if object_pairs_hook: - class ObjList(object): - def __init__(self): - self.pairs = [] - - def __setitem__(self, k, v): - self.pairs.append((memo.setdefault(k, k), v)) +def setitem_list(lst, k, v): + lst.append((k, v)) - def finalize(self): - return object_pairs_hook(self.pairs) - return ObjList - else: - class ObjDict(object): - def __init__(self): - self.pairs = {} +def setitem_dict(dct, k, v): + dct[k] = v - def __setitem__(self, k, v): - self.pairs[memo.setdefault(k, k)] = v +def finalize_noop(dct): + return dct - def finalize(self): - if object_hook: - return object_hook(self.pairs) - return self.pairs - return ObjDict +def obj_funcs(object_hook, object_pairs_hook): + if object_pairs_hook: + return list, setitem_list, object_pairs_hook + elif object_hook: + return dict, setitem_dict, object_hook + else: + return dict, setitem_dict, finalize_noop def object_parser(encoding, strict, object_hook, object_pairs_hook, memo): - Obj = obj_class_factory(object_hook, object_pairs_hook, memo) + new_obj, setitem, finalize = obj_funcs(object_hook, object_pairs_hook) def parse_object((s, end), _scan_once): - pairs = Obj() + pairs = new_obj() try: while is_whitespace(s[end]): end += 1 nextchar = s[end] if nextchar == '}': - return pairs.finalize(), end + 1 + return finalize(pairs), end + 1 elif nextchar != '"': JSONDecodeError("Expecting property name", s, end) except IndexError: @@ -165,6 +156,7 @@ def object_parser(encoding, strict, object_hook, object_pairs_hook, memo): end += 1 while 1: key, end = scanstring(s, end, encoding, strict) + key = memo.setdefault(key, key) try: # To skip some function call overhead we optimize the fast # paths where the JSON key separator is ": " or just ":". @@ -185,7 +177,7 @@ def object_parser(encoding, strict, object_hook, object_pairs_hook, memo): value, end = _scan_once(s, end) except StopIteration: raise JSONDecodeError("Expecting object", s, end) - pairs[key] = value + setitem(pairs, key, value) try: while is_whitespace(s[end]): end += 1 @@ -202,7 +194,7 @@ def object_parser(encoding, strict, object_hook, object_pairs_hook, memo): end += 1 except IndexError: raise JSONDecodeError("Expecting property name", s, len(s)) - return pairs.finalize(), end + return finalize(pairs), end return parse_object def make_scanner(context): |