[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 1/1] libxl/gentypes: add range init to array elements in json parsing
Oleksandr Grytsov writes ("[PATCH v1 1/1] libxl/gentypes: add range init to array elements in json parsing"): > From: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx> > > Add initialization of array elements in parse json function. > > Currently, array elements are initialized with calloc. Which means > initialize all element fields with zero values. If entries are missed in > json for such fields, it will be equal to zero instead of default values. > The fix is to add range init function before parsing array element for > structures which have defined range init function. I think you have accurately identified a bug. Thank you. I have eyeballed the diff to the output and it looks plausible as far as it goes. However, > s += " for (i=0; (t=libxl__json_array_get(x,i)); i++) {\n" > + if ty.elem_type.init_fn is not None and > ty.elem_type.autogenerate_init_fn: > + s += indent + " "+"%s_init(&%s[i]);\n" % > (ty.elem_type.typename, v) > s += libxl_C_type_parse_json(ty.elem_type, "t", v+"[i]", I think open-coding the use of init_fn is wrong here. I worry that the effect would be to fail to initialise some things: in particular, things with an init_val but no init_fn. Looking at other places where init_fn is used: * _libxl_C_type_init is used for generating the body of %s_init. Using the output of that would obviously be logically correct here, but it's probably undesirable because it would emit a repetition of the per-field initialisers for aggregates. It contains code which tries various strategies for initialisation. * libxl_C_type_member_init is a special case for typed unions, which if we get things right we shouldn't need to explicitly special-case here. * libxl_C_type_copy_deprecated also has code which tries various strategies for initialisation. * The other places are just .h and other similar bureaucracy. I think therefore that the code in _libxl_C_type_init or in libxl_C_type_copy_deprecated, or something like those, must be the model. Aggregates, including Struct and KeyedUnion, all have init_fn. (I think the "or ty.init_fn is None" at gentypes.py:197 is never true.) For all aggregates, we want to call the function. So in that respect, libxl_C_type_copy_deprecated is more correct. For non-aggregates which have a plain value (init_val), we would prefer to set the value, as that is probably smaller code and faster too. But I think this is true for libxl_C_type_copy_deprecated too. So I think the right code is something like that in libxl_C_type_copy_deprecated, but with the init_val check first. Ideally we would change libxl_C_type_copy_deprecated too. I think I will try having a go at this myself. Watch this space. Thanks, Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |