From 03c36c36a3aaa9e8a6975ebdec35a9533d947ef5 Mon Sep 17 00:00:00 2001 From: zhijufan Date: Mon, 15 Oct 2018 09:02:31 +0800 Subject: [PATCH] BaseTools: Add check for the string type whether is same Relational and equality operators require both operands to be of the same type. Treat the string 'A' and "A" as same type, but for "A" and L"A" are not same type since one is general string, another is unicode string. True:'A'<'B', "A"<"B" 'A'<"B", L'A' Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Zhiju.Fan Reviewed-by: Jaben Carsey --- BaseTools/Source/Python/Common/Expression.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/Python/Common/Expression.py b/BaseTools/Source/Python/Common/Expression.py index ff9271031b..e398f7a034 100644 --- a/BaseTools/Source/Python/Common/Expression.py +++ b/BaseTools/Source/Python/Common/Expression.py @@ -297,8 +297,8 @@ class ValueExpression(BaseExpression): else: raise BadExpression(ERR_EXPR_TYPE) if isinstance(Oprand1, type('')) and isinstance(Oprand2, type('')): - if (Oprand1.startswith('L"') and not Oprand2.startswith('L"')) or \ - (not Oprand1.startswith('L"') and Oprand2.startswith('L"')): + if ((Oprand1.startswith('L"') or Oprand1.startswith('L')) and (not Oprand2.startswith('L"')) and (not Oprand2.startswith("L'"))) or \ + (((not Oprand1.startswith('L"')) and (not Oprand1.startswith("L'"))) and (Oprand2.startswith('L"') or Oprand2.startswith('L'))): raise BadExpression(ERR_STRING_CMP % (Oprand1, Operator, Oprand2)) if 'in' in Operator and isinstance(Oprand2, type('')): Oprand2 = Oprand2.split() @@ -827,6 +827,8 @@ class ValueExpressionEx(ValueExpression): PcdValue = PcdValue.strip() if PcdValue.startswith('{') and PcdValue.endswith('}'): PcdValue = SplitPcdValueString(PcdValue[1:-1]) + if ERR_STRING_CMP.split(':')[0] in Value.message: + raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value)) if isinstance(PcdValue, type([])): TmpValue = 0 Size = 0 -- 2.39.2