diff options
Diffstat (limited to 'src/engine/SCons/Subst.py')
| -rw-r--r-- | src/engine/SCons/Subst.py | 30 | 
1 files changed, 23 insertions, 7 deletions
diff --git a/src/engine/SCons/Subst.py b/src/engine/SCons/Subst.py index 90c12a0..1e0d423 100644 --- a/src/engine/SCons/Subst.py +++ b/src/engine/SCons/Subst.py @@ -5,7 +5,7 @@ SCons string substitution.  """  # -# Copyright (c) 2001 - 2017 The SCons Foundation +# Copyright (c) 2001 - 2019 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ SCons string substitution.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Subst.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +__revision__ = "src/engine/SCons/Subst.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan"  import collections  import re @@ -86,6 +86,9 @@ class Literal(object):      def __neq__(self, other):          return not self.__eq__(other) +    def __hash__(self): +        return hash(self.lstr) +  class SpecialAttrWrapper(object):      """This is a wrapper for what we call a 'Node special attribute.'      This is any of the attributes of a Node that we can reference from @@ -338,13 +341,16 @@ SUBST_RAW = 1  SUBST_SIG = 2  _rm = re.compile(r'\$[()]') -_rm_split = re.compile(r'(\$[()])') + +# Note the pattern below only matches $( or $) when there is no +# preceeding $. (Thus the (?<!\$)) +_rm_split = re.compile(r'(?<!\$)(\$[()])')  # Indexed by the SUBST_* constants above.  _regex_remove = [ _rm, None, _rm_split ]  def _rm_list(list): -    return [l for l in list if not l in ('$(', '$)')] +    return [l for l in list if l not in ('$(', '$)')]  def _remove_list(list):      result = [] @@ -437,7 +443,11 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={                  if s0 != '$':                      return s                  if s1 == '$': -                    return '$' +                    # In this case keep the double $'s which we'll later +                    # swap for a single dollar sign as we need to retain +                    # this information to properly avoid matching "$("" when +                    # the actual text was "$$(""  (or "$)"" when "$$)"" ) +                    return '$$'                  elif s1 in '()':                      return s                  else: @@ -458,7 +468,7 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={                              s = lvars[key]                          elif key in self.gvars:                              s = self.gvars[key] -                        elif not NameError in AllowableExceptions: +                        elif NameError not in AllowableExceptions:                              raise_exception(NameError(key), lvars['TARGETS'], s)                          else:                              return '' @@ -583,6 +593,12 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={              # Compress strings of white space characters into              # a single space.              result = _space_sep.sub(' ', result).strip() + +        # Now replace escaped $'s currently "$$" +        # This is needed because we now retain $$ instead of +        # replacing them during substition to avoid +        # improperly trying to escape "$$(" as being "$(" +        result = result.replace('$$','$')      elif is_Sequence(result):          remove = _list_remove[mode]          if remove: @@ -674,7 +690,7 @@ def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gv                              s = lvars[key]                          elif key in self.gvars:                              s = self.gvars[key] -                        elif not NameError in AllowableExceptions: +                        elif NameError not in AllowableExceptions:                              raise_exception(NameError(), lvars['TARGETS'], s)                          else:                              return  | 
