hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
/******************************************************************************
 *
 * Module Name: pswalk - Parser routines to walk parsed op tree(s)
 *
 * Copyright (C) 2000 - 2020, Intel Corp.
 *
 *****************************************************************************/
 
#include <acpi/acpi.h>
#include "accommon.h"
#include "acparser.h"
 
#define _COMPONENT          ACPI_PARSER
ACPI_MODULE_NAME("pswalk")
 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ps_delete_parse_tree
 *
 * PARAMETERS:  subtree_root        - Root of tree (or subtree) to delete
 *
 * RETURN:      None
 *
 * DESCRIPTION: Delete a portion of or an entire parse tree.
 *
 ******************************************************************************/
#include "amlcode.h"
void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
{
   union acpi_parse_object *op = subtree_root;
   union acpi_parse_object *next = NULL;
   union acpi_parse_object *parent = NULL;
   u32 level = 0;
 
   ACPI_FUNCTION_TRACE_PTR(ps_delete_parse_tree, subtree_root);
 
   ACPI_DEBUG_PRINT((ACPI_DB_PARSE_TREES, " root %p\n", subtree_root));
 
   /* Visit all nodes in the subtree */
 
   while (op) {
       if (op != parent) {
 
           /* This is the descending case */
 
           if (ACPI_IS_DEBUG_ENABLED
               (ACPI_LV_PARSE_TREES, _COMPONENT)) {
 
               /* This debug option will print the entire parse tree */
 
               acpi_os_printf("      %*.s%s %p", (level * 4),
                          " ",
                          acpi_ps_get_opcode_name(op->
                                      common.
                                      aml_opcode),
                          op);
 
               if (op->named.aml_opcode == AML_INT_NAMEPATH_OP) {
                   acpi_os_printf("  %4.4s",
                              op->common.value.string);
               }
               if (op->named.aml_opcode == AML_STRING_OP) {
                   acpi_os_printf("  %s",
                              op->common.value.string);
               }
               acpi_os_printf("\n");
           }
 
           /* Look for an argument or child of the current op */
 
           next = acpi_ps_get_arg(op, 0);
           if (next) {
 
               /* Still going downward in tree (Op is not completed yet) */
 
               op = next;
               level++;
               continue;
           }
       }
 
       /* No more children, this Op is complete. */
 
       next = op->common.next;
       parent = op->common.parent;
 
       acpi_ps_free_op(op);
 
       /* If we are back to the starting point, the walk is complete. */
 
       if (op == subtree_root) {
           return_VOID;
       }
 
       if (next) {
           op = next;
       } else {
           level--;
           op = parent;
       }
   }
 
   return_VOID;
}