]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Update --pcd parser to support flexible pcd format
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index e72b7779cef364875a1a761f345d95c8b3c65ae2..91b3a2737d9d895b2931d4852370397e42d6250e 100644 (file)
@@ -21,7 +21,7 @@ from Common.String import *
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
-\r
+from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
 from Common.TargetTxtClassObject import *\r
 from Common.ToolDefClassObject import *\r
@@ -905,36 +905,6 @@ class DscBuildData(PlatformBuildClassObject):
             if isinstance(self._Pcds[pcd],StructurePcd) and (self._Pcds[pcd].PcdValueFromComm or self._Pcds[pcd].PcdFieldValueFromComm):\r
                 UpdateCommandLineValue(self._Pcds[pcd])\r
 \r
-    def GetFieldValueFromComm(self,ValueStr,TokenSpaceGuidCName, TokenCName, FieldName):\r
-        PredictedFieldType = "VOID*"\r
-        if ValueStr.startswith('L'):\r
-            if not ValueStr[1]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            ValueStr = ValueStr[0] + '"' + ValueStr[1:] + '"'\r
-            PredictedFieldType = "VOID*"\r
-        elif ValueStr.startswith('H') or ValueStr.startswith('{'):\r
-            EdkLogger.error("build", FORMAT_INVALID, 'Currently we do not support assign H"{...}" format for Pcd field.', ExtraData="%s.%s.%s from command line" % (TokenSpaceGuidCName, TokenCName, FieldName))\r
-            ValueStr = ValueStr[1:]\r
-            PredictedFieldType = "VOID*"\r
-        elif ValueStr.upper() in ['TRUE', '0X1', '0X01', '1', 'FALSE', '0X0', '0X00', '0']:\r
-            PredictedFieldType = "BOOLEAN"\r
-        elif ValueStr.isdigit() or ValueStr.upper().startswith('0X'):\r
-            PredictedFieldType = TAB_UINT16\r
-        else:\r
-            if not ValueStr[0]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            ValueStr = '"' + ValueStr + '"'\r
-            PredictedFieldType = "VOID*"\r
-        IsValid, Cause = CheckPcdDatum(PredictedFieldType, ValueStr)\r
-        if not IsValid:\r
-            EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s.%s from command line" % (TokenSpaceGuidCName, TokenCName, FieldName))\r
-        if PredictedFieldType == 'BOOLEAN':\r
-            ValueStr = ValueStr.upper()\r
-            if ValueStr == 'TRUE' or ValueStr == '1':\r
-                ValueStr = '1'\r
-            elif ValueStr == 'FALSE' or ValueStr == '0':\r
-                ValueStr = '0'\r
-        return  ValueStr\r
     def __ParsePcdFromCommandLine(self):\r
         if GlobalData.BuildOptionPcd:\r
             for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
@@ -975,148 +945,118 @@ class DscBuildData(PlatformBuildClassObject):
                 TokenSpaceGuidCNameList = []\r
                 FoundFlag = False\r
                 PcdDatumType = ''\r
-                NewValue = ''\r
+                DisplayName = TokenCName\r
+                if FieldName:\r
+                    DisplayName = TokenCName + '.' + FieldName\r
                 if not HasTokenSpace:\r
                     for key in self.DecPcds:\r
-                        if TokenCName == key[0]:\r
-                            if TokenSpaceGuidCName:\r
-                                EdkLogger.error(\r
-                                                'build',\r
-                                                 AUTOGEN_ERROR,\r
-                                                "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName, TokenSpaceGuidCName, key[1])\r
-                                                )\r
-                            else:\r
-                                TokenSpaceGuidCName = key[1]\r
-                                FoundFlag = True\r
+                        PcdItem = self.DecPcds[key]\r
+                        if TokenCName == PcdItem.TokenCName:\r
+                            if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
+                                if len (TokenSpaceGuidCNameList) < 1:\r
+                                    TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
+                                    TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
+                                    PcdDatumType = PcdItem.DatumType\r
+                                    FoundFlag = True\r
+                                else:\r
+                                    EdkLogger.error(\r
+                                            'build',\r
+                                             AUTOGEN_ERROR,\r
+                                            "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
+                                            )\r
                 else:\r
                     if (TokenCName, TokenSpaceGuidCName) in self.DecPcds:\r
                         FoundFlag = True\r
