public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Liming" <liming.gao@intel.com>
To: "Feng, Bob C" <bob.c.feng@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [Patch V2] BaseTools: Enable CODE format in DEC file
Date: Tue, 29 Jan 2019 03:33:55 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E3D1BCF@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20190125094516.368-1-bob.c.feng@intel.com>

Bob:
  I have no comments on this patch. Reviewed-by: Liming Gao <liming.gao@intel.com>
  
  Besides, please make sure the build report list the value from DEC file when the value is specified in DEC file.

Thanks
Liming
> -----Original Message-----
> From: Feng, Bob C
> Sent: Friday, January 25, 2019 5:45 PM
> To: edk2-devel@lists.01.org
> Cc: Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com>
> Subject: [Patch V2] BaseTools: Enable CODE format in DEC file
> 
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1292.
> Enable CODE format in DEC File.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Bob Feng <bob.c.feng@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> ---
>  .../Source/Python/Workspace/DscBuildData.py   | 38 +++----
>  .../Source/Python/Workspace/MetaFileParser.py | 99 ++++++++++++-------
>  BaseTools/Source/Python/build/BuildReport.py  |  2 +-
>  3 files changed, 86 insertions(+), 53 deletions(-)
> 
> diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py
> index 0dad04212e..4c3c9b8d34 100644
> --- a/BaseTools/Source/Python/Workspace/DscBuildData.py
> +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
> @@ -1786,20 +1786,21 @@ class DscBuildData(PlatformBuildClassObject):
>                          Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)
>                      except BadExpression:
>                          EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
>                                          (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))),
> FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))
>                      Value, ValueSize = ParseFieldValue(Value)
> -                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1],
> FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
> +                    if not Pcd.IsArray:
> +                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1],
> FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
>                  else:
>                      NewFieldName = ''
>                      FieldName_ori = FieldName.strip('.')
>                      while '[' in  FieldName:
>                          NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
>                          ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
>                          FieldName = FieldName.split(']', 1)[1]
>                      FieldName = NewFieldName + FieldName
> -                    while '[' in FieldName:
> +                    while '[' in FieldName and not Pcd.IsArray:
>                          FieldName = FieldName.rsplit('[', 1)[0]
>                          CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType,
> FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
>          for skuname in Pcd.SkuOverrideValues:
>              if skuname == TAB_COMMON:
>                  continue
> @@ -1817,20 +1818,21 @@ class DscBuildData(PlatformBuildClassObject):
>                                      Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)
>                                  except BadExpression:
>                                      EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
>                                                      (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))),
> FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))
>                                  Value, ValueSize = ParseFieldValue(Value)
> -                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1],
> FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
> +                                if not Pcd.IsArray:
> +                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) +
> ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1],
> FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
>                              else:
>                                  NewFieldName = ''
>                                  FieldName_ori = FieldName.strip('.')
>                                  while '[' in  FieldName:
>                                      NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
>                                      ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
>                                      FieldName = FieldName.split(']', 1)[1]
>                                  FieldName = NewFieldName + FieldName
> -                                while '[' in FieldName:
> +                                while '[' in FieldName and not Pcd.IsArray:
>                                      FieldName = FieldName.rsplit('[', 1)[0]
>                                      CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' %
> (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
>          if Pcd.PcdFieldValueFromFdf:
>              CApp = CApp + "// From fdf \n"
>          for FieldName in Pcd.PcdFieldValueFromFdf:
> @@ -1841,11 +1843,12 @@ class DscBuildData(PlatformBuildClassObject):
>                      Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)
>                  except BadExpression:
>                      EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
>                                      (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))),
> Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))
>                  Value, ValueSize = ParseFieldValue(Value)
> -                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1],
> Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);
> +                if not Pcd.IsArray:
> +                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1],
> Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);
>              else:
>                  NewFieldName = ''
>                  FieldName_ori = FieldName.strip('.')
>                  while '[' in  FieldName:
>                      NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
> @@ -1865,20 +1868,21 @@ class DscBuildData(PlatformBuildClassObject):
>                      Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)
>                  except BadExpression:
>                      EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
>                                      (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))),
> Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))
>                  Value, ValueSize = ParseFieldValue(Value)
> -                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."),
> Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2],
> Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);
> +                if not Pcd.IsArray:
> +                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %%
> __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize,
> Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."),
> Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2],
> Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);
>              else:
>                  NewFieldName = ''
>                  FieldName_ori = FieldName.strip('.')
>                  while '[' in  FieldName:
>                      NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
>                      ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
>                      FieldName = FieldName.split(']', 1)[1]
>                  FieldName = NewFieldName + FieldName
> -                while '[' in FieldName:
> +                while '[' in FieldName and not Pcd.IsArray:
>                      FieldName = FieldName.rsplit('[', 1)[0]
>                      CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType,
> FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2],
> Pcd.PcdFieldValueFromComm[FieldName_ori][0])
>          if Pcd.GetPcdMaxSize():
>              CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(),
> Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())
>          CApp = CApp + "}\n"
> @@ -1905,14 +1909,15 @@ class DscBuildData(PlatformBuildClassObject):
>                  PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultValue
>              else:
>                  PcdDefValue = Pcd.DefaultValue
>              if lastoneisEmpty:
>                  if "{CODE(" not in PcdDefValue:
> -                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))
> -                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))
> +                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))
> +                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))
>                      sizeof = "sizeof(%s)" % Pcd.BaseDatumType
> -                    CApp = '  Size = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof,
> sizebasevalue_plus, sizebasevalue))
> +                    CApp = '  int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof,
> sizebasevalue_plus, sizebasevalue))
> +                    CApp += '  Size = ArraySize * sizeof(%s); \n' % Pcd.BaseDatumType
>                  else:
>                      CApp = "  Size = 0;\n"
>              else:
>                  CApp = '  Size = sizeof(%s);\n' % ("".join(r_datatype) )
>          else:
> @@ -1968,21 +1973,21 @@ class DscBuildData(PlatformBuildClassObject):
>              except BadExpression:
>                  EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %
>                                  (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))
>          DefaultValueFromDec = StringToArray(DefaultValueFromDec)
>          Value, ValueSize = ParseFieldValue (DefaultValueFromDec)
> -        if isinstance(Value, str):
> -            CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)
> -        elif IsArray:
> +        if IsArray:
>          #
>          # Use memcpy() to copy value into field
>          #
>              if "{CODE(" in Pcd.DefaultValueFromDec:
>                  CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName,
> Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
>              else:
>                  CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize),
> Pcd.DefaultValueFromDec)
>                  CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)
> +        elif isinstance(Value, str):
> +            CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)
>          for index in Pcd.DefaultValues:
>              FieldList = Pcd.DefaultValues[index]
>              if not FieldList:
>                  continue
>              for FieldName in FieldList:
> @@ -1998,22 +2003,21 @@ class DscBuildData(PlatformBuildClassObject):
>                      Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
>                  except Exception:
>                      EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
> (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))
> 
>                  indicator = self.GetIndicator(index, FieldName,Pcd)
> -                if isinstance(Value, str):
> -                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1],
> FieldList[FieldName][2], FieldList[FieldName][0])
> -                elif IsArray:
> +                if IsArray:
>                      #
>                      # Use memcpy() to copy value into field
>                      #
>                      CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
>                      CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize),
> FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
>                      CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer
> exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName,
> FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
>                      CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName,
> ValueSize, ValueSize)
>                      CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator,
> ValueSize, ValueSize)
> -
> +                elif isinstance(Value, str):
> +                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1],
> FieldList[FieldName][2], FieldList[FieldName][0])
>                  else:
>                      if '[' in FieldName and ']' in FieldName:
>                          Index = int(FieldName.split('[')[1].split(']')[0])
>                          CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array
> index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0],
> FieldList[FieldName][1], FieldList[FieldName][2], FieldName)
>                      if ValueSize > 4:
> diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> index 6df0d3cdf8..45cdf1a238 100644
> --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
> +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> @@ -190,10 +190,14 @@ class MetaFileParser(object):
>          self._PostProcessed = False
>          # Different version of meta-file has different way to parse.
>          self._Version = 0
>          self._GuidDict = {}  # for Parser PCD value {GUID(gTokeSpaceGuidName)}
> 
> +        self._PcdCodeValue = ""
> +        self._PcdDataTypeCODE = False
> +        self._CurrentPcdName = ""
> +
>      ## Store the parsed data in table
>      def _Store(self, *Args):
>          return self._Table.Insert(*Args)
> 
>      ## Virtual method for starting parse
> @@ -481,10 +485,43 @@ class MetaFileParser(object):
>          Macros.update(ComSpeMacroDict)
>          Macros.update(SpeSpeMacroDict)
> 
>          return Macros
> 
> +    def ProcessMultipleLineCODEValue(self,Content):
> +        CODEBegin = False
> +        CODELine = ""
> +        continuelinecount = 0
> +        newContent = []
> +        for Index in range(0, len(Content)):
> +            Line = Content[Index]
> +            if CODEBegin:
> +                CODELine = CODELine + Line
> +                continuelinecount +=1
> +                if ")}" in Line:
> +                    newContent.append(CODELine)
> +                    for _ in range(continuelinecount):
> +                        newContent.append("")
> +                    CODEBegin = False
> +                    CODELine = ""
> +                    continuelinecount = 0
> +            else:
> +                if not Line:
> +                    newContent.append(Line)
> +                    continue
> +                if "{CODE(" not in Line:
> +                    newContent.append(Line)
> +                    continue
> +                elif CODEPattern.findall(Line):
> +                    newContent.append(Line)
> +                    continue
> +                else:
> +                    CODEBegin = True
> +                    CODELine = Line
> +
> +        return newContent
> +
>      _SectionParser = {}
> 
>  ## INF file parser class
>  #
>  #   @param      FilePath        The path of platform description file
> @@ -901,13 +938,10 @@ class DscParser(MetaFileParser):
>          #  Map the ID between the original table and new table to track
>          #  the owner item
>          #
>          self._IdMapping = {-1:-1}
> 
> -        self._PcdCodeValue = ""
> -        self._PcdDataTypeCODE = False
> -        self._CurrentPcdName = ""
>          self._Content = None
> 
>      ## Parser starter
>      def Start(self):
>          Content = ''
> @@ -1134,42 +1168,10 @@ class DscParser(MetaFileParser):
>      ## Parse Edk style of library modules
>      @ParseMacro
>      def _LibraryInstanceParser(self):
>          self._ValueList[0] = self._CurrentLine
> 
> -    def ProcessMultipleLineCODEValue(self,Content):
> -        CODEBegin = False
> -        CODELine = ""
> -        continuelinecount = 0
> -        newContent = []
> -        for Index in range(0, len(Content)):
> -            Line = Content[Index]
> -            if CODEBegin:
> -                CODELine = CODELine + Line
> -                continuelinecount +=1
> -                if ")}" in Line:
> -                    newContent.append(CODELine)
> -                    for _ in range(continuelinecount):
> -                        newContent.append("")
> -                    CODEBegin = False
> -                    CODELine = ""
> -                    continuelinecount = 0
> -            else:
> -                if not Line:
> -                    newContent.append(Line)
> -                    continue
> -                if "{CODE(" not in Line:
> -                    newContent.append(Line)
> -                    continue
> -                elif CODEPattern.findall(Line):
> -                    newContent.append(Line)
> -                    continue
> -                else:
> -                    CODEBegin = True
> -                    CODELine = Line
> -
> -        return newContent
> 
>      def _DecodeCODEData(self):
>          pass
>      ## PCD sections parser
>      #
> @@ -1772,18 +1774,22 @@ class DecParser(MetaFileParser):
> 
>          self._CurrentStructurePcdName = ""
>          self._include_flag = False
>          self._package_flag = False
> 
> +        self._RestofValue = ""
> +
>      ## Parser starter
>      def Start(self):
>          Content = ''
>          try:
>              Content = open(str(self.MetaFile), 'r').readlines()
>          except:
>              EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)
> 
> +        Content = self.ProcessMultipleLineCODEValue(Content)
> +
>          self._DefinesCount = 0
>          for Index in range(0, len(Content)):
>              Line, Comment = CleanString2(Content[Index])
>              self._CurrentLine = Line
>              self._LineIndex = Index
> @@ -1977,10 +1983,11 @@ class DecParser(MetaFileParser):
>      #   [PcdsDynamicEx
>      #   [PcdsDynamic]
>      #
>      @ParseMacro
>      def _PcdParser(self):
> +
>          if self._CurrentStructurePcdName:
>              self._ValueList[0] = self._CurrentStructurePcdName
> 
>              if "|" not in self._CurrentLine:
>                  if "<HeaderFiles>" == self._CurrentLine:
> @@ -2022,11 +2029,33 @@ class DecParser(MetaFileParser):
>                          EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " %
> (self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),
>                                  File=self.MetaFile, Line=self._LineIndex + 1)
>                      self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])
>                      self._ValueList[2] = PcdTockens[1]
>          if not self._CurrentStructurePcdName:
> +            if self._PcdDataTypeCODE:
> +                if ")}" in self._CurrentLine:
> +                    ValuePart,RestofValue = self._CurrentLine.split(")}")
> +                    self._PcdCodeValue = self._PcdCodeValue + "\n " + ValuePart
> +                    self._CurrentLine = "|".join((self._CurrentPcdName, self._PcdCodeValue,RestofValue))
> +                    self._PcdDataTypeCODE = False
> +                    self._PcdCodeValue = ""
> +                else:
> +                    self._PcdCodeValue = self._PcdCodeValue + "\n " + self._CurrentLine
> +                    self._ValueList = None
> +                    return
>              TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)
> +            self._CurrentPcdName = TokenList[0]
> +            if len(TokenList) == 2 and TokenList[1].strip().startswith("{CODE"):
> +                if ")}" in self._CurrentLine:
> +                    self._PcdDataTypeCODE = False
> +                    self._PcdCodeValue = ""
> +                else:
> +                    self._PcdDataTypeCODE = True
> +                    self._PcdCodeValue = TokenList[1].strip()
> +                    self._ValueList = None
> +                    return
> +
>              self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)
>              ValueRe = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*')
>              # check PCD information
>              if self._ValueList[0] == '' or self._ValueList[1] == '':
>                  EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified",
> diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py
> index ae37a6ce0e..4ae98698f3 100644
> --- a/BaseTools/Source/Python/build/BuildReport.py
> +++ b/BaseTools/Source/Python/build/BuildReport.py
> @@ -147,11 +147,11 @@ def FileWrite(File, String, Wrapper=False):
> 
>  def ByteArrayForamt(Value):
>      IsByteArray = False
>      SplitNum = 16
>      ArrayList = []
> -    if Value.startswith('{') and Value.endswith('}'):
> +    if Value.startswith('{') and Value.endswith('}') and not Value.startswith("{CODE("):
>          Value = Value[1:-1]
>          ValueList = Value.split(',')
>          if len(ValueList) >= SplitNum:
>              IsByteArray = True
>      if IsByteArray:
> --
> 2.20.1.windows.1



      reply	other threads:[~2019-01-29  3:35 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-25  9:45 [Patch V2] BaseTools: Enable CODE format in DEC file Feng, Bob C
2019-01-29  3:33 ` Gao, Liming [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E3D1BCF@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox