summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node/FS.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2003-05-17 20:45:44 (GMT)
committerSteven Knight <knight@baldmt.com>2003-05-17 20:45:44 (GMT)
commita4a6636bb15d7544abb5ee360aff6c7bb9ee21be (patch)
tree7949132a4d080294d4cfdfd59528d1f4fe03a106 /src/engine/SCons/Node/FS.py
parent178bb4ca29174ac1913693343f5d1eb1a3c18237 (diff)
downloadSCons-a4a6636bb15d7544abb5ee360aff6c7bb9ee21be.zip
SCons-a4a6636bb15d7544abb5ee360aff6c7bb9ee21be.tar.gz
SCons-a4a6636bb15d7544abb5ee360aff6c7bb9ee21be.tar.bz2
Eliminate redundant signature calculations, optimize out use of hasattr().
Diffstat (limited to 'src/engine/SCons/Node/FS.py')
-rw-r--r--src/engine/SCons/Node/FS.py65
1 files changed, 43 insertions, 22 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index ff4dfb5..c226504 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -378,9 +378,11 @@ class Entry(SCons.Node.Node):
return self._exists
def rexists(self):
- if not hasattr(self, '_rexists'):
+ try:
+ return self._rexists
+ except AttributeError:
self._rexists = self.rfile().exists()
- return self._rexists
+ return self._rexists
def get_parents(self):
parents = SCons.Node.Node.get_parents(self)
@@ -1112,25 +1114,28 @@ class File(Entry):
else:
return 0
- def calc_signature(self, calc, cache=None):
+ def calc_signature(self, calc):
"""
Select and calculate the appropriate build signature for a File.
self - the File node
calc - the signature calculation module
- cache - alternate node to use for the signature cache
returns - the signature
"""
-
- if self.is_derived():
- if SCons.Sig.build_signature:
- return calc.bsig(self.rfile(), self)
+ try:
+ return self._calculated_sig
+ except AttributeError:
+ if self.is_derived():
+ if SCons.Sig.build_signature:
+ sig = self.rfile().calc_bsig(calc, self)
+ else:
+ sig = self.rfile().calc_csig(calc, self)
+ elif not self.rexists():
+ sig = None
else:
- return calc.csig(self.rfile(), self)
- elif not self.rexists():
- return None
- else:
- return calc.csig(self.rfile(), self)
+ sig = self.rfile().calc_csig(calc, self)
+ self._calculated_sig = sig
+ return sig
def store_csig(self):
self.dir.sconsign().set_csig(self.name, self.get_csig())
@@ -1208,10 +1213,14 @@ class File(Entry):
# created the directory, depending on whether the -n
# option was used or not. Delete the _exists and
# _rexists attributes so they can be reevaluated.
- if hasattr(dirnode, '_exists'):
+ try:
delattr(dirnode, '_exists')
- if hasattr(dirnode, '_rexists'):
+ except AttributeError:
+ pass
+ try:
delattr(dirnode, '_rexists')
+ except AttributeError:
+ pass
except OSError:
pass
@@ -1253,10 +1262,14 @@ class File(Entry):
CachePush(self, None, None)
SCons.Node.Node.built(self)
self.found_includes = {}
- if hasattr(self, '_exists'):
+ try:
delattr(self, '_exists')
- if hasattr(self, '_rexists'):
+ except AttributeError:
+ pass
+ try:
delattr(self, '_rexists')
+ except AttributeError:
+ pass
def visited(self):
if self.fs.CachePath and self.fs.cache_force and os.path.exists(self.path):
@@ -1321,8 +1334,10 @@ class File(Entry):
except OSError, e:
raise SCons.Errors.BuildError(node = self,
errstr = e.strerror)
- if hasattr(self, '_exists'):
+ try:
delattr(self, '_exists')
+ except AttributeError:
+ pass
else:
try:
self._createDir()
@@ -1357,10 +1372,14 @@ class File(Entry):
# created the file, depending on whether the -n
# option was used or not. Delete the _exists and
# _rexists attributes so they can be reevaluated.
- if hasattr(self, '_exists'):
+ try:
delattr(self, '_exists')
- if hasattr(self, '_rexists'):
+ except AttributeError:
+ pass
+ try:
delattr(self, '_rexists')
+ except AttributeError:
+ pass
return Entry.exists(self)
def current(self, calc):
@@ -1384,14 +1403,16 @@ class File(Entry):
return calc.current(self, bsig)
def rfile(self):
- if not hasattr(self, '_rfile'):
+ try:
+ return self._rfile
+ except:
self._rfile = self
if not self.exists():
n = self.fs.Rsearch(self.path, clazz=File,
cwd=self.fs.Top)
if n:
self._rfile = n
- return self._rfile
+ return self._rfile
def rstr(self):
return str(self.rfile())