ActionFactory action functions should take an env argument, too.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 7 Dec 2004 23:21:53 +0000 (23:21 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 7 Dec 2004 23:21:53 +0000 (23:21 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1184 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Action.py
src/engine/SCons/ActionTests.py

index 545bd6181364f0a7673458915e1a80beb6304a93..6db1e6af8321cef4c041fb0e0881aa81270eb0f3 100644 (file)
@@ -665,14 +665,22 @@ class ActionCaller:
                 # or something like that.  Do the best we can.
                 contents = str(actfunc)
         return contents
+    def subst(self, s, target, source, env):
+        # Special-case hack:  Let a custom function wrapped in an
+        # ActionCaller get at the environment through which the action
+        # was called by using this hard-coded value as a special return.
+        if s == '$__env__':
+            return env
+        else:
+            return env.subst(s, 0, target, source)
     def subst_args(self, target, source, env):
-        return map(lambda x, e=env, t=target, s=source:
-                          e.subst(x, 0, t, s),
+        return map(lambda x, self=self, t=target, s=source, e=env:
+                          self.subst(x, t, s, e),
                    self.args)
     def subst_kw(self, target, source, env):
         kw = {}
         for key in self.kw.keys():
-            kw[key] = env.subst(self.kw[key], 0, target, source)
+            kw[key] = self.subst(self.kw[key], target, source, env)
         return kw
     def __call__(self, target, source, env):
         args = self.subst_args(target, source, env)
index 315b1ac0fd1dfc7e711edec69adb93ded9a71354..705daff2746aa702d5421bd63cd8f9ef75122186 100644 (file)
@@ -1588,15 +1588,22 @@ class ActionCallerTestCase(unittest.TestCase):
         def strfunc(a1, a2, a3):
             pass
 
+        e = Environment(FOO = 2, BAR = 5)
+
         af = SCons.Action.ActionFactory(actfunc, strfunc)
-        ac = SCons.Action.ActionCaller(af, [1, '$FOO', 3], {})
-        ac([], [], Environment(FOO = 2))
-        assert actfunc_args == [1, '2', 3], actfunc_args
+        ac = SCons.Action.ActionCaller(af, ['$__env__', '$FOO', 3], {})
+        ac([], [], e)
+        assert actfunc_args[0] is e, actfunc_args
+        assert actfunc_args[1] == '2', actfunc_args
+        assert actfunc_args[2] == 3, actfunc_args
+        del actfunc_args[:]
 
+        ac = SCons.Action.ActionCaller(af, [], {'a3' : '$__env__', 'a2' : '$BAR', 'a1' : 4})
+        ac([], [], e)
+        assert actfunc_args[0] == 4, actfunc_args
+        assert actfunc_args[1] == '5', actfunc_args
+        assert actfunc_args[2] is e, actfunc_args
         del actfunc_args[:]
-        ac = SCons.Action.ActionCaller(af, [], {'a3' : 6, 'a2' : '$BAR', 'a1' : 4})
-        ac([], [], Environment(BAR = 5))
-        assert actfunc_args == [4, '5', 6], actfunc_args
 
     def test_strfunction(self):
         """Test calling the ActionCaller strfunction() method"""