Bug 1266343 - Avoid _apply_imports happening twice for the same function. r?chmanchester
--- 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)