]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Customize deepcopy function.
authorBobCF <bob.c.feng@intel.com>
Thu, 8 Nov 2018 06:03:38 +0000 (14:03 +0800)
committerBobCF <bob.c.feng@intel.com>
Fri, 7 Dec 2018 02:31:04 +0000 (10:31 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=1288

This patch is one of build tool performance improvement
series patches.

This patch is going to customize the deepcopy function for
SkuClass, PcdClassObject and python dictionary.

python deepcopy copy everything of a object, but for our current
usage we just need to copy the data we care about recursively.

By implementing __deepcopy__ for SkuClass, PcdClassObject, we can customize
deepcopy function for them.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: BobCF <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/Common/Expression.py
BaseTools/Source/Python/Common/Misc.py
BaseTools/Source/Python/CommonDataClass/CommonClass.py
BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index a5f085d7fb7468227a479207869124453ac4b904..19ea13b7fb2d63a920c274391e2f2947cfa57356 100644 (file)
@@ -17,7 +17,7 @@ from __future__ import absolute_import
 from Common.GlobalData import *\r
 from CommonDataClass.Exceptions import BadExpression\r
 from CommonDataClass.Exceptions import WrnExpression\r
-from .Misc import GuidStringToGuidStructureString, ParseFieldValue\r
+from .Misc import GuidStringToGuidStructureString, ParseFieldValue,CopyDict\r
 import Common.EdkLogger as EdkLogger\r
 import copy\r
 from Common.DataType import *\r
@@ -355,7 +355,7 @@ class ValueExpression(BaseExpression):
         #\r
         # The symbol table including PCD and macro mapping\r
         #\r
-        self._Symb = copy.deepcopy(SymbolTable)\r
+        self._Symb = CopyDict(SymbolTable)\r
         self._Symb.update(self.LogicalOperators)\r
         self._Idx = 0\r
         self._Len = len(self._Expr)\r
index 84f3f16ee6fee80c8b6e92b1c71da0037ea42967..b063f064fb9b89db3d23dfd22f0bd57841b069e6 100644 (file)
@@ -41,6 +41,7 @@ import uuid
 from CommonDataClass.Exceptions import BadExpression\r
 from Common.caching import cached_property\r
 import subprocess\r
+from collections import OrderedDict\r
 ## Regular expression used to find out place holders in string template\r
 gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
 \r
@@ -2130,6 +2131,21 @@ def PackByteFormatGUID(Guid):
                 Guid[10],\r
                 )\r
 \r
+## DeepCopy dict/OrderedDict recusively\r
+#\r
+#   @param      ori_dict    a nested dict or ordereddict\r
+#\r
+#   @retval     new dict or orderdict\r
+#\r
+def CopyDict(ori_dict):\r
+    dict_type = ori_dict.__class__\r
+    new_dict = dict_type()\r
+    for key in ori_dict:\r
+        if isinstance(ori_dict[key],(dict,OrderedDict)):\r
+            new_dict[key] = CopyDict(ori_dict[key])\r
+        else:\r
+            new_dict[key] = ori_dict[key]\r
+    return new_dict\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
index a98cf8a7c506e90a68d60ba8a4045ae8b5ad9d82..336bb1167143c95eaebc362c1cec8971f8c306da 100644 (file)
@@ -80,3 +80,18 @@ class SkuInfoClass(object):
                     'VpdOffset = ' + str(self.VpdOffset) + "," + \\r
                     'DefaultValue = ' + str(self.DefaultValue) + ","\r
         return Rtn\r
+\r
+    def __deepcopy__(self,memo):\r
+        new_sku = SkuInfoClass()\r
+        new_sku.SkuIdName = self.SkuIdName\r
+        new_sku.SkuId = self.SkuId\r
+        new_sku.VariableName = self.VariableName\r
+        new_sku.VariableGuid = self.VariableGuid\r
+        new_sku.VariableGuidValue = self.VariableGuidValue\r
+        new_sku.VariableOffset = self.VariableOffset\r
+        new_sku.HiiDefaultValue = self.HiiDefaultValue\r
+        new_sku.VariableAttribute = self.VariableAttribute\r
+        new_sku.DefaultStoreDict = {key:value for key,value in self.DefaultStoreDict.items()}\r
+        new_sku.VpdOffset = self.VpdOffset\r
+        new_sku.DefaultValue = self.DefaultValue\r
+        return new_sku\r
index 15bb82291094937604f54a973bee8cd8c1212ba7..008eee1a1664b4ba1fe16318d34a638ab88ec70e 100644 (file)
@@ -16,6 +16,8 @@ from Common.DataType import *
 import collections\r
 import re\r
 from collections import OrderedDict\r
+from Common.Misc import CopyDict\r
+import copy\r
 StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')\r
 ArrayIndex = re.compile("\[\s*\d{0,1}\s*\]")\r
 ## PcdClassObject\r
@@ -211,6 +213,37 @@ class PcdClassObject(object):
     def __hash__(self):\r
         return hash((self.TokenCName, self.TokenSpaceGuidCName))\r
 \r
