@@ -1,7 +1,7 @@
/*
* Core Definitions for QAPI Visitor implementations
*
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2012-2016 Red Hat, Inc.
*
* Author: Paolo Bonizni <pbonzini@redhat.com>
*
@@ -56,12 +56,6 @@ struct Visitor
/* May be NULL; most useful for input visitors. */
void (*optional)(Visitor *v, bool *present, const char *name);
- void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp);
- void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp);
- void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp);
- void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp);
- void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp);
- void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp);
bool (*start_union)(Visitor *v, bool data_present, Error **errp);
};
@@ -95,129 +95,89 @@ void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp)
v->type_int64(v, obj, name, errp);
}
+static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
+ uint64_t max, const char *type, Error **errp)
+{
+ Error *err = NULL;
+ uint64_t value = *obj;
+
+ v->type_uint64(v, &value, name, &err);
+ if (err) {
+ error_propagate(errp, err);
+ } else if (value > max) {
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+ name ? name : "null", type);
+ } else {
+ *obj = value;
+ }
+}
+
void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp)
{
- uint64_t value;
-
- if (v->type_uint8) {
- v->type_uint8(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_uint64(v, &value, name, errp);
- if (value > UINT8_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "uint8_t");
- return;
- }
- *obj = value;
- }
+ uint64_t value = *obj;
+ visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp);
+ *obj = value;
}
-void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp)
+void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name,
+ Error **errp)
{
- uint64_t value;
-
- if (v->type_uint16) {
- v->type_uint16(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_uint64(v, &value, name, errp);
- if (value > UINT16_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "uint16_t");
- return;
- }
- *obj = value;
- }
+ uint64_t value = *obj;
+ visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp);
+ *obj = value;
}
-void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp)
+void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name,
+ Error **errp)
{
- uint64_t value;
-
- if (v->type_uint32) {
- v->type_uint32(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_uint64(v, &value, name, errp);
- if (value > UINT32_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "uint32_t");
- return;
- }
- *obj = value;
- }
+ uint64_t value = *obj;
+ visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp);
+ *obj = value;
}
-void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp)
+void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name,
+ Error **errp)
{
v->type_uint64(v, obj, name, errp);
}
+static void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
+ int64_t min, int64_t max, const char *type,
+ Error **errp)
+{
+ Error *err = NULL;
+ int64_t value = *obj;
+
+ v->type_int64(v, &value, name, &err);
+ if (err) {
+ error_propagate(errp, err);
+ } else if (value < min || value > max) {
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+ name ? name : "null", type);
+ } else {
+ *obj = value;
+ }
+}
+
void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp)
{
- int64_t value;
-
- if (v->type_int8) {
- v->type_int8(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_int64(v, &value, name, errp);
- if (value < INT8_MIN || value > INT8_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "int8_t");
- return;
- }
- *obj = value;
- }
+ int64_t value = *obj;
+ visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", errp);
+ *obj = value;
}
void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp)
{
- int64_t value;
-
- if (v->type_int16) {
- v->type_int16(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_int64(v, &value, name, errp);
- if (value < INT16_MIN || value > INT16_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "int16_t");
- return;
- }
- *obj = value;
- }
+ int64_t value = *obj;
+ visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t", errp);
+ *obj = value;
}
void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error **errp)
{
- int64_t value;
-
- if (v->type_int32) {
- v->type_int32(v, obj, name, errp);
- } else {
- value = *obj;
- v->type_int64(v, &value, name, errp);
- if (value < INT32_MIN || value > INT32_MAX) {
- /* FIXME questionable reuse of errp if callback changed
- value on error */
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name ? name : "null", "int32_t");
- return;
- }
- *obj = value;
- }
+ int64_t value = *obj;
+ visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t", errp);
+ *obj = value;
}
void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp)