Patchwork [6,of,6,import-refactor,V2] mercurial: don't load C extensions from PyPy

login
register
mail settings
Submitter Gregory Szorc
Date Nov. 25, 2015, 7:31 a.m.
Message ID <f5a278521dc8cb5d076d.1448436710@ubuntu-main>
Download mbox | patch
Permalink /patch/11656/
State Superseded
Commit d308a9ca9ed72b1923ed52e9a361a77d554705ea
Delegated to: Yuya Nishihara
Headers show

Comments

Gregory Szorc - Nov. 25, 2015, 7:31 a.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1448432511 28800
#      Tue Nov 24 22:21:51 2015 -0800
# Node ID f5a278521dc8cb5d076da2463bd3725d18dadae2
# Parent  45043395515abca0dc7290128b16752258be868b
mercurial: don't load C extensions from PyPy

PyPy isn't compatible with Python C extensions.

With this patch, the module load policy is automatically to "Python
only" when run under PyPy. `hg` and other Python scripts importing
mercurial.* modules will run from the source checkout or any
installation when executed with PyPy. This should enable people to
more easily experiment with PyPy and its potentially significant
performance benefits over CPython!

Patch

diff --git a/mercurial/__init__.py b/mercurial/__init__.py
--- a/mercurial/__init__.py
+++ b/mercurial/__init__.py
@@ -17,16 +17,23 @@  import sys
 #    allow - allow pure Python implementation when C loading fails
 #    py - only load pure Python modules
 modulepolicy = '@MODULELOADPOLICY@'
 
 # By default, require the C extensions for performance reasons.
 if modulepolicy == '@' 'MODULELOADPOLICY' '@':
     modulepolicy = 'c'
 
+# PyPy doesn't load C extensions.
+#
+# The canonical way to do this is to test platform.python_implementation().
+# But we don't import platform and don't bloat for it here.
+if '__pypy__' in sys.builtin_module_names:
+    modulepolicy = 'py'
+
 # Environment variable can always force settings.
 modulepolicy = os.environ.get('HGMODULEPOLICY', modulepolicy)
 
 # Modules that have both Python and C implementations. See also the
 # set of .py files under mercurial/pure/.
 _dualmodules = set([
     'mercurial.base85',
     'mercurial.bdiff',