qapi: Avoid use of misnamed DO_UPCAST()
The macro DO_UPCAST() is incorrectly named: it converts from a parent class to a derived class (which is a downcast). Better, and more consistent with some of the other qapi visitors, is to use the container_of() macro through a to_FOO() helper. Names like 'to_ov()' may be a bit short, but for a static helper it doesn't hurt too much, and matches existing practice in files like qmp-input-visitor.c. Our current definition of container_of() is weaker than DO_UPCAST(), in that it does not require the derived class to have Visitor as its first member, but this does not hurt our usage patterns in qapi visitors. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <1454075341-13658-3-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
		
							parent
							
								
									6e8e5cb9aa
								
							
						
					
					
						commit
						d7bea75d35
					
				| @ -90,6 +90,12 @@ struct OptsVisitor | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static OptsVisitor *to_ov(Visitor *v) | ||||
| { | ||||
|     return container_of(v, OptsVisitor, visitor); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void | ||||
| destroy_list(gpointer list) | ||||
| { | ||||
| @ -122,7 +128,7 @@ static void | ||||
| opts_start_struct(Visitor *v, void **obj, const char *kind, | ||||
|                   const char *name, size_t size, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
| 
 | ||||
|     if (obj) { | ||||
| @ -161,7 +167,7 @@ ghr_true(gpointer ign_key, gpointer ign_value, gpointer ign_user_data) | ||||
| static void | ||||
| opts_end_struct(Visitor *v, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     GQueue *any; | ||||
| 
 | ||||
|     if (--ov->depth > 0) { | ||||
| @ -203,7 +209,7 @@ lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp) | ||||
| static void | ||||
| opts_start_list(Visitor *v, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
| 
 | ||||
|     /* we can't traverse a list in a list */ | ||||
|     assert(ov->list_mode == LM_NONE); | ||||
| @ -217,7 +223,7 @@ opts_start_list(Visitor *v, const char *name, Error **errp) | ||||
| static GenericList * | ||||
| opts_next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     GenericList **link; | ||||
| 
 | ||||
|     switch (ov->list_mode) { | ||||
| @ -266,7 +272,7 @@ opts_next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| static void | ||||
| opts_end_list(Visitor *v, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
| 
 | ||||
|     assert(ov->list_mode == LM_STARTED || | ||||
|            ov->list_mode == LM_IN_PROGRESS || | ||||
| @ -308,7 +314,7 @@ processed(OptsVisitor *ov, const char *name) | ||||
| static void | ||||
| opts_type_str(Visitor *v, char **obj, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
| 
 | ||||
|     opt = lookup_scalar(ov, name, errp); | ||||
| @ -324,7 +330,7 @@ opts_type_str(Visitor *v, char **obj, const char *name, Error **errp) | ||||
| static void | ||||
| opts_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
| 
 | ||||
|     opt = lookup_scalar(ov, name, errp); | ||||
| @ -357,7 +363,7 @@ opts_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) | ||||
| static void | ||||
| opts_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
|     const char *str; | ||||
|     long long val; | ||||
| @ -413,7 +419,7 @@ opts_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) | ||||
| static void | ||||
| opts_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
|     const char *str; | ||||
|     unsigned long long val; | ||||
| @ -465,7 +471,7 @@ opts_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) | ||||
| static void | ||||
| opts_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
|     const QemuOpt *opt; | ||||
|     int64_t val; | ||||
|     char *endptr; | ||||
| @ -491,7 +497,7 @@ opts_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) | ||||
| static void | ||||
| opts_optional(Visitor *v, bool *present, const char *name) | ||||
| { | ||||
|     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); | ||||
|     OptsVisitor *ov = to_ov(v); | ||||
| 
 | ||||
|     /* we only support a single mandatory scalar field in a list node */ | ||||
|     assert(ov->list_mode == LM_NONE); | ||||
|  | ||||
| @ -33,6 +33,11 @@ struct StringInputVisitor | ||||
|     const char *string; | ||||
| }; | ||||
| 
 | ||||
| static StringInputVisitor *to_siv(Visitor *v) | ||||
| { | ||||
|     return container_of(v, StringInputVisitor, visitor); | ||||
| } | ||||
| 
 | ||||
| static void free_range(void *range, void *dummy) | ||||
| { | ||||
|     g_free(range); | ||||
| @ -121,7 +126,7 @@ error: | ||||
| static void | ||||
| start_list(Visitor *v, const char *name, Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
| 
 | ||||
|     parse_str(siv, errp); | ||||
| 
 | ||||
| @ -137,7 +142,7 @@ start_list(Visitor *v, const char *name, Error **errp) | ||||
| static GenericList * | ||||
| next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
|     GenericList **link; | ||||
|     Range *r; | ||||
| 
 | ||||
| @ -176,14 +181,14 @@ next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| static void | ||||
| end_list(Visitor *v, Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
|     siv->head = true; | ||||
| } | ||||
| 
 | ||||
| static void parse_type_int(Visitor *v, int64_t *obj, const char *name, | ||||
|                            Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
| 
 | ||||
|     if (!siv->string) { | ||||
|         error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", | ||||
| @ -225,7 +230,7 @@ error: | ||||
| static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, | ||||
|                             Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
|     Error *err = NULL; | ||||
|     uint64_t val; | ||||
| 
 | ||||
| @ -247,7 +252,7 @@ static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, | ||||
| static void parse_type_bool(Visitor *v, bool *obj, const char *name, | ||||
|                             Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
| 
 | ||||
|     if (siv->string) { | ||||
|         if (!strcasecmp(siv->string, "on") || | ||||
| @ -271,7 +276,7 @@ static void parse_type_bool(Visitor *v, bool *obj, const char *name, | ||||
| static void parse_type_str(Visitor *v, char **obj, const char *name, | ||||
|                            Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
|     if (siv->string) { | ||||
|         *obj = g_strdup(siv->string); | ||||
|     } else { | ||||
| @ -283,7 +288,7 @@ static void parse_type_str(Visitor *v, char **obj, const char *name, | ||||
| static void parse_type_number(Visitor *v, double *obj, const char *name, | ||||
|                               Error **errp) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
|     char *endp = (char *) siv->string; | ||||
|     double val; | ||||
| 
 | ||||
| @ -302,7 +307,7 @@ static void parse_type_number(Visitor *v, double *obj, const char *name, | ||||
| 
 | ||||
| static void parse_optional(Visitor *v, bool *present, const char *name) | ||||
| { | ||||
|     StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); | ||||
|     StringInputVisitor *siv = to_siv(v); | ||||
| 
 | ||||
|     if (!siv->string) { | ||||
|         *present = false; | ||||
|  | ||||
| @ -67,6 +67,11 @@ struct StringOutputVisitor | ||||
|     GList *ranges; | ||||
| }; | ||||
| 
 | ||||
| static StringOutputVisitor *to_sov(Visitor *v) | ||||
| { | ||||
|     return container_of(v, StringOutputVisitor, visitor); | ||||
| } | ||||
| 
 | ||||
| static void string_output_set(StringOutputVisitor *sov, char *string) | ||||
| { | ||||
|     if (sov->string) { | ||||
| @ -120,7 +125,7 @@ static void format_string(StringOutputVisitor *sov, Range *r, bool next, | ||||
| static void print_type_int(Visitor *v, int64_t *obj, const char *name, | ||||
|                            Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     GList *l; | ||||
| 
 | ||||
|     switch (sov->list_mode) { | ||||
| @ -196,7 +201,7 @@ static void print_type_int(Visitor *v, int64_t *obj, const char *name, | ||||
| static void print_type_size(Visitor *v, uint64_t *obj, const char *name, | ||||
|                            Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T', 'P', 'E' }; | ||||
|     uint64_t div, val; | ||||
|     char *out; | ||||
| @ -227,14 +232,14 @@ static void print_type_size(Visitor *v, uint64_t *obj, const char *name, | ||||
| static void print_type_bool(Visitor *v, bool *obj, const char *name, | ||||
|                             Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     string_output_set(sov, g_strdup(*obj ? "true" : "false")); | ||||
| } | ||||
| 
 | ||||
| static void print_type_str(Visitor *v, char **obj, const char *name, | ||||
|                            Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     char *out; | ||||
| 
 | ||||
|     if (sov->human) { | ||||
| @ -248,14 +253,14 @@ static void print_type_str(Visitor *v, char **obj, const char *name, | ||||
| static void print_type_number(Visitor *v, double *obj, const char *name, | ||||
|                               Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     string_output_set(sov, g_strdup_printf("%f", *obj)); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| start_list(Visitor *v, const char *name, Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
| 
 | ||||
|     /* we can't traverse a list in a list */ | ||||
|     assert(sov->list_mode == LM_NONE); | ||||
| @ -266,7 +271,7 @@ start_list(Visitor *v, const char *name, Error **errp) | ||||
| static GenericList * | ||||
| next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
|     GenericList *ret = NULL; | ||||
|     if (*list) { | ||||
|         if (sov->head) { | ||||
| @ -293,7 +298,7 @@ next_list(Visitor *v, GenericList **list, Error **errp) | ||||
| static void | ||||
| end_list(Visitor *v, Error **errp) | ||||
| { | ||||
|     StringOutputVisitor *sov = DO_UPCAST(StringOutputVisitor, visitor, v); | ||||
|     StringOutputVisitor *sov = to_sov(v); | ||||
| 
 | ||||
|     assert(sov->list_mode == LM_STARTED || | ||||
|            sov->list_mode == LM_END || | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Eric Blake
						Eric Blake