public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch] BaseTools: Add check for the string type whether is same
@ 2018-10-15 12:45 Yonghong Zhu
  2018-10-15 17:43 ` Carsey, Jaben
  0 siblings, 1 reply; 2+ messages in thread
From: Yonghong Zhu @ 2018-10-15 12:45 UTC (permalink / raw)
  To: edk2-devel; +Cc: zhijufan, Liming Gao

From: zhijufan <zhijux.fan@intel.com>

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'<L'B', L"A"<L"B", L'A'<L"B"
Error:'A'<L'B', 'A'<L"B", "A'<L'B'

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
---
 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 78c69fa..84898f7 100644
--- a/BaseTools/Source/Python/Common/Expression.py
+++ b/BaseTools/Source/Python/Common/Expression.py
@@ -295,12 +295,12 @@ class ValueExpression(BaseExpression):
                     # bitwise and logical operation between number and boolean is allowed
                     pass
                 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()
             EvalStr = 'Oprand1 ' + Operator + ' Oprand2'
 
@@ -825,10 +825,12 @@ class ValueExpressionEx(ValueExpression):
         except BadExpression as Value:
             if self.PcdType in TAB_PCD_NUMERIC_TYPES:
                 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
                     ValueType = ''
                     for Item in PcdValue:
-- 
2.6.1.windows.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Patch] BaseTools: Add check for the string type whether is same
  2018-10-15 12:45 [Patch] BaseTools: Add check for the string type whether is same Yonghong Zhu
@ 2018-10-15 17:43 ` Carsey, Jaben
  0 siblings, 0 replies; 2+ messages in thread
From: Carsey, Jaben @ 2018-10-15 17:43 UTC (permalink / raw)
  To: Zhu, Yonghong, edk2-devel@lists.01.org; +Cc: Gao, Liming

Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Yonghong Zhu
> Sent: Monday, October 15, 2018 5:45 AM
> To: edk2-devel@lists.01.org
> Cc: Gao, Liming <liming.gao@intel.com>
> Subject: [edk2] [Patch] BaseTools: Add check for the string type whether is
> same
> 
> From: zhijufan <zhijux.fan@intel.com>
> 
> 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'<L'B', L"A"<L"B", L'A'<L"B"
> Error:'A'<L'B', 'A'<L"B", "A'<L'B'
> 
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Yonghong Zhu <yonghong.zhu@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
> ---
>  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 78c69fa..84898f7 100644
> --- a/BaseTools/Source/Python/Common/Expression.py
> +++ b/BaseTools/Source/Python/Common/Expression.py
> @@ -295,12 +295,12 @@ class ValueExpression(BaseExpression):
>                      # bitwise and logical operation between number and boolean is
> allowed
>                      pass
>                  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()
>              EvalStr = 'Oprand1 ' + Operator + ' Oprand2'
> 
> @@ -825,10 +825,12 @@ class ValueExpressionEx(ValueExpression):
>          except BadExpression as Value:
>              if self.PcdType in TAB_PCD_NUMERIC_TYPES:
>                  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
>                      ValueType = ''
>                      for Item in PcdValue:
> --
> 2.6.1.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-10-15 17:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-15 12:45 [Patch] BaseTools: Add check for the string type whether is same Yonghong Zhu
2018-10-15 17:43 ` Carsey, Jaben

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox