From cbeeecf3bd122f72d4e84de01cefd94846022190 Mon Sep 17 00:00:00 2001 From: Bob Ippolito Date: Sat, 12 Mar 2011 14:48:50 -0500 Subject: simpler object parsing code --- simplejson/_pypy_speedups.py | 46 ++++++++++++++++++-------------------------- 1 file 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): -- cgit v1.2.1