Bug 1266343 - Avoid _apply_imports happening twice for the same function. r?chmanchester draft
authorMike Hommey <mh+mozilla@glandium.org>
Fri, 15 Apr 2016 20:55:57 +0900
changeset 354778 9ad5a2ce5535a389797273cd3e67b20db31f17c6
parent 354777 049d947c79efefc4b61406b5cead791e20f3211c
child 354779 2598b1479895e551fb1c0fccad70da60f78103e3
push id16148
push userbmo:mh+mozilla@glandium.org
push dateThu, 21 Apr 2016 12:30:02 +0000
reviewerschmanchester
bugs1266343
milestone48.0a1
Bug 1266343 - Avoid _apply_imports happening twice for the same function. r?chmanchester
python/mozbuild/mozbuild/configure/__init__.py
python/mozbuild/mozbuild/test/configure/test_configure.py
--- a/python/mozbuild/mozbuild/configure/__init__.py
+++ b/python/mozbuild/mozbuild/configure/__init__.py
@@ -730,13 +730,15 @@ class ConfigureSandbox(dict):
             func.func_code,
             glob,
             func.__name__,
             func.func_defaults,
             closure
         ))
         @wraps(new_func)
         def wrapped(*args, **kwargs):
-            self._apply_imports(func, glob)
+            if func in self._imports:
+                self._apply_imports(func, glob)
+                del self._imports[func]
             return new_func(*args, **kwargs)
 
         self._prepared_functions.add(wrapped)
         return wrapped, glob
--- a/python/mozbuild/mozbuild/test/configure/test_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_configure.py
@@ -337,16 +337,41 @@ class TestConfigure(unittest.TestCase):
         )
 
         self.assertIs(sandbox['foo'](), sandbox)
 
         # Nothing leaked from the function being executed
         self.assertEquals(sandbox.keys(), ['__builtins__', 'foo'])
         self.assertEquals(sandbox['__builtins__'], ConfigureSandbox.BUILTINS)
 
+    def test_apply_imports(self):
+        imports = []
+
+        class CountApplyImportsSandbox(ConfigureSandbox):
+            def _apply_imports(self, *args, **kwargs):
+                imports.append((args, kwargs))
+                super(CountApplyImportsSandbox, self)._apply_imports(
+                    *args, **kwargs)
+
+        config = {}
+        out = StringIO()
+        sandbox = CountApplyImportsSandbox(config, {}, [], out, out)
+
+        exec_(textwrap.dedent('''
+            @template
+            @imports('sys')
+            def foo():
+                return sys
+            foo()
+            foo()'''),
+            sandbox
+        )
+
+        self.assertEquals(len(imports), 1)
+
     def test_os_path(self):
         config = self.get_config(['--with-imports=%s' % __file__])
         self.assertIn('IS_FILE', config)
         self.assertEquals(config['IS_FILE'], True)
 
         config = self.get_config(['--with-imports=%s.no-exist' % __file__])
         self.assertIn('IS_FILE', config)
         self.assertEquals(config['IS_FILE'], False)