From 5947982f1dadfa72a6913f25cc4f56e137c7217e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 14 Jan 2022 09:06:11 -0700 Subject: Simplify event_location_probe event_location_probe currently stores two strings, but really only needs one. This patch simplifies it and removes some unnecessary copies as well. --- gdb/location.c | 35 ++++++++++++++--------------------- gdb/location.h | 2 +- gdb/probe.c | 2 +- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/gdb/location.c b/gdb/location.c index f8369bf..d4dfc3b 100644 --- a/gdb/location.c +++ b/gdb/location.c @@ -71,6 +71,12 @@ protected: { } + event_location (enum event_location_type t, std::string &&str) + : type (t), + as_string (std::move (str)) + { + } + explicit event_location (const event_location *to_clone) : type (to_clone->type), as_string (to_clone->as_string) @@ -85,17 +91,9 @@ protected: /* A probe. */ struct event_location_probe : public event_location { - explicit event_location_probe (const char *probe) - : event_location (PROBE_LOCATION), - addr_string (probe == nullptr - ? nullptr - : xstrdup (probe)) - { - } - - ~event_location_probe () + explicit event_location_probe (std::string &&probe) + : event_location (PROBE_LOCATION, std::move (probe)) { - xfree (addr_string); } event_location_up clone () const override @@ -105,24 +103,19 @@ struct event_location_probe : public event_location bool empty_p () const override { - return addr_string == nullptr; + return false; } - char *addr_string; - protected: explicit event_location_probe (const event_location_probe *to_clone) - : event_location (to_clone), - addr_string (to_clone->addr_string == nullptr - ? nullptr - : xstrdup (to_clone->addr_string)) + : event_location (to_clone) { } std::string compute_string () const override { - return addr_string; + return std::move (as_string); } }; @@ -357,9 +350,9 @@ get_address_string_location (const struct event_location *location) /* See description in location.h. */ event_location_up -new_probe_location (const char *probe) +new_probe_location (std::string &&probe) { - return event_location_up (new event_location_probe (probe)); + return event_location_up (new event_location_probe (std::move (probe))); } /* See description in location.h. */ @@ -368,7 +361,7 @@ const char * get_probe_location (const struct event_location *location) { gdb_assert (location->type == PROBE_LOCATION); - return ((event_location_probe *) location)->addr_string; + return location->to_string (); } /* See description in location.h. */ diff --git a/gdb/location.h b/gdb/location.h index 4cabf26..848f645 100644 --- a/gdb/location.h +++ b/gdb/location.h @@ -169,7 +169,7 @@ extern const char * /* Create a new probe location. */ -extern event_location_up new_probe_location (const char *probe); +extern event_location_up new_probe_location (std::string &&probe); /* Return the probe location (a string) of the given event_location (which must be of type PROBE_LOCATION). */ diff --git a/gdb/probe.c b/gdb/probe.c index b8da177..689b5f0 100644 --- a/gdb/probe.c +++ b/gdb/probe.c @@ -204,7 +204,7 @@ parse_probes (const struct event_location *location, std::string canon (arg_start, arg_end - arg_start); canonical->special_display = 1; canonical->pre_expanded = 1; - canonical->location = new_probe_location (canon.c_str ()); + canonical->location = new_probe_location (std::move (canon)); } return result; -- cgit v1.1