On 3/11/21 11:24 AM, Paolo Bonzini wrote: > Emulators are currently using OptsVisitor (via user_creatable_add_opts) > to parse the -object command line option. This has one extra feature, > compared to keyval, which is automatic conversion of integers to lists > as well as support for lists as repeated options: > > -object > memory-backend-ram,id=pc.ram,size=1048576000,host-nodes=0,policy=bind > > So we cannot replace OptsVisitor with keyval right now. Still, this > patch moves the user_creatable_add_opts logic to vl.c since it is > not needed anywhere else, and makes it go through user_creatable_add_qapi. > > In order to minimize code changes, the predicate still takes a string. > This can be changed later to use the ObjectType QAPI enum directly. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > include/qom/object_interfaces.h | 50 ++-------------------- > qom/object_interfaces.c | 57 +------------------------ > softmmu/vl.c | 73 +++++++++++++++++++++++++-------- > 3 files changed, 60 insertions(+), 120 deletions(-) >
> @@ -1684,6 +1691,48 @@ static int machine_set_property(void *opaque, > return object_parse_property_opt(opaque, name, value, "type", errp); > } > > +static void object_option_foreach_add(bool (*type_opt_predicate)(const char > *), Error **errp) Should this return a bool... > +{ > + ObjectOption *opt, *next; > + > + QTAILQ_FOREACH_SAFE(opt, &object_opts, next, next) { > + const char *type = ObjectType_str(opt->opts->qom_type); > + if (type_opt_predicate(type)) { > + if (!user_creatable_add_qapi(opt->opts, errp)) { > + return; with return false here, > + } > + qapi_free_ObjectOptions(opt->opts); > + QTAILQ_REMOVE(&object_opts, opt, next); > + } > + } and true here, to make it easier for callers to detect failure without having to inspect errp? > +} > + > +static void object_option_parse(const char *optarg) > @@ -1815,9 +1860,7 @@ static void qemu_create_early_backends(void) > exit(1); > } > > - qemu_opts_foreach(qemu_find_opts("object"), > - user_creatable_add_opts_foreach, > - object_create_early, &error_fatal); > + object_option_foreach_add(object_create_early, &error_fatal); Then again, since the only callers pass error_fatal, we never reach the early return. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org