From 50374da1cdf6f93e5095aed5b64317b2398c2e4f Mon Sep 17 00:00:00 2001 From: stevenknight Date: Wed, 16 Nov 2005 02:54:07 +0000 Subject: [PATCH] Handle FunctionAction signatures when the function is an object method. git-svn-id: http://scons.tigris.org/svn/scons/trunk@1388 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- src/CHANGES.txt | 3 +++ src/engine/SCons/Action.py | 29 ++++++++++++++++++++--------- src/engine/SCons/ActionTests.py | 8 ++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index d9d77d10..d75008ab 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -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. diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index 98de34e7..25c71332 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -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))) diff --git a/src/engine/SCons/ActionTests.py b/src/engine/SCons/ActionTests.py index 011cc0df..3cc563b6 100644 --- a/src/engine/SCons/ActionTests.py +++ b/src/engine/SCons/ActionTests.py @@ -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): -- 2.26.2