![Eric Blake](/assets/img/avatar_default.png)
The QMP input visitor allows integral values to be assigned by promotion to a QTYPE_QFLOAT. However, when parsing an alternate, we did not take this into account, such that an alternate that accepts 'number' and some other type, but not 'int', would reject integral values. With this patch, we now have the following desirable table: alternate has case selected for 'int' 'number' QTYPE_QINT QTYPE_QFLOAT no no error error no yes 'number' 'number' yes no 'int' error yes yes 'int' 'number' While it is unlikely that we will ever use 'number' in an alternate other than in the testsuite, it never hurts to be more precise in what we allow. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1449033659-25497-8-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
71 lines
3.1 KiB
C
71 lines
3.1 KiB
C
/*
|
|
* Core Definitions for QAPI Visitor implementations
|
|
*
|
|
* Copyright (C) 2012 Red Hat, Inc.
|
|
*
|
|
* Author: Paolo Bonizni <pbonzini@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
* See the COPYING.LIB file in the top-level directory.
|
|
*
|
|
*/
|
|
#ifndef QAPI_VISITOR_IMPL_H
|
|
#define QAPI_VISITOR_IMPL_H
|
|
|
|
#include "qapi/error.h"
|
|
#include "qapi/visitor.h"
|
|
|
|
struct Visitor
|
|
{
|
|
/* Must be set */
|
|
void (*start_struct)(Visitor *v, void **obj, const char *kind,
|
|
const char *name, size_t size, Error **errp);
|
|
void (*end_struct)(Visitor *v, Error **errp);
|
|
|
|
void (*start_implicit_struct)(Visitor *v, void **obj, size_t size,
|
|
Error **errp);
|
|
void (*end_implicit_struct)(Visitor *v, Error **errp);
|
|
|
|
void (*start_list)(Visitor *v, const char *name, Error **errp);
|
|
GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp);
|
|
void (*end_list)(Visitor *v, Error **errp);
|
|
|
|
void (*type_enum)(Visitor *v, int *obj, const char * const strings[],
|
|
const char *kind, const char *name, Error **errp);
|
|
/* May be NULL; only needed for input visitors. */
|
|
void (*get_next_type)(Visitor *v, QType *type, bool promote_int,
|
|
const char *name, Error **errp);
|
|
|
|
void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp);
|
|
void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp);
|
|
void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp);
|
|
void (*type_number)(Visitor *v, double *obj, const char *name,
|
|
Error **errp);
|
|
void (*type_any)(Visitor *v, QObject **obj, const char *name,
|
|
Error **errp);
|
|
|
|
/* May be NULL */
|
|
void (*optional)(Visitor *v, bool *present, const char *name,
|
|
Error **errp);
|
|
|
|
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_uint64)(Visitor *v, uint64_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);
|
|
void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
|
|
/* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
|
|
void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
|
|
bool (*start_union)(Visitor *v, bool data_present, Error **errp);
|
|
void (*end_union)(Visitor *v, bool data_present, Error **errp);
|
|
};
|
|
|
|
void input_type_enum(Visitor *v, int *obj, const char * const strings[],
|
|
const char *kind, const char *name, Error **errp);
|
|
void output_type_enum(Visitor *v, int *obj, const char * const strings[],
|
|
const char *kind, const char *name, Error **errp);
|
|
|
|
#endif
|