[pypy-commit] pypy py3.5: Kill save_module_content_for_future_reload(): reloading a built-in module is a no-op now

rlamy pypy.commits at gmail.com
Fri Oct 20 18:08:31 EDT 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.5
Changeset: r92809:f80cb4368b95
Date: 2017-10-20 23:07 +0100
http://bitbucket.org/pypy/pypy/changeset/f80cb4368b95/

Log:	Kill save_module_content_for_future_reload(): reloading a built-in
	module is a no-op now

diff --git a/pypy/interpreter/app_main.py b/pypy/interpreter/app_main.py
--- a/pypy/interpreter/app_main.py
+++ b/pypy/interpreter/app_main.py
@@ -574,10 +574,6 @@
             except ValueError:
                 pass      # ignore "2 is not a valid file descriptor"
 
-    if we_are_translated():
-        import __pypy__
-        __pypy__.save_module_content_for_future_reload(sys)
-
     mainmodule = type(sys)('__main__')
     sys.modules['__main__'] = mainmodule
 
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -515,9 +515,8 @@
                 # patcher relies on this behaviour.
                 w_mod2 = Module(self, w_name)
                 self.setitem(w_modules, w_name, w_mod2)
-                w_mod.getdict(self)  # unlazy w_initialdict
-                self.call_method(w_mod2.getdict(self), 'update',
-                                 w_mod.w_initialdict)
+                w_dict = w_mod.getdict(self)  # unlazy
+                self.call_method(w_mod2.getdict(self), 'update', w_dict)
                 return w_mod2
             self.setitem(w_modules, w_name, w_mod)
             w_mod.init(self)
diff --git a/pypy/interpreter/mixedmodule.py b/pypy/interpreter/mixedmodule.py
--- a/pypy/interpreter/mixedmodule.py
+++ b/pypy/interpreter/mixedmodule.py
@@ -10,11 +10,7 @@
 
 class MixedModule(Module):
     applevel_name = None
-
-    # The following attribute is None as long as the module has not been
-    # imported yet, and when it has been, it is mod.__dict__.copy() just
-    # after startup().
-    w_initialdict = None
+    initialized = False
     lazy = False
     submodule_name = None
 
@@ -23,7 +19,6 @@
         Module.__init__(self, space, w_name)
         init_extra_module_attrs(space, self)
         self.lazy = True
-        self.lazy_initial_values_w = {}
         self.__class__.buildloaders()
         self.loaders = self.loaders.copy()    # copy from the class to the inst
         self.submodules_w = []
@@ -47,27 +42,14 @@
     def init(self, space):
         """This is called each time the module is imported or reloaded
         """
-        if self.w_initialdict is not None:
-            # the module was already imported.  Refresh its content with
-            # the saved dict, as done with built-in and extension modules
-            # on CPython.
-            space.call_method(self.w_dict, 'update', self.w_initialdict)
-
         for w_submodule in self.submodules_w:
             name = space.text0_w(w_submodule.w_name)
             space.setitem(self.w_dict, space.newtext(name.split(".")[-1]), w_submodule)
             space.getbuiltinmodule(name)
 
-        if self.w_initialdict is None:
+        if not self.initialized:
             Module.init(self, space)
-            if not self.lazy and self.w_initialdict is None:
-                self.save_module_content_for_future_reload()
-
-    def save_module_content_for_future_reload(self):
-        # Save the current dictionary in w_initialdict, for future
-        # reloads.  This forces the dictionary if needed.
-        w_dict = self.getdict(self.space)
-        self.w_initialdict = self.space.call_method(w_dict, 'copy')
+            self.initialized = True
 
     @classmethod
     @not_rpython
@@ -96,13 +78,6 @@
         return w_value
 
     def setdictvalue(self, space, attr, w_value):
-        if self.lazy and attr not in self.lazy_initial_values_w:
-            # in lazy mode, the first time an attribute changes,
-            # we save away the old (initial) value.  This allows
-            # a future getdict() call to build the correct
-            # self.w_initialdict, containing the initial value.
-            w_initial_value = self._load_lazily(space, attr)
-            self.lazy_initial_values_w[attr] = w_initial_value
         space.setitem_str(self.w_dict, attr, w_value)
         return True
 
@@ -142,23 +117,11 @@
 
     def _force_lazy_dict_now(self):
         # Force the dictionary by calling all lazy loaders now.
-        # This also saves in self.w_initialdict a copy of all the
-        # initial values, including if they have already been
-        # modified by setdictvalue().
         space = self.space
         for name in self.loaders:
             w_value = self.get(name)
             space.setitem(self.w_dict, space.new_interned_str(name), w_value)
         self.lazy = False
-        self.save_module_content_for_future_reload()
-        for key, w_initial_value in self.lazy_initial_values_w.items():
-            w_key = space.new_interned_str(key)
-            if w_initial_value is not None:
-                space.setitem(self.w_initialdict, w_key, w_initial_value)
-            else:
-                if space.finditem(self.w_initialdict, w_key) is not None:
-                    space.delitem(self.w_initialdict, w_key)
-        del self.lazy_initial_values_w
 
     def _cleanup_(self):
         self.getdict(self.space)
diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py
--- a/pypy/module/__pypy__/__init__.py
+++ b/pypy/module/__pypy__/__init__.py
@@ -92,8 +92,6 @@
         'set_debug'                 : 'interp_magic.set_debug',
         'locals_to_fast'            : 'interp_magic.locals_to_fast',
         'set_code_callback'         : 'interp_magic.set_code_callback',
-        'save_module_content_for_future_reload':
-                          'interp_magic.save_module_content_for_future_reload',
         'decode_long'               : 'interp_magic.decode_long',
         '_promote'                   : 'interp_magic._promote',
         'normalize_exc'             : 'interp_magic.normalize_exc',
@@ -131,7 +129,7 @@
                 raise
             else:
                 pass   # ok fine to ignore in this case
-        
+
         if self.space.config.translation.jit:
             features = detect_cpu.getcpufeatures(model)
             self.extra_interpdef('jit_backend_features',
diff --git a/pypy/module/__pypy__/interp_magic.py b/pypy/module/__pypy__/interp_magic.py
--- a/pypy/module/__pypy__/interp_magic.py
+++ b/pypy/module/__pypy__/interp_magic.py
@@ -145,10 +145,6 @@
     assert isinstance(w_frame, PyFrame)
     w_frame.locals2fast()
 
- at unwrap_spec(w_module=MixedModule)
-def save_module_content_for_future_reload(space, w_module):
-    w_module.save_module_content_for_future_reload()
-
 def set_code_callback(space, w_callable):
     cache = space.fromcache(CodeHookCache)
     if space.is_none(w_callable):
diff --git a/pypy/module/__pypy__/test/test_magic.py b/pypy/module/__pypy__/test/test_magic.py
--- a/pypy/module/__pypy__/test/test_magic.py
+++ b/pypy/module/__pypy__/test/test_magic.py
@@ -2,18 +2,6 @@
 class AppTestMagic:
     spaceconfig = dict(usemodules=['__pypy__'])
 
-    def test_save_module_content_for_future_reload(self):
-        import sys, __pypy__, imp
-        d = sys.dont_write_bytecode
-        sys.dont_write_bytecode = "hello world"
-        __pypy__.save_module_content_for_future_reload(sys)
-        sys.dont_write_bytecode = d
-        imp.reload(sys)
-        assert sys.dont_write_bytecode == "hello world"
-        #
-        sys.dont_write_bytecode = d
-        __pypy__.save_module_content_for_future_reload(sys)
-
     def test_new_code_hook(self):
         # workaround for running on top of old CPython 2.7 versions
         def exec_(code, d):


More information about the pypy-commit mailing list