[pypy-commit] pypy fastjson: start to refactor the decoder to avoid continuously updating .pos

antocuni noreply at buildbot.pypy.org
Sun Jun 9 11:41:55 CEST 2013


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: fastjson
Changeset: r64833:a3f22cd8a330
Date: 2013-06-06 17:49 +0200
http://bitbucket.org/pypy/pypy/changeset/a3f22cd8a330/

Log:	start to refactor the decoder to avoid continuously updating .pos

diff --git a/pypy/module/_fastjson/interp_decoder.py b/pypy/module/_fastjson/interp_decoder.py
--- a/pypy/module/_fastjson/interp_decoder.py
+++ b/pypy/module/_fastjson/interp_decoder.py
@@ -75,22 +75,21 @@
         assert end > 0
         return self.s[start:end]
 
-    def skip_whitespace(self):
-        i = self.pos
+    def skip_whitespace(self, i):
         while i < len(self.s):
             ch = self.s[i]
             if is_whitespace(ch):
                 i+=1
             else:
                 break
-        self.pos = i
+        return i
 
     @specialize.arg(1)
     def _raise(self, msg, *args):
         raise operationerrfmt(self.space.w_ValueError, msg, *args)
 
     def decode_any(self):
-        self.skip_whitespace()
+        self.pos = self.skip_whitespace(self.pos)
         ch = self.peek()
         if ch == '"':
             self.next()
@@ -203,21 +202,25 @@
         return intval, count
         
     def decode_array(self):
+        w_list = self.space.newlist([])
         start = self.pos
-        w_list = self.space.newlist([])
-        self.skip_whitespace()
-        while not self.eof():
-            ch = self.peek()
+        i = self.skip_whitespace(start)
+        while i < len(self.s):
+            ch = self.s[i]
             if ch == ']':
-                self.next()
+                self.pos = i+1
                 return w_list
+            self.pos = i
             w_item = self.decode_any()
+            i = self.pos
             self.space.call_method(w_list, 'append', w_item)
-            self.skip_whitespace()
-            if self.eof():
+            i = self.skip_whitespace(i)
+            if i == len(self.s):
                 break
-            ch = self.next()
+            ch = self.s[i]
+            i += 1
             if ch == ']':
+                self.pos = i
                 return w_list
             elif ch == ',':
                 pass
@@ -241,17 +244,17 @@
             w_name = self.decode_any()
             if self.last_type != TYPE_STRING:
                 self._raise("Key name must be string for object starting at char %d", start)
-            self.skip_whitespace()
+            self.pos = self.skip_whitespace(self.pos)
             if self.eof():
                 break
             ch = self.next()
             if ch != ':':
                 self._raise("No ':' found at char %d", self.pos)
-            self.skip_whitespace()
+            self.pos = self.skip_whitespace(self.pos)
             #
             w_value = self.decode_any()
             self.space.setitem(w_dict, w_name, w_value)
-            self.skip_whitespace()
+            self.pos = self.skip_whitespace(self.pos)
             if self.eof():
                 break
             ch = self.next()
@@ -347,7 +350,7 @@
 def loads(space, s):
     decoder = JSONDecoder(space, s)
     w_res = decoder.decode_any()
-    decoder.skip_whitespace()
+    decoder.pos = decoder.skip_whitespace(decoder.pos)
     if not decoder.eof():
         start = decoder.pos
         end = len(decoder.s)
diff --git a/pypy/module/_fastjson/test/test__fastjson.py b/pypy/module/_fastjson/test/test__fastjson.py
--- a/pypy/module/_fastjson/test/test__fastjson.py
+++ b/pypy/module/_fastjson/test/test__fastjson.py
@@ -3,16 +3,12 @@
 from pypy.module._fastjson.interp_decoder import JSONDecoder
 
 def test_skip_whitespace():
-    dec = JSONDecoder('fake space', '   hello   ')
+    s = '   hello   '
+    dec = JSONDecoder('fake space', s)
     assert dec.pos == 0
-    dec.skip_whitespace()
-    assert dec.next() == 'h'
-    assert dec.next() == 'e'
-    assert dec.next() == 'l'
-    assert dec.next() == 'l'
-    assert dec.next() == 'o'
-    dec.skip_whitespace()
-    assert dec.eof()
+    assert dec.skip_whitespace(0) == 3
+    assert dec.skip_whitespace(3) == 3
+    assert dec.skip_whitespace(8) == len(s)
 
     
 


More information about the pypy-commit mailing list