On Wed, May 03, 2017 at 11:39:10AM -0500, Eric Blake wrote: > On 05/03/2017 11:35 AM, Eduardo Habkost wrote: > > >> + > >> + memset(&cpu, 0, sizeof(cpu)); > >> + cpu.has_node_id = object->u.cpu.has_node_id; > >> + cpu.node_id = object->u.cpu.node_id; > >> + cpu.has_socket_id = object->u.cpu.has_socket_id; > >> + cpu.socket_id = object->u.cpu.socket_id; > >> + cpu.has_core_id = object->u.cpu.has_core_id; > >> + cpu.core_id = object->u.cpu.core_id; > >> + cpu.has_thread_id = object->u.cpu.has_thread_id; > >> + cpu.thread_id = object->u.cpu.thread_id; > > > > We don't have a way to avoid copying each field individually? > > Some visitor trick, maybe? > > > > Eric, Markus, Michael, do you have any suggestions? > > Markus just added QAPI_CLONE_MEMBERS(), which sounds like what you want: > > https://lists.gnu.org/archive/html/qemu-devel/2017-04/msg04867.html
Not sure if it would work in this case. Note that cpu and object->u.cpu have different types. 'cpu' is CpuInstanceProps, but object->u.cpu is NodeCpuOptions. NodeCpuOptions has { 'base': 'CpuInstanceProps' }, and CpuInstanceProps field declarations are duplicated in struct NodeCpuOptions. Do you know why struct inheritance is implemented by duplicating the fields of the base struct instead of embedding the base struct? -- Eduardo