Use std::string in Rust code
authorTom Tromey <tom@tromey.com>
Fri, 3 Feb 2017 03:58:12 +0000 (20:58 -0700)
committerTom Tromey <tom@tromey.com>
Fri, 3 Feb 2017 04:25:11 +0000 (21:25 -0700)
This changes a couple of spots in the Rust support to use std::string.
In one spot this removes some manual memory management; in the other
spot this allows the removal of a call to xstrdup.

2017-02-02  Tom Tromey  <tom@tromey.com>

* rust-lang.h (rust_crate_for_block): Update.
* rust-lang.c (rust_crate_for_block): Return std::string.
(rust_get_disr_info): Use std:;string, not
gdb::unique_xmalloc_ptr.
* rust-exp.y (crate_name): Update.

gdb/ChangeLog
gdb/rust-exp.y
gdb/rust-lang.c
gdb/rust-lang.h

index 202c90ce6a232fe78195a12bbb958b4f6de08699..cb47f737976229eb9d35c26b898d627970ebfcc0 100644 (file)
@@ -1,3 +1,11 @@
+2017-02-02  Tom Tromey  <tom@tromey.com>
+
+       * rust-lang.h (rust_crate_for_block): Update.
+       * rust-lang.c (rust_crate_for_block): Return std::string.
+       (rust_get_disr_info): Use std:;string, not
+       gdb::unique_xmalloc_ptr.
+       * rust-exp.y (crate_name): Update.
+
 2017-02-02  Pedro Alves  <palves@redhat.com>
 
        * disasm-selftests.c (print_one_insn_test): Move the "verbose"
index a97ca67f46e92982c40e7846b4a0a579ffac5a24..98301a48922eeda75cf8bb55f00158c187cc3985 100644 (file)
@@ -941,16 +941,15 @@ rust_concat3 (const char *s1, const char *s2, const char *s3)
 static const struct rust_op *
 crate_name (const struct rust_op *name)
 {
-  char *crate = rust_crate_for_block (expression_context_block);
+  std::string crate = rust_crate_for_block (expression_context_block);
   struct stoken result;
 
   gdb_assert (name->opcode == OP_VAR_VALUE);
 
-  if (crate == NULL)
+  if (crate.empty ())
     error (_("Could not find crate for current location"));
-  result = make_stoken (obconcat (&work_obstack, "::", crate, "::",
+  result = make_stoken (obconcat (&work_obstack, "::", crate.c_str (), "::",
                                  name->left.sval.ptr, (char *) NULL));
-  xfree (crate);
 
   return ast_path (result, name->right.params);
 }
index dd72cd9380fcaaa42e33114608402c4273ad8a28..17df6bb21906b497ed4608814462ab9aa55ac949 100644 (file)
@@ -51,19 +51,17 @@ rust_last_path_segment (const char * path)
   return result + 1;
 }
 
-/* Find the Rust crate for BLOCK.  If no crate can be found, returns
-   NULL.  Otherwise, returns a newly allocated string that the caller
-   is responsible for freeing.  */
+/* See rust-lang.h.  */
 
-char *
+std::string
 rust_crate_for_block (const struct block *block)
 {
   const char *scope = block_scope (block);
 
   if (scope[0] == '\0')
-    return NULL;
+    return std::string ();
 
-  return xstrndup (scope, cp_find_first_component (scope));
+  return std::string (scope, cp_find_first_component (scope));
 }
 
 /* Information about the discriminant/variant of an enum */
@@ -157,8 +155,8 @@ rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
       /* Optimized enums have only one field.  */
       member_type = TYPE_FIELD_TYPE (type, 0);
 
-      gdb::unique_xmalloc_ptr<char> name (xstrdup (TYPE_FIELD_NAME (type, 0)));
-      tail = name.get () + strlen (RUST_ENUM_PREFIX);
+      std::string name (TYPE_FIELD_NAME (type, 0));
+      tail = &name[0] + strlen (RUST_ENUM_PREFIX);
 
       /* The location of the value that doubles as a discriminant is
          stored in the name of the field, as
index 70da69f14456699efd378223d4d2fed0486bf86c..6c627ae71c859720f8289e495765d55202a03993 100644 (file)
@@ -35,10 +35,9 @@ extern int rust_tuple_type_p (struct type *type);
 /* Return true if TYPE is a tuple struct type; otherwise false.  */
 extern int rust_tuple_struct_type_p (struct type *type);
 
-/* Given a block, find the name of the block's crate.  The name must
-   be freed by the caller.  Returns NULL if no crate name can be
-   found.  */
-extern char *rust_crate_for_block (const struct block *block);
+/* 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);
 
 /* Create a new slice type.  NAME is the name of the type.  ELT_TYPE
    is the type of the elements of the slice.  USIZE_TYPE is the Rust