rust-exp.h revision 1.1.1.3 1 1.1 christos /* Definitions for Rust expressions
2 1.1 christos
3 1.1.1.2 christos Copyright (C) 2020-2024 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1.1.3 christos #ifndef GDB_RUST_EXP_H
21 1.1.1.3 christos #define GDB_RUST_EXP_H
22 1.1 christos
23 1.1 christos #include "expop.h"
24 1.1 christos
25 1.1 christos extern struct value *eval_op_rust_complement (struct type *expect_type,
26 1.1 christos struct expression *exp,
27 1.1 christos enum noside noside,
28 1.1 christos enum exp_opcode opcode,
29 1.1 christos struct value *value);
30 1.1 christos extern struct value *eval_op_rust_array (struct type *expect_type,
31 1.1 christos struct expression *exp,
32 1.1 christos enum noside noside,
33 1.1 christos enum exp_opcode opcode,
34 1.1 christos struct value *ncopies,
35 1.1 christos struct value *elt);
36 1.1 christos extern struct value *rust_subscript (struct type *expect_type,
37 1.1 christos struct expression *exp,
38 1.1 christos enum noside noside, bool for_addr,
39 1.1 christos struct value *lhs, struct value *rhs);
40 1.1 christos extern struct value *rust_range (struct type *expect_type,
41 1.1 christos struct expression *exp,
42 1.1 christos enum noside noside, enum range_flag kind,
43 1.1 christos struct value *low, struct value *high);
44 1.1 christos
45 1.1 christos namespace expr
46 1.1 christos {
47 1.1 christos
48 1.1 christos using rust_unop_compl_operation = unop_operation<UNOP_COMPLEMENT,
49 1.1 christos eval_op_rust_complement>;
50 1.1 christos using rust_array_operation = binop_operation<OP_RUST_ARRAY,
51 1.1 christos eval_op_rust_array>;
52 1.1 christos
53 1.1 christos /* The Rust indirection operation. */
54 1.1 christos class rust_unop_ind_operation
55 1.1 christos : public unop_ind_operation
56 1.1 christos {
57 1.1 christos public:
58 1.1 christos
59 1.1 christos using unop_ind_operation::unop_ind_operation;
60 1.1 christos
61 1.1 christos value *evaluate (struct type *expect_type,
62 1.1 christos struct expression *exp,
63 1.1 christos enum noside noside) override;
64 1.1 christos };
65 1.1 christos
66 1.1 christos /* Subscript operator for Rust. */
67 1.1 christos class rust_subscript_operation
68 1.1 christos : public tuple_holding_operation<operation_up, operation_up>
69 1.1 christos {
70 1.1 christos public:
71 1.1 christos
72 1.1 christos using tuple_holding_operation::tuple_holding_operation;
73 1.1 christos
74 1.1 christos value *evaluate (struct type *expect_type,
75 1.1 christos struct expression *exp,
76 1.1 christos enum noside noside) override
77 1.1 christos {
78 1.1 christos value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
79 1.1 christos value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
80 1.1 christos return rust_subscript (expect_type, exp, noside, false, arg1, arg2);
81 1.1 christos }
82 1.1 christos
83 1.1 christos value *slice (struct type *expect_type,
84 1.1 christos struct expression *exp,
85 1.1 christos enum noside noside)
86 1.1 christos {
87 1.1 christos value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
88 1.1 christos value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
89 1.1 christos return rust_subscript (expect_type, exp, noside, true, arg1, arg2);
90 1.1 christos }
91 1.1 christos
92 1.1 christos enum exp_opcode opcode () const override
93 1.1 christos { return BINOP_SUBSCRIPT; }
94 1.1 christos };
95 1.1 christos
96 1.1 christos class rust_unop_addr_operation
97 1.1 christos : public tuple_holding_operation<operation_up>
98 1.1 christos {
99 1.1 christos public:
100 1.1 christos
101 1.1 christos using tuple_holding_operation::tuple_holding_operation;
102 1.1 christos
103 1.1 christos value *evaluate (struct type *expect_type,
104 1.1 christos struct expression *exp,
105 1.1 christos enum noside noside) override
106 1.1 christos {
107 1.1 christos operation *oper = std::get<0> (m_storage).get ();
108 1.1 christos rust_subscript_operation *sub_op
109 1.1 christos = dynamic_cast<rust_subscript_operation *> (oper);
110 1.1 christos if (sub_op != nullptr)
111 1.1 christos return sub_op->slice (expect_type, exp, noside);
112 1.1 christos return oper->evaluate_for_address (exp, noside);
113 1.1 christos }
114 1.1 christos
115 1.1 christos enum exp_opcode opcode () const override
116 1.1 christos { return UNOP_ADDR; }
117 1.1 christos };
118 1.1 christos
119 1.1 christos /* The Rust range operators. */
120 1.1 christos class rust_range_operation
121 1.1 christos : public tuple_holding_operation<enum range_flag, operation_up, operation_up>
122 1.1 christos {
123 1.1 christos public:
124 1.1 christos
125 1.1 christos using tuple_holding_operation::tuple_holding_operation;
126 1.1 christos
127 1.1 christos value *evaluate (struct type *expect_type,
128 1.1 christos struct expression *exp,
129 1.1 christos enum noside noside) override
130 1.1 christos {
131 1.1 christos auto kind = std::get<0> (m_storage);
132 1.1 christos value *low = nullptr;
133 1.1 christos if (std::get<1> (m_storage) != nullptr)
134 1.1 christos low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
135 1.1 christos value *high = nullptr;
136 1.1 christos if (std::get<2> (m_storage) != nullptr)
137 1.1 christos high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
138 1.1 christos return rust_range (expect_type, exp, noside, kind, low, high);
139 1.1 christos }
140 1.1 christos
141 1.1 christos enum exp_opcode opcode () const override
142 1.1 christos { return OP_RANGE; }
143 1.1 christos };
144 1.1 christos
145 1.1 christos /* Tuple field reference (using an integer). */
146 1.1 christos class rust_struct_anon
147 1.1 christos : public tuple_holding_operation<int, operation_up>
148 1.1 christos {
149 1.1 christos public:
150 1.1 christos
151 1.1 christos using tuple_holding_operation::tuple_holding_operation;
152 1.1 christos
153 1.1 christos value *evaluate (struct type *expect_type,
154 1.1 christos struct expression *exp,
155 1.1 christos enum noside noside) override;
156 1.1 christos
157 1.1 christos enum exp_opcode opcode () const override
158 1.1 christos { return STRUCTOP_ANONYMOUS; }
159 1.1 christos };
160 1.1 christos
161 1.1 christos /* Structure (or union or enum) field reference. */
162 1.1 christos class rust_structop
163 1.1 christos : public structop_base_operation
164 1.1 christos {
165 1.1 christos public:
166 1.1 christos
167 1.1 christos using structop_base_operation::structop_base_operation;
168 1.1 christos
169 1.1 christos value *evaluate (struct type *expect_type,
170 1.1 christos struct expression *exp,
171 1.1 christos enum noside noside) override;
172 1.1 christos
173 1.1 christos value *evaluate_funcall (struct type *expect_type,
174 1.1 christos struct expression *exp,
175 1.1 christos enum noside noside,
176 1.1 christos const std::vector<operation_up> &args) override;
177 1.1 christos
178 1.1 christos enum exp_opcode opcode () const override
179 1.1 christos { return STRUCTOP_STRUCT; }
180 1.1 christos };
181 1.1 christos
182 1.1 christos /* Rust aggregate initialization. */
183 1.1 christos class rust_aggregate_operation
184 1.1 christos : public tuple_holding_operation<struct type *, operation_up,
185 1.1 christos std::vector<std::pair<std::string,
186 1.1 christos operation_up>>>
187 1.1 christos {
188 1.1 christos public:
189 1.1 christos
190 1.1 christos using tuple_holding_operation::tuple_holding_operation;
191 1.1 christos
192 1.1 christos value *evaluate (struct type *expect_type,
193 1.1 christos struct expression *exp,
194 1.1 christos enum noside noside) override;
195 1.1 christos
196 1.1 christos enum exp_opcode opcode () const override
197 1.1 christos { return OP_AGGREGATE; }
198 1.1 christos };
199 1.1 christos
200 1.1 christos /* Rust parenthesized operation. This is needed to distinguish
201 1.1 christos between 'obj.f()', which is a method call, and '(obj.f)()', which
202 1.1 christos is a call of a function-valued field 'f'. */
203 1.1 christos class rust_parenthesized_operation
204 1.1 christos : public tuple_holding_operation<operation_up>
205 1.1 christos {
206 1.1 christos public:
207 1.1 christos
208 1.1 christos explicit rust_parenthesized_operation (operation_up op)
209 1.1 christos : tuple_holding_operation (std::move (op))
210 1.1 christos {
211 1.1 christos }
212 1.1 christos
213 1.1 christos value *evaluate (struct type *expect_type,
214 1.1 christos struct expression *exp,
215 1.1 christos enum noside noside) override
216 1.1 christos {
217 1.1 christos return std::get<0> (m_storage)->evaluate (expect_type, exp, noside);
218 1.1 christos }
219 1.1 christos
220 1.1 christos enum exp_opcode opcode () const override
221 1.1 christos {
222 1.1 christos /* A lie but this isn't worth introducing a new opcode for. */
223 1.1 christos return UNOP_PLUS;
224 1.1 christos }
225 1.1 christos };
226 1.1 christos
227 1.1 christos } /* namespace expr */
228 1.1 christos
229 1.1.1.3 christos #endif /* GDB_RUST_EXP_H */
230