}\r
}\r
\r
+/**\r
+ Tell whether this Operand is an known OpCode.\r
+\r
+ @param Operand Operand of an IFR OpCode.\r
+\r
+ @retval TRUE This is an Statement OpCode.\r
+ @retval FALSE Not an Statement OpCode.\r
+\r
+**/\r
+BOOLEAN\r
+IsUnKnownOpCode (\r
+ IN UINT8 Operand\r
+ )\r
+{\r
+ return Operand > EFI_IFR_WARNING_IF_OP ? TRUE : FALSE;\r
+}\r
+\r
/**\r
Calculate number of Statemens(Questions) and Expression OpCodes.\r
\r
EFI_VARSTORE_ID TempVarstoreId;\r
BOOLEAN InScopeDisable;\r
INTN ConditionalExprCount;\r
+ BOOLEAN InUnknownScope;\r
+ UINT8 UnknownDepth;\r
\r
SuppressForQuestion = FALSE;\r
SuppressForOption = FALSE;\r
MapExpressionList = NULL;\r
TempVarstoreId = 0;\r
ConditionalExprCount = 0;\r
+ InUnknownScope = FALSE;\r
+ UnknownDepth = 0;\r
\r
//\r
// Get the number of Statements and Expressions\r
Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
\r
+ if (InUnknownScope) {\r
+ if (Operand == EFI_IFR_END_OP) {\r
+ UnknownDepth --;\r
+\r
+ if (UnknownDepth == 0) {\r
+ InUnknownScope = FALSE;\r
+ }\r
+ } else {\r
+ if (Scope != 0) {\r
+ UnknownDepth ++;\r
+ }\r
+ }\r
+\r
+ continue;\r
+ }\r
+\r
+ if (IsUnKnownOpCode(Operand)) {\r
+ if (Scope != 0) {\r
+ InUnknownScope = TRUE;\r
+ UnknownDepth ++;\r
+ }\r
+\r
+ continue;\r
+ }\r
+\r
//\r
// If scope bit set, push onto scope stack\r
//\r