Avoid copying __builtin__ when evaluating variables. (Gary Oberbrunner)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 22 Oct 2004 21:57:53 +0000 (21:57 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Fri, 22 Oct 2004 21:57:53 +0000 (21:57 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1136 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/CHANGES.txt
src/engine/SCons/Util.py

index 6747261045bff80c8138cf3d1aa25ceac807dffd..9845e85fbfb1c6d7f7be1438aeb4476b3104a688 100644 (file)
@@ -154,6 +154,9 @@ RELEASE 0.97 - XXX
     will not be added to the construction environment unless it's set
     explicitly by the user or from an Options file.
 
+  - Avoid copying __builtin__ values into a construction environment's
+    dictionary when evaluating construction variables.
+
   From Chris Pawling:
 
   - Have the linkloc tool use $MSVS_VERSION to select the Microsoft
index 4e8193503303a819d5bcabbe93c369d5c733ee72..b713b570a72a462173bd54f33bc3115cca226726 100644 (file)
@@ -692,9 +692,22 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, dict=No
     if gvars is None:
         gvars = env.Dictionary()
 
+    # We're (most likely) going to eval() things.  If Python doesn't
+    # find a __builtin__ value in the global dictionary used for eval(),
+    # it copies the current __builtin__ values for you.  Avoid this by
+    # setting it explicitly and then deleting, so we don't pollute the
+    # construction environment Dictionary(ies) that are typically used
+    # for expansion.
+    gvars['__builtin__'] = __builtin__
+
     ss = StringSubber(env, mode, target, source, conv, gvars)
     result = ss.substitute(strSubst, dict)
 
+    try:
+        del gvars['__builtin__']
+    except KeyError:
+        pass
+
     if is_String(result):
         # Remove $(-$) pairs and any stuff in between,
         # if that's appropriate.
@@ -929,9 +942,22 @@ def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, di
     if gvars is None:
         gvars = env.Dictionary()
 
+    # We're (most likely) going to eval() things.  If Python doesn't
+    # find a __builtin__ value in the global dictionary used for eval(),
+    # it copies the current __builtin__ values for you.  Avoid this by
+    # setting it explicitly and then deleting, so we don't pollute the
+    # construction environment Dictionary(ies) that are typically used
+    # for expansion.
+    gvars['__builtins__'] = __builtins__
+
     ls = ListSubber(env, mode, target, source, conv, gvars)
     ls.substitute(strSubst, dict, 0)
 
+    try:
+        del gvars['__builtins__']
+    except KeyError:
+        pass
+
     return ls.data
 
 def scons_subst_once(strSubst, env, key):