Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: py3k Changeset: r50815:221a0077614d Date: 2011-12-21 23:00 +0100 http://bitbucket.org/pypy/pypy/changeset/221a0077614d/
Log: Implement imp.source_from_cache() Kind of... we still use the old .py/pyc scheme. diff --git a/pypy/module/imp/__init__.py b/pypy/module/imp/__init__.py --- a/pypy/module/imp/__init__.py +++ b/pypy/module/imp/__init__.py @@ -36,6 +36,7 @@ 'release_lock': 'interp_imp.release_lock', 'cache_from_source': 'interp_imp.cache_from_source', + 'source_from_cache': 'interp_imp.source_from_cache', } appleveldefs = { diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py --- a/pypy/module/imp/importing.py +++ b/pypy/module/imp/importing.py @@ -866,6 +866,14 @@ "Given the path to a .py file, return the path to its .pyc file." return pathname + 'c' +def make_source_pathname(pathname): + pos_extension = len(pathname) - 4 # len('.pyc') + if pos_extension < 0: + raise ValueError("path is too short") + if pathname[pos_extension:] != '.pyc': + raise ValueError("not a .pyc path name") + return pathname[:pos_extension + 3] + @jit.dont_look_inside def load_source_module(space, w_modulename, w_mod, pathname, source, write_pyc=True): diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py --- a/pypy/module/imp/interp_imp.py +++ b/pypy/module/imp/interp_imp.py @@ -182,5 +182,29 @@ importing.getimportlock(space).reinit_lock() @unwrap_spec(pathname=str) -def cache_from_source(space, pathname): +def cache_from_source(space, pathname, w_debug_override=None): + """cache_from_source(path, [debug_override]) -> path + Given the path to a .py file, return the path to its .pyc/.pyo file. + + The .py file does not need to exist; this simply returns the path to the + .pyc/.pyo file calculated as if the .py file were imported. The extension + will be .pyc unless __debug__ is not defined, then it will be .pyo. + + If debug_override is not None, then it must be a boolean and is taken as + the value of __debug__ instead.""" return space.wrap(importing.make_compiled_pathname(pathname)) + +@unwrap_spec(pathname=str) +def source_from_cache(space, pathname): + """source_from_cache(path) -> path + Given the path to a .pyc./.pyo file, return the path to its .py file. + + The .pyc/.pyo file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc/.pyo file. If path + does not conform to PEP 3147 format, ValueError will be raised.""" + try: + sourcename = importing.make_source_pathname(pathname) + except ValueError: + raise operationerrfmt(space.w_ValueError, + "Not a PEP 3147 pyc path: %s", pathname) + return space.wrap(sourcename) diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py @@ -579,6 +579,8 @@ def test_cache_from_source(self): import imp assert imp.cache_from_source('a/b/c.py') == 'a/b/c.pyc' + assert imp.source_from_cache('a/b/c.pyc') == 'a/b/c.py' + raises(ValueError, imp.source_from_cache, 'a/b/c.py') def test_shadow_builtin(self): if self.runappdirect: skip("hard to test: module is already imported") _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit