qapi-visit: Split off visit_type_FOO_fields forward decl
We generate a static visit_type_FOO_fields() for every type FOO. However, sometimes we need a forward declaration. Split the code to generate the forward declaration out of gen_visit_implicit_struct() into a new gen_visit_fields_decl(), and also prepare for a forward declaration to be emitted during gen_visit_struct(), so that a future patch can switch from using visit_type_FOO_implicit() to the simpler visit_type_FOO_fields() as part of unboxing the base class of a struct. No change to generated code. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1445898903-12082-8-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
		
							parent
							
								
									98481bfcd6
								
							
						
					
					
						commit
						d02cf37766
					
				@ -15,7 +15,12 @@
 | 
			
		||||
from qapi import *
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
# visit_type_FOO_implicit() is emitted as needed; track if it has already
 | 
			
		||||
# been output.
 | 
			
		||||
implicit_structs_seen = set()
 | 
			
		||||
 | 
			
		||||
# visit_type_FOO_fields() is always emitted; track if a forward declaration
 | 
			
		||||
# or implementation has already been output.
 | 
			
		||||
struct_fields_seen = set()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -29,19 +34,24 @@ void visit_type_%(c_name)s(Visitor *v, %(c_type)sobj, const char *name, Error **
 | 
			
		||||
                 c_name=c_name(name), c_type=c_type)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_visit_implicit_struct(typ):
 | 
			
		||||
    if typ in implicit_structs_seen:
 | 
			
		||||
        return ''
 | 
			
		||||
    implicit_structs_seen.add(typ)
 | 
			
		||||
 | 
			
		||||
def gen_visit_fields_decl(typ):
 | 
			
		||||
    ret = ''
 | 
			
		||||
    if typ.name not in struct_fields_seen:
 | 
			
		||||
        # Need a forward declaration
 | 
			
		||||
        ret += mcgen('''
 | 
			
		||||
 | 
			
		||||
static void visit_type_%(c_type)s_fields(Visitor *v, %(c_type)s **obj, Error **errp);
 | 
			
		||||
''',
 | 
			
		||||
                     c_type=typ.c_name())
 | 
			
		||||
        struct_fields_seen.add(typ.name)
 | 
			
		||||
    return ret
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_visit_implicit_struct(typ):
 | 
			
		||||
    if typ in implicit_structs_seen:
 | 
			
		||||
        return ''
 | 
			
		||||
    implicit_structs_seen.add(typ)
 | 
			
		||||
 | 
			
		||||
    ret = gen_visit_fields_decl(typ)
 | 
			
		||||
 | 
			
		||||
    ret += mcgen('''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user