[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v9 26/27] qapi: Remove dead visitor code
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v9 26/27] qapi: Remove dead visitor code |
Date: |
Thu, 05 Nov 2015 20:05:23 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Eric Blake <address@hidden> writes:
> Commit cbc95538 removed unused start_handle() and end_handle(),
> but forgot got remove their declarations.
>
> Commit 4e27e819 introduced optional visitor callbacks for all
> sorts of int types, but except for type_uint64 and type_size,
> none of them have ever been supplied (the generic implementation
> based on using type_int then bounds-checking works just fine).
> In the interest of simplicity, it's easier to make the visitor
> callback interface not have to worry about the other sizes.
>
> Signed-off-by: Eric Blake <address@hidden>
>
> ---
> v9: no change
> v8: no change
> v7: no change
> v6: no change
> ---
> include/qapi/visitor-impl.h | 19 +++----
> include/qapi/visitor.h | 3 -
> qapi/qapi-visit-core.c | 131
> +++++++++++++++++---------------------------
> 3 files changed, 58 insertions(+), 95 deletions(-)
Easier to review with whitespace change ignored:
| diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
| index 1d09b7b..370935a 100644
| --- a/include/qapi/visitor-impl.h
| +++ b/include/qapi/visitor-impl.h
| @@ -1,7 +1,7 @@
| /*
| * Core Definitions for QAPI Visitor implementations
| *
| - * Copyright (C) 2012 Red Hat, Inc.
| + * Copyright (C) 2012, 2015 Red Hat, Inc.
| *
| * Author: Paolo Bonizni <address@hidden>
| *
| @@ -48,18 +48,15 @@ struct Visitor
| 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);
| +
| + /* Only required to visit uint64 differently than (*type_int)(). */
If you don't supply it, what happens for uint64_t values that aren't
representable as int64_t?
| + void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name,
| + Error **errp);
| + /* Only required to visit sizes differently than (*type_uint64)(). */
| + void (*type_size)(Visitor *v, uint64_t *obj, const char *name,
| + Error **errp);
| };
|
| void input_type_enum(Visitor *v, int *obj, const char * const strings[],
| diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
| index baea594..67ddd83 100644
| --- a/include/qapi/visitor.h
| +++ b/include/qapi/visitor.h
| @@ -27,9 +27,6 @@ typedef struct GenericList
| struct GenericList *next;
| } GenericList;
|
| -void visit_start_handle(Visitor *v, void **obj, const char *kind,
| - const char *name, Error **errp);
| -void visit_end_handle(Visitor *v, Error **errp);
| void visit_start_struct(Visitor *v, void **obj, const char *kind,
| const char *name, size_t size, Error **errp);
| void visit_end_struct(Visitor *v, Error **errp);
| diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
| index 884fe94..cbf7780 100644
| --- a/qapi/qapi-visit-core.c
| +++ b/qapi/qapi-visit-core.c
| @@ -104,9 +104,6 @@ void visit_type_uint8(Visitor *v, uint8_t *obj, const
char *name, Error **errp)
| {
| int64_t value;
|
| - if (v->type_uint8) {
| - v->type_uint8(v, obj, name, errp);
| - } else {
| value = *obj;
| v->type_int(v, &value, name, errp);
| if (value < 0 || value > UINT8_MAX) {
| @@ -116,15 +113,12 @@ void visit_type_uint8(Visitor *v, uint8_t *obj, const
char *name, Error **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)
| {
| int64_t value;
|
| - if (v->type_uint16) {
| - v->type_uint16(v, obj, name, errp);
| - } else {
| value = *obj;
| v->type_int(v, &value, name, errp);
| if (value < 0 || value > UINT16_MAX) {
| @@ -134,15 +128,12 @@ void visit_type_uint16(Visitor *v, uint16_t *obj, const
char *name, Error **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)
| {
| int64_t value;
|
| - if (v->type_uint32) {
| - v->type_uint32(v, obj, name, errp);
| - } else {
| value = *obj;
| v->type_int(v, &value, name, errp);
| if (value < 0 || value > UINT32_MAX) {
| @@ -152,9 +143,9 @@ void visit_type_uint32(Visitor *v, uint32_t *obj, const
char *name, Error **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)
| {
| int64_t value;
|
if (v->type_uint64) {
v->type_uint64(v, obj, name, errp);
} else {
value = *obj;
v->type_int(v, &value, name, errp);
*obj = value;
}
}
Answering my "what happens" question:
* Input visitor
If your type_int() accepts large positive input values and casts them
to the corresponding large negative value, *obj = value will cast them
right back, and the sloppiness cancels out.
If it rejects them, they stay rejected.
* Output visitor
You'll output large positive values as the corresponding large
negative value.
I doubt not defining this makes much sense. Do we have such visitors?
| @@ -171,9 +162,6 @@ 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_int(v, &value, name, errp);
| if (value < INT8_MIN || value > INT8_MAX) {
| @@ -183,15 +171,11 @@ void visit_type_int8(Visitor *v, int8_t *obj, const
char *name, Error **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_int(v, &value, name, errp);
| if (value < INT16_MIN || value > INT16_MAX) {
| @@ -201,15 +185,11 @@ void visit_type_int16(Visitor *v, int16_t *obj, const
char *name, Error **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_int(v, &value, name, errp);
| if (value < INT32_MIN || value > INT32_MAX) {
| @@ -219,29 +199,18 @@ void visit_type_int32(Visitor *v, int32_t *obj, const
char *name, Error **errp)
| }
| *obj = value;
| }
| -}
|
| void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error
**errp)
| {
| - if (v->type_int64) {
| - v->type_int64(v, obj, name, errp);
| - } else {
| v->type_int(v, obj, name, errp);
| }
| -}
|
| void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error
**errp)
| {
| - int64_t value;
| -
| if (v->type_size) {
| v->type_size(v, obj, name, errp);
| - } else if (v->type_uint64) {
| - v->type_uint64(v, obj, name, errp);
| } else {
| - value = *obj;
| - v->type_int(v, &value, name, errp);
| - *obj = value;
| + visit_type_uint64(v, obj, name, errp);
| }
| }
|
This one's problematic, I think. If you supply type_uint64(), but not
type_size(), I'd certainly expect type_uint64() to be used. If not,
what happens for values that can be represented as uint64_t, but not as
int64_t?
- [Qemu-devel] [PATCH v9 24/27] qapi: Fix alternates that accept 'number' but not 'int', (continued)
- [Qemu-devel] [PATCH v9 24/27] qapi: Fix alternates that accept 'number' but not 'int', Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 08/27] qapi: Provide nicer array names in introspection, Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 01/27] qapi: Use generated TestStruct machinery in tests, Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 18/27] qapi: Factor out QAPISchemaObjectTypeMember.check_clash(), Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 20/27] qapi: Simplify QAPISchemaObjectTypeVariants.check(), Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 15/27] qapi: Simplify QAPISchemaObjectTypeMember.check(), Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 22/27] qapi: Remove outdated tests related to QMP/branch collisions, Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 26/27] qapi: Remove dead visitor code, Eric Blake, 2015/11/04
- Re: [Qemu-devel] [PATCH v9 26/27] qapi: Remove dead visitor code,
Markus Armbruster <=
- [Qemu-devel] [PATCH v9 25/27] qapi: Add positive tests to qapi-schema-test, Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 12/27] qapi-types: Simplify gen_struct_field[s], Eric Blake, 2015/11/04
- [Qemu-devel] [PATCH v9 19/27] qapi: Check for qapi collisions of flat union branches, Eric Blake, 2015/11/04
[Qemu-devel] [PATCH v9 04/27] qapi: Simplify error testing in test-qmp-*, Eric Blake, 2015/11/04