BaseTools: Fix PcdArray issue
https://bugzilla.tianocore.org/show_bug.cgi?id=1390 1. support hex number for array index 2. support Non-Dynamic Pcd for array data type 3. support {} and {CODE()} for array data type 4. Change GetStructurePcdMaxSize to be a static function since it need to be called in another static function. And this function does not depend on it's class instance. 5. Add unittest for RemoveCComments function and ArrayIndex regular expression. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Philippe Mathieu-Daud? <philmd@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@ -2148,6 +2148,12 @@ def CopyDict(ori_dict):
|
|||||||
else:
|
else:
|
||||||
new_dict[key] = ori_dict[key]
|
new_dict[key] = ori_dict[key]
|
||||||
return new_dict
|
return new_dict
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove the c/c++ comments: // and /* */
|
||||||
|
#
|
||||||
|
def RemoveCComments(ctext):
|
||||||
|
return re.sub('//.*?\n|/\*.*?\*/', '\n', ctext, flags=re.S)
|
||||||
##
|
##
|
||||||
#
|
#
|
||||||
# This acts like the main() function for the script, unless it is 'import'ed into another
|
# This acts like the main() function for the script, unless it is 'import'ed into another
|
||||||
|
@ -19,7 +19,7 @@ from collections import OrderedDict
|
|||||||
from Common.Misc import CopyDict
|
from Common.Misc import CopyDict
|
||||||
import copy
|
import copy
|
||||||
StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')
|
StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')
|
||||||
ArrayIndex = re.compile("\[\s*\d{0,1}\s*\]")
|
ArrayIndex = re.compile("\[\s*[0-9a-fA-FxX]*\s*\]")
|
||||||
## PcdClassObject
|
## PcdClassObject
|
||||||
#
|
#
|
||||||
# This Class is used for PcdObject
|
# This Class is used for PcdObject
|
||||||
@ -84,6 +84,7 @@ class PcdClassObject(object):
|
|||||||
maxsize = item.lstrip("[").rstrip("]").strip()
|
maxsize = item.lstrip("[").rstrip("]").strip()
|
||||||
if not maxsize:
|
if not maxsize:
|
||||||
maxsize = "-1"
|
maxsize = "-1"
|
||||||
|
maxsize = str(int(maxsize,16)) if maxsize.startswith(("0x","0X")) else maxsize
|
||||||
self._Capacity.append(maxsize)
|
self._Capacity.append(maxsize)
|
||||||
if hasattr(self, "SkuOverrideValues"):
|
if hasattr(self, "SkuOverrideValues"):
|
||||||
for sku in self.SkuOverrideValues:
|
for sku in self.SkuOverrideValues:
|
||||||
|
@ -33,7 +33,7 @@ from .MetaFileParser import *
|
|||||||
|
|
||||||
from .WorkspaceCommon import GetDeclaredPcd
|
from .WorkspaceCommon import GetDeclaredPcd
|
||||||
from Common.Misc import AnalyzeDscPcd
|
from Common.Misc import AnalyzeDscPcd
|
||||||
from Common.Misc import ProcessDuplicatedInf
|
from Common.Misc import ProcessDuplicatedInf,RemoveCComments
|
||||||
import re
|
import re
|
||||||
from Common.Parsing import IsValidWord
|
from Common.Parsing import IsValidWord
|
||||||
from Common.VariableAttributes import VariableAttributes
|
from Common.VariableAttributes import VariableAttributes
|
||||||
@ -1575,7 +1575,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
|
|
||||||
for str_pcd_obj in S_pcd_set.values():
|
for str_pcd_obj in S_pcd_set.values():
|
||||||
|
|
||||||
str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)
|
str_pcd_obj.MaxDatumSize = DscBuildData.GetStructurePcdMaxSize(str_pcd_obj)
|
||||||
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj
|
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj
|
||||||
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True
|
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True
|
||||||
|
|
||||||
@ -1689,9 +1689,10 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]
|
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]
|
||||||
return Pcds
|
return Pcds
|
||||||
|
|
||||||
def GetStructurePcdMaxSize(self, str_pcd):
|
@staticmethod
|
||||||
|
def GetStructurePcdMaxSize(str_pcd):
|
||||||
pcd_default_value = str_pcd.DefaultValue
|
pcd_default_value = str_pcd.DefaultValue
|
||||||
sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]
|
sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]
|
||||||
sku_values.append(pcd_default_value)
|
sku_values.append(pcd_default_value)
|
||||||
|
|
||||||
def get_length(value):
|
def get_length(value):
|
||||||
@ -1703,7 +1704,10 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
return len(Value[2:-1])
|
return len(Value[2:-1])
|
||||||
if Value[0] == '"' and Value[-1] == '"':
|
if Value[0] == '"' and Value[-1] == '"':
|
||||||
return len(Value) - 2
|
return len(Value) - 2
|
||||||
if Value[0] == '{' and Value[-1] == '}':
|
if Value.strip().startswith("{CODE("):
|
||||||
|
tmpValue = RemoveCComments(Value)
|
||||||
|
return len(tmpValue.split(","))
|
||||||
|
if (Value[0] == '{' and Value[-1] == '}'):
|
||||||
return len(Value.split(","))
|
return len(Value.split(","))
|
||||||
if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
|
if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
|
||||||
return len(list(Value[2:-1]))
|
return len(list(Value[2:-1]))
|
||||||
@ -1866,7 +1870,8 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
r_datatype.append("[1]")
|
r_datatype.append("[1]")
|
||||||
else:
|
else:
|
||||||
r_datatype.append("[" + dem + "]")
|
r_datatype.append("[" + dem + "]")
|
||||||
CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype))
|
sizebasevalue = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))
|
||||||
|
CApp = ' Size = sizeof(%s) > %s?sizeof(%s) : %s ;\n' % ( ("".join(r_datatype), sizebasevalue, "".join(r_datatype), sizebasevalue) )
|
||||||
else:
|
else:
|
||||||
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)
|
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)
|
||||||
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||||
@ -2248,7 +2253,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
|
|
||||||
PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())
|
PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())
|
||||||
|
|
||||||
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)
|
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get current PCD value and size
|
# Get current PCD value and size
|
||||||
@ -2318,29 +2323,39 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
return CApp
|
return CApp
|
||||||
Demesion = ""
|
Demesion = ""
|
||||||
for d in Pcd.Capacity:
|
for d in Pcd.Capacity:
|
||||||
if d == "0":
|
Demesion += "[]"
|
||||||
Demesion += "[]"
|
|
||||||
else:
|
|
||||||
Demesion += "["+d+"]"
|
|
||||||
|
|
||||||
Value = Pcd.DefaultValueFromDec
|
Value = Pcd.DefaultValueFromDec
|
||||||
if "{CODE(" in Pcd.DefaultValueFromDec:
|
if "{CODE(" in Pcd.DefaultValueFromDec:
|
||||||
realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"
|
realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"
|
||||||
CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)
|
else:
|
||||||
|
realvalue = Pcd.DefaultValueFromDec.strip()
|
||||||
|
CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)
|
||||||
|
|
||||||
for skuname in Pcd.SkuInfoList:
|
if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:
|
||||||
skuinfo = Pcd.SkuInfoList[skuname]
|
for skuname in Pcd.SkuInfoList:
|
||||||
if skuinfo.VariableName:
|
skuinfo = Pcd.SkuInfoList[skuname]
|
||||||
for defaultstore in skuinfo.DefaultStoreDict:
|
if skuinfo.VariableName:
|
||||||
Value = skuinfo[defaultstore]
|
for defaultstore in skuinfo.DefaultStoreDict:
|
||||||
|
Value = skuinfo[defaultstore]
|
||||||
|
if "{CODE(" in Value:
|
||||||
|
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
|
||||||
|
else:
|
||||||
|
realvalue = Value.strip()
|
||||||
|
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)
|
||||||
|
else:
|
||||||
|
Value = skuinfo.DefaultValue
|
||||||
if "{CODE(" in Value:
|
if "{CODE(" in Value:
|
||||||
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
|
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
|
||||||
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)
|
else:
|
||||||
else:
|
realvalue = Value.strip()
|
||||||
Value = skuinfo.DefaultValue
|
|
||||||
if "{CODE(" in Value:
|
|
||||||
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
|
|
||||||
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)
|
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)
|
||||||
|
else:
|
||||||
|
if "{CODE(" in Pcd.DefaultValue:
|
||||||
|
realvalue = Pcd.DefaultValue.strip()[6:-2] # "{CODE(").rstrip(")}"
|
||||||
|
else:
|
||||||
|
realvalue = Pcd.DefaultValue.strip()
|
||||||
|
CApp += "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)
|
||||||
return CApp
|
return CApp
|
||||||
def SkuOverrideValuesEmpty(self,OverrideValues):
|
def SkuOverrideValuesEmpty(self,OverrideValues):
|
||||||
if not OverrideValues:
|
if not OverrideValues:
|
||||||
|
54
BaseTools/Tests/TestRegularExpression.py
Normal file
54
BaseTools/Tests/TestRegularExpression.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
## @file
|
||||||
|
# Routines for generating Pcd Database
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
|
# This program and the accompanying materials
|
||||||
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
|
# http://opensource.org/licenses/bsd-license.php
|
||||||
|
#
|
||||||
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
from Common.Misc import RemoveCComments
|
||||||
|
from Workspace.BuildClassObject import ArrayIndex
|
||||||
|
|
||||||
|
class TestRe(unittest.TestCase):
|
||||||
|
def test_ccomments(self):
|
||||||
|
TestStr1 = """ {0x01,0x02} """
|
||||||
|
self.assertEquals(TestStr1, RemoveCComments(TestStr1))
|
||||||
|
|
||||||
|
TestStr2 = """ L'TestString' """
|
||||||
|
self.assertEquals(TestStr2, RemoveCComments(TestStr2))
|
||||||
|
|
||||||
|
TestStr3 = """ 'TestString' """
|
||||||
|
self.assertEquals(TestStr3, RemoveCComments(TestStr3))
|
||||||
|
|
||||||
|
TestStr4 = """
|
||||||
|
{CODE({
|
||||||
|
{0x01, {0x02, 0x03, 0x04 }},// Data comment
|
||||||
|
{0x01, {0x02, 0x03, 0x04 }},// Data comment
|
||||||
|
})
|
||||||
|
} /*
|
||||||
|
This is multiple line comments
|
||||||
|
The seconde line comment
|
||||||
|
*/
|
||||||
|
// This is a comment
|
||||||
|
"""
|
||||||
|
Expect_TestStr4 = """{CODE({
|
||||||
|
{0x01, {0x02, 0x03, 0x04 }},
|
||||||
|
{0x01, {0x02, 0x03, 0x04 }},
|
||||||
|
})
|
||||||
|
}"""
|
||||||
|
self.assertEquals(Expect_TestStr4, RemoveCComments(TestStr4).strip())
|
||||||
|
|
||||||
|
def Test_ArrayIndex(self):
|
||||||
|
TestStr1 = """[1]"""
|
||||||
|
self.assertEquals(['[1]'], ArrayIndex.findall(TestStr1))
|
||||||
|
|
||||||
|
TestStr2 = """[1][2][0x1][0x01][]"""
|
||||||
|
self.assertEquals(['[1]','[2]','[0x1]','[0x01]','[]'], ArrayIndex.findall(TestStr2))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
Reference in New Issue
Block a user