Various performance enhancements. (Anthony Roach)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 5 Apr 2002 09:39:27 +0000 (09:39 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 5 Apr 2002 09:39:27 +0000 (09:39 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@321 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/CHANGES.txt
src/engine/SCons/Builder.py
src/engine/SCons/Node/__init__.py
src/engine/SCons/Util.py
src/engine/SCons/UtilTests.py

index fee7642787edab3b5911ec3f94f4e248fb80224f..da541f33b7d6e1ca853c7b0b39a97a17de9eae15 100644 (file)
@@ -20,6 +20,12 @@ RELEASE 0.07 -
 
   - Significant internal restructuring of Scanners and Taskmaster.
 
+  - Added new --debug=dtree option.
+
+  - Fixes for --profile option.
+
+  - Performance improvement in construction variable substitution.
+
 
 
 RELEASE 0.06 - Thu, 28 Mar 2002 01:24:29 -0600
index e7af01ce89fbe04f58aa83a1f07075153ec60fe8..2ccba000ba46472d135089abda77689f256b8907 100644 (file)
@@ -64,7 +64,7 @@ def _init_nodes(builder, env, tlist, slist):
     the proper Builder information.
     """
     for s in slist:
-        src_key = slist[0].scanner_key()        # the file suffix
+        src_key = s.scanner_key()        # the file suffix
         scanner = env.get_scanner(src_key)
         if scanner:
             s.source_scanner = scanner
@@ -115,10 +115,8 @@ class BuilderBase:
         """
         def adjustixes(files, pre, suf):
             ret = []
-            if SCons.Util.is_String(files):
-                files = string.split(files)
-            if not SCons.Util.is_List(files):
-                files = [files]
+            files = SCons.Util.argmunge(files)
+
             for f in files:
                 if SCons.Util.is_String(f):
                     if pre and f[:len(pre)] != pre:
index 67ad743160bb60477f449a7cf7a62b4c7bedb08d..9c39d25c3a82da0da3228e9ca8f121bde7beb4eb 100644 (file)
@@ -347,11 +347,7 @@ def arg2nodes(arg, node_factory=None):
           in the list are not split at spaces.
     In all cases, the function returns a list of Node instances."""
 
-    narg = arg
-    if SCons.Util.is_String(arg):
-        narg = string.split(arg)
-    elif not SCons.Util.is_List(arg):
-        narg = [arg]
+    narg = SCons.Util.argmunge(arg)
 
     nodes = []
     for v in narg:
index ef998a94bc502e209e050f127b5def003fbe4e4d..e31b1b081cda7914afe36af87a40f5ac222b2a3e 100644 (file)
@@ -196,6 +196,12 @@ def scons_subst(strSubst, globals, locals, remove=None):
     surrounded by curly braces to separate the name from
     trailing characters.
     """
+    
+    # Make the common case (i.e. nothing to do) fast:
+    if string.find(strSubst, "$") == -1 \
+       and (remove is None or remove.search(strSubst) is None):
+        return strSubst
+    
     cmd_list = scons_subst_list(strSubst, globals, locals, remove)
     return string.join(map(string.join, cmd_list), '\n')
 
@@ -238,6 +244,23 @@ def is_Dict(e):
 def is_List(e):
     return type(e) is types.ListType or isinstance(e, UserList.UserList)
 
+def argmunge(arg):
+    """This function converts a string or list into a list of strings or Nodes.
+    It follows the rules outlined in the SCons design document by accepting
+    any of the following inputs:
+        - A single string containing names separated by spaces. These will be
+          split apart at the spaces.
+        - A single None instance
+        - A list containing either strings or Node instances. Any strings
+          in the list are not split at spaces.
+    In all cases, the function returns a list of Nodes and strings."""
+    if is_List(arg):
+        return arg
+    elif is_String(arg):
+        return string.split(arg)
+    else:
+        return [arg]
+
 if hasattr(types, 'UnicodeType'):
     def is_String(e):
         return type(e) is types.StringType \
index d230a08da06451dbc0e6dfea2f75f9fa0604d1f2..60d7d4d282909d3d83e8f67bd0d3bbe045b323d3 100644 (file)
@@ -208,6 +208,11 @@ class UtilTestCase(unittest.TestCase):
         if hasattr(types, 'UnicodeType'):
             exec "assert not is_List(u'')"
 
+    def test_argmunge(self):
+        assert argmunge("foo bar") == ["foo", "bar"]
+        assert argmunge(["foo", "bar"]) == ["foo", "bar"]
+        assert argmunge("foo") == ["foo"]
+
     def test_is_String(self):
         assert is_String("")
         if hasattr(types, 'UnicodeType'):