Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/808798/?format=api
{ "id": 808798, "url": "http://patchwork.ozlabs.org/api/patches/808798/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901153758.8628-47-armbru@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170901153758.8628-47-armbru@redhat.com>", "list_archive_url": null, "date": "2017-09-01T15:37:57", "name": "[PULL,v2,46/47] qapi: Change data type of the FOO_lookup generated for enum FOO", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "1d49e33b7ee87a8092d0df4b8ca497b7d26de009", "submitter": { "id": 2645, "url": "http://patchwork.ozlabs.org/api/people/2645/?format=api", "name": "Markus Armbruster", "email": "armbru@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901153758.8628-47-armbru@redhat.com/mbox/", "series": [ { "id": 1049, "url": "http://patchwork.ozlabs.org/api/series/1049/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1049", "date": "2017-09-01T15:37:14", "name": "[PULL,v2,01/47] qapi: Fix error handling code on alternate conflict", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/1049/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/808798/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/808798/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=208.118.235.17; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx10.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=armbru@redhat.com" ], "Received": [ "from lists.gnu.org (lists.gnu.org [208.118.235.17])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkPd16bKpz9t2x\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 2 Sep 2017 02:21:25 +1000 (AEST)", "from localhost ([::1]:47363 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnoh9-0007g8-Ov\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 12:21:23 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:51863)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <armbru@redhat.com>) id 1dno1b-0006v4-Ru\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:31 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <armbru@redhat.com>) id 1dno1V-0001rV-Ty\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:27 -0400", "from mx1.redhat.com ([209.132.183.28]:1951)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <armbru@redhat.com>) id 1dno1V-0001qt-GZ\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 11:38:21 -0400", "from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 918306148C\n\tfor <qemu-devel@nongnu.org>; Fri, 1 Sep 2017 15:38:20 +0000 (UTC)", "from blackfin.pond.sub.org (ovpn-116-75.ams2.redhat.com\n\t[10.36.116.75])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 4534EA948B;\n\tFri, 1 Sep 2017 15:38:12 +0000 (UTC)", "by blackfin.pond.sub.org (Postfix, from userid 1000)\n\tid CA88F1132F4F; Fri, 1 Sep 2017 17:37:58 +0200 (CEST)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 918306148C", "From": "Markus Armbruster <armbru@redhat.com>", "To": "qemu-devel@nongnu.org", "Date": "Fri, 1 Sep 2017 17:37:57 +0200", "Message-Id": "<20170901153758.8628-47-armbru@redhat.com>", "In-Reply-To": "<20170901153758.8628-1-armbru@redhat.com>", "References": "<20170901153758.8628-1-armbru@redhat.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.15", "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.39]);\n\tFri, 01 Sep 2017 15:38:20 +0000 (UTC)", "Content-Transfer-Encoding": "quoted-printable", "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]", "X-Received-From": "209.132.183.28", "Subject": "[Qemu-devel] [PULL v2 46/47] qapi: Change data type of the\n\tFOO_lookup generated for enum FOO", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "From: Marc-André Lureau <marcandre.lureau@redhat.com>\n\nCurrently, a FOO_lookup is an array of strings terminated by a NULL\nsentinel.\n\nA future patch will generate enums with \"holes\". NULL-termination\nwill cease to work then.\n\nTo prepare for that, store the length in the FOO_lookup by wrapping it\nin a struct and adding a member for the length.\n\nThe sentinel will be dropped next.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nMessage-Id: <20170822132255.23945-13-marcandre.lureau@redhat.com>\n[Basically redone]\nSigned-off-by: Markus Armbruster <armbru@redhat.com>\nMessage-Id: <1503564371-26090-16-git-send-email-armbru@redhat.com>\n[Rebased]\n---\n backends/hostmem.c | 2 +-\n block.c | 2 +-\n block/blkdebug.c | 4 ++--\n block/file-posix.c | 8 +++++---\n block/file-win32.c | 2 +-\n block/gluster.c | 4 ++--\n block/parallels.c | 14 ++++++++------\n block/qcow2.c | 4 ++--\n block/quorum.c | 2 +-\n blockdev.c | 2 +-\n crypto/block-luks.c | 8 ++++----\n crypto/secret.c | 2 +-\n crypto/tlscreds.c | 2 +-\n hmp.c | 6 +++---\n hw/core/qdev-properties.c | 10 +++++-----\n include/hw/qdev-core.h | 2 +-\n include/qapi/util.h | 9 +++++++--\n include/qapi/visitor.h | 2 +-\n include/qom/object.h | 4 ++--\n migration/global_state.c | 2 +-\n net/filter.c | 2 +-\n qapi/qapi-util.c | 12 ++++++------\n qapi/qapi-visit-core.c | 24 +++++++++++++-----------\n qemu-img.c | 2 +-\n qemu-nbd.c | 2 +-\n qom/object.c | 16 ++++++++--------\n scripts/qapi-visit.py | 2 +-\n scripts/qapi.py | 13 ++++++++-----\n tests/check-qom-proplist.c | 15 +++++++++------\n tests/qmp-test.c | 2 +-\n tests/test-qapi-util.c | 10 +++++-----\n tests/test-qobject-input-visitor.c | 2 +-\n tpm.c | 2 +-\n 33 files changed, 106 insertions(+), 89 deletions(-)", "diff": "diff --git a/backends/hostmem.c b/backends/hostmem.c\nindex 06e8898e40..217cff6766 100644\n--- a/backends/hostmem.c\n+++ b/backends/hostmem.c\n@@ -395,7 +395,7 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)\n host_memory_backend_set_host_nodes,\n NULL, NULL, &error_abort);\n object_class_property_add_enum(oc, \"policy\", \"HostMemPolicy\",\n- HostMemPolicy_lookup,\n+ &HostMemPolicy_lookup,\n host_memory_backend_get_policy,\n host_memory_backend_set_policy, &error_abort);\n object_class_property_add_str(oc, \"id\", get_id, set_id, &error_abort);\ndiff --git a/block.c b/block.c\nindex 845eff8177..b749bd6404 100644\n--- a/block.c\n+++ b/block.c\n@@ -1332,7 +1332,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,\n detect_zeroes = qemu_opt_get(opts, \"detect-zeroes\");\n if (detect_zeroes) {\n BlockdevDetectZeroesOptions value =\n- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,\n+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,\n detect_zeroes,\n BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,\n &local_err);\ndiff --git a/block/blkdebug.c b/block/blkdebug.c\nindex b370fcedfb..8e385acf54 100644\n--- a/block/blkdebug.c\n+++ b/block/blkdebug.c\n@@ -169,7 +169,7 @@ static int add_rule(void *opaque, QemuOpts *opts, Error **errp)\n error_setg(errp, \"Missing event name for rule\");\n return -1;\n }\n- event = qapi_enum_parse(BlkdebugEvent_lookup, event_name, -1, errp);\n+ event = qapi_enum_parse(&BlkdebugEvent_lookup, event_name, -1, errp);\n if (event < 0) {\n return -1;\n }\n@@ -732,7 +732,7 @@ static int blkdebug_debug_breakpoint(BlockDriverState *bs, const char *event,\n struct BlkdebugRule *rule;\n int blkdebug_event;\n \n- blkdebug_event = qapi_enum_parse(BlkdebugEvent_lookup, event, -1, NULL);\n+ blkdebug_event = qapi_enum_parse(&BlkdebugEvent_lookup, event, -1, NULL);\n if (blkdebug_event < 0) {\n return -ENOENT;\n }\ndiff --git a/block/file-posix.c b/block/file-posix.c\nindex bfef91db63..6acbd56238 100644\n--- a/block/file-posix.c\n+++ b/block/file-posix.c\n@@ -437,7 +437,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,\n aio_default = (bdrv_flags & BDRV_O_NATIVE_AIO)\n ? BLOCKDEV_AIO_OPTIONS_NATIVE\n : BLOCKDEV_AIO_OPTIONS_THREADS;\n- aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, \"aio\"),\n+ aio = qapi_enum_parse(&BlockdevAioOptions_lookup,\n+ qemu_opt_get(opts, \"aio\"),\n aio_default, &local_err);\n if (local_err) {\n error_propagate(errp, local_err);\n@@ -446,7 +447,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,\n }\n s->use_linux_aio = (aio == BLOCKDEV_AIO_OPTIONS_NATIVE);\n \n- locking = qapi_enum_parse(OnOffAuto_lookup, qemu_opt_get(opts, \"locking\"),\n+ locking = qapi_enum_parse(&OnOffAuto_lookup,\n+ qemu_opt_get(opts, \"locking\"),\n ON_OFF_AUTO_AUTO, &local_err);\n if (local_err) {\n error_propagate(errp, local_err);\n@@ -1973,7 +1975,7 @@ static int raw_create(const char *filename, QemuOpts *opts, Error **errp)\n BDRV_SECTOR_SIZE);\n nocow = qemu_opt_get_bool(opts, BLOCK_OPT_NOCOW, false);\n buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);\n- prealloc = qapi_enum_parse(PreallocMode_lookup, buf,\n+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,\n PREALLOC_MODE_OFF, &local_err);\n g_free(buf);\n if (local_err) {\ndiff --git a/block/file-win32.c b/block/file-win32.c\nindex f2a1830060..9e02214a69 100644\n--- a/block/file-win32.c\n+++ b/block/file-win32.c\n@@ -302,7 +302,7 @@ static bool get_aio_option(QemuOpts *opts, int flags, Error **errp)\n \n aio_default = (flags & BDRV_O_NATIVE_AIO) ? BLOCKDEV_AIO_OPTIONS_NATIVE\n : BLOCKDEV_AIO_OPTIONS_THREADS;\n- aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, \"aio\"),\n+ aio = qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, \"aio\"),\n aio_default, errp);\n \n switch (aio) {\ndiff --git a/block/gluster.c b/block/gluster.c\nindex 29f9427e47..0f4265a3a4 100644\n--- a/block/gluster.c\n+++ b/block/gluster.c\n@@ -543,7 +543,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,\n if (!strcmp(ptr, \"tcp\")) {\n ptr = \"inet\"; /* accept legacy \"tcp\" */\n }\n- type = qapi_enum_parse(SocketAddressType_lookup, ptr, -1, NULL);\n+ type = qapi_enum_parse(&SocketAddressType_lookup, ptr, -1, NULL);\n if (type != SOCKET_ADDRESS_TYPE_INET\n && type != SOCKET_ADDRESS_TYPE_UNIX) {\n error_setg(&local_err,\n@@ -1000,7 +1000,7 @@ static int qemu_gluster_create(const char *filename,\n BDRV_SECTOR_SIZE);\n \n tmp = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);\n- prealloc = qapi_enum_parse(PreallocMode_lookup, tmp, PREALLOC_MODE_OFF,\n+ prealloc = qapi_enum_parse(&PreallocMode_lookup, tmp, PREALLOC_MODE_OFF,\n &local_err);\n g_free(tmp);\n if (local_err) {\ndiff --git a/block/parallels.c b/block/parallels.c\nindex d812210b4f..cce7336cac 100644\n--- a/block/parallels.c\n+++ b/block/parallels.c\n@@ -68,13 +68,15 @@ typedef enum ParallelsPreallocMode {\n PRL_PREALLOC_MODE__MAX = 2,\n } ParallelsPreallocMode;\n \n-static const char *prealloc_mode_lookup[] = {\n- \"falloc\",\n- \"truncate\",\n- NULL,\n+static QEnumLookup prealloc_mode_lookup = {\n+ .array = (const char *const[]) {\n+ \"falloc\",\n+ \"truncate\",\n+ NULL,\n+ },\n+ .size = PRL_PREALLOC_MODE__MAX\n };\n \n-\n typedef struct BDRVParallelsState {\n /** Locking is conservative, the lock protects\n * - image file extending (truncate, fallocate)\n@@ -695,7 +697,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,\n qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);\n s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);\n buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);\n- s->prealloc_mode = qapi_enum_parse(prealloc_mode_lookup, buf,\n+ s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,\n PRL_PREALLOC_MODE_FALLOCATE,\n &local_err);\n g_free(buf);\ndiff --git a/block/qcow2.c b/block/qcow2.c\nindex cbe9681fb0..2ec399663e 100644\n--- a/block/qcow2.c\n+++ b/block/qcow2.c\n@@ -2915,7 +2915,7 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)\n goto finish;\n }\n buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);\n- prealloc = qapi_enum_parse(PreallocMode_lookup, buf,\n+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,\n PREALLOC_MODE_OFF, &local_err);\n if (local_err) {\n error_propagate(errp, local_err);\n@@ -3605,7 +3605,7 @@ static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, BlockDriverState *in_bs,\n }\n \n optstr = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);\n- prealloc = qapi_enum_parse(PreallocMode_lookup, optstr,\n+ prealloc = qapi_enum_parse(&PreallocMode_lookup, optstr,\n PREALLOC_MODE_OFF, &local_err);\n g_free(optstr);\n if (local_err) {\ndiff --git a/block/quorum.c b/block/quorum.c\nindex 8d1c9f6306..272f9a5b77 100644\n--- a/block/quorum.c\n+++ b/block/quorum.c\n@@ -912,7 +912,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,\n if (!pattern_str) {\n ret = QUORUM_READ_PATTERN_QUORUM;\n } else {\n- ret = qapi_enum_parse(QuorumReadPattern_lookup, pattern_str,\n+ ret = qapi_enum_parse(&QuorumReadPattern_lookup, pattern_str,\n -EINVAL, NULL);\n }\n if (ret < 0) {\ndiff --git a/blockdev.c b/blockdev.c\nindex bfb2a95299..796beaed94 100644\n--- a/blockdev.c\n+++ b/blockdev.c\n@@ -437,7 +437,7 @@ static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,\n \n if (detect_zeroes) {\n *detect_zeroes =\n- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,\n+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,\n qemu_opt_get(opts, \"detect-zeroes\"),\n BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,\n &local_error);\ndiff --git a/crypto/block-luks.c b/crypto/block-luks.c\nindex 4e828951d4..36bc856084 100644\n--- a/crypto/block-luks.c\n+++ b/crypto/block-luks.c\n@@ -264,7 +264,7 @@ qcrypto_block_luks_cipher_alg_lookup(QCryptoCipherAlgorithm alg,\n /* XXX replace with qapi_enum_parse() in future, when we can\n * make that function emit a more friendly error message */\n static int qcrypto_block_luks_name_lookup(const char *name,\n- const char *const *map,\n+ const QEnumLookup *map,\n const char *type,\n Error **errp)\n {\n@@ -279,19 +279,19 @@ static int qcrypto_block_luks_name_lookup(const char *name,\n \n #define qcrypto_block_luks_cipher_mode_lookup(name, errp) \\\n qcrypto_block_luks_name_lookup(name, \\\n- QCryptoCipherMode_lookup, \\\n+ &QCryptoCipherMode_lookup, \\\n \"Cipher mode\", \\\n errp)\n \n #define qcrypto_block_luks_hash_name_lookup(name, errp) \\\n qcrypto_block_luks_name_lookup(name, \\\n- QCryptoHashAlgorithm_lookup, \\\n+ &QCryptoHashAlgorithm_lookup, \\\n \"Hash algorithm\", \\\n errp)\n \n #define qcrypto_block_luks_ivgen_name_lookup(name, errp) \\\n qcrypto_block_luks_name_lookup(name, \\\n- QCryptoIVGenAlgorithm_lookup, \\\n+ &QCryptoIVGenAlgorithm_lookup, \\\n \"IV generator\", \\\n errp)\n \ndiff --git a/crypto/secret.c b/crypto/secret.c\nindex 285ab7a63c..388abd7df5 100644\n--- a/crypto/secret.c\n+++ b/crypto/secret.c\n@@ -378,7 +378,7 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)\n NULL);\n object_class_property_add_enum(oc, \"format\",\n \"QCryptoSecretFormat\",\n- QCryptoSecretFormat_lookup,\n+ &QCryptoSecretFormat_lookup,\n qcrypto_secret_prop_get_format,\n qcrypto_secret_prop_set_format,\n NULL);\ndiff --git a/crypto/tlscreds.c b/crypto/tlscreds.c\nindex a8965531b6..3cd41035bb 100644\n--- a/crypto/tlscreds.c\n+++ b/crypto/tlscreds.c\n@@ -233,7 +233,7 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)\n NULL);\n object_class_property_add_enum(oc, \"endpoint\",\n \"QCryptoTLSCredsEndpoint\",\n- QCryptoTLSCredsEndpoint_lookup,\n+ &QCryptoTLSCredsEndpoint_lookup,\n qcrypto_tls_creds_prop_get_endpoint,\n qcrypto_tls_creds_prop_set_endpoint,\n NULL);\ndiff --git a/hmp.c b/hmp.c\nindex 30819fe602..cd046c6d71 100644\n--- a/hmp.c\n+++ b/hmp.c\n@@ -1528,7 +1528,7 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)\n MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));\n int val;\n \n- val = qapi_enum_parse(MigrationCapability_lookup, cap, -1, &err);\n+ val = qapi_enum_parse(&MigrationCapability_lookup, cap, -1, &err);\n if (val < 0) {\n goto end;\n }\n@@ -1557,7 +1557,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)\n Error *err = NULL;\n int val, ret;\n \n- val = qapi_enum_parse(MigrationParameter_lookup, param, -1, &err);\n+ val = qapi_enum_parse(&MigrationParameter_lookup, param, -1, &err);\n if (val < 0) {\n goto cleanup;\n }\n@@ -1735,7 +1735,7 @@ void hmp_change(Monitor *mon, const QDict *qdict)\n } else {\n if (read_only) {\n read_only_mode =\n- qapi_enum_parse(BlockdevChangeReadOnlyMode_lookup,\n+ qapi_enum_parse(&BlockdevChangeReadOnlyMode_lookup,\n read_only,\n BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);\n if (err) {\ndiff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c\nindex 7512bd4379..1dc80fcea2 100644\n--- a/hw/core/qdev-properties.c\n+++ b/hw/core/qdev-properties.c\n@@ -587,7 +587,7 @@ const PropertyInfo qdev_prop_macaddr = {\n const PropertyInfo qdev_prop_on_off_auto = {\n .name = \"OnOffAuto\",\n .description = \"on/off/auto\",\n- .enum_table = OnOffAuto_lookup,\n+ .enum_table = &OnOffAuto_lookup,\n .get = get_enum,\n .set = set_enum,\n .set_default_value = set_default_value_enum,\n@@ -599,7 +599,7 @@ QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));\n \n const PropertyInfo qdev_prop_losttickpolicy = {\n .name = \"LostTickPolicy\",\n- .enum_table = LostTickPolicy_lookup,\n+ .enum_table = &LostTickPolicy_lookup,\n .get = get_enum,\n .set = set_enum,\n .set_default_value = set_default_value_enum,\n@@ -613,7 +613,7 @@ const PropertyInfo qdev_prop_blockdev_on_error = {\n .name = \"BlockdevOnError\",\n .description = \"Error handling policy, \"\n \"report/ignore/enospc/stop/auto\",\n- .enum_table = BlockdevOnError_lookup,\n+ .enum_table = &BlockdevOnError_lookup,\n .get = get_enum,\n .set = set_enum,\n .set_default_value = set_default_value_enum,\n@@ -627,7 +627,7 @@ const PropertyInfo qdev_prop_bios_chs_trans = {\n .name = \"BiosAtaTranslation\",\n .description = \"Logical CHS translation algorithm, \"\n \"auto/none/lba/large/rechs\",\n- .enum_table = BiosAtaTranslation_lookup,\n+ .enum_table = &BiosAtaTranslation_lookup,\n .get = get_enum,\n .set = set_enum,\n .set_default_value = set_default_value_enum,\n@@ -639,7 +639,7 @@ const PropertyInfo qdev_prop_fdc_drive_type = {\n .name = \"FdcDriveType\",\n .description = \"FDC drive type, \"\n \"144/288/120/none/auto\",\n- .enum_table = FloppyDriveType_lookup,\n+ .enum_table = &FloppyDriveType_lookup,\n .get = get_enum,\n .set = set_enum,\n .set_default_value = set_default_value_enum,\ndiff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h\nindex ae317286a4..089146197f 100644\n--- a/include/hw/qdev-core.h\n+++ b/include/hw/qdev-core.h\n@@ -249,7 +249,7 @@ struct Property {\n struct PropertyInfo {\n const char *name;\n const char *description;\n- const char * const *enum_table;\n+ const QEnumLookup *enum_table;\n int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);\n void (*set_default_value)(Object *obj, const Property *prop);\n void (*create)(Object *obj, Property *prop, Error **errp);\ndiff --git a/include/qapi/util.h b/include/qapi/util.h\nindex 5e50d0c1ce..a7c3c64148 100644\n--- a/include/qapi/util.h\n+++ b/include/qapi/util.h\n@@ -11,8 +11,13 @@\n #ifndef QAPI_UTIL_H\n #define QAPI_UTIL_H\n \n-const char *qapi_enum_lookup(const char *const lookup[], int val);\n-int qapi_enum_parse(const char * const lookup[], const char *buf,\n+typedef struct QEnumLookup {\n+ const char *const *array;\n+ int size;\n+} QEnumLookup;\n+\n+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);\n+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,\n int def, Error **errp);\n \n int parse_qapi_name(const char *name, bool complete);\ndiff --git a/include/qapi/visitor.h b/include/qapi/visitor.h\nindex 0f3b8cb459..62a51a54cb 100644\n--- a/include/qapi/visitor.h\n+++ b/include/qapi/visitor.h\n@@ -469,7 +469,7 @@ bool visit_optional(Visitor *v, const char *name, bool *present);\n * that visit_type_str() must have no unwelcome side effects.\n */\n void visit_type_enum(Visitor *v, const char *name, int *obj,\n- const char *const strings[], Error **errp);\n+ const QEnumLookup *lookup, Error **errp);\n \n /*\n * Check if visitor is an input visitor.\ndiff --git a/include/qom/object.h b/include/qom/object.h\nindex 1b828994fa..f3e5cff37a 100644\n--- a/include/qom/object.h\n+++ b/include/qom/object.h\n@@ -1415,14 +1415,14 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,\n */\n void object_property_add_enum(Object *obj, const char *name,\n const char *typename,\n- const char * const *strings,\n+ const QEnumLookup *lookup,\n int (*get)(Object *, Error **),\n void (*set)(Object *, int, Error **),\n Error **errp);\n \n void object_class_property_add_enum(ObjectClass *klass, const char *name,\n const char *typename,\n- const char * const *strings,\n+ const QEnumLookup *lookup,\n int (*get)(Object *, Error **),\n void (*set)(Object *, int, Error **),\n Error **errp);\ndiff --git a/migration/global_state.c b/migration/global_state.c\nindex 8db2f19459..dfdaf63910 100644\n--- a/migration/global_state.c\n+++ b/migration/global_state.c\n@@ -88,7 +88,7 @@ static int global_state_post_load(void *opaque, int version_id)\n s->received = true;\n trace_migrate_global_state_post_load(runstate);\n \n- r = qapi_enum_parse(RunState_lookup, runstate, -1, &local_err);\n+ r = qapi_enum_parse(&RunState_lookup, runstate, -1, &local_err);\n \n if (r == -1) {\n if (local_err) {\ndiff --git a/net/filter.c b/net/filter.c\nindex 1dfd2caa23..2fd7d7d663 100644\n--- a/net/filter.c\n+++ b/net/filter.c\n@@ -179,7 +179,7 @@ static void netfilter_init(Object *obj)\n netfilter_get_netdev_id, netfilter_set_netdev_id,\n NULL);\n object_property_add_enum(obj, \"queue\", \"NetFilterDirection\",\n- NetFilterDirection_lookup,\n+ &NetFilterDirection_lookup,\n netfilter_get_direction, netfilter_set_direction,\n NULL);\n object_property_add_str(obj, \"status\",\ndiff --git a/qapi/qapi-util.c b/qapi/qapi-util.c\nindex 7af2f04d36..e9b266bb70 100644\n--- a/qapi/qapi-util.c\n+++ b/qapi/qapi-util.c\n@@ -14,14 +14,14 @@\n #include \"qapi/error.h\"\n #include \"qemu-common.h\"\n \n-const char *qapi_enum_lookup(const char *const lookup[], int val)\n+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)\n {\n- assert(val >= 0);\n+ assert(val >= 0 && val < lookup->size);\n \n- return lookup[val];\n+ return lookup->array[val];\n }\n \n-int qapi_enum_parse(const char * const lookup[], const char *buf,\n+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,\n int def, Error **errp)\n {\n int i;\n@@ -30,8 +30,8 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,\n return def;\n }\n \n- for (i = 0; lookup[i]; i++) {\n- if (!strcmp(buf, lookup[i])) {\n+ for (i = 0; i < lookup->size; i++) {\n+ if (!strcmp(buf, lookup->array[i])) {\n return i;\n }\n }\ndiff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c\nindex 30dc85b6f3..3dcb968867 100644\n--- a/qapi/qapi-visit-core.c\n+++ b/qapi/qapi-visit-core.c\n@@ -333,24 +333,26 @@ void visit_type_null(Visitor *v, const char *name, QNull **obj,\n }\n \n static void output_type_enum(Visitor *v, const char *name, int *obj,\n- const char *const strings[], Error **errp)\n+ const QEnumLookup *lookup, Error **errp)\n {\n- int i = 0;\n int value = *obj;\n char *enum_str;\n \n- while (strings[i++] != NULL);\n- if (value < 0 || value >= i - 1) {\n+ /*\n+ * TODO why is this an error, not an assertion? If assertion:\n+ * delete, and rely on qapi_enum_lookup()\n+ */\n+ if (value < 0 || value >= lookup->size) {\n error_setg(errp, QERR_INVALID_PARAMETER, name ? name : \"null\");\n return;\n }\n \n- enum_str = (char *)qapi_enum_lookup(strings, value);\n+ enum_str = (char *)qapi_enum_lookup(lookup, value);\n visit_type_str(v, name, &enum_str, errp);\n }\n \n static void input_type_enum(Visitor *v, const char *name, int *obj,\n- const char *const strings[], Error **errp)\n+ const QEnumLookup *lookup, Error **errp)\n {\n Error *local_err = NULL;\n int64_t value;\n@@ -362,7 +364,7 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,\n return;\n }\n \n- value = qapi_enum_parse(strings, enum_str, -1, NULL);\n+ value = qapi_enum_parse(lookup, enum_str, -1, NULL);\n if (value < 0) {\n error_setg(errp, QERR_INVALID_PARAMETER, enum_str);\n g_free(enum_str);\n@@ -374,16 +376,16 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,\n }\n \n void visit_type_enum(Visitor *v, const char *name, int *obj,\n- const char *const strings[], Error **errp)\n+ const QEnumLookup *lookup, Error **errp)\n {\n- assert(obj && strings);\n+ assert(obj && lookup);\n trace_visit_type_enum(v, name, obj);\n switch (v->type) {\n case VISITOR_INPUT:\n- input_type_enum(v, name, obj, strings, errp);\n+ input_type_enum(v, name, obj, lookup, errp);\n break;\n case VISITOR_OUTPUT:\n- output_type_enum(v, name, obj, strings, errp);\n+ output_type_enum(v, name, obj, lookup, errp);\n break;\n case VISITOR_CLONE:\n /* nothing further to do, scalar value was already copied by\ndiff --git a/qemu-img.c b/qemu-img.c\nindex a72a2e3133..df984b11b9 100644\n--- a/qemu-img.c\n+++ b/qemu-img.c\n@@ -3489,7 +3489,7 @@ static int img_resize(int argc, char **argv)\n image_opts = true;\n break;\n case OPTION_PREALLOCATION:\n- prealloc = qapi_enum_parse(PreallocMode_lookup, optarg,\n+ prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg,\n PREALLOC_MODE__MAX, NULL);\n if (prealloc == PREALLOC_MODE__MAX) {\n error_report(\"Invalid preallocation mode '%s'\", optarg);\ndiff --git a/qemu-nbd.c b/qemu-nbd.c\nindex a97f3f4540..d75ca51482 100644\n--- a/qemu-nbd.c\n+++ b/qemu-nbd.c\n@@ -638,7 +638,7 @@ int main(int argc, char **argv)\n break;\n case QEMU_NBD_OPT_DETECT_ZEROES:\n detect_zeroes =\n- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,\n+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,\n optarg,\n BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,\n &local_err);\ndiff --git a/qom/object.c b/qom/object.c\nindex fe6e744b4d..3e18537e9b 100644\n--- a/qom/object.c\n+++ b/qom/object.c\n@@ -1246,7 +1246,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,\n }\n \n typedef struct EnumProperty {\n- const char * const *strings;\n+ const QEnumLookup *lookup;\n int (*get)(Object *, Error **);\n void (*set)(Object *, int, Error **);\n } EnumProperty;\n@@ -1284,7 +1284,7 @@ int object_property_get_enum(Object *obj, const char *name,\n visit_complete(v, &str);\n visit_free(v);\n v = string_input_visitor_new(str);\n- visit_type_enum(v, name, &ret, enumprop->strings, errp);\n+ visit_type_enum(v, name, &ret, enumprop->lookup, errp);\n \n g_free(str);\n visit_free(v);\n@@ -1950,7 +1950,7 @@ static void property_get_enum(Object *obj, Visitor *v, const char *name,\n return;\n }\n \n- visit_type_enum(v, name, &value, prop->strings, errp);\n+ visit_type_enum(v, name, &value, prop->lookup, errp);\n }\n \n static void property_set_enum(Object *obj, Visitor *v, const char *name,\n@@ -1960,7 +1960,7 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,\n int value;\n Error *err = NULL;\n \n- visit_type_enum(v, name, &value, prop->strings, &err);\n+ visit_type_enum(v, name, &value, prop->lookup, &err);\n if (err) {\n error_propagate(errp, err);\n return;\n@@ -1977,7 +1977,7 @@ static void property_release_enum(Object *obj, const char *name,\n \n void object_property_add_enum(Object *obj, const char *name,\n const char *typename,\n- const char * const *strings,\n+ const QEnumLookup *lookup,\n int (*get)(Object *, Error **),\n void (*set)(Object *, int, Error **),\n Error **errp)\n@@ -1985,7 +1985,7 @@ void object_property_add_enum(Object *obj, const char *name,\n Error *local_err = NULL;\n EnumProperty *prop = g_malloc(sizeof(*prop));\n \n- prop->strings = strings;\n+ prop->lookup = lookup;\n prop->get = get;\n prop->set = set;\n \n@@ -2002,7 +2002,7 @@ void object_property_add_enum(Object *obj, const char *name,\n \n void object_class_property_add_enum(ObjectClass *klass, const char *name,\n const char *typename,\n- const char * const *strings,\n+ const QEnumLookup *lookup,\n int (*get)(Object *, Error **),\n void (*set)(Object *, int, Error **),\n Error **errp)\n@@ -2010,7 +2010,7 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,\n Error *local_err = NULL;\n EnumProperty *prop = g_malloc(sizeof(*prop));\n \n- prop->strings = strings;\n+ prop->lookup = lookup;\n prop->get = get;\n prop->set = set;\n \ndiff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py\nindex bd0b742236..7e1cfc13f0 100644\n--- a/scripts/qapi-visit.py\n+++ b/scripts/qapi-visit.py\n@@ -153,7 +153,7 @@ def gen_visit_enum(name):\n void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error **errp)\n {\n int value = *obj;\n- visit_type_enum(v, name, &value, %(c_name)s_lookup, errp);\n+ visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);\n *obj = value;\n }\n ''',\ndiff --git a/scripts/qapi.py b/scripts/qapi.py\nindex 8736b9c786..39a67270fc 100644\n--- a/scripts/qapi.py\n+++ b/scripts/qapi.py\n@@ -1849,19 +1849,22 @@ def guardend(name):\n def gen_enum_lookup(name, values, prefix=None):\n ret = mcgen('''\n \n-const char *const %(c_name)s_lookup[] = {\n+const QEnumLookup %(c_name)s_lookup = {\n+ .array = (const char *const[]) {\n ''',\n c_name=c_name(name))\n for value in values:\n index = c_enum_const(name, value, prefix)\n ret += mcgen('''\n- [%(index)s] = \"%(value)s\",\n+ [%(index)s] = \"%(value)s\",\n ''',\n index=index, value=value)\n \n max_index = c_enum_const(name, '_MAX', prefix)\n ret += mcgen('''\n- [%(max_index)s] = NULL,\n+ [%(max_index)s] = NULL,\n+ },\n+ .size = %(max_index)s\n };\n ''',\n max_index=max_index)\n@@ -1895,9 +1898,9 @@ typedef enum %(c_name)s {\n ret += mcgen('''\n \n #define %(c_name)s_str(val) \\\\\n- qapi_enum_lookup(%(c_name)s_lookup, (val))\n+ qapi_enum_lookup(&%(c_name)s_lookup, (val))\n \n-extern const char *const %(c_name)s_lookup[];\n+extern const QEnumLookup %(c_name)s_lookup;\n ''',\n c_name=c_name(name))\n return ret\ndiff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c\nindex c51e6e734d..07e351f950 100644\n--- a/tests/check-qom-proplist.c\n+++ b/tests/check-qom-proplist.c\n@@ -46,11 +46,14 @@ enum DummyAnimal {\n DUMMY_LAST,\n };\n \n-static const char *const dummy_animal_map[DUMMY_LAST + 1] = {\n- [DUMMY_FROG] = \"frog\",\n- [DUMMY_ALLIGATOR] = \"alligator\",\n- [DUMMY_PLATYPUS] = \"platypus\",\n- [DUMMY_LAST] = NULL,\n+const QEnumLookup dummy_animal_map = {\n+ .array = (const char *const[]) {\n+ [DUMMY_FROG] = \"frog\",\n+ [DUMMY_ALLIGATOR] = \"alligator\",\n+ [DUMMY_PLATYPUS] = \"platypus\",\n+ [DUMMY_LAST] = NULL,\n+ },\n+ .size = DUMMY_LAST\n };\n \n struct DummyObject {\n@@ -142,7 +145,7 @@ static void dummy_class_init(ObjectClass *cls, void *data)\n NULL);\n object_class_property_add_enum(cls, \"av\",\n \"DummyAnimal\",\n- dummy_animal_map,\n+ &dummy_animal_map,\n dummy_get_av,\n dummy_set_av,\n NULL);\ndiff --git a/tests/qmp-test.c b/tests/qmp-test.c\nindex ec99814f79..ed8f45ad82 100644\n--- a/tests/qmp-test.c\n+++ b/tests/qmp-test.c\n@@ -181,7 +181,7 @@ static void test_query(const void *data)\n g_assert(qdict_haskey(resp, \"return\"));\n } else {\n g_assert(error);\n- g_assert_cmpint(qapi_enum_parse(QapiErrorClass_lookup, error_class,\n+ g_assert_cmpint(qapi_enum_parse(&QapiErrorClass_lookup, error_class,\n -1, &error_abort),\n ==, expected_error_class);\n }\ndiff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c\nindex 0992bdb218..4b5e4f8bd3 100644\n--- a/tests/test-qapi-util.c\n+++ b/tests/test-qapi-util.c\n@@ -19,19 +19,19 @@ static void test_qapi_enum_parse(void)\n Error *err = NULL;\n int ret;\n \n- ret = qapi_enum_parse(QType_lookup, NULL, QTYPE_NONE, &error_abort);\n+ ret = qapi_enum_parse(&QType_lookup, NULL, QTYPE_NONE, &error_abort);\n g_assert_cmpint(ret, ==, QTYPE_NONE);\n \n- ret = qapi_enum_parse(QType_lookup, \"junk\", -1, NULL);\n+ ret = qapi_enum_parse(&QType_lookup, \"junk\", -1, NULL);\n g_assert_cmpint(ret, ==, -1);\n \n- ret = qapi_enum_parse(QType_lookup, \"junk\", -1, &err);\n+ ret = qapi_enum_parse(&QType_lookup, \"junk\", -1, &err);\n error_free_or_abort(&err);\n \n- ret = qapi_enum_parse(QType_lookup, \"none\", -1, &error_abort);\n+ ret = qapi_enum_parse(&QType_lookup, \"none\", -1, &error_abort);\n g_assert_cmpint(ret, ==, QTYPE_NONE);\n \n- ret = qapi_enum_parse(QType_lookup, QType_str(QTYPE__MAX - 1),\n+ ret = qapi_enum_parse(&QType_lookup, QType_str(QTYPE__MAX - 1),\n QTYPE__MAX - 1, &error_abort);\n g_assert_cmpint(ret, ==, QTYPE__MAX - 1);\n }\ndiff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c\nindex f8720aa5eb..fe591814e4 100644\n--- a/tests/test-qobject-input-visitor.c\n+++ b/tests/test-qobject-input-visitor.c\n@@ -1110,7 +1110,7 @@ static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data,\n error_free_or_abort(&err);\n visit_optional(v, \"optional\", &present);\n g_assert(!present);\n- visit_type_enum(v, \"enum\", &en, EnumOne_lookup, &err);\n+ visit_type_enum(v, \"enum\", &en, &EnumOne_lookup, &err);\n error_free_or_abort(&err);\n visit_type_int(v, \"i64\", &i64, &err);\n error_free_or_abort(&err);\ndiff --git a/tpm.c b/tpm.c\nindex 111f1ca63f..2d830d072a 100644\n--- a/tpm.c\n+++ b/tpm.c\n@@ -33,7 +33,7 @@ void tpm_register_model(enum TpmModel model)\n \n const TPMDriverOps *tpm_get_backend_driver(const char *type)\n {\n- int i = qapi_enum_parse(TpmType_lookup, type, -1, NULL);\n+ int i = qapi_enum_parse(&TpmType_lookup, type, -1, NULL);\n \n return i >= 0 ? be_drivers[i] : NULL;\n }\n", "prefixes": [ "PULL", "v2", "46/47" ] }