summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Scanner
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2001-12-11 06:18:49 (GMT)
committerSteven Knight <knight@baldmt.com>2001-12-11 06:18:49 (GMT)
commitd64afa0c1a0c43d658105a7e6aebcf23559c108a (patch)
tree36778b1739c79b51a58690c076f4e4540af64e30 /src/engine/SCons/Scanner
parentd28daaf13a9b527df8a9f5ce2b04e077b776ef25 (diff)
downloadSCons-d64afa0c1a0c43d658105a7e6aebcf23559c108a.zip
SCons-d64afa0c1a0c43d658105a7e6aebcf23559c108a.tar.gz
SCons-d64afa0c1a0c43d658105a7e6aebcf23559c108a.tar.bz2
Add a __hash_() method to the Scanners.
Diffstat (limited to 'src/engine/SCons/Scanner')
-rw-r--r--src/engine/SCons/Scanner/C.py7
-rw-r--r--src/engine/SCons/Scanner/CTests.py21
-rw-r--r--src/engine/SCons/Scanner/ScannerTests.py10
-rw-r--r--src/engine/SCons/Scanner/__init__.py12
4 files changed, 40 insertions, 10 deletions
diff --git a/src/engine/SCons/Scanner/C.py b/src/engine/SCons/Scanner/C.py
index 5dbdf6f..589aef6 100644
--- a/src/engine/SCons/Scanner/C.py
+++ b/src/engine/SCons/Scanner/C.py
@@ -50,6 +50,7 @@ def CScan(fs = SCons.Node.FS.default_fs):
class CScanner(SCons.Scanner.Recursive):
def __init__(self, *args, **kw):
apply(SCons.Scanner.Recursive.__init__, (self,) + args, kw)
+ self.hash = None
self.pathscanners = {}
def instance(self, env):
@@ -64,10 +65,14 @@ class CScanner(SCons.Scanner.Recursive):
dirs = ()
if not self.pathscanners.has_key(dirs):
clone = copy.copy(self)
- clone.argument = [self.fs, dirs] # XXX reaching into object
+ clone.hash = dirs
+ clone.argument = [self.fs, dirs] # XXX reaching into object
self.pathscanners[dirs] = clone
return self.pathscanners[dirs]
+ def __hash__(self):
+ return hash(self.hash)
+
def scan(filename, env, args = [SCons.Node.FS.default_fs, ()]):
"""
scan(str, Environment) -> [str]
diff --git a/src/engine/SCons/Scanner/CTests.py b/src/engine/SCons/Scanner/CTests.py
index c16da61..71b36e5 100644
--- a/src/engine/SCons/Scanner/CTests.py
+++ b/src/engine/SCons/Scanner/CTests.py
@@ -166,12 +166,13 @@ class CScannerTestCase6(unittest.TestCase):
def runTest(self):
env1 = DummyEnvironment([test.workpath("d1")])
env2 = DummyEnvironment([test.workpath("d1/d2")])
+ env3 = DummyEnvironment([test.workpath("d1/../d1")])
s = SCons.Scanner.C.CScan()
- s1 = s.instance(env1)
- s2 = s.instance(env2)
- s3 = s.instance(env1)
- assert not s1 is s2
- assert s1 is s3
+ s1 = s.instance(env1)
+ s2 = s.instance(env2)
+ s3 = s.instance(env3)
+ assert not s1 is s2
+ assert s1 is s3
deps1 = s1.scan(test.workpath('f1.cpp'), None)
deps2 = s2.scan(test.workpath('f1.cpp'), None)
headers1 = ['f1.h', 'd1/f2.h']
@@ -179,6 +180,15 @@ class CScannerTestCase6(unittest.TestCase):
deps_match(self, deps1, headers1)
deps_match(self, deps2, headers2)
+class CScannerTestCase7(unittest.TestCase):
+ def runTest(self):
+ s = SCons.Scanner.C.CScan()
+ s1 = s.instance(DummyEnvironment([test.workpath("d1")]))
+ s2 = s.instance(DummyEnvironment([test.workpath("d1/../d1")]))
+ dict = {}
+ dict[s1] = 777
+ assert dict[s2] == 777
+
def suite():
suite = unittest.TestSuite()
suite.addTest(CScannerTestCase1())
@@ -187,6 +197,7 @@ def suite():
suite.addTest(CScannerTestCase4())
suite.addTest(CScannerTestCase5())
suite.addTest(CScannerTestCase6())
+ suite.addTest(CScannerTestCase7())
return suite
if __name__ == "__main__":
diff --git a/src/engine/SCons/Scanner/ScannerTests.py b/src/engine/SCons/Scanner/ScannerTests.py
index f1a92cd..e414e34 100644
--- a/src/engine/SCons/Scanner/ScannerTests.py
+++ b/src/engine/SCons/Scanner/ScannerTests.py
@@ -111,12 +111,22 @@ class ScannerKeywordArgumentTestCase(ScannerTestBase, unittest.TestCase):
i = s.instance(env)
self.test(i, env, 'i4.cpp', ['i4.h', 'i4.hpp'], arg)
+class ScannerHashTestCase(ScannerTestBase, unittest.TestCase):
+ "Test the Scanner.Base class __hash__() method"
+ def runTest(self):
+ s = SCons.Scanner.Base(self.func, "Hash")
+ dict = {}
+ dict[s] = 777
+ self.failUnless(hash(dict.keys()[0]) == hash(None),
+ "did not hash Scanner base class as expected")
+
def suite():
suite = unittest.TestSuite()
suite.addTest(ScannerPositionalTestCase())
suite.addTest(ScannerKeywordTestCase())
suite.addTest(ScannerPositionalArgumentTestCase())
suite.addTest(ScannerKeywordArgumentTestCase())
+ suite.addTest(ScannerHashTestCase())
return suite
if __name__ == "__main__":
diff --git a/src/engine/SCons/Scanner/__init__.py b/src/engine/SCons/Scanner/__init__.py
index 7ecd846..ba37edc 100644
--- a/src/engine/SCons/Scanner/__init__.py
+++ b/src/engine/SCons/Scanner/__init__.py
@@ -116,6 +116,9 @@ class Base:
def __cmp__(self, other):
return cmp(self.__dict__, other.__dict__)
+ def __hash__(self):
+ return hash(None)
+
class Recursive(Base):
"""
The class for recursive dependency scanning. This will
@@ -143,8 +146,9 @@ class Recursive(Base):
else:
d = self.function(f, env)
d = filter(lambda x, seen=seen: str(x) not in seen, d)
- deps.extend(d)
- s = map(str, d)
- seen.extend(s)
- files.extend(s)
+ if d:
+ deps.extend(d)
+ s = map(str, d)
+ seen.extend(s)
+ files.extend(s)
return deps