diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index a154523..17964ad 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -154,6 +154,7 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void) v = g_malloc0(sizeof(*v)); + qapi_init_input_visitor(&v->visitor); v->visitor.start_struct = qapi_dealloc_start_struct; v->visitor.end_struct = qapi_dealloc_end_struct; v->visitor.start_list = qapi_dealloc_start_list; diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index ddef3ed..5c1881d 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -116,3 +116,37 @@ void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp) v->type_number(v, obj, name, errp); } } + +static void visit_type_int16_in(Visitor *v, int16_t *obj, const char *name, Error **errp) +{ + if (!error_is_set(errp)) { + int64_t value; + v->type_int(v, &value, name, errp); + *obj = value; + } +} + +static void visit_type_int16_out(Visitor *v, int16_t *obj, const char *name, Error **errp) +{ + if (!error_is_set(errp)) { + int64_t value = *obj; + v->type_int(v, &value, name, errp); + } +} + +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp) +{ + if (!error_is_set(errp)) { + v->type_int16(v, obj, name, errp); + } +} + +void qapi_init_input_visitor(Visitor *v) +{ + v->type_int16 = visit_type_int16_in; +} + +void qapi_init_output_visitor(Visitor *v) +{ + v->type_int16 = visit_type_int16_out; +} diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h index e850746..c0395b3 100644 --- a/qapi/qapi-visit-core.h +++ b/qapi/qapi-visit-core.h @@ -52,6 +52,9 @@ struct Visitor void (*start_handle)(Visitor *v, void **obj, const char *kind, const char *name, Error **errp); void (*end_handle)(Visitor *v, Error **errp); + + /* Internal only. */ + void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); }; void visit_start_handle(Visitor *v, void **obj, const char *kind, @@ -69,8 +72,24 @@ void visit_end_optional(Visitor *v, Error **errp); void visit_type_enum(Visitor *v, int *obj, const char *strings[], const char *kind, const char *name, Error **errp); void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp); +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp); void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp); void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp); void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp); +static inline void visit_type_uint(Visitor *v, uint64_t *obj, + const char *name, Error **errp) +{ + visit_type_int(v, (int64_t *) obj, name, errp); +} + +static inline void visit_type_uint16(Visitor *v, uint16_t *obj, + const char *name, Error **errp) +{ + visit_type_int16(v, (int16_t *) obj, name, errp); +} + +void qapi_init_input_visitor(Visitor *v); +void qapi_init_output_visitor(Visitor *v); + #endif diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index c78022b..67da359 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -283,6 +283,7 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj) v = g_malloc0(sizeof(*v)); + qapi_init_input_visitor(&v->visitor); v->visitor.start_struct = qmp_input_start_struct; v->visitor.end_struct = qmp_input_end_struct; v->visitor.start_list = qmp_input_start_list; diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index f76d015..65f8e3e 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -234,6 +234,7 @@ QmpOutputVisitor *qmp_output_visitor_new(void) v = g_malloc0(sizeof(*v)); + qapi_init_output_visitor(&v->visitor); v->visitor.start_struct = qmp_output_start_struct; v->visitor.end_struct = qmp_output_end_struct; v->visitor.start_list = qmp_output_start_list; diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 663c2a0..77bc529 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -229,10 +229,8 @@ static void get_int16(DeviceState *dev, Visitor *v, void *opaque, { Property *prop = opaque; int16_t *ptr = qdev_get_prop_ptr(dev, prop); - int64_t value; - value = *ptr; - visit_type_int(v, &value, name, errp); + visit_type_int16(v, ptr, name, errp); } static void set_int16(DeviceState *dev, Visitor *v, void *opaque,