static void OpcDoUuId ( ACPI_PARSE_OBJECT *Op) { char *InString; UINT8 *Buffer; ACPI_STATUS Status = AE_OK; ACPI_PARSE_OBJECT *NewOp; InString = ACPI_CAST_PTR (char, Op->Asl.Value.String); Buffer = UtLocalCalloc (16); Status = AuValidateUuid (InString); if (ACPI_FAILURE (Status)) { AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String); } else { AcpiUtConvertStringToUuid (InString, Buffer); } /* Change Op to a Buffer */ Op->Asl.ParseOpcode = PARSEOP_BUFFER; Op->Common.AmlOpcode = AML_BUFFER_OP; /* Disable further optimization */ Op->Asl.CompileFlags &= ~OP_COMPILE_TIME_CONST; UtSetParseOpName (Op); /* Child node is the buffer length */ NewOp = TrAllocateOp (PARSEOP_INTEGER); NewOp->Asl.AmlOpcode = AML_BYTE_OP; NewOp->Asl.Value.Integer = 16; NewOp->Asl.Parent = Op; Op->Asl.Child = NewOp; Op = NewOp; /* Peer to the child is the raw buffer data */ NewOp = TrAllocateOp (PARSEOP_RAW_DATA); NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; NewOp->Asl.AmlLength = 16; NewOp->Asl.Value.String = ACPI_CAST_PTR (char, Buffer); NewOp->Asl.Parent = Op->Asl.Parent; Op->Asl.Next = NewOp; }
ACPI_PARSE_OBJECT * TrLinkPeerOps ( UINT32 NumPeers, ...) { ACPI_PARSE_OBJECT *This; ACPI_PARSE_OBJECT *Next; va_list ap; UINT32 i; ACPI_PARSE_OBJECT *Start; DbgPrint (ASL_PARSE_OUTPUT, "\nLinkPeerOps: (%u) ", NumPeers); va_start (ap, NumPeers); This = va_arg (ap, ACPI_PARSE_OBJECT *); Start = This; /* * Link all peers */ for (i = 0; i < (NumPeers -1); i++) { DbgPrint (ASL_PARSE_OUTPUT, "%u=%p ", (i+1), This); while (This->Asl.Next) { This = This->Asl.Next; } /* Get another peer op */ Next = va_arg (ap, ACPI_PARSE_OBJECT *); if (!Next) { Next = TrAllocateOp (PARSEOP_DEFAULT_ARG); } /* link new op to the current op */ This->Asl.Next = Next; This = Next; } va_end (ap); DbgPrint (ASL_PARSE_OUTPUT,"\n"); return (Start); }
void ExDoExternal ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *ListOp; ACPI_PARSE_OBJECT *Prev; ACPI_PARSE_OBJECT *Next; ACPI_PARSE_OBJECT *ArgCountOp; ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next; ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE; ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST; ArgCountOp->Asl.Value.Integer = 0; UtSetParseOpName (ArgCountOp); /* Create new list node of arbitrary type */ ListOp = TrAllocateOp (PARSEOP_DEFAULT_ARG); /* Store External node as child */ ListOp->Asl.Child = Op; ListOp->Asl.Next = NULL; if (AslGbl_ExternalsListHead) { /* Link new External to end of list */ Prev = AslGbl_ExternalsListHead; Next = Prev; while (Next) { Prev = Next; Next = Next->Asl.Next; } Prev->Asl.Next = ListOp; } else { AslGbl_ExternalsListHead = ListOp; } }
static void ExMoveExternals ( ACPI_PARSE_OBJECT *DefinitionBlockOp) { ACPI_PARSE_OBJECT *ParentOp; ACPI_PARSE_OBJECT *ExternalOp; ACPI_PARSE_OBJECT *PredicateOp; ACPI_PARSE_OBJECT *NextOp; ACPI_PARSE_OBJECT *Prev; ACPI_PARSE_OBJECT *Next; char *ExternalName; ACPI_OBJECT_TYPE ObjType; ACPI_STATUS Status; UINT32 i; if (!AslGbl_ExternalsListHead) { return; } /* Remove the External nodes from the tree */ NextOp = AslGbl_ExternalsListHead; while (NextOp) { /* * The External is stored in child pointer of each node in the * list */ ExternalOp = NextOp->Asl.Child; /* Get/set the fully qualified name */ ExternalName = AcpiNsGetNormalizedPathname (ExternalOp->Asl.Node, TRUE); ExternalOp->Asl.ExternalName = ExternalName; ExternalOp->Asl.Namepath = ExternalName; /* Set line numbers (for listings, etc.) */ ExternalOp->Asl.LineNumber = 0; ExternalOp->Asl.LogicalLineNumber = 0; Next = ExternalOp->Asl.Child; Next->Asl.LineNumber = 0; Next->Asl.LogicalLineNumber = 0; if (Next->Asl.ParseOpcode == PARSEOP_NAMESEG) { Next->Asl.ParseOpcode = PARSEOP_NAMESTRING; } Next->Asl.ExternalName = ExternalName; Status = UtInternalizeName (ExternalName, &Next->Asl.Value.String); if (ACPI_FAILURE (Status)) { AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Next, "Could not internalize namestring"); return; } Next->Asl.AmlLength = strlen (Next->Asl.Value.String); Next = Next->Asl.Next; Next->Asl.LineNumber = 0; Next->Asl.LogicalLineNumber = 0; Next = Next->Asl.Next; Next->Asl.LineNumber = 0; Next->Asl.LogicalLineNumber = 0; Next = Next->Asl.Next; Next->Asl.LineNumber = 0; Next->Asl.LogicalLineNumber = 0; ParentOp = ExternalOp->Asl.Parent; Prev = Next = ParentOp->Asl.Child; /* Now find the External node's position in parse tree */ while (Next != ExternalOp) { Prev = Next; Next = Next->Asl.Next; } /* Remove the External from the parse tree */ if (Prev == ExternalOp) { /* External was the first child node */ ParentOp->Asl.Child = ExternalOp->Asl.Next; } Prev->Asl.Next = ExternalOp->Asl.Next; ExternalOp->Asl.Next = NULL; ExternalOp->Asl.Parent = AslGbl_ExternalsListHead; /* Point the External to the next in the list */ if (NextOp->Asl.Next) { ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child; } NextOp = NextOp->Asl.Next; } /* * Loop again to remove MethodObj Externals for which * a MethodCall was not found (dead external reference) */ Prev = AslGbl_ExternalsListHead->Asl.Child; Next = Prev; while (Next) { ObjType = (ACPI_OBJECT_TYPE) Next->Asl.Child->Asl.Next->Asl.Value.Integer; if (ObjType == ACPI_TYPE_METHOD && !(Next->Asl.CompileFlags & OP_VISITED)) { if (Next == Prev) { AslGbl_ExternalsListHead->Asl.Child = Next->Asl.Next; Next->Asl.Next = NULL; Prev = AslGbl_ExternalsListHead->Asl.Child; Next = Prev; continue; } else { Prev->Asl.Next = Next->Asl.Next; Next->Asl.Next = NULL; Next = Prev->Asl.Next; continue; } } Prev = Next; Next = Next->Asl.Next; } /* If list is now empty, don't bother to make If (0) block */ if (!AslGbl_ExternalsListHead->Asl.Child) { return; } /* Convert Gbl_ExternalsListHead parent to If(). */ AslGbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF; AslGbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP; AslGbl_ExternalsListHead->Asl.CompileFlags = OP_AML_PACKAGE; UtSetParseOpName (AslGbl_ExternalsListHead); /* Create a Zero op for the If predicate */ PredicateOp = TrAllocateOp (PARSEOP_ZERO); PredicateOp->Asl.AmlOpcode = AML_ZERO_OP; PredicateOp->Asl.Parent = AslGbl_ExternalsListHead; PredicateOp->Asl.Child = NULL; PredicateOp->Asl.Next = AslGbl_ExternalsListHead->Asl.Child; AslGbl_ExternalsListHead->Asl.Child = PredicateOp; /* Set line numbers (for listings, etc.) */ AslGbl_ExternalsListHead->Asl.LineNumber = 0; AslGbl_ExternalsListHead->Asl.LogicalLineNumber = 0; PredicateOp->Asl.LineNumber = 0; PredicateOp->Asl.LogicalLineNumber = 0; /* Insert block back in the list */ Prev = DefinitionBlockOp->Asl.Child; Next = Prev; /* Find last default arg */ for (i = 0; i < 6; i++) { Prev = Next; Next = Prev->Asl.Next; } if (Next) { /* Definition Block is not empty */ AslGbl_ExternalsListHead->Asl.Next = Next; } else { /* Definition Block is empty. */ AslGbl_ExternalsListHead->Asl.Next = NULL; } Prev->Asl.Next = AslGbl_ExternalsListHead; AslGbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent; }
void OpcDoPld ( ACPI_PARSE_OBJECT *Op) { ACPI_PLD_INFO PldInfo; UINT8 *Buffer; ACPI_PARSE_OBJECT *ThisOp; ACPI_PARSE_OBJECT *NewOp; UINT16 ParseOpcode; UINT32 Value; if (!Op) { AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op, NULL); return; } if (Op->Asl.ParseOpcode != PARSEOP_TOPLD) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, Op, NULL); return; } memset (&PldInfo, 0, sizeof (ACPI_PLD_INFO)); /* Traverse the list of PLD Ops (one per PLD field) */ ThisOp = Op->Asl.Child; while (ThisOp) { /* Get child values */ ParseOpcode = ThisOp->Asl.Child->Asl.ParseOpcode; Value = (UINT32) ThisOp->Asl.Child->Asl.Value.Integer; switch (ThisOp->Asl.ParseOpcode) { case PARSEOP_PLD_REVISION: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 127) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } PldInfo.Revision = (UINT8) Value; break; case PARSEOP_PLD_IGNORECOLOR: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 1) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } PldInfo.IgnoreColor = (UINT8) Value; break; case PARSEOP_PLD_RED: case PARSEOP_PLD_GREEN: case PARSEOP_PLD_BLUE: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (Value > 255) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_RED) { PldInfo.Red = (UINT8) Value; } else if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_GREEN) { PldInfo.Green = (UINT8) Value; } else /* PARSEOP_PLD_BLUE */ { PldInfo.Blue = (UINT8) Value; } break; case PARSEOP_PLD_WIDTH: case PARSEOP_PLD_HEIGHT: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 65535) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_WIDTH) { PldInfo.Width = (UINT16) Value; } else /* PARSEOP_PLD_HEIGHT */ { PldInfo.Height = (UINT16) Value; } break; case PARSEOP_PLD_USERVISIBLE: case PARSEOP_PLD_DOCK: case PARSEOP_PLD_LID: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 1) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_USERVISIBLE) { PldInfo.UserVisible = (UINT8) Value; } else if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_DOCK) { PldInfo.Dock = (UINT8) Value; } else { PldInfo.Lid = (UINT8) Value; } break; case PARSEOP_PLD_PANEL: if (ParseOpcode == PARSEOP_INTEGER) { if (Value > 6) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } } else /* PARSEOP_STRING */ { if (!OpcFindName (AcpiGbl_PldPanelList, ThisOp->Asl.Child->Asl.Value.String, &Value)) { AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, ThisOp, NULL); break; } } PldInfo.Panel = (UINT8) Value; break; case PARSEOP_PLD_VERTICALPOSITION: if (ParseOpcode == PARSEOP_INTEGER) { if (Value > 2) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } } else /* PARSEOP_STRING */ { if (!OpcFindName (AcpiGbl_PldVerticalPositionList, ThisOp->Asl.Child->Asl.Value.String, &Value)) { AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, ThisOp, NULL); break; } } PldInfo.VerticalPosition = (UINT8) Value; break; case PARSEOP_PLD_HORIZONTALPOSITION: if (ParseOpcode == PARSEOP_INTEGER) { if (Value > 2) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } } else /* PARSEOP_STRING */ { if (!OpcFindName (AcpiGbl_PldHorizontalPositionList, ThisOp->Asl.Child->Asl.Value.String, &Value)) { AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, ThisOp, NULL); break; } } PldInfo.HorizontalPosition = (UINT8) Value; break; case PARSEOP_PLD_SHAPE: if (ParseOpcode == PARSEOP_INTEGER) { if (Value > 8) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } } else /* PARSEOP_STRING */ { if (!OpcFindName (AcpiGbl_PldShapeList, ThisOp->Asl.Child->Asl.Value.String, &Value)) { AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, ThisOp, NULL); break; } } PldInfo.Shape = (UINT8) Value; break; case PARSEOP_PLD_GROUPORIENTATION: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 1) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } PldInfo.GroupOrientation = (UINT8) Value; break; case PARSEOP_PLD_GROUPTOKEN: case PARSEOP_PLD_GROUPPOSITION: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 255) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_GROUPTOKEN) { PldInfo.GroupToken = (UINT8) Value; } else /* PARSEOP_PLD_GROUPPOSITION */ { PldInfo.GroupPosition = (UINT8) Value; } break; case PARSEOP_PLD_BAY: case PARSEOP_PLD_EJECTABLE: case PARSEOP_PLD_EJECTREQUIRED: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 1) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_BAY) { PldInfo.Bay = (UINT8) Value; } else if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_EJECTABLE) { PldInfo.Ejectable = (UINT8) Value; } else /* PARSEOP_PLD_EJECTREQUIRED */ { PldInfo.OspmEjectRequired = (UINT8) Value; } break; case PARSEOP_PLD_CABINETNUMBER: case PARSEOP_PLD_CARDCAGENUMBER: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 255) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_CABINETNUMBER) { PldInfo.CabinetNumber = (UINT8) Value; } else /* PARSEOP_PLD_CARDCAGENUMBER */ { PldInfo.CardCageNumber = (UINT8) Value; } break; case PARSEOP_PLD_REFERENCE: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 1) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } PldInfo.Reference = (UINT8) Value; break; case PARSEOP_PLD_ROTATION: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 7) { switch (Value) { case 45: Value = 1; break; case 90: Value = 2; break; case 135: Value = 3; break; case 180: Value = 4; break; case 225: Value = 5; break; case 270: Value = 6; break; case 315: Value = 7; break; default: AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } } PldInfo.Rotation = (UINT8) Value; break; case PARSEOP_PLD_ORDER: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 31) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } PldInfo.Order = (UINT8) Value; break; case PARSEOP_PLD_VERTICALOFFSET: case PARSEOP_PLD_HORIZONTALOFFSET: if (ParseOpcode != PARSEOP_INTEGER) { AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } if (Value > 65535) { AslError (ASL_ERROR, ASL_MSG_RANGE, ThisOp, NULL); break; } if (ThisOp->Asl.ParseOpcode == PARSEOP_PLD_VERTICALOFFSET) { PldInfo.VerticalOffset = (UINT16) Value; } else /* PARSEOP_PLD_HORIZONTALOFFSET */ { PldInfo.HorizontalOffset = (UINT16) Value; } break; default: AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ThisOp, NULL); break; } ThisOp = ThisOp->Asl.Next; } Buffer = OpcEncodePldBuffer (&PldInfo); /* Change Op to a Buffer */ Op->Asl.ParseOpcode = PARSEOP_BUFFER; Op->Common.AmlOpcode = AML_BUFFER_OP; /* Disable further optimization */ Op->Asl.CompileFlags &= ~OP_COMPILE_TIME_CONST; UtSetParseOpName (Op); /* Child node is the buffer length */ NewOp = TrAllocateOp (PARSEOP_INTEGER); NewOp->Asl.AmlOpcode = AML_BYTE_OP; NewOp->Asl.Value.Integer = 20; NewOp->Asl.Parent = Op; Op->Asl.Child = NewOp; Op = NewOp; /* Peer to the child is the raw buffer data */ NewOp = TrAllocateOp (PARSEOP_RAW_DATA); NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; NewOp->Asl.AmlLength = 20; NewOp->Asl.Value.String = ACPI_CAST_PTR (char, Buffer); NewOp->Asl.Parent = Op->Asl.Parent; Op->Asl.Next = NewOp; }
ACPI_PARSE_OBJECT * TrLinkOpChildren ( ACPI_PARSE_OBJECT *Op, UINT32 NumChildren, ...) { ACPI_PARSE_OBJECT *Child; ACPI_PARSE_OBJECT *PrevChild; va_list ap; UINT32 i; BOOLEAN FirstChild; va_start (ap, NumChildren); TrSetOpEndLineNumber (Op); DbgPrint (ASL_PARSE_OUTPUT, "\nLinkChildren Line [%u to %u] NewParent %p Child %u Op %s ", Op->Asl.LineNumber, Op->Asl.EndLine, Op, NumChildren, UtGetOpName(Op->Asl.ParseOpcode)); switch (Op->Asl.ParseOpcode) { case PARSEOP_ASL_CODE: Gbl_ParseTreeRoot = Op; Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); break; case PARSEOP_DEFINITION_BLOCK: DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->"); break; case PARSEOP_OPERATIONREGION: DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->"); break; case PARSEOP_OR: DbgPrint (ASL_PARSE_OUTPUT, "OR->"); break; default: /* Nothing to do for other opcodes */ break; } /* The following is for capturing comments */ if (AcpiGbl_CaptureComments) { /* * If there are "regular comments" detected at this point, * then is an endBlk comment. Categorize it as so and distribute * all regular comments to this parse op. */ if (Gbl_CommentListHead) { Op->Asl.EndBlkComment = Gbl_CommentListHead; CvDbgPrint ("EndBlk Comment for %s: %s", Op->Asl.ParseOpName, Gbl_CommentListHead->Comment); Gbl_CommentListHead = NULL; Gbl_CommentListTail = NULL; } } /* Link the new op to it's children */ PrevChild = NULL; FirstChild = TRUE; for (i = 0; i < NumChildren; i++) { Child = va_arg (ap, ACPI_PARSE_OBJECT *); if ((Child == PrevChild) && (Child != NULL)) { AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child, "Child op list invalid"); va_end(ap); return (Op); } DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child); /* * If child is NULL, this means that an optional argument * was omitted. We must create a placeholder with a special * opcode (DEFAULT_ARG) so that the code generator will know * that it must emit the correct default for this argument */ if (!Child) { Child = TrAllocateOp (PARSEOP_DEFAULT_ARG); } /* Link first child to parent */ if (FirstChild) { FirstChild = FALSE; Op->Asl.Child = Child; } /* Point all children to parent */ Child->Asl.Parent = Op; /* Link children in a peer list */ if (PrevChild) { PrevChild->Asl.Next = Child; } /* * This child might be a list, point all ops in the list * to the same parent */ while (Child->Asl.Next) { Child = Child->Asl.Next; Child->Asl.Parent = Op; } PrevChild = Child; } va_end(ap); DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); if (AcpiGbl_CaptureComments) { Gbl_CommentState.LatestParseOp = Op; CvDbgPrint ("TrLinkOpChildren=====Set latest parse op to this op.\n"); } return (Op); }