void ApCheckPredefinedReturnValue ( ACPI_PARSE_OBJECT *Op, ASL_METHOD_INFO *MethodInfo) { UINT32 Index; ACPI_PARSE_OBJECT *ReturnValueOp; const ACPI_PREDEFINED_INFO *ThisName; /* * Check parent method for a match against the predefined name list. * * Note: Disable compiler errors/warnings because any errors will be * caught when analyzing the parent method. Eliminates duplicate errors. */ Gbl_AllExceptionsDisabled = TRUE; Index = ApCheckForPredefinedName (MethodInfo->Op, MethodInfo->Op->Asl.NameSeg); Gbl_AllExceptionsDisabled = FALSE; switch (Index) { case ACPI_EVENT_RESERVED_NAME: /* _Lxx/_Exx/_Wxx/_Qxx methods */ /* No return value expected, warn if there is one */ ApCheckForUnexpectedReturnValue (Op, MethodInfo); return; case ACPI_NOT_RESERVED_NAME: /* No underscore or _Txx or _xxx name not matched */ case ACPI_PREDEFINED_NAME: /* Resource Name or reserved scope name */ case ACPI_COMPILER_RESERVED_NAME: /* A _Txx that was not emitted by compiler */ /* Just return, nothing to do */ return; default: /* A standard predefined ACPI name */ ThisName = &AcpiGbl_PredefinedMethods[Index]; if (!ThisName->Info.ExpectedBtypes) { /* No return value expected, warn if there is one */ ApCheckForUnexpectedReturnValue (Op, MethodInfo); return; } /* Get the object returned, it is the next argument */ ReturnValueOp = Op->Asl.Child; switch (ReturnValueOp->Asl.ParseOpcode) { case PARSEOP_ZERO: case PARSEOP_ONE: case PARSEOP_ONES: case PARSEOP_INTEGER: case PARSEOP_STRING_LITERAL: case PARSEOP_BUFFER: case PARSEOP_PACKAGE: /* Static data return object - check against expected type */ ApCheckObjectType (ThisName->Info.Name, ReturnValueOp, ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); /* For packages, check the individual package elements */ if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_PACKAGE) { ApCheckPackage (ReturnValueOp, ThisName); } break; default: /* * All other ops are very difficult or impossible to typecheck at * compile time. These include all Localx, Argx, and method * invocations. Also, NAMESEG and NAMESTRING because the type of * any named object can be changed at runtime (for example, * CopyObject will change the type of the target object.) */ break; } } }
void ApCheckPredefinedReturnValue ( ACPI_PARSE_OBJECT *Op, ASL_METHOD_INFO *MethodInfo) { UINT32 Index; ACPI_PARSE_OBJECT *ReturnValueOp; /* Check parent method for a match against the predefined name list */ Index = ApCheckForPredefinedName (MethodInfo->Op, MethodInfo->Op->Asl.NameSeg); switch (Index) { case ACPI_EVENT_RESERVED_NAME: /* _Lxx/_Exx/_Wxx/_Qxx methods */ /* No return value expected, warn if there is one */ ApCheckForUnexpectedReturnValue (Op, MethodInfo); return; case ACPI_NOT_RESERVED_NAME: /* No underscore or _Txx or _xxx name not matched */ case ACPI_PREDEFINED_NAME: /* Resource Name or reserved scope name */ case ACPI_COMPILER_RESERVED_NAME: /* A _Txx that was not emitted by compiler */ /* Just return, nothing to do */ return; default: /* A standard predefined ACPI name */ if (!PredefinedNames[Index].Info.ExpectedBtypes) { /* No return value expected, warn if there is one */ ApCheckForUnexpectedReturnValue (Op, MethodInfo); return; } /* Get the object returned, it is the next argument */ ReturnValueOp = Op->Asl.Child; switch (ReturnValueOp->Asl.ParseOpcode) { case PARSEOP_ZERO: case PARSEOP_ONE: case PARSEOP_ONES: case PARSEOP_INTEGER: case PARSEOP_STRING_LITERAL: case PARSEOP_BUFFER: case PARSEOP_PACKAGE: /* Static data return object - check against expected type */ ApCheckObjectType (PredefinedNames[Index].Info.Name, ReturnValueOp, PredefinedNames[Index].Info.ExpectedBtypes); break; default: /* * All other ops are very difficult or impossible to typecheck at * compile time. These include all Localx, Argx, and method * invocations. Also, NAMESEG and NAMESTRING because the type of * any named object can be changed at runtime (for example, * CopyObject will change the type of the target object.) */ break; } } }