a
    Lg>1                     @   s0  d Z ddlmZmZ ddlmZmZmZmZ ddl	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ d"eeed	d
dZeedddZeee ee ee edddZeeedddZeedddZ eeedddZ!eedddZ"G dd de
Z#eeeeddd d!Z$dS )#aQ  
QAPI visitor generator

Copyright IBM, Corp. 2011
Copyright (C) 2014-2018 Red Hat, Inc.

Authors:
 Anthony Liguori <aliguori@us.ibm.com>
 Michael Roth    <mdroth@linux.vnet.ibm.com>
 Markus Armbruster <armbru@redhat.com>

This work is licensed under the terms of the GNU GPL, version 2.
See the COPYING file in the top-level directory.
    )ListOptional   )c_enum_constc_nameindentmcgen)QAPISchemaModularCVisitorgen_special_features	ifcontext)

QAPISchemaQAPISchemaAlternativesQAPISchemaBranchesQAPISchemaEnumMemberQAPISchemaEnumTypeQAPISchemaFeatureQAPISchemaIfCondQAPISchemaObjectTypeQAPISchemaObjectTypeMemberQAPISchemaType)QAPISourceInfoF)namescalarreturnc                 C   s*   t | d }|s|d7 }tdt | |dS )Nz **zj

bool visit_type_%(c_name)s(Visitor *v, const char *name,
                 %(c_type)sobj, Error **errp);
)r   c_type)r   r   )r   r   r    r   =/home2/Puru_Virtio_Blk/virtio-demo/qemu/scripts/qapi/visit.pygen_visit_decl,   s    r   r   r   c                 C   s   t dt| dS )NzQ

bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
r   r   r   r   r   r   r   gen_visit_members_decl8   s    r#   )r   basemembersbranchesr   c                 C   sD  t dt| d}d}|D ]H}|jr| s||j 7 }|t dt|jd7 }d}||j 7 }q||7 }|r|t d| d7 }|D ]}||j 7 }|jrdt|j }| rd	| }|t d
|j|d7 }t	  t
|j}|dkr|t d|j|d7 }t	  |t d|j |jt|jd7 }|dkrHt  |t d7 }|jrdt  |t d7 }||j 7 }q|r4|j}	t|	jtsJ |t dt|	jd7 }|jD ]x}
t|	jj|
j|	jj}||
j 7 }|
jjdkr|t d|d7 }n |t d||
j t|
jd7 }||
j 7 }q|t d7 }|t d7 }|S )NzR

bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
{
r     z.
    bool has_%(c_name)s = !!obj->%(c_name)s;

zc
    if (!visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, errp)) {
        return false;
    }
)r   has_zobj->z4
    if (visit_optional(v, "%(name)s", &%(has)s)) {
)r   has0z
    if (visit_policy_reject(v, "%(name)s", %(special_features)s, errp)) {
        return false;
    }
    if (!visit_policy_skip(v, "%(name)s", %(special_features)s)) {
)r   special_featureszf
    if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
        return false;
    }
)r   r   r   z
    }
z 
    switch (obj->%(c_name)s) {
q_emptyz#
    case %(case)s:
        break;
casez_
    case %(case)s:
        return visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, errp);
)r/   r   r   z%
    default:
        abort();
    }
z
    return true;
}
)r   r   optionalneed_hasifcondgen_ifr   	gen_endifr   increaser
   featurestypedecrease
tag_member
isinstancer   variantsr   prefix)r   r$   r%   r&   retsepmembr*   r,   r9   varZcase_strr   r   r   gen_visit_object_members@   s    




rA   )r   element_typer   c                 C   s   t dt| | dS )Na  

bool visit_type_%(c_name)s(Visitor *v, const char *name,
                 %(c_name)s **obj, Error **errp)
{
    bool ok = false;
    %(c_name)s *tail;
    size_t size = sizeof(**obj);

    if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) {
        return false;
    }

    for (tail = *obj; tail;
         tail = (%(c_name)s *)visit_next_list(v, (GenericList *)tail, size)) {
        if (!visit_type_%(c_elt_type)s(v, NULL, &tail->value, errp)) {
            goto out_obj;
        }
    }

    ok = visit_check_list(v, errp);
out_obj:
    visit_end_list(v, (void **)obj);
    if (!ok && visit_is_input(v)) {
        qapi_free_%(c_name)s(*obj);
        *obj = NULL;
    }
    return ok;
}
)r   Z
c_elt_typer!   )r   rB   r   r   r   gen_visit_list   s    rC   c                 C   s   t dt| dS )Nz

bool visit_type_%(c_name)s(Visitor *v, const char *name,
                 %(c_name)s *obj, Error **errp)
{
    int value = *obj;
    bool ok = visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
    *obj = value;
    return ok;
}
r    r!   r"   r   r   r   gen_visit_enum   s    rD   )r   alternativesr   c                 C   s   t dt| d}|jD ]}||j 7 }|t d|j d7 }t|jtrj|t d|j t|j	d7 }n|t d|j t|j	d7 }|t d7 }||j
 7 }q|t d	| t| d
7 }|S )Na  

