On 2/23/23 18:54, Laszlo Ersek wrote:
> On 2/22/23 18:01, Richard W.M. Jones wrote:
>> On Wed, Feb 22, 2023 at 05:22:57PM +0100, Laszlo Ersek wrote:
>>> On 2/22/23 10:40, Laszlo Ersek wrote:
>>>> On 2/22/23 09:17, Richard W.M. Jones wrote:
>>>>> On Tue, Feb 21, 2023 at 05:23:52PM +0100, Laszlo Ersek wrote:
>>>>
>>>>>> This is doable, but I hope it's not expected that
>>>>>> DEFINE_POINTER_VECTOR_TYPE() *enforce* that the element type be a 
>>>>>> pointer :)
>>>>>
>>>>>
>>>>> You might ignore this for a first draft, but it is apparently possible
>>>>> to statically detect this (at least, if using GCC/clang):
>>>>>
>>>>> https://stackoverflow.com/questions/19255148/check-if-a-macro-argument-is-a-pointer-or-not
>>>>
>>>> Right, we already use at least __builtin_types_compatible_p in
>>>> TYPE_IS_ARRAY(); that's what I wouldn't want more of, at least via this
>>>> series.
>>>
>>> OK, summarizing the TODOs for this particular patch:
>>>
>>> 1. keep _iter
>>>
>>> 2. rename DEFINE_VECTOR_EMPTY to ADD_VECTOR_EMPTY_METHOD
>>>
>>> 3. introduce DEFINE_POINTER_VECTOR_TYPE that expands to DEFINE_VECTOR_TYPE 
>>> + ADD_VECTOR_EMPTY_METHOD
>>>
>>> 4. DEFINE_POINTER_VECTOR_TYPE (and ADD_VECTOR_EMPTY_METHOD) should not take 
>>> "free" as a parameter; ADD_VECTOR_EMPTY_METHOD should hard-code it
>>>    
>>> 5. in "common/utils/string-vector.h", don't ADD_VECTOR_EMPTY_METHOD; 
>>> instead, replace DEFINE_VECTOR_TYPE with DEFINE_POINTER_VECTOR_TYPE.
>>>
>>> 6. in ADD_VECTOR_EMPTY_METHOD, consider checking that the element type is a 
>>> pointer type.
>>
>> Sounds like a plan.
>>
>>> --*--
>>>
>>> Re: 6, I find that the stackoverflow solution above is too complicated. I 
>>> mentioned our existent TYPE_IS_ARRAY macro:
>>>
>>> #define TYPE_IS_ARRAY(a) \
>>>   (!__builtin_types_compatible_p (typeof (a), typeof (&(a)[0])))
>>>
>>> This is perfectly usable for our purposes, as !TYPE_IS_ARRAY(). The reason 
>>> is that when this macro is applied to anything that's *neither* a pointer 
>>> *nor* an array, we get a build error at once:
>>>
>>> #define TYPE_IS_ARRAY(a) \
>>>   (!__builtin_types_compatible_p (typeof (a), typeof (&(a)[0])))
>>>
>>> int main(void)
>>> {
>>>   int x[5];
>>>   int *y;
>>>   int z;
>>>   
>>>   TYPE_IS_ARRAY (x);
>>>   TYPE_IS_ARRAY (y);
>>>   TYPE_IS_ARRAY (z);
>>>   return 0;
>>> }
>>>
>>> --->
>>>
>>> isptr.c: In function ‘main’:
>>> isptr.c:2:59: error: subscripted value is neither array nor pointer nor 
>>> vector
>>>     2 |   (!__builtin_types_compatible_p (typeof (a), typeof (&(a)[0])))
>>>       |                                                           ^
>>> isptr.c:12:3: note: in expansion of macro ‘TYPE_IS_ARRAY’
>>>    12 |   TYPE_IS_ARRAY (z);
>>>       |   ^~~~~~~~~~~~~
>>>
>>> (the "nor vector" part of the error message can most likely be ignored, I 
>>> believe it refers to the C++ standard library vector class)
>>>
>>> Thus, with types that are neither pointers nor arrays nicely caught at 
>>> compilation time, !TYPE_IS_ARRAY stands for "pointer".
>>
>> Nice .. but probably want to define:
>>
>> #define TYPE_IS_POINTER(p) (!TYPE_IS_ARRAY(p))
>>
>>> I'll experiment with this a bit, but if it becomes too complex, I'll likely 
>>> drop step 6.
> 
> Sigh, this patch has now turned into a series of 5 patches. I'll post it
> separately tomorrow. /smh

This patch has been rewritten and merged as commit range
254ac22dde42..c7ff70101e8c.

Laszlo

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to