+    def sharedcopy(self,new_pcd):\r
+        new_pcd.TokenCName = self.TokenCName\r
+        new_pcd.TokenSpaceGuidCName = self.TokenSpaceGuidCName\r
+        new_pcd.TokenSpaceGuidValue = self.TokenSpaceGuidValue\r
+        new_pcd.Type = self.Type\r
+        new_pcd.DatumType = self.DatumType\r
+        new_pcd.DefaultValue = self.DefaultValue\r
+        new_pcd.TokenValue = self.TokenValue\r
+        new_pcd.MaxDatumSize = self.MaxDatumSize\r
+\r
+        new_pcd.Phase = self.Phase\r
+        new_pcd.Pending = self.Pending\r
+        new_pcd.IsOverrided = self.IsOverrided\r
+        new_pcd.IsFromBinaryInf = self.IsFromBinaryInf\r
+        new_pcd.IsFromDsc = self.IsFromDsc\r
+        new_pcd.PcdValueFromComm = self.PcdValueFromComm\r
+        new_pcd.PcdValueFromFdf = self.PcdValueFromFdf\r
+        new_pcd.UserDefinedDefaultStoresFlag = self.UserDefinedDefaultStoresFlag\r
+        new_pcd.DscRawValue = self.DscRawValue\r
+        new_pcd.CustomAttribute = self.CustomAttribute\r
+        new_pcd.validateranges = [item for item in self.validateranges]\r
+        new_pcd.validlists = [item for item in self.validlists]\r
+        new_pcd.expressions = [item for item in self.expressions]\r
+        new_pcd.SkuInfoList = {key: copy.deepcopy(skuobj) for key,skuobj in self.SkuInfoList.items()}\r
+        return new_pcd\r
+\r
+    def __deepcopy__(self,memo):\r
+        new_pcd = PcdClassObject()\r
+        self.sharedcopy(new_pcd)\r
+        return new_pcd\r
+\r
 class StructurePcd(PcdClassObject):\r
     def __init__(self, StructuredPcdIncludeFile=None, Packages=None, Name=None, Guid=None, Type=None, DatumType=None, Value=None, Token=None, MaxDatumSize=None, SkuInfoList=None, IsOverrided=False, GuidValue=None, validateranges=None, validlists=None, expressions=None,default_store = TAB_DEFAULT_STORES_DEFAULT):\r
         if SkuInfoList is None:\r
@@ -303,6 +336,25 @@ class StructurePcd(PcdClassObject):
             self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm\r
             self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf\r
 \r
+    def __deepcopy__(self,memo):\r
+        new_pcd = StructurePcd()\r
+        self.sharedcopy(new_pcd)\r
+\r
+        new_pcd.DefaultValueFromDec = self.DefaultValueFromDec\r
+        new_pcd.PcdMode = self.PcdMode\r
+        new_pcd.StructName = self.DatumType\r
+        new_pcd.PcdDefineLineNo = self.PcdDefineLineNo\r
+        new_pcd.PkgPath = self.PkgPath\r
+        new_pcd.StructuredPcdIncludeFile = [item for item in self.StructuredPcdIncludeFile]\r
+        new_pcd.PackageDecs = [item for item in self.PackageDecs]\r
+        new_pcd.DefaultValues = CopyDict(self.DefaultValues)\r
+        new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC)\r
+        new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues)\r
+        new_pcd.PcdFieldValueFromComm = CopyDict(self.PcdFieldValueFromComm)\r
+        new_pcd.PcdFieldValueFromFdf = CopyDict(self.PcdFieldValueFromFdf)\r
+        new_pcd.ValueChain = {item for item in self.ValueChain}\r
+        return new_pcd\r
+\r
 LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList'], verbose=False)\r
 \r
 ## ModuleBuildClassObject\r
index 28da5ea63b9bd4f954e46922bfe360a5e29485fc..59d118216d3178a218783956dca81ef3fb220e13 100644 (file)
@@ -974,7 +974,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
                     PcdDefaultStoreSet = set(defaultstorename  for defaultstorename in skuobj.DefaultStoreDict)\r
                     mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
-                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = CopyDict(skuobj.DefaultStoreDict[mindefaultstorename])\r
         return Pcds\r
 \r
     def RecoverCommandLinePcd(self):\r
@@ -1528,7 +1528,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
                     for defaultstoreid in DefaultStores:\r
                         if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
-                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
+                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
@@ -2769,7 +2769,7 @@ class DscBuildData(PlatformBuildClassObject):
                     mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
                     for defaultstorename in DefaultStores:\r
                         if defaultstorename not in skuobj.DefaultStoreDict:\r
-                            skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                            skuobj.DefaultStoreDict[defaultstorename] = CopyDict(skuobj.DefaultStoreDict[mindefaultstorename])\r
                     skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
             for skuname, skuid in SkuIds.items():\r
                 if skuname not in PcdObj.SkuInfoList:\r