Handle FunctionAction signatures when the function is an object method.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 16 Nov 2005 02:54:07 +0000 (02:54 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 16 Nov 2005 02:54:07 +0000 (02:54 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1388 fdb21ef1-2011-0410-befe-b5e4ea1792b1

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

index d9d77d108819311be6b25009462465ca54615e3e..d75008abc8c30c92b4029f27392ef60eb05ad41f 100644 (file)
@@ -381,6 +381,9 @@ RELEASE 0.97 - XXX
   - Change the order of the arguments to Configure.Checklib() to match
     the documentation.
 
+  - Handle signature calculation properly when the Python function used
+    for a FunctionAction is an object method.
+
   From Chen Lee:
 
   - Handle Visual Studio project and solution files in Unicode.
index 98de34e75405d6708daa62839336f99f9e921447..25c71332e91ee0b43c790e7cd737de8f80e0ae0d 100644 (file)
@@ -659,22 +659,33 @@ class FunctionAction(_ActionAction):
         So we remove the line number byte codes to prevent
         recompilations from moving a Python function.
         """
+        execfunction = self.execfunction
         try:
-            # "self.execfunction" is a function.
-            contents = str(self.execfunction.func_code.co_code)
+            # Test if execfunction is a function.
+            code = execfunction.func_code.co_code
         except AttributeError:
-            # "self.execfunction" is a callable object.
             try:
-                contents = str(self.execfunction.__call__.im_func.func_code.co_code)
+                # Test if execfunction is a method.
+                code = execfunction.im_func.func_code.co_code
             except AttributeError:
                 try:
-                    # See if execfunction will do the heavy lifting for us.
-                    gc = self.execfunction.get_contents
+                    # Test if execfunction is a callable object.
+                    code = execfunction.__call__.im_func.func_code.co_code
                 except AttributeError:
-                    # This is weird, just do the best we can.
-                    contents = str(self.execfunction)
+                    try:
+                        # See if execfunction will do the heavy lifting for us.
+                        gc = self.execfunction.get_contents
+                    except AttributeError:
+                        # This is weird, just do the best we can.
+                        contents = str(self.execfunction)
+                    else:
+                        contents = gc(target, source, env)
                 else:
-                    contents = gc(target, source, env)
+                    contents = str(code)
+            else:
+                contents = str(code)
+        else:
+            contents = str(code)
         contents = remove_set_lineno_codes(contents)
         return contents + env.subst(string.join(map(lambda v: '${'+v+'}',
                                                      self.varlist)))
index 011cc0df88522e44b4e2aea34eec91f2c8a80bec..3cc563b6ccde65b723d0a31ed538d0409e32983a 100644 (file)
@@ -1462,6 +1462,14 @@ class FunctionActionTestCase(unittest.TestCase):
         c = a.get_contents(target=[], source=[], env=Environment())
         assert c == 'xyzzy', repr(c)
 
+        class LocalClass:
+            def LocalMethod(self):
+                pass
+        lc = LocalClass()
+        a = SCons.Action.FunctionAction(lc.LocalMethod)
+        c = a.get_contents(target=[], source=[], env=Environment())
+        assert c in matches, repr(c)
+
 class ListActionTestCase(unittest.TestCase):
 
     def test___init__(self):