qapi: Track all failures between visit_start/stop
Inside the generated code between visit_start_struct() and
visit_end_struct(), we were blindly setting the error into
the caller's errp parameter.  But a future patch to split
visit_end_struct() will require that we take action based
on whether an error has occurred, which requires us to track
all actions through a local err.  Rewrite the visits to be
more in line with the other generated calls.
Generated code changes look like:
|     visit_start_struct(v, (void **)obj, "Abort", name, sizeof(Abort), &err);
|-    if (!err) {
|-        if (*obj) {
|-            visit_type_Abort_fields(v, obj, errp);
|-        }
|-        visit_end_struct(v, &err);
|+    if (err) {
|+        goto out;
|     }
|+    if (!*obj) {
|+        goto out_obj;
|+    }
|+    visit_type_Abort_fields(v, obj, &err);
|+    error_propagate(errp, err);
|+    err = NULL;
|+out_obj:
|+    visit_end_struct(v, &err);
|+out:
|     error_propagate(errp, err);
| }
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1454075341-13658-12-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									a16e3e5c58
								
							
						
					
					
						commit
						92b09babc1
					
				| @ -2,7 +2,7 @@ | ||||
| # QAPI visitor generator | ||||
| # | ||||
| # Copyright IBM, Corp. 2011 | ||||
| # Copyright (C) 2014-2015 Red Hat, Inc. | ||||
| # Copyright (C) 2014-2016 Red Hat, Inc. | ||||
| # | ||||
| # Authors: | ||||
| #  Anthony Liguori <aliguori@us.ibm.com> | ||||
| @ -123,12 +123,18 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error | ||||
|     Error *err = NULL; | ||||
| 
 | ||||
|     visit_start_struct(v, (void **)obj, "%(name)s", name, sizeof(%(c_name)s), &err); | ||||
|     if (!err) { | ||||
|         if (*obj) { | ||||
|             visit_type_%(c_name)s_fields(v, obj, errp); | ||||
|         } | ||||
|         visit_end_struct(v, &err); | ||||
|     if (err) { | ||||
|         goto out; | ||||
|     } | ||||
|     if (!*obj) { | ||||
|         goto out_obj; | ||||
|     } | ||||
|     visit_type_%(c_name)s_fields(v, obj, &err); | ||||
|     error_propagate(errp, err); | ||||
|     err = NULL; | ||||
| out_obj: | ||||
|     visit_end_struct(v, &err); | ||||
| out: | ||||
|     error_propagate(errp, err); | ||||
| } | ||||
| ''', | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Eric Blake
						Eric Blake