On 12 July 2018 at 17:55, Thomas Huth <th...@redhat.com> wrote: > On 12.07.2018 18:52, Eduardo Habkost wrote: >> On Thu, Jul 12, 2018 at 05:30:59PM +0200, Thomas Huth wrote: >>> @@ -749,6 +749,25 @@ int object_set_propv(Object *obj, >>> void object_initialize(void *obj, size_t size, const char *typename); >>> >>> /** >>> + * object_initialize_as_child: >>> + * @parentobj: The parent object to add a property to >>> + * @propname: The name of the property >>> + * @childobj: A pointer to the memory to be used for the object. >>> + * @size: The maximum size available at @obj for the object. >>> + * @type: The name of the type of the object to instantiate. >>> + * @errp: If an error occurs, a pointer to an area to store the area >>> + * >>> + * This function will initialize an object. The memory for the object >>> should >>> + * have already been allocated. The object will then be added as child >>> property >>> + * to a parent with object_property_add_child() function. The returned >>> object >>> + * has a reference count of 1, and will be finalized when the last >>> reference is >>> + * dropped. >>> + */ >>> +void object_initialize_as_child(Object *parentobj, const char *propname, >>> + void *childobj, size_t size, const char >>> *type, >>> + Error **errp); >> >> Why did you use void* instead of Object*? > > That's the same what object_initialize() is doing (see above). Otherwise > all the callers have to cast their pointers with OBJECT() first.
Casting with OBJECT() would not work, because it does a typecheck. At the point where something is calling object_initialize() or object_initialize_with_child(), the memory at 'childobj' has not been initialized, so a typecheck is impossible. It's only once the object has actually been initialized that the memory is a valid Object* that you can put through OBJECT(). thanks -- PMM