mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-24 20:45:34 +00:00
5dd5646a9a
JSON uses "name":value, but many of our visitor interfaces were called with visit_type_FOO(v, &value, name, errp). This can be a bit confusing to have to mentally swap the parameter order to match JSON order. It's particularly bad for visit_start_struct(), where the 'name' parameter is smack in the middle of the otherwise-related group of 'obj, kind, size' parameters! It's time to do a global swap of the parameter ordering, so that the 'name' parameter is always immediately after the Visitor argument. Additional reason in favor of the swap: the existing include/qjson.h prefers listing 'name' first in json_prop_*(), and I have plans to unify that file with the qapi visitors; listing 'name' first in qapi will minimize churn to the (admittedly few) qjson.h clients. Later patches will then fix docs, object.h, visitor-impl.h, and those clients to match. Done by first patching scripts/qapi*.py by hand to make generated files do what I want, then by running the following Coccinelle script to affect the rest of the code base: $ spatch --sp-file script `git grep -l '\bvisit_' -- '**/*.[ch]'` I then had to apply some touchups (Coccinelle insisted on TAB indentation in visitor.h, and botched the signature of visit_type_enum() by rewriting 'const char *const strings[]' to the syntactically invalid 'const char*const[] strings'). The movement of parameters is sufficient to provoke compiler errors if any callers were missed. // Part 1: Swap declaration order @@ type TV, TErr, TObj, T1, T2; identifier OBJ, ARG1, ARG2; @@ void visit_start_struct -(TV v, TObj OBJ, T1 ARG1, const char *name, T2 ARG2, TErr errp) +(TV v, const char *name, TObj OBJ, T1 ARG1, T2 ARG2, TErr errp) { ... } @@ type bool, TV, T1; identifier ARG1; @@ bool visit_optional -(TV v, T1 ARG1, const char *name) +(TV v, const char *name, T1 ARG1) { ... } @@ type TV, TErr, TObj, T1; identifier OBJ, ARG1; @@ void visit_get_next_type -(TV v, TObj OBJ, T1 ARG1, const char *name, TErr errp) +(TV v, const char *name, TObj OBJ, T1 ARG1, TErr errp) { ... } @@ type TV, TErr, TObj, T1, T2; identifier OBJ, ARG1, ARG2; @@ void visit_type_enum -(TV v, TObj OBJ, T1 ARG1, T2 ARG2, const char *name, TErr errp) +(TV v, const char *name, TObj OBJ, T1 ARG1, T2 ARG2, TErr errp) { ... } @@ type TV, TErr, TObj; identifier OBJ; identifier VISIT_TYPE =~ "^visit_type_"; @@ void VISIT_TYPE -(TV v, TObj OBJ, const char *name, TErr errp) +(TV v, const char *name, TObj OBJ, TErr errp) { ... } // Part 2: swap caller order @@ expression V, NAME, OBJ, ARG1, ARG2, ERR; identifier VISIT_TYPE =~ "^visit_type_"; @@ ( -visit_start_struct(V, OBJ, ARG1, NAME, ARG2, ERR) +visit_start_struct(V, NAME, OBJ, ARG1, ARG2, ERR) | -visit_optional(V, ARG1, NAME) +visit_optional(V, NAME, ARG1) | -visit_get_next_type(V, OBJ, ARG1, NAME, ERR) +visit_get_next_type(V, NAME, OBJ, ARG1, ERR) | -visit_type_enum(V, OBJ, ARG1, ARG2, NAME, ERR) +visit_type_enum(V, NAME, OBJ, ARG1, ARG2, ERR) | -VISIT_TYPE(V, OBJ, NAME, ERR) +VISIT_TYPE(V, NAME, OBJ, ERR) ) Backports commit 51e72bc1dd6ace6e91d675f41a1f09bd00ab8043 from qemu
85 lines
3.3 KiB
C
85 lines
3.3 KiB
C
/*
|
|
* Core Definitions for QAPI Visitor Classes
|
|
*
|
|
* Copyright IBM, Corp. 2011
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.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_CORE_H
|
|
#define QAPI_VISITOR_CORE_H
|
|
|
|
#include "qemu/typedefs.h"
|
|
#include "qapi/qmp/qobject.h"
|
|
#include "qapi/error.h"
|
|
#include <stdlib.h>
|
|
|
|
typedef struct GenericList
|
|
{
|
|
union {
|
|
void *value;
|
|
uint64_t padding;
|
|
};
|
|
struct GenericList *next;
|
|
} GenericList;
|
|
|
|
void visit_start_struct(Visitor *v, const char *name, void **obj,
|
|
const char *kind, size_t size, Error **errp);
|
|
void visit_end_struct(Visitor *v, Error **errp);
|
|
void visit_start_implicit_struct(Visitor *v, void **obj, size_t size,
|
|
Error **errp);
|
|
void visit_end_implicit_struct(Visitor *v);
|
|
void visit_start_list(Visitor *v, const char *name, Error **errp);
|
|
GenericList *visit_next_list(Visitor *v, GenericList **list);
|
|
void visit_end_list(Visitor *v);
|
|
|
|
/**
|
|
* Check if an optional member @name of an object needs visiting.
|
|
* For input visitors, set *@present according to whether the
|
|
* corresponding visit_type_*() needs calling; for other visitors,
|
|
* leave *@present unchanged. Return *@present for convenience.
|
|
*/
|
|
bool visit_optional(Visitor *v, const char *name, bool *present);
|
|
|
|
/**
|
|
* Determine the qtype of the item @name in the current object visit.
|
|
* For input visitors, set *@type to the correct qtype of a qapi
|
|
* alternate type; for other visitors, leave *@type unchanged.
|
|
* If @promote_int, treat integers as QTYPE_FLOAT.
|
|
*/
|
|
void visit_get_next_type(Visitor *v, const char *name, QType *type,
|
|
bool promote_int, Error **errp);
|
|
void visit_type_enum(Visitor *v, const char *name, int *obj,
|
|
const char *const strings[], const char *kind,
|
|
Error **errp);
|
|
void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp);
|
|
void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
|
|
Error **errp);
|
|
void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
|
|
Error **errp);
|
|
void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
|
|
Error **errp);
|
|
void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
|
|
Error **errp);
|
|
void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp);
|
|
void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
|
|
Error **errp);
|
|
void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
|
|
Error **errp);
|
|
void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
|
|
Error **errp);
|
|
void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
|
|
Error **errp);
|
|
void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
|
|
void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
|
|
void visit_type_number(Visitor *v, const char *name, double *obj,
|
|
Error **errp);
|
|
void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
|
|
bool visit_start_union(Visitor *v, bool data_present, Error **errp);
|
|
|
|
#endif
|