@ -19,34 +19,32 @@
# include "qemu-common.h"
# include "qapi/qmp/types.h"
typedef struct QStackEntry
{
typedef struct QStackEntry {
QObject * value ;
void * qapi ; /* sanity check that caller uses same pointer */
QSLIST_ENTRY ( QStackEntry ) node ;
} QStackEntry ;
struct QmpOutputVisitor
{
struct QObjectOutputVisitor {
Visitor visitor ;
QSLIST_HEAD ( , QStackEntry ) stack ; /* Stack of unfinished containers */
QObject * root ; /* Root of the output visit */
QObject * * result ; /* User's storage location for result */
} ;
# define qmp _output_add(qov, name, value) \
qmp _output_add_obj ( qov , name , QOBJECT ( value ) )
# define qmp _output_push(qov, value, qapi) \
qmp _output_push_obj ( qov , QOBJECT ( value ) , qapi )
# define qobject _output_add(qov, name, value) \
qobject _output_add_obj ( qov , name , QOBJECT ( value ) )
# define qobject _output_push(qov, value, qapi) \
qobject _output_push_obj ( qov , QOBJECT ( value ) , qapi )
static Qmp OutputVisitor * to_qov ( Visitor * v )
static QObject OutputVisitor * to_qov ( Visitor * v )
{
return container_of ( v , Qmp OutputVisitor , visitor ) ;
return container_of ( v , QObject OutputVisitor , visitor ) ;
}
/* Push @value onto the stack of current QObjects being built */
static void qmp_output_push_obj ( Qmp OutputVisitor * qov , QObject * value ,
void * qapi )
static void qobject_output_push_obj ( QObject OutputVisitor * qov , QObject * value ,
void * qapi )
{
QStackEntry * e = g_malloc0 ( sizeof ( * e ) ) ;
@ -58,7 +56,7 @@ static void qmp_output_push_obj(QmpOutputVisitor *qov, QObject *value,
}
/* Pop a value off the stack of QObjects being built, and return it. */
static QObject * qmp_output_pop ( Qmp OutputVisitor * qov , void * qapi )
static QObject * qobject_output_pop ( QObject OutputVisitor * qov , void * qapi )
{
QStackEntry * e = QSLIST_FIRST ( & qov - > stack ) ;
QObject * value ;
@ -75,8 +73,8 @@ static QObject *qmp_output_pop(QmpOutputVisitor *qov, void *qapi)
/* Add @value to the current QObject being built.
* If the stack is visiting a dictionary or list , @ value is now owned
* by that container . Otherwise , @ value is now the root . */
static void qmp_output_add_obj ( Qmp OutputVisitor * qov , const char * name ,
QObject * value )
static void qobject_output_add_obj ( QObject OutputVisitor * qov , const char * name ,
QObject * value )
{
QStackEntry * e = QSLIST_FIRST ( & qov - > stack ) ;
QObject * cur = e ? e - > value : NULL ;
@ -101,107 +99,107 @@ static void qmp_output_add_obj(QmpOutputVisitor *qov, const char *name,
}
}
static void qmp _output_start_struct ( Visitor * v , const char * name , void * * obj ,
size_t unused , Error * * errp )
static void qobject _output_start_struct ( Visitor * v , const char * name ,
void * * obj , size_t unused , Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
QDict * dict = qdict_new ( ) ;
qmp _output_add ( qov , name , dict ) ;
qmp _output_push ( qov , dict , obj ) ;
qobject _output_add ( qov , name , dict ) ;
qobject _output_push ( qov , dict , obj ) ;
}
static void qmp _output_end_struct ( Visitor * v , void * * obj )
static void qobject _output_end_struct ( Visitor * v , void * * obj )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject * value = qmp _output_pop ( qov , obj ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
QObject * value = qobject _output_pop ( qov , obj ) ;
assert ( qobject_type ( value ) = = QTYPE_QDICT ) ;
}
static void qmp _output_start_list ( Visitor * v , const char * name ,
GenericList * * listp , size_t size ,
Error * * errp )
static void qobject _output_start_list ( Visitor * v , const char * name ,
GenericList * * listp , size_t size ,
Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
QList * list = qlist_new ( ) ;
qmp _output_add ( qov , name , list ) ;
qmp _output_push ( qov , list , listp ) ;
qobject _output_add ( qov , name , list ) ;
qobject _output_push ( qov , list , listp ) ;
}
static GenericList * qmp _output_next_list ( Visitor * v , GenericList * tail ,
size_t size )
static GenericList * qobject _output_next_list ( Visitor * v , GenericList * tail ,
size_t size )
{
return tail - > next ;
}
static void qmp _output_end_list ( Visitor * v , void * * obj )
static void qobject _output_end_list ( Visitor * v , void * * obj )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject * value = qmp _output_pop ( qov , obj ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
QObject * value = qobject _output_pop ( qov , obj ) ;
assert ( qobject_type ( value ) = = QTYPE_QLIST ) ;
}
static void qmp _output_type_int64 ( Visitor * v , const char * name , int64_t * obj ,
Error * * errp )
static void qobject _output_type_int64 ( Visitor * v , const char * name ,
int64_t * obj , Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
qmp _output_add ( qov , name , qint_from_int ( * obj ) ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject _output_add ( qov , name , qint_from_int ( * obj ) ) ;
}
static void qmp _output_type_uint64 ( Visitor * v , const char * name , uint64_t * obj ,
Error * * errp )
static void qobject _output_type_uint64 ( Visitor * v , const char * name ,
uint64_t * obj , Error * * errp )
{
/* FIXME values larger than INT64_MAX become negative */
Qmp OutputVisitor * qov = to_qov ( v ) ;
qmp _output_add ( qov , name , qint_from_int ( * obj ) ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject _output_add ( qov , name , qint_from_int ( * obj ) ) ;
}
static void qmp _output_type_bool ( Visitor * v , const char * name , bool * obj ,
Error * * errp )
static void qobject _output_type_bool ( Visitor * v , const char * name , bool * obj ,
Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
qmp _output_add ( qov , name , qbool_from_bool ( * obj ) ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject _output_add ( qov , name , qbool_from_bool ( * obj ) ) ;
}
static void qmp _output_type_str ( Visitor * v , const char * name , char * * obj ,
Error * * errp )
static void qobject _output_type_str ( Visitor * v , const char * name , char * * obj ,
Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
if ( * obj ) {
qmp _output_add ( qov , name , qstring_from_str ( * obj ) ) ;
qobject _output_add ( qov , name , qstring_from_str ( * obj ) ) ;
} else {
qmp _output_add ( qov , name , qstring_from_str ( " " ) ) ;
qobject _output_add ( qov , name , qstring_from_str ( " " ) ) ;
}
}
static void qmp _output_type_number ( Visitor * v , const char * name , double * obj ,
Error * * errp )
static void qobject _output_type_number ( Visitor * v , const char * name ,
double * obj , Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
qmp _output_add ( qov , name , qfloat_from_double ( * obj ) ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject _output_add ( qov , name , qfloat_from_double ( * obj ) ) ;
}
static void qmp _output_type_any ( Visitor * v , const char * name , QObject * * obj ,
Error * * errp )
static void qobject _output_type_any ( Visitor * v , const char * name ,
QObject * * obj , Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject_incref ( * obj ) ;
qmp _output_add_obj ( qov , name , * obj ) ;
qobject _output_add_obj ( qov , name , * obj ) ;
}
static void qmp _output_type_null ( Visitor * v , const char * name , Error * * errp )
static void qobject _output_type_null ( Visitor * v , const char * name , Error * * errp )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
qmp _output_add_obj ( qov , name , qnull ( ) ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
qobject _output_add_obj ( qov , name , qnull ( ) ) ;
}
/* Finish building, and return the root object.
* The root object is never null . The caller becomes the object ' s
* owner , and should use qobject_decref ( ) when done with it . */
static void qmp _output_complete ( Visitor * v , void * opaque )
static void qobject _output_complete ( Visitor * v , void * opaque )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
/* A visit must have occurred, with each start paired with end. */
assert ( qov - > root & & QSLIST_EMPTY ( & qov - > stack ) ) ;
@ -212,9 +210,9 @@ static void qmp_output_complete(Visitor *v, void *opaque)
qov - > result = NULL ;
}
static void qmp _output_free ( Visitor * v )
static void qobject _output_free ( Visitor * v )
{
Qmp OutputVisitor * qov = to_qov ( v ) ;
QObject OutputVisitor * qov = to_qov ( v ) ;
QStackEntry * e ;
while ( ! QSLIST_EMPTY ( & qov - > stack ) ) {
@ -227,27 +225,27 @@ static void qmp_output_free(Visitor *v)
g_free ( qov ) ;
}
Visitor * qmp _output_visitor_new ( QObject * * result )
Visitor * qobject _output_visitor_new ( QObject * * result )
{
Qmp OutputVisitor * v ;
QObject OutputVisitor * v ;
v = g_malloc0 ( sizeof ( * v ) ) ;
v - > visitor . type = VISITOR_OUTPUT ;
v - > visitor . start_struct = qmp _output_start_struct ;
v - > visitor . end_struct = qmp _output_end_struct ;
v - > visitor . start_list = qmp _output_start_list ;
v - > visitor . next_list = qmp _output_next_list ;
v - > visitor . end_list = qmp _output_end_list ;
v - > visitor . type_int64 = qmp _output_type_int64 ;
v - > visitor . type_uint64 = qmp _output_type_uint64 ;
v - > visitor . type_bool = qmp _output_type_bool ;
v - > visitor . type_str = qmp _output_type_str ;
v - > visitor . type_number = qmp _output_type_number ;
v - > visitor . type_any = qmp _output_type_any ;
v - > visitor . type_null = qmp _output_type_null ;
v - > visitor . complete = qmp _output_complete ;
v - > visitor . free = qmp _output_free ;
v - > visitor . start_struct = qobject _output_start_struct ;
v - > visitor . end_struct = qobject _output_end_struct ;
v - > visitor . start_list = qobject _output_start_list ;
v - > visitor . next_list = qobject _output_next_list ;
v - > visitor . end_list = qobject _output_end_list ;
v - > visitor . type_int64 = qobject _output_type_int64 ;
v - > visitor . type_uint64 = qobject _output_type_uint64 ;
v - > visitor . type_bool = qobject _output_type_bool ;
v - > visitor . type_str = qobject _output_type_str ;
v - > visitor . type_number = qobject _output_type_number ;
v - > visitor . type_any = qobject _output_type_any ;
v - > visitor . type_null = qobject _output_type_null ;
v - > visitor . complete = qobject _output_complete ;
v - > visitor . free = qobject _output_free ;
* result = NULL ;
v - > result = result ;