Re: [edk2] [PATCH] BaseTools: Update Expression.py for string comparison and MACRO replace issue
Reviewed-by: Yonghong Zhu <yonghong@intel.com> Best Regards, Zhu Yonghong -Original Message- From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Yonghong Zhu Sent: Thursday, February 08, 2018 10:46 PM To: edk2-devel@lists.01.org Cc: Feng, YunhuaX <yunhuax.f...@intel.com>; Gao, Liming <liming@intel.com> Subject: [edk2] [PATCH] BaseTools: Update Expression.py for string comparison and MACRO replace issue From: Yunhua Feng <yunhuax.f...@intel.com> 1. Fix string comparison incorrect issue, we expected "ABC" is greater than "AAD" since the second char 'B' is greater than 'A'. 2. fix MACRO not replace issue. Cc: Liming Gao <liming@intel.com> Cc: Yonghong Zhu <yonghong@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yunhua Feng <yunhuax.f...@intel.com> --- BaseTools/Source/Python/Common/Expression.py | 41 ++ BaseTools/Source/Python/Workspace/DscBuildData.py | 2 +- .../Source/Python/Workspace/MetaFileParser.py | 1 + 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/BaseTools/Source/Python/Common/Expression.py b/BaseTools/Source/Python/Common/Expression.py index 6a1103df2c..a19f35d991 100644 --- a/BaseTools/Source/Python/Common/Expression.py +++ b/BaseTools/Source/Python/Common/Expression.py @@ -155,23 +155,13 @@ class ValueExpression(object): @staticmethod def Eval(Operator, Oprand1, Oprand2 = None): WrnExp = None -if Operator not in ["in", "not in"] and (type(Oprand1) == type('') or type(Oprand2) == type('')): -if type(Oprand1) == type(''): -if Oprand1[0] in ['"', "'"] or Oprand1.startswith('L"') or Oprand1.startswith("L'")or Oprand1.startswith('UINT'): -Oprand1, Size = ParseFieldValue(Oprand1) -else: -Oprand1,Size = ParseFieldValue('"' + Oprand1 + '"') -if type(Oprand2) == type(''): -if Oprand2[0] in ['"', "'"] or Oprand2.startswith('L"') or Oprand2.startswith("L'") or Oprand2.startswith('UINT'): -Oprand2, Size = ParseFieldValue(Oprand2) -else: -Oprand2, Size = ParseFieldValue('"' + Oprand2 + '"') -if type(Oprand1) == type('') or type(Oprand2) == type(''): -raise BadExpression(ERR_STRING_EXPR % Operator) +if Operator not in ["==", "!=", ">=", "<=", ">", "<", "in", "not in"] and \ +(type(Oprand1) == type('') or type(Oprand2) == type('')): +raise BadExpression(ERR_STRING_EXPR % Operator) if Operator in ['in', 'not in']: if type(Oprand1) != type(''): Oprand1 = IntToStr(Oprand1) if type(Oprand2) != type(''): Oprand2 = IntToStr(Oprand2) @@ -294,12 +284,10 @@ class ValueExpression(object): try: Token = self._GetToken() except BadExpression: pass if type(Token) == type('') and Token.startswith('{') and Token.endswith('}') and self._Idx >= self._Len: -if len(Token) != len(self._Expr.replace(' ', '')): -raise BadExpression return self._Expr self._Idx = 0 self._Token = '' @@ -457,19 +445,17 @@ class ValueExpression(object): Flag = 0 for Index in range(len(self._Token)): if self._Token[Index] in ['"']: Flag += 1 if Flag == 2 and self._Token.endswith('"'): -self._Token = ParseFieldValue(self._Token)[0] return True if self._Token.startswith("'") or self._Token.startswith("L'"): Flag = 0 for Index in range(len(self._Token)): if self._Token[Index] in ["'"]: Flag += 1 if Flag == 2 and self._Token.endswith("'"): -self._Token = ParseFieldValue(self._Token)[0] return True try: self._Token = int(self._Token, Radix) return True except ValueError: @@ -620,28 +606,20 @@ class ValueExpression(object): if Expr.startswith('L"'): # Skip L self._Idx += 1 UStr = self.__GetString() self._Token = 'L"' + UStr + '"' -self._Token, Size = ParseFieldValue(self._Token) return self._Token elif Expr.startswith("L'"): # Skip L self._Idx += 1 UStr = self.__GetString() self._Token = "
[edk2] [PATCH] BaseTools: Update Expression.py for string comparison and MACRO replace issue
From: Yunhua Feng1. Fix string comparison incorrect issue, we expected "ABC" is greater than "AAD" since the second char 'B' is greater than 'A'. 2. fix MACRO not replace issue. Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yunhua Feng --- BaseTools/Source/Python/Common/Expression.py | 41 ++ BaseTools/Source/Python/Workspace/DscBuildData.py | 2 +- .../Source/Python/Workspace/MetaFileParser.py | 1 + 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/BaseTools/Source/Python/Common/Expression.py b/BaseTools/Source/Python/Common/Expression.py index 6a1103df2c..a19f35d991 100644 --- a/BaseTools/Source/Python/Common/Expression.py +++ b/BaseTools/Source/Python/Common/Expression.py @@ -155,23 +155,13 @@ class ValueExpression(object): @staticmethod def Eval(Operator, Oprand1, Oprand2 = None): WrnExp = None -if Operator not in ["in", "not in"] and (type(Oprand1) == type('') or type(Oprand2) == type('')): -if type(Oprand1) == type(''): -if Oprand1[0] in ['"', "'"] or Oprand1.startswith('L"') or Oprand1.startswith("L'")or Oprand1.startswith('UINT'): -Oprand1, Size = ParseFieldValue(Oprand1) -else: -Oprand1,Size = ParseFieldValue('"' + Oprand1 + '"') -if type(Oprand2) == type(''): -if Oprand2[0] in ['"', "'"] or Oprand2.startswith('L"') or Oprand2.startswith("L'") or Oprand2.startswith('UINT'): -Oprand2, Size = ParseFieldValue(Oprand2) -else: -Oprand2, Size = ParseFieldValue('"' + Oprand2 + '"') -if type(Oprand1) == type('') or type(Oprand2) == type(''): -raise BadExpression(ERR_STRING_EXPR % Operator) +if Operator not in ["==", "!=", ">=", "<=", ">", "<", "in", "not in"] and \ +(type(Oprand1) == type('') or type(Oprand2) == type('')): +raise BadExpression(ERR_STRING_EXPR % Operator) if Operator in ['in', 'not in']: if type(Oprand1) != type(''): Oprand1 = IntToStr(Oprand1) if type(Oprand2) != type(''): Oprand2 = IntToStr(Oprand2) @@ -294,12 +284,10 @@ class ValueExpression(object): try: Token = self._GetToken() except BadExpression: pass if type(Token) == type('') and Token.startswith('{') and Token.endswith('}') and self._Idx >= self._Len: -if len(Token) != len(self._Expr.replace(' ', '')): -raise BadExpression return self._Expr self._Idx = 0 self._Token = '' @@ -457,19 +445,17 @@ class ValueExpression(object): Flag = 0 for Index in range(len(self._Token)): if self._Token[Index] in ['"']: Flag += 1 if Flag == 2 and self._Token.endswith('"'): -self._Token = ParseFieldValue(self._Token)[0] return True if self._Token.startswith("'") or self._Token.startswith("L'"): Flag = 0 for Index in range(len(self._Token)): if self._Token[Index] in ["'"]: Flag += 1 if Flag == 2 and self._Token.endswith("'"): -self._Token = ParseFieldValue(self._Token)[0] return True try: self._Token = int(self._Token, Radix) return True except ValueError: @@ -620,28 +606,20 @@ class ValueExpression(object): if Expr.startswith('L"'): # Skip L self._Idx += 1 UStr = self.__GetString() self._Token = 'L"' + UStr + '"' -self._Token, Size = ParseFieldValue(self._Token) return self._Token elif Expr.startswith("L'"): # Skip L self._Idx += 1 UStr = self.__GetString() self._Token = "L'" + UStr + "'" -self._Token, Size = ParseFieldValue(self._Token) -return self._Token -elif Expr.startswith('"'): -UStr = self.__GetString() -self._Token = '"' + UStr + '"' -self._Token, Size = ParseFieldValue(self._Token) return self._Token elif Expr.startswith("'"): UStr = self.__GetString() self._Token = "'" + UStr + "'" -self._Token, Size = ParseFieldValue(self._Token) return self._Token elif Expr.startswith('UINT'): Re = re.compile('(?:UINT8|UINT16|UINT32|UINT64)\((.+)\)') try: RetValue = Re.search(Expr).group(1) @@ -749,11 +727,11 @@ class ValueExpressionEx(ValueExpression):