[pypy-commit] pypy default: make looking up encodings free with the JIT
alex_gaynor
noreply at buildbot.pypy.org
Wed Apr 10 04:53:28 CEST 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r63186:c514bbc4c086
Date: 2013-04-09 19:53 -0700
http://bitbucket.org/pypy/pypy/changeset/c514bbc4c086/
Log: make looking up encodings free with the JIT
diff --git a/pypy/module/_codecs/interp_codecs.py b/pypy/module/_codecs/interp_codecs.py
--- a/pypy/module/_codecs/interp_codecs.py
+++ b/pypy/module/_codecs/interp_codecs.py
@@ -1,10 +1,18 @@
+from rpython.rlib import jit
+from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib.rstring import UnicodeBuilder
+
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
-from rpython.rlib.rstring import UnicodeBuilder
-from rpython.rlib.objectmodel import we_are_translated
+
+
+class VersionTag(object):
+ pass
class CodecState(object):
+ _immutable_fields_ = ["version?"]
+
def __init__(self, space):
self.codec_search_path = []
self.codec_search_cache = {}
@@ -14,6 +22,7 @@
self.encode_error_handler = self.make_encode_errorhandler(space)
self.unicodedata_handler = None
+ self.modified()
def _make_errorhandler(self, space, decode):
def call_errorhandler(errors, encoding, reason, input, startpos,
@@ -86,9 +95,20 @@
self.unicodedata_handler = UnicodeData_Handler(space, w_getcode)
return self.unicodedata_handler
+ def modified(self):
+ self.version = VersionTag()
+
+ def get_codec_from_cache(self, key):
+ return self._get_codec_with_version(key, self.version)
+
+ @jit.elidable
+ def _get_codec_with_version(self, key, version):
+ return self.codec_search_cache.get(key, None)
+
def _cleanup_(self):
assert not self.codec_search_path
+
def register_codec(space, w_search_function):
"""register(search_function)
@@ -115,11 +135,12 @@
"lookup_codec() should not be called during translation"
state = space.fromcache(CodecState)
normalized_encoding = encoding.replace(" ", "-").lower()
- w_result = state.codec_search_cache.get(normalized_encoding, None)
+ w_result = state.get_codec_from_cache(normalized_encoding)
if w_result is not None:
return w_result
return _lookup_codec_loop(space, encoding, normalized_encoding)
+
def _lookup_codec_loop(space, encoding, normalized_encoding):
state = space.fromcache(CodecState)
if state.codec_need_encodings:
@@ -143,6 +164,7 @@
space.wrap("codec search functions must return 4-tuples"))
else:
state.codec_search_cache[normalized_encoding] = w_result
+ state.modified()
return w_result
raise operationerrfmt(
space.w_LookupError,
More information about the pypy-commit
mailing list