bool visit_type_%(c_name)s(Visitor *v, const char *name,
                 %(c_name)s **obj, Error **errp)
{
    bool ok = false;

    if (!visit_start_alternate(v, name, (GenericAlternate **)obj,
                               sizeof(**obj), errp)) {
        return false;
    }
    if (!*obj) {
        /* incomplete */
        assert(visit_is_dealloc(v));
        ok = true;
        goto out_obj;
    }
    switch ((*obj)->type) {
r    z
    case %(case)s:
r.   a  
        if (!visit_start_struct(v, name, NULL, 0, errp)) {
            break;
        }
        if (visit_type_%(c_type)s_members(v, &(*obj)->u.%(c_name)s, errp)) {
            ok = visit_check_struct(v, errp);
        }
        visit_end_struct(v, NULL);
)r   r   zK
        ok = visit_type_%(c_type)s(v, name, &(*obj)->u.%(c_name)s, errp);
z
        break;
a   
    case QTYPE_NONE:
        abort();
    default:
        assert(visit_is_input(v));
        error_setg(errp,
                   "Invalid parameter type for '%%s', expected: %(name)s",
                   name ? name : "null");
        /* Avoid passing invalid *obj to qapi_free_%(c_name)s() */
        g_free(*obj);
        *obj = NULL;
    }
out_obj:
    visit_end_alternate(v, (void **)obj);
    if (!ok && visit_is_input(v)) {
        qapi_free_%(c_name)s(*obj);
        *obj = NULL;
    }
    return ok;
}
)r   r   )r   r   r;   r2   r3   r7   alternate_qtyper:   r   r   r4   )r   rE   r=   r@   r   r   r   gen_visit_alternate   s.    
	
rG   c                 C   s   t dt| dS )Na  

bool visit_type_%(c_name)s(Visitor *v, const char *name,
                 %(c_name)s **obj, Error **errp)
{
    bool ok = false;

    if (!visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), errp)) {
        return false;
    }
    if (!*obj) {
        /* incomplete */
        assert(visit_is_dealloc(v));
        ok = true;
        goto out_obj;
    }
    if (!visit_type_%(c_name)s_members(v, *obj, errp)) {
        goto out_obj;
    }
    ok = visit_check_struct(v, errp);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (!ok && visit_is_input(v)) {
        qapi_free_%(c_name)s(*obj);
        *obj = NULL;
    }
    return ok;
}
r    r!   r"   r   r   r   gen_visit_object0  s    rH   c                	       s   e Zd Zed fddZddddZeddd	d
Zeee e	e
e e
e ee ddddZeee e	eddddZeee e	e
e ee e
e ee ddddZeee e	e
e eddddZ  ZS )QAPISchemaGenVisitVisitor)r<   c                    s   t  |dddt d S )N
qapi-visitz * Schema-defined QAPI visitorsz * Built-in QAPI visitors)super__init____doc__)selfr<   	__class__r   r   rL   S  s    z"QAPISchemaGenVisitVisitor.__init__N)r   c                 C   s$   | j td | jtd d S )NzV
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "qapi/qapi-builtin-visit.h"
zA
#include "qapi/visitor.h"
#include "qapi/qapi-builtin-types.h"

)_gencpreamble_addr   _genh)rN   r   r   r   _begin_builtin_moduleX  s    z/QAPISchemaGenVisitVisitor._begin_builtin_moduler   c                 C   sD   |  d|}|  d|}| jtd|d | jtd|d d S )Nz
qapi-typesrJ   zH
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "%(visit)s.h"
)visitz>
#include "qapi/qapi-builtin-visit.h"
#include "%(types)s.h"

)types)_module_basenamerQ   rR   r   rS   )rN   r   rV   rU   r   r   r   _begin_user_moduled  s    

z,QAPISchemaGenVisitVisitor._begin_user_module)r   infor2   r6   r%   r<   r   c                 C   sX   t || j| j4 | jt|dd | jt| W d    n1 sJ0    Y  d S )NT)r   )r   rS   rQ   addr   rD   )rN   r   rY   r2   r6   r%   r<   r   r   r   visit_enum_typet  s    z)QAPISchemaGenVisitVisitor.visit_enum_type)r   rY   r2   rB   r   c                 C   sV   t || j| j2 | jt| | jt|| W d    n1 sH0    Y  d S N)r   rS   rQ   rZ   r   rC   )rN   r   rY   r2   rB   r   r   r   visit_array_type  s    z*QAPISchemaGenVisitVisitor.visit_array_type)r   rY   r2   r6   r$   r%   r&   r   c                 C   s   |dkrd S t || j| j` | jt| | jt|||| |dsn| jt| | jt| W d    n1 s0    Y  d S )Nr-   q_)	r   rS   rQ   rZ   r#   rA   
startswithr   rH   )rN   r   rY   r2   r6   r$   r%   r&   r   r   r   visit_object_type  s    	
z+QAPISchemaGenVisitVisitor.visit_object_type)r   rY   r2   r6   rE   r   c                 C   sV   t || j| j2 | jt| | jt|| W d    n1 sH0    Y  d S r\   )r   rS   rQ   rZ   r   rG   )rN   r   rY   r2   r6   rE   r   r   r   visit_alternate_type  s    z.QAPISchemaGenVisitVisitor.visit_alternate_type)__name__
__module____qualname__strrL   rT   rX   r   r   r   r   r   r   r[   r   r]   r   r   r   r`   r   ra   __classcell__r   r   rO   r   rI   Q  s:   
rI   N)schema
output_dirr<   opt_builtinsr   c                 C   s"   t |}| | ||| d S r\   )rI   rU   write)rg   rh   r<   ri   visr   r   r   	gen_visit  s    
rl   )F)%rM   typingr   r   commonr   r   r   r   genr	   r
   r   rg   r   r   r   r   r   r   r   r   r   r   sourcer   re   boolr   r#   rA   rC   rD   rG   rH   rI   rl   r   r   r   r   <module>   s0   0q"N!X