]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Expression.py
BaseTools/Expression: Use 2nd passes on PCD values
[mirror_edk2.git] / BaseTools / Source / Python / Common / Expression.py
index 6a1103df2ce02097538d3110fc693d22a7dd33df..28320d78a931fb802686d65cc64edf44d81ed150 100644 (file)
@@ -157,19 +157,9 @@ class ValueExpression(object):
     def Eval(Operator, Oprand1, Oprand2 = None):\r
         WrnExp = None\r
 \r
-        if Operator not in ["in", "not in"] and (type(Oprand1) == type('') or type(Oprand2) == type('')):\r
-            if type(Oprand1) == type(''):\r
-                if Oprand1[0] in ['"', "'"] or Oprand1.startswith('L"') or Oprand1.startswith("L'")or Oprand1.startswith('UINT'):\r
-                    Oprand1, Size = ParseFieldValue(Oprand1)\r
-                else:\r
-                    Oprand1,Size = ParseFieldValue('"' + Oprand1 + '"')\r
-            if type(Oprand2) == type(''):\r
-                if Oprand2[0] in ['"', "'"] or Oprand2.startswith('L"') or Oprand2.startswith("L'") or Oprand2.startswith('UINT'):\r
-                    Oprand2, Size = ParseFieldValue(Oprand2)\r
-                else:\r
-                    Oprand2, Size = ParseFieldValue('"' + Oprand2 + '"')\r
-            if type(Oprand1) == type('') or type(Oprand2) == type(''):\r
-                raise BadExpression(ERR_STRING_EXPR % Operator)\r
+        if Operator not in ["==", "!=", ">=", "<=", ">", "<", "in", "not in"] and \\r
+            (type(Oprand1) == type('') or type(Oprand2) == type('')):\r
+            raise BadExpression(ERR_STRING_EXPR % Operator)\r
         if Operator in ['in', 'not in']:\r
             if type(Oprand1) != type(''):\r
                 Oprand1 = IntToStr(Oprand1)\r
@@ -296,8 +286,6 @@ class ValueExpression(object):
             except BadExpression:\r
                 pass\r
             if type(Token) == type('') and Token.startswith('{') and Token.endswith('}') and self._Idx >= self._Len:\r
-                if len(Token) != len(self._Expr.replace(' ', '')):\r
-                    raise BadExpression\r
                 return self._Expr\r
 \r
             self._Idx = 0\r
@@ -459,7 +447,6 @@ class ValueExpression(object):
                 if self._Token[Index] in ['"']:\r
                     Flag += 1\r
             if Flag == 2 and self._Token.endswith('"'):\r
-                self._Token = ParseFieldValue(self._Token)[0]\r
                 return True\r
         if self._Token.startswith("'") or self._Token.startswith("L'"):\r
             Flag = 0\r
@@ -467,7 +454,6 @@ class ValueExpression(object):
                 if self._Token[Index] in ["'"]:\r
                     Flag += 1\r
             if Flag == 2 and self._Token.endswith("'"):\r
-                self._Token = ParseFieldValue(self._Token)[0]\r
                 return True\r
         try:\r
             self._Token = int(self._Token, Radix)\r
@@ -622,24 +608,16 @@ class ValueExpression(object):
             self._Idx += 1\r
             UStr = self.__GetString()\r
             self._Token = 'L"' + UStr + '"'\r
-            self._Token, Size = ParseFieldValue(self._Token)\r
             return self._Token\r
         elif Expr.startswith("L'"):\r
             # Skip L\r
             self._Idx += 1\r
             UStr = self.__GetString()\r
             self._Token = "L'" + UStr + "'"\r
-            self._Token, Size = ParseFieldValue(self._Token)\r
-            return self._Token\r
-        elif Expr.startswith('"'):\r
-            UStr = self.__GetString()\r
-            self._Token = '"' + UStr + '"'\r
-            self._Token, Size = ParseFieldValue(self._Token)\r
             return self._Token\r
         elif Expr.startswith("'"):\r
             UStr = self.__GetString()\r
             self._Token = "'" + UStr + "'"\r
-            self._Token, Size = ParseFieldValue(self._Token)\r
             return self._Token\r
         elif Expr.startswith('UINT'):\r
             Re = re.compile('(?:UINT8|UINT16|UINT32|UINT64)\((.+)\)')\r
