Commit 7dbec553 authored by Bob Moore's avatar Bob Moore Committed by Rafael J. Wysocki

ACPICA: Refactor evaluate_object to reduce nesting

ACPICA commit 599e9159f53565e4a3f3e67f6a03f81fcb10a4cf

Original patch from hanjun.guo@linaro.org

ACPICA BZ 1072.

Link: https://github.com/acpica/acpica/commit/599e9159
Link: https://bugs.acpica.org/show_bug.cgi?id=1072Original-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent f5c1e1c5
...@@ -280,13 +280,12 @@ acpi_evaluate_object(acpi_handle handle, ...@@ -280,13 +280,12 @@ acpi_evaluate_object(acpi_handle handle,
info->parameters[info->param_count] = NULL; info->parameters[info->param_count] = NULL;
} }
#if 0 #ifdef _FUTURE_FEATURE
/* /*
* Begin incoming argument count analysis. Check for too few args * Begin incoming argument count analysis. Check for too few args
* and too many args. * and too many args.
*/ */
switch (acpi_ns_get_type(info->node)) { switch (acpi_ns_get_type(info->node)) {
case ACPI_TYPE_METHOD: case ACPI_TYPE_METHOD:
...@@ -370,68 +369,68 @@ acpi_evaluate_object(acpi_handle handle, ...@@ -370,68 +369,68 @@ acpi_evaluate_object(acpi_handle handle,
* If we are expecting a return value, and all went well above, * If we are expecting a return value, and all went well above,
* copy the return value to an external object. * copy the return value to an external object.
*/ */
if (return_buffer) { if (!return_buffer) {
if (!info->return_object) { goto cleanup_return_object;
return_buffer->length = 0; }
} else {
if (ACPI_GET_DESCRIPTOR_TYPE(info->return_object) ==
ACPI_DESC_TYPE_NAMED) {
/*
* If we received a NS Node as a return object, this means that
* the object we are evaluating has nothing interesting to
* return (such as a mutex, etc.) We return an error because
* these types are essentially unsupported by this interface.
* We don't check up front because this makes it easier to add
* support for various types at a later date if necessary.
*/
status = AE_TYPE;
info->return_object = NULL; /* No need to delete a NS Node */
return_buffer->length = 0;
}
if (ACPI_SUCCESS(status)) { if (!info->return_object) {
return_buffer->length = 0;
goto cleanup;
}
/* Dereference Index and ref_of references */ if (ACPI_GET_DESCRIPTOR_TYPE(info->return_object) ==
ACPI_DESC_TYPE_NAMED) {
/*
* If we received a NS Node as a return object, this means that
* the object we are evaluating has nothing interesting to
* return (such as a mutex, etc.) We return an error because
* these types are essentially unsupported by this interface.
* We don't check up front because this makes it easier to add
* support for various types at a later date if necessary.
*/
status = AE_TYPE;
info->return_object = NULL; /* No need to delete a NS Node */
return_buffer->length = 0;
}
acpi_ns_resolve_references(info); if (ACPI_FAILURE(status)) {
goto cleanup_return_object;
}
/* Get the size of the returned object */ /* Dereference Index and ref_of references */
status = acpi_ns_resolve_references(info);
acpi_ut_get_object_size(info->return_object,
&buffer_space_needed); /* Get the size of the returned object */
if (ACPI_SUCCESS(status)) {
status = acpi_ut_get_object_size(info->return_object,
/* Validate/Allocate/Clear caller buffer */ &buffer_space_needed);
if (ACPI_SUCCESS(status)) {
status =
acpi_ut_initialize_buffer /* Validate/Allocate/Clear caller buffer */
(return_buffer,
buffer_space_needed); status = acpi_ut_initialize_buffer(return_buffer,
if (ACPI_FAILURE(status)) { buffer_space_needed);
/* if (ACPI_FAILURE(status)) {
* Caller's buffer is too small or a new one can't /*
* be allocated * Caller's buffer is too small or a new one can't
*/ * be allocated
ACPI_DEBUG_PRINT((ACPI_DB_INFO, */
"Needed buffer size %X, %s\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO,
(u32) "Needed buffer size %X, %s\n",
buffer_space_needed, (u32)buffer_space_needed,
acpi_format_exception acpi_format_exception(status)));
(status))); } else {
} else { /* We have enough space for the object, build it */
/* We have enough space for the object, build it */
status =
status = acpi_ut_copy_iobject_to_eobject(info->return_object,
acpi_ut_copy_iobject_to_eobject return_buffer);
(info->return_object,
return_buffer);
}
}
}
} }
} }
cleanup_return_object:
if (info->return_object) { if (info->return_object) {
/* /*
* Delete the internal return object. NOTE: Interpreter must be * Delete the internal return object. NOTE: Interpreter must be
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment