Hi Alex, could we have a test_pypy_c test for this please?
On 10/04/13 03:53, alex_gaynor wrote:
Author: Alex Gaynor <alex.gay...@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, _______________________________________________ pypy-commit mailing list pypy-com...@python.org http://mail.python.org/mailman/listinfo/pypy-commit
_______________________________________________ pypy-dev mailing list pypy-dev@python.org http://mail.python.org/mailman/listinfo/pypy-dev