diff options
Diffstat (limited to 'BaseTools/Source/Python/Workspace')
4 files changed, 34 insertions, 31 deletions
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 22a56bf6c7..7f6e966b5f 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -881,7 +881,7 @@ class DscBuildData(PlatformBuildClassObject): return self._LibraryClasses
def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):
- if self._DecPcds is None:
+ if not self._DecPcds:
FdfInfList = []
if GlobalData.gFdfParser:
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index eaedba0c12..032220813b 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -206,9 +206,7 @@ class MetaFileParser(object): ## Set parsing complete flag in both class and table
def _Done(self):
self._Finished = True
- ## Do not set end flag when processing included files
- if self._From == -1:
- self._Table.SetEndFlag()
+ self._Table.SetEndFlag()
def _PostProcess(self):
self._PostProcessed = True
@@ -241,13 +239,7 @@ class MetaFileParser(object): DataInfo = (DataInfo,)
# Parse the file first, if necessary
- if not self._Finished:
- if self._RawTable.IsIntegrity():
- self._Finished = True
- else:
- self._Table = self._RawTable
- self._PostProcessed = False
- self.Start()
+ self.StartParse()
# No specific ARCH or Platform given, use raw data
if self._RawTable and (len(DataInfo) == 1 or DataInfo[1] is None):
@@ -259,6 +251,14 @@ class MetaFileParser(object): return self._FilterRecordList(self._Table.Query(*DataInfo), DataInfo[1])
+ def StartParse(self):
+ if not self._Finished:
+ if self._RawTable.IsIntegrity():
+ self._Finished = True
+ else:
+ self._Table = self._RawTable
+ self._PostProcessed = False
+ self.Start()
## Data parser for the common format in different type of file
#
# The common format in the meatfile is like
@@ -917,6 +917,7 @@ class DscParser(MetaFileParser): self._PcdCodeValue = ""
self._PcdDataTypeCODE = False
self._CurrentPcdName = ""
+ self._Content = None
## Parser starter
def Start(self):
@@ -1645,9 +1646,7 @@ class DscParser(MetaFileParser): Parser._Scope = self._Scope
Parser._Enabled = self._Enabled
# Parse the included file
- Parser.Start()
-
-
+ Parser.StartParse()
# Insert all records in the table for the included file into dsc file table
Records = IncludedFileTable.GetAll()
if Records:
diff --git a/BaseTools/Source/Python/Workspace/MetaFileTable.py b/BaseTools/Source/Python/Workspace/MetaFileTable.py index 081970dba8..004e9494c3 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileTable.py +++ b/BaseTools/Source/Python/Workspace/MetaFileTable.py @@ -26,8 +26,8 @@ from Common.DataType import * class MetaFileTable():
# TRICK: use file ID as the part before '.'
- _ID_STEP_ = 0.00000001
- _ID_MAX_ = 0.99999999
+ _ID_STEP_ = 1
+ _ID_MAX_ = 99999999
## Constructor
def __init__(self, DB, MetaFile, FileType, Temporary, FromItem=None):
@@ -35,8 +35,7 @@ class MetaFileTable(): self.TableName = ""
self.DB = DB
self._NumpyTab = None
- self.FileId = len(DB.TblFile)
- self.ID = self.FileId
+
self.CurrentContent = []
DB.TblFile.append([MetaFile.Name,
MetaFile.Ext,
@@ -45,6 +44,8 @@ class MetaFileTable(): FileType,
MetaFile.TimeStamp,
FromItem])
+ self.FileId = len(DB.TblFile)
+ self.ID = self.FileId * 10**8
if Temporary:
self.TableName = "_%s_%s_%s" % (FileType, len(DB.TblFile), uuid.uuid4().hex)
else:
@@ -53,7 +54,10 @@ class MetaFileTable(): def IsIntegrity(self):
try:
TimeStamp = self.MetaFile.TimeStamp
- Result = int(self.CurrentContent[-1][0]) < 0
+ if not self.CurrentContent:
+ Result = False
+ else:
+ Result = self.CurrentContent[-1][0] < 0
if not Result:
# update the timestamp in database
self.DB.SetFileTimeStamp(self.FileId, TimeStamp)
@@ -72,12 +76,10 @@ class MetaFileTable(): self.CurrentContent.append(self._DUMMY_)
def GetAll(self):
- return [item for item in self.CurrentContent if item[0] > 0 ]
+ return [item for item in self.CurrentContent if item[0] >= 0 ]
## Python class representation of table storing module data
class ModuleTable(MetaFileTable):
- _ID_STEP_ = 0.00000001
- _ID_MAX_ = 0.99999999
_COLUMN_ = '''
ID REAL PRIMARY KEY,
Model INTEGER NOT NULL,
@@ -140,7 +142,6 @@ class ModuleTable(MetaFileTable): self.CurrentContent.append(row)
return self.ID
-
## Query table
#
# @param Model: The Model of Record
@@ -215,8 +216,6 @@ class PackageTable(MetaFileTable): BelongsToItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0):
(Value1, Value2, Value3, Scope1, Scope2) = (Value1.strip(), Value2.strip(), Value3.strip(), Scope1.strip(), Scope2.strip())
self.ID = self.ID + self._ID_STEP_
- if self.ID >= (MODEL_FILE_INF + self._ID_MAX_):
- self.ID = MODEL_FILE_INF + self._ID_STEP_
row = [ self.ID,
Model,
@@ -290,6 +289,7 @@ class PackageTable(MetaFileTable): ExtraData=oricomment, File=self.MetaFile, Line=LineNum)
return set(), set(), set()
return set(validateranges), set(validlists), set(expressions)
+
## Python class representation of table storing platform data
class PlatformTable(MetaFileTable):
_COLUMN_ = '''
@@ -338,8 +338,6 @@ class PlatformTable(MetaFileTable): FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1):
(Value1, Value2, Value3, Scope1, Scope2, Scope3) = (Value1.strip(), Value2.strip(), Value3.strip(), Scope1.strip(), Scope2.strip(), Scope3.strip())
self.ID = self.ID + self._ID_STEP_
- if self.ID >= (MODEL_FILE_INF + self._ID_MAX_):
- self.ID = MODEL_FILE_INF + self._ID_STEP_
row = [ self.ID,
Model,
@@ -414,10 +412,13 @@ class MetaFileStorage(object): ".dec" : MODEL_FILE_DEC,
".dsc" : MODEL_FILE_DSC,
}
-
+ _ObjectCache = {}
## Constructor
def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False, FromItem=None):
# no type given, try to find one
+ key = (MetaFile.Path, FileType,Temporary,FromItem)
+ if key in Class._ObjectCache:
+ return Class._ObjectCache[key]
if not FileType:
if MetaFile.Type in self._FILE_TYPE_:
FileType = Class._FILE_TYPE_[MetaFile.Type]
@@ -433,5 +434,8 @@ class MetaFileStorage(object): Args = Args + (FromItem,)
# create the storage object and return it to caller
- return Class._FILE_TABLE_[FileType](*Args)
+ reval = Class._FILE_TABLE_[FileType](*Args)
+ if not Temporary:
+ Class._ObjectCache[key] = reval
+ return reval
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index 8dbf3ae97c..a6a292d15c 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -163,10 +163,10 @@ class WorkspaceDatabase(object): self.TransformObject = WorkspaceDatabase.TransformObjectFactory(self)
def SetFileTimeStamp(self,FileId,TimeStamp):
- self.TblFile[FileId][6] = TimeStamp
+ self.TblFile[FileId-1][6] = TimeStamp
def GetFileTimeStamp(self,FileId):
- return self.TblFile[FileId][6]
+ return self.TblFile[FileId-1][6]
## Summarize all packages in the database
|