[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