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