-                if FieldName:\r
-                    NewValue = self.GetFieldValueFromComm(pcdvalue, TokenSpaceGuidCName, TokenCName, FieldName)\r
-                    GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))\r
-                else:\r
-                    # Replace \' to ', \\\' to \'\r
-                    pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
-                    for key in self.DecPcds:\r
-                        PcdItem = self.DecPcds[key]\r
-                        if HasTokenSpace:\r
-                            if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):\r
-                                PcdDatumType = PcdItem.DatumType\r
-                                if pcdvalue.startswith('H'):\r
-                                    try:\r
-                                        pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
-                                    except BadExpression, Value:\r
-                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
-                                        pcdvalue = 'H' + pcdvalue\r
-                                elif pcdvalue.startswith("L'"):\r
-                                    try:\r
-                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                    except BadExpression, Value:\r
-                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
-                                        pcdvalue = 'H' + pcdvalue\r
-                                elif pcdvalue.startswith("'"):\r
-                                    try:\r
-                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                    except BadExpression, Value:\r
-                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
-                                        pcdvalue = 'H' + pcdvalue\r
-                                elif pcdvalue.startswith('L'):\r
-                                    pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
-                                    try:\r
-                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                    except BadExpression, Value:\r
-                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                else:\r
-                                    try:\r
-                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                    except BadExpression, Value:\r
-                                        try:\r
-                                            pcdvalue = '"' + pcdvalue + '"'\r
-                                            pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                        except BadExpression, Value:\r
-                                            EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                            (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
-                                FoundFlag = True\r
-                        else:\r
-                            if PcdItem.TokenCName == TokenCName:\r
-                                if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
-                                    if len (TokenSpaceGuidCNameList) < 1:\r
-                                        TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
-                                        PcdDatumType = PcdItem.DatumType\r
-                                        TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
-                                        if pcdvalue.startswith('H'):\r
-                                            try:\r
-                                                pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
-                                            except BadExpression, Value:\r
-                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
-                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:\r
-                                                pcdvalue = 'H' + pcdvalue\r
-                                        elif pcdvalue.startswith("L'"):\r
-                                            try:\r
-                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
-                                                    True)\r
-                                            except BadExpression, Value:\r
-                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
-                                                pcdvalue = 'H' + pcdvalue\r
-                                        elif pcdvalue.startswith("'"):\r
-                                            try:\r
-                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
-                                                    True)\r
-                                            except BadExpression, Value:\r
-                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, 'BOOLEAN']:\r
-                                                pcdvalue = 'H' + pcdvalue\r
-                                        elif pcdvalue.startswith('L'):\r
-                                            pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
-                                            try:\r
-                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
-                                                    True)\r
-                                            except BadExpression, Value:\r
-                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                        else:\r
-                                            try:\r
-                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                            except BadExpression, Value:\r
-                                                try:\r
-                                                    pcdvalue = '"' + pcdvalue + '"'\r
-                                                    pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
-                                                except BadExpression, Value:\r
-                                                    EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                                    (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                        NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
-                                        FoundFlag = True\r
-                                    else:\r
-                                        EdkLogger.error(\r
-                                                'build',\r
-                                                 AUTOGEN_ERROR,\r
-                                                "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
-                                                )\r
-                    GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName,NewValue,("build command options",1))\r
                 if not FoundFlag:\r
                     if HasTokenSpace:\r
-                        EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, TokenCName))\r
+                        EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, DisplayName))\r
                     else:\r
-                        EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (TokenCName))\r
+                        EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (DisplayName))\r
+                pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
+                if FieldName:\r
+                    pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict, FieldName)\r
+                else:\r
+                    pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict)\r
+                    IsValid, Cause = CheckPcdDatum(PcdDatumType, pcdvalue)\r
+                    if not IsValid:\r
+                        EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
+                GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue,("build command options",1))\r
+\r
                 for BuildData in self._Bdb._CACHE_.values():\r
                     if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
                         continue\r
                     for key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
-                            PcdItem.DefaultValue = NewValue\r
+                            PcdItem.DefaultValue = pcdvalue\r
+\r
+    def HandleFlexiblePcd(self, TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
+        if FieldName:\r
+            IsArray = False\r
+            TokenCName += '.' + FieldName\r
+        if PcdValue.startswith('H'):\r
+            if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
+                PcdDatumType = 'VOID*'\r
+                IsArray = True\r
+            if FieldName and not IsArray:\r
+                return PcdValue\r
+            try:\r
+                PcdValue = ValueExpressionEx(PcdValue[1:], PcdDatumType, GuidDict)(True)\r
+            except BadExpression, Value:     \r
+                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+        elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
+            if FieldName and IsFieldValueAnArray(PcdValue):\r
+                PcdDatumType = 'VOID*'\r
+                IsArray = True\r
+            if FieldName and not IsArray:\r
+                return PcdValue\r
+            try:\r
+                PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
+            except BadExpression, Value:\r
+                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+        elif PcdValue.startswith('L'):\r
+            PcdValue = 'L"' + PcdValue[1:] + '"'\r
+            if FieldName and IsFieldValueAnArray(PcdValue):\r
+                PcdDatumType = 'VOID*'\r
+                IsArray = True\r
+            if FieldName and not IsArray:\r
+                return PcdValue\r
+            try:\r
+                PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
+            except BadExpression, Value:\r
+                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+        else:\r
+            if PcdValue.upper() == 'FALSE':\r
+                PcdValue = str(0)\r
+            if PcdValue.upper() == 'TRUE':\r
+                PcdValue = str(1)\r
+            if not FieldName:\r
+                if PcdDatumType not in ['UINT8','UINT16','UINT32','UINT64','BOOLEAN']:\r
+                    PcdValue = '"' + PcdValue + '"'\r
+            else:\r
+                IsArray = False\r
+                Base = 10\r
+                if PcdValue.upper().startswith('0X'):\r
+                    Base = 16\r
+                try:\r
+                    Num = int(PcdValue, Base)\r
+                except:\r
+                    PcdValue = '"' + PcdValue + '"'\r
+                if IsFieldValueAnArray(PcdValue):\r
+                    PcdDatumType = 'VOID*'\r
+                    IsArray = True\r
+                if not IsArray:\r
+                    return PcdValue\r
+            try:\r
+                PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
+            except BadExpression, Value:\r
+                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
+        return PcdValue\r
+\r
     ## Retrieve all PCD settings in platform\r
     def _GetPcds(self):\r
         if self._Pcds == None:\r
@@ -1555,22 +1495,6 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))\r
 \r
-    def IsFieldValueAnArray (self, Value):\r
-        Value = Value.strip()\r
-        if Value.startswith('GUID') and Value.endswith(')'):\r
-            return True\r
-        if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
-            return True\r
-        if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
-            return True\r
-        if Value[0] == '{' and Value[-1] == '}':\r
-            return True\r
-        if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
-            return True\r
-        if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
-            return True\r
-        return False\r
-\r
     def ExecuteCommand (self, Command):\r
         try:\r
             Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
@@ -1617,7 +1541,7 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
             for FieldName in FieldList:\r
                 FieldName = "." + FieldName\r
-                IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                     try:\r
                         Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
@@ -1647,7 +1571,7 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     for FieldName in FieldList:\r
                         FieldName = "." + FieldName\r
-                        IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                        IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                         if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                             try:\r
                                 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
@@ -1671,7 +1595,7 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + "// From Command Line \n"\r
         for FieldName in Pcd.PcdFieldValueFromComm:\r
             FieldName = "." + FieldName\r
-            IsArray = self.IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
+            IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
             if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
                 try:\r
                     Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
@@ -1704,7 +1628,7 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
-        IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+        IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
         if IsArray:\r
             try:\r
                 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
@@ -1725,7 +1649,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
@@ -1775,7 +1699,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = self.IsFieldValueAnArray(FieldList)\r
+                IsArray = IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
@@ -1805,7 +1729,7 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
             if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD') or (( (SkuName,'') not in Pcd.ValueChain) and ( (SkuName,DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
-                    IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
                             FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
@@ -1846,7 +1770,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = self.IsFieldValueAnArray(FieldList)\r
+                IsArray = IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
@@ -1865,7 +1789,7 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r