From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: mdroth@linux.vnet.ibm.com
Subject: [PATCH 20/20] qobject: Make QString immutable
Date: Fri, 11 Dec 2020 18:11:52 +0100 [thread overview]
Message-ID: <20201211171152.146877-21-armbru@redhat.com> (raw)
In-Reply-To: <20201211171152.146877-1-armbru@redhat.com>
The functions to modify a QString's string are all unused now. Drop
them, and make the string immutable. Saves 16 bytes per QString on my
system.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
include/qapi/qmp/qstring.h | 8 +----
qobject/qstring.c | 65 ++------------------------------------
tests/check-qobject.c | 3 +-
tests/check-qstring.c | 16 ----------
4 files changed, 4 insertions(+), 88 deletions(-)
diff --git a/include/qapi/qmp/qstring.h b/include/qapi/qmp/qstring.h
index 53567db6c0..1d8ba46936 100644
--- a/include/qapi/qmp/qstring.h
+++ b/include/qapi/qmp/qstring.h
@@ -17,19 +17,13 @@
struct QString {
struct QObjectBase_ base;
- char *string;
- size_t length;
- size_t capacity;
+ const char *string;
};
QString *qstring_new(void);
QString *qstring_from_str(const char *str);
QString *qstring_from_substr(const char *str, size_t start, size_t end);
QString *qstring_from_gstring(GString *gstr);
-size_t qstring_get_length(const QString *qstring);
const char *qstring_get_str(const QString *qstring);
-void qstring_append_int(QString *qstring, int64_t value);
-void qstring_append(QString *qstring, const char *str);
-void qstring_append_chr(QString *qstring, int c);
#endif /* QSTRING_H */
diff --git a/qobject/qstring.c b/qobject/qstring.c
index ea86d80cf0..b4613899b9 100644
--- a/qobject/qstring.c
+++ b/qobject/qstring.c
@@ -24,14 +24,6 @@ QString *qstring_new(void)
return qstring_from_str("");
}
-/**
- * qstring_get_length(): Get the length of a QString
- */
-size_t qstring_get_length(const QString *qstring)
-{
- return qstring->length;
-}
-
/**
* qstring_from_substr(): Create a new QString from a C string substring
*
@@ -42,18 +34,9 @@ QString *qstring_from_substr(const char *str, size_t start, size_t end)
QString *qstring;
assert(start <= end);
-
qstring = g_malloc(sizeof(*qstring));
qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
-
- qstring->length = end - start;
- qstring->capacity = qstring->length;
-
- assert(qstring->capacity < SIZE_MAX);
- qstring->string = g_malloc(qstring->capacity + 1);
- memcpy(qstring->string, str + start, qstring->length);
- qstring->string[qstring->length] = 0;
-
+ qstring->string = g_strndup(str + start, end - start);
return qstring;
}
@@ -79,55 +62,11 @@ QString *qstring_from_gstring(GString *gstr)
qstring = g_malloc(sizeof(*qstring));
qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
- qstring->length = gstr->len;
- qstring->capacity = gstr->allocated_len;
qstring->string = g_string_free(gstr, false);
return qstring;
}
-static void capacity_increase(QString *qstring, size_t len)
-{
- if (qstring->capacity < (qstring->length + len)) {
- assert(len <= SIZE_MAX - qstring->capacity);
- qstring->capacity += len;
- assert(qstring->capacity <= SIZE_MAX / 2);
- qstring->capacity *= 2; /* use exponential growth */
-
- qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
- }
-}
-
-/* qstring_append(): Append a C string to a QString
- */
-void qstring_append(QString *qstring, const char *str)
-{
- size_t len = strlen(str);
-
- capacity_increase(qstring, len);
- memcpy(qstring->string + qstring->length, str, len);
- qstring->length += len;
- qstring->string[qstring->length] = 0;
-}
-
-void qstring_append_int(QString *qstring, int64_t value)
-{
- char num[32];
-
- snprintf(num, sizeof(num), "%" PRId64, value);
- qstring_append(qstring, num);
-}
-
-/**
- * qstring_append_chr(): Append a C char to a QString
- */
-void qstring_append_chr(QString *qstring, int c)
-{
- capacity_increase(qstring, 1);
- qstring->string[qstring->length++] = c;
- qstring->string[qstring->length] = 0;
-}
-
/**
* qstring_get_str(): Return a pointer to the stored string
*
@@ -158,6 +97,6 @@ void qstring_destroy_obj(QObject *obj)
assert(obj != NULL);
qs = qobject_to(QString, obj);
- g_free(qs->string);
+ g_free((char *)qs->string);
g_free(qs);
}
diff --git a/tests/check-qobject.c b/tests/check-qobject.c
index 6b6deaeb8b..c1713d15af 100644
--- a/tests/check-qobject.c
+++ b/tests/check-qobject.c
@@ -155,8 +155,7 @@ static void qobject_is_equal_string_test(void)
str_case = qstring_from_str("Foo");
/* Should yield "foo" */
- str_built = qstring_from_substr("form", 0, 2);
- qstring_append_chr(str_built, 'o');
+ str_built = qstring_from_substr("buffoon", 3, 6);
check_unequal(str_base, str_whitespace_0, str_whitespace_1,
str_whitespace_2, str_whitespace_3, str_case);
diff --git a/tests/check-qstring.c b/tests/check-qstring.c
index 2d079921e3..4bf9772093 100644
--- a/tests/check-qstring.c
+++ b/tests/check-qstring.c
@@ -47,21 +47,6 @@ static void qstring_get_str_test(void)
qobject_unref(qstring);
}
-static void qstring_append_chr_test(void)
-{
- int i;
- QString *qstring;
- const char *str = "qstring append char unit-test";
-
- qstring = qstring_new();
-
- for (i = 0; str[i]; i++)
- qstring_append_chr(qstring, str[i]);
-
- g_assert(strcmp(str, qstring_get_str(qstring)) == 0);
- qobject_unref(qstring);
-}
-
static void qstring_from_substr_test(void)
{
QString *qs;
@@ -90,7 +75,6 @@ int main(int argc, char **argv)
g_test_add_func("/public/from_str", qstring_from_str_test);
g_test_add_func("/public/get_str", qstring_get_str_test);
- g_test_add_func("/public/append_chr", qstring_append_chr_test);
g_test_add_func("/public/from_substr", qstring_from_substr_test);
g_test_add_func("/public/to_qstring", qobject_to_qstring_test);
--
2.26.2
next prev parent reply other threads:[~2020-12-11 18:07 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-11 17:11 [PATCH 00/20] Immutable QString, and also one JSON writer less Markus Armbruster
2020-12-11 17:11 ` [PATCH 01/20] hmp: Simplify how qmp_human_monitor_command() gets output Markus Armbruster
2020-12-16 18:53 ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 02/20] monitor: Use GString instead of QString for output buffer Markus Armbruster
2020-12-16 19:36 ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 03/20] qobject: Make qobject_to_json_pretty() take a pretty argument Markus Armbruster
2020-12-11 17:11 ` [PATCH 04/20] qobject: Use GString instead of QString to accumulate JSON Markus Armbruster
2020-12-11 17:11 ` [PATCH 05/20] qobject: Change qobject_to_json()'s value to GString Markus Armbruster
2021-03-24 7:16 ` Thomas Huth
2021-03-24 8:14 ` Markus Armbruster
2020-12-11 17:11 ` [PATCH 06/20] Revert "qstring: add qstring_free()" Markus Armbruster
2020-12-11 17:11 ` [PATCH 07/20] hw/rdma: Replace QList by GQueue Markus Armbruster
2020-12-11 17:11 ` [PATCH 08/20] qobject: Move internals to qobject-internal.h Markus Armbruster
2020-12-11 17:11 ` [PATCH 09/20] qmp: Fix tracing of non-string command IDs Markus Armbruster
2020-12-11 17:11 ` [PATCH 10/20] block: Avoid qobject_get_try_str() Markus Armbruster
2020-12-11 18:28 ` Vladimir Sementsov-Ogievskiy
2020-12-11 17:11 ` [PATCH 11/20] Revert "qobject: let object_property_get_str() use new API" Markus Armbruster
2020-12-11 19:48 ` Eduardo Habkost
2020-12-11 17:11 ` [PATCH 12/20] qobject: Drop qobject_get_try_str() Markus Armbruster
2020-12-11 17:11 ` [PATCH 13/20] qobject: Drop qstring_get_try_str() Markus Armbruster
2020-12-11 17:11 ` [PATCH 14/20] qobject: Factor quoted_str() out of to_json() Markus Armbruster
2020-12-11 17:11 ` [PATCH 15/20] qobject: Factor JSON writer out of qobject_to_json() Markus Armbruster
2020-12-11 17:11 ` [PATCH 16/20] migration: Replace migration's JSON writer by the general one Markus Armbruster
2020-12-16 19:46 ` Dr. David Alan Gilbert
2020-12-17 7:10 ` Markus Armbruster
2020-12-17 9:38 ` Dr. David Alan Gilbert
2020-12-17 10:32 ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 17/20] json: Use GString instead of QString to accumulate strings Markus Armbruster
2020-12-11 17:11 ` [PATCH 18/20] keyval: Use GString to accumulate value strings Markus Armbruster
2020-12-22 9:56 ` Paolo Bonzini
2021-01-11 13:05 ` Markus Armbruster
2021-01-11 13:51 ` Paolo Bonzini
2020-12-11 17:11 ` [PATCH 19/20] block: Use GString instead of QString to build filenames Markus Armbruster
2020-12-11 18:47 ` Vladimir Sementsov-Ogievskiy
2020-12-11 17:11 ` Markus Armbruster [this message]
2020-12-22 9:59 ` [PATCH 00/20] Immutable QString, and also one JSON writer less Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201211171152.146877-21-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).