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
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
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
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
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
try:\r
PcdValue = ValueExpression.__call__(self, RealValue, Depth)\r
if self.PcdType == 'VOID*' and (PcdValue.startswith("'") or PcdValue.startswith("L'")):\r
- raise BadExpression\r
+ PcdValue, Size = ParseFieldValue(PcdValue)\r
+ PcdValueList = []\r
+ for I in range(Size):\r
+ PcdValueList.append('0x%02X'%(PcdValue & 0xff))\r
+ PcdValue = PcdValue >> 8\r
+ PcdValue = '{' + ','.join(PcdValueList) + '}'\r
elif self.PcdType in ['UINT8', 'UINT16', 'UINT32', 'UINT64', 'BOOLEAN'] and (PcdValue.startswith("'") or \\r
PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):\r
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
TmpValue = 0\r
Size = 0\r
for Item in PcdValue:\r
+ if Item.startswith('UINT8'):\r
+ ItemSize = 1\r
if Item.startswith('UINT16'):\r
ItemSize = 2\r
elif Item.startswith('UINT32'):\r
TmpValue = (ItemValue << (Size * 8)) | TmpValue\r
Size = Size + ItemSize\r
else:\r
- TmpValue, Size = ParseFieldValue(PcdValue)\r
+ try:\r
+ TmpValue, Size = ParseFieldValue(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
raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)\r
if self.PcdType == 'UINT64' and Size > 8:\r
raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)\r
- if self.PcdType in ['VOID*']:\r
+ else:\r
try:\r
TmpValue = long(PcdValue)\r
TmpList = []\r
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
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('UINT16'):\r
+ if Item.startswith('UINT8'):\r
ItemSize = 1\r
ValueType = "UINT8"\r
elif Item.startswith('UINT16'):\r
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
\r
if Size > 0:\r
PcdValue = '{' + ValueStr[:-2] + '}'\r
+ else:\r
+ raise BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
+\r
if PcdValue == 'True':\r
PcdValue = '1'\r
if PcdValue == 'False':\r