Refactor Rust code for slice-to-array operation

This patch exposes rust_slice_type_p and introduces
rust_slice_to_array, in preparation for subsequent patches that will
need these.
This commit is contained in:
Tom Tromey 2023-08-04 13:46:44 -06:00
parent e1a482ad96
commit 49ed499c44
2 changed files with 35 additions and 9 deletions

View File

@ -153,10 +153,10 @@ rust_tuple_struct_type_p (struct type *type)
return type->num_fields () > 0 && rust_underscore_fields (type);
}
/* Return true if TYPE is a slice type, otherwise false. */
/* See rust-lang.h. */
static bool
rust_slice_type_p (struct type *type)
bool
rust_slice_type_p (const struct type *type)
{
if (type->code () == TYPE_CODE_STRUCT
&& type->name () != NULL
@ -319,6 +319,30 @@ static const struct generic_val_print_decorations rust_decorations =
"]"
};
/* See rust-lang.h. */
struct value *
rust_slice_to_array (struct value *val)
{
struct type *type = check_typedef (val->type ());
/* This must have been checked by the caller. */
gdb_assert (rust_slice_type_p (type));
struct value *base = value_struct_elt (&val, {}, "data_ptr", NULL,
"slice");
struct value *len = value_struct_elt (&val, {}, "length", NULL, "slice");
LONGEST llen = value_as_long (len);
struct type *elt_type = base->type ()->target_type ();
struct type *array_type = lookup_array_range_type (elt_type, 0,
llen - 1);
struct value *array = value::allocate_lazy (array_type);
array->set_lval (lval_memory);
array->set_address (value_as_address (base));
return array;
}
/* Helper function to print a slice. */
static void
@ -345,12 +369,7 @@ rust_val_print_slice (struct value *val, struct ui_file *stream, int recurse,
gdb_printf (stream, "[]");
else
{
struct type *elt_type = base->type ()->target_type ();
struct type *array_type = lookup_array_range_type (elt_type, 0,
llen - 1);
struct value *array = value::allocate_lazy (array_type);
array->set_lval (lval_memory);
array->set_address (value_as_address (base));
struct value *array = rust_slice_to_array (val);
array->fetch_lazy ();
generic_value_print (array, stream, recurse, options,
&rust_decorations);

View File

@ -34,6 +34,9 @@ extern bool rust_tuple_type_p (struct type *type);
/* Return true if TYPE is a tuple struct type; otherwise false. */
extern bool rust_tuple_struct_type_p (struct type *type);
/* Return true if TYPE is a slice type, otherwise false. */
extern bool rust_slice_type_p (const struct type *type);
/* Given a block, find the name of the block's crate. Returns an empty
stringif no crate name can be found. */
extern std::string rust_crate_for_block (const struct block *block);
@ -50,6 +53,10 @@ extern const char *rust_last_path_segment (const char *path);
extern struct type *rust_slice_type (const char *name, struct type *elt_type,
struct type *usize_type);
/* Return a new array that holds the contents of the given slice,
VAL. */
extern struct value *rust_slice_to_array (struct value *val);
/* Class representing the Rust language. */
class rust_language : public language_defn