Bug 1256571 - Move resolving @depends dependencies to just before running the decorated function. r?chmanchester draft
authorMike Hommey <mh+mozilla@glandium.org>
Thu, 07 Apr 2016 18:03:47 +0900
changeset 350223 eb8368c2b6663f5ef206b433b43f0071af982637
parent 350198 eb4c521053e4bf49cb09ce216d4a2493199bcbc9
child 350224 44e7ae522bf13c8b5a73209109a35f16e39e86b2
push id15274
push userbmo:mh+mozilla@glandium.org
push dateWed, 13 Apr 2016 01:01:28 +0000
reviewerschmanchester
bugs1256571
milestone48.0a1
Bug 1256571 - Move resolving @depends dependencies to just before running the decorated function. r?chmanchester
python/mozbuild/mozbuild/configure/__init__.py
--- a/python/mozbuild/mozbuild/configure/__init__.py
+++ b/python/mozbuild/mozbuild/configure/__init__.py
@@ -318,63 +318,66 @@ class ConfigureSandbox(dict):
 
         The decorated function is altered to use a different global namespace
         for its execution. This different global namespace exposes a limited
         set of functions from os.path.
         '''
         if not args:
             raise ConfigureError('@depends needs at least one argument')
 
-        resolved_args = []
         dependencies = []
         for arg in args:
             if isinstance(arg, types.StringTypes):
                 prefix, name, values = Option.split_option(arg)
                 if values != ():
                     raise ConfigureError("Option must not contain an '='")
                 if name not in self._options:
                     raise ConfigureError("'%s' is not a known option. "
                                          "Maybe it's declared too late?"
                                          % arg)
                 arg = self._options[name]
                 self._seen.add(arg)
                 dependencies.append(arg)
-                assert arg in self._option_values or self._help
-                resolved_arg = self._option_values.get(arg)
             elif isinstance(arg, DependsFunction):
                 assert arg in self._depends
                 dependencies.append(arg)
-                arg, _ = self._depends[arg]
-                resolved_arg = self._results.get(arg)
             else:
                 raise TypeError(
                     "Cannot use object of type '%s' as argument to @depends"
                     % type(arg).__name__)
-            resolved_args.append(resolved_arg)
         dependencies = tuple(dependencies)
 
         def decorator(func):
             if inspect.isgeneratorfunction(func):
                 raise ConfigureError(
                     'Cannot decorate generator functions with @depends')
             func, glob = self._prepare_function(func)
             dummy = wraps(func)(DependsFunction())
             self._depends[dummy] = func, dependencies
             with_help = self._help_option in dependencies
             if with_help:
-                for arg in args:
+                for arg in dependencies:
                     if isinstance(arg, DependsFunction):
                         _, deps = self._depends[arg]
                         if self._help_option not in deps:
                             raise ConfigureError(
                                 "`%s` depends on '--help' and `%s`. "
                                 "`%s` must depend on '--help'"
                                 % (func.__name__, arg.__name__, arg.__name__))
 
             if not self._help or with_help:
+                resolved_args = []
+                for arg in dependencies:
+                    if isinstance(arg, Option):
+                        assert arg in self._option_values
+                        resolved_args.append(self._option_values.get(arg))
+                    elif isinstance(arg, DependsFunction):
+                        arg, _ = self._depends[arg]
+                        resolved_args.append(self._results.get(arg))
+
                 self._results[func] = func(*resolved_args)
 
             return dummy
 
         return decorator
 
     def include_impl(self, what):
         '''Implementation of include().