[PATCH 048/203] Split out eval_op_rust_array

Tom Tromey
2021-01-01T21:48:01Z

This splits OP_ARRAY into a new function for future use.

gdb/ChangeLog
2021-01-01 Tom Tromey <tom@tromey.com>

* rust-lang.c (eval_op_rust_array): New function.
(rust_evaluate_subexp): Use it.
---
gdb/ChangeLog | 5 +++++
gdb/rust-lang.c | 49 +++++++++++++++++++++++++++++--------------------
2 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 5e293663828..ba57b6d0572 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -1354,6 +1354,34 @@ eval_op_rust_complement (struct type *expect_type, struct expression *exp,
return value_complement (value);
}

+/* A helper function for OP_ARRAY. */
+
+static struct value *
+eval_op_rust_array (struct type *expect_type, struct expression *exp,
+ enum noside noside,
+ struct value *elt, struct value *ncopies)
+{
+ int copies = value_as_long (ncopies);
+ if (copies < 0)
+ error (_("Array with negative number of elements"));
+
+ if (noside == EVAL_NORMAL)
+ {
+ int i;
+ std::vector<struct value *> eltvec (copies);
+
+ for (i = 0; i < copies; ++i)
+ eltvec[i] = elt;
+ return value_array (0, copies - 1, eltvec.data ());
+ }
+ else
+ {
+ struct type *arraytype
+ = lookup_array_range_type (value_type (elt), 0, copies - 1);
+ return allocate_value (arraytype);
+ }
+}
+
/* evaluate_exp implementation for Rust. */

static struct value *
@@ -1472,31 +1500,12 @@ rust_evaluate_subexp (struct type *expect_type, struct expression *exp,
case OP_RUST_ARRAY:
{
(*pos)++;
- int copies;
struct value *elt;
struct value *ncopies;

elt = rust_evaluate_subexp (NULL, exp, pos, noside);
ncopies = rust_evaluate_subexp (NULL, exp, pos, noside);
- copies = value_as_long (ncopies);
- if (copies < 0)
- error (_("Array with negative number of elements"));
-
- if (noside == EVAL_NORMAL)
- {
- int i;
- std::vector<struct value *> eltvec (copies);
-
- for (i = 0; i < copies; ++i)
- eltvec[i] = elt;
- result = value_array (0, copies - 1, eltvec.data ());
- }
- else
- {
- struct type *arraytype
- = lookup_array_range_type (value_type (elt), 0, copies - 1);
- result = allocate_value (arraytype);
- }
+ return eval_op_rust_array (expect_type, exp, noside, elt, ncopies);
}
break;

--
2.26.2