@@ -751,7 +729,7 @@ class ValueExpressionEx(ValueExpression):
                 raise BadExpression\r
         except WrnExpression, Value:\r
             PcdValue = Value.result\r
-        except BadExpression:\r
+        except BadExpression, Value:\r
             if self.PcdType in ['UINT8', 'UINT16', 'UINT32', 'UINT64', 'BOOLEAN']:\r
                 PcdValue = PcdValue.strip()\r
                 if type(PcdValue) == type('') and PcdValue.startswith('{') and PcdValue.endswith('}'):\r
@@ -785,10 +763,13 @@ class ValueExpressionEx(ValueExpression):
                 else:\r
                     try:\r
                         TmpValue, Size = ParseFieldValue(PcdValue)\r
-                    except BadExpression:\r
-                        raise BadExpression("Type: %s, Value: %s, format or value error" % (self.PcdType, PcdValue))\r
+                    except BadExpression, Value:\r
+                        raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
                 if type(TmpValue) == type(''):\r
-                    TmpValue = int(TmpValue)\r
+                    try:\r
+                        TmpValue = int(TmpValue)\r
+                    except:\r
+                        raise  BadExpression(Value)\r
                 else:\r
                     PcdValue = '0x%0{}X'.format(Size) % (TmpValue)\r
                 if TmpValue < 0:\r
@@ -846,6 +827,30 @@ class ValueExpressionEx(ValueExpression):
                             LabelDict = {}\r
                             ReLabel = re.compile('LABEL\((\w+)\)')\r
                             ReOffset = re.compile('OFFSET_OF\((\w+)\)')\r
+                            LabelOffset = 0\r
+                            for Index, Item in enumerate(ListItem):\r
+                                # compute byte offset of every LABEL\r
+                                Item = Item.strip()\r
+                                try:\r
+                                    LabelList = ReLabel.findall(Item)\r
+                                    for Label in LabelList:\r
+                                        if Label not in LabelDict.keys():\r
+                                            LabelDict[Label] = str(LabelOffset)\r
+                                    Item = ReLabel.sub('', Item)\r
+                                except:\r
+                                    pass\r
+                                if Item.startswith('UINT8'):\r
+                                    LabelOffset = LabelOffset + 1\r
+                                elif Item.startswith('UINT16'):\r
+                                    LabelOffset = LabelOffset + 2\r
+                                elif Item.startswith('UINT32'):\r
+                                    LabelOffset = LabelOffset + 4\r
+                                elif Item.startswith('UINT64'):\r
+                                    LabelOffset = LabelOffset + 8\r
+                                else:\r
+                                    ItemValue, ItemSize = ParseFieldValue(Item)\r
+                                    LabelOffset = LabelOffset + ItemSize\r
+\r
                             for Index, Item in enumerate(ListItem):\r
                                 # for LABEL parse\r
                                 Item = Item.strip()\r
@@ -866,7 +871,7 @@ class ValueExpressionEx(ValueExpression):
                                         Re = re.compile('OFFSET_OF\(%s\)'% Offset)\r
                                         Item = Re.sub(LabelDict[Offset], Item)\r
                                     else:\r
-                                        raise BadExpression('%s not defined before use' % Offset)\r
+                                        raise BadExpression('%s not defined' % Offset)\r
                                 ValueType = ""\r
                                 if Item.startswith('UINT8'):\r
                                     ItemSize = 1\r
@@ -876,8 +881,10 @@ class ValueExpressionEx(ValueExpression):
                                     ValueType = "UINT16"\r
                                 elif Item.startswith('UINT32'):\r
                                     ItemSize = 4\r
+                                    ValueType = "UINT32"\r
                                 elif Item.startswith('UINT64'):\r
                                     ItemSize = 8\r
+                                    ValueType = "UINT64"\r
                                 else:\r
                                     ItemSize = 0\r
                                 if ValueType:\r
@@ -898,7 +905,7 @@ class ValueExpressionEx(ValueExpression):
                             if Size > 0:\r
                                 PcdValue = '{' + ValueStr[:-2] + '}'\r
                     else:\r
-                        raise  BadExpression("Type: %s, Value: %s, format or value error"%(self.PcdType, PcdValue))\r
+                        raise  BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
 \r
         if PcdValue == 'True':\r
             PcdValue = '1'\r