[PATCH] tools/libxl: Make gentypes.py compatible with older Python

Jason Andryuk posted 1 patch 1 week, 6 days ago
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20251017020613.79855-1-jason.andryuk@amd.com
tools/libs/light/gentypes.py | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
[PATCH] tools/libxl: Make gentypes.py compatible with older Python
Posted by Jason Andryuk 1 week, 6 days ago
removeprefix is only added in Python 3.9.

Instead of the prefix removal, switch to passing in a "depth" parameter,
and incrementing it for each level.

There is a slight change in the generated _libxl_types.c.  instances of
KeyedUnion increment depth without outputing any code.  The net result
is some cases where jso_sub_1 is followed by jso_sub_3.  As an example:

_libxl_types.c
_libxl_types.c
@@ -5535,12 +5535,12 @@
                 if (!jso_sub_1)
                     goto out;
                 if (!libxl__string_is_default(&p->u.pty.path)) {
-                    json_object *jso_sub_2 = NULL;
-                    rc = libxl__string_gen_jso(&jso_sub_2, p->u.pty.path);
+                    json_object *jso_sub_3 = NULL;
+                    rc = libxl__string_gen_jso(&jso_sub_3, p->u.pty.path);
                     if (rc)
                         goto out;
-                    if (json_object_object_add(jso_sub_1, "path", jso_sub_2)) {
-                        json_object_put(jso_sub_2);
+                    if (json_object_object_add(jso_sub_1, "path", jso_sub_3)) {
+                        json_object_put(jso_sub_3);
                         goto out;
                     }
                 }

Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
---
Here's an alternative approach to workaround removeprefix.

 tools/libs/light/gentypes.py | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/tools/libs/light/gentypes.py b/tools/libs/light/gentypes.py
index 006bea170a..0e45c04f49 100644
--- a/tools/libs/light/gentypes.py
+++ b/tools/libs/light/gentypes.py
@@ -377,15 +377,16 @@ def get_default_expr(f, nparent, fexpr):
     return "%s" % fexpr
 
 # For json-c gen_json functions
-def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
+def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
     s = ""
     if parent is None:
         s += "json_object *jso;\n"
         s += "int rc;\n"
-        sub_scope_object = "jso_sub_1"
+        depth = 1
     else:
-        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
+        depth += 1
 
+    sub_scope_object = "jso_sub_%d" % depth
     if isinstance(ty, idl.Array):
         if parent is None:
             raise Exception("Array type must have a parent")
@@ -398,7 +399,8 @@ def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "
         s += "        json_object *%s;\n" % (sub_scope_object)
         # remove some indent, it's over indented at least in one case libxl_vcpu_sched_params_gen_json
         s += libxl_C_type_gen_jso(ty.elem_type, v+"[i]",
-                                   indent + "    ", parent, sub_scope_object)
+                                  indent + "    ", parent, sub_scope_object,
+                                  depth)
         s += "        if (json_object_array_add(%s, %s)) {\n" % (scope_object, sub_scope_object)
         s += "            json_object_put(%s);\n" % (sub_scope_object)
         s += "            goto out;\n"
@@ -417,7 +419,7 @@ def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "
             (nparent,fexpr) = ty.member(v, f, parent is None)
             s += "case %s:\n" % f.enumname
             if f.type is not None:
-                s += libxl_C_type_gen_jso(f.type, fexpr, indent + "    ", nparent, scope_object)
+                s += libxl_C_type_gen_jso(f.type, fexpr, indent + "    ", nparent, scope_object, depth)
             else:
                 s += "    %s = json_object_new_object();\n" % (scope_object)
                 s += "    if (!%s)\n" % (scope_object)
@@ -433,7 +435,7 @@ def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "
             default_expr = get_default_expr(f, nparent, fexpr)
             s += "if (%s) {\n" % default_expr
             s += "    json_object *%s = NULL;\n" % (sub_scope_object)
-            s += libxl_C_type_gen_jso(f.type, fexpr, "    ", nparent, sub_scope_object)
+            s += libxl_C_type_gen_jso(f.type, fexpr, "    ", nparent, sub_scope_object, depth)
             s += libxl_C_type_gen_jso_map_key(f, nparent, "    ", scope_object, sub_scope_object)
 
             s += "}\n"
-- 
2.51.0
Re: [PATCH] tools/libxl: Make gentypes.py compatible with older Python
Posted by Anthony PERARD 1 week, 1 day ago
On Thu, Oct 16, 2025 at 10:06:13PM -0400, Jason Andryuk wrote:
> removeprefix is only added in Python 3.9.
> 
> Instead of the prefix removal, switch to passing in a "depth" parameter,
> and incrementing it for each level.
> 
> There is a slight change in the generated _libxl_types.c.  instances of
> KeyedUnion increment depth without outputing any code.  The net result
> is some cases where jso_sub_1 is followed by jso_sub_3.  As an example:
> 
> _libxl_types.c
> _libxl_types.c
> @@ -5535,12 +5535,12 @@
>                  if (!jso_sub_1)
>                      goto out;
>                  if (!libxl__string_is_default(&p->u.pty.path)) {
> -                    json_object *jso_sub_2 = NULL;
> -                    rc = libxl__string_gen_jso(&jso_sub_2, p->u.pty.path);
> +                    json_object *jso_sub_3 = NULL;
> +                    rc = libxl__string_gen_jso(&jso_sub_3, p->u.pty.path);
>                      if (rc)
>                          goto out;
> -                    if (json_object_object_add(jso_sub_1, "path", jso_sub_2)) {
> -                        json_object_put(jso_sub_2);
> +                    if (json_object_object_add(jso_sub_1, "path", jso_sub_3)) {
> +                        json_object_put(jso_sub_3);
>                          goto out;
>                      }
>                  }
> 
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
> ---
> Here's an alternative approach to workaround removeprefix.

Yeah, this version is less obscure about what's going on. Let's go for
it.

Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>

>  tools/libs/light/gentypes.py | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/tools/libs/light/gentypes.py b/tools/libs/light/gentypes.py
> index 006bea170a..0e45c04f49 100644
> --- a/tools/libs/light/gentypes.py
> +++ b/tools/libs/light/gentypes.py
> @@ -377,15 +377,16 @@ def get_default_expr(f, nparent, fexpr):
>      return "%s" % fexpr
>  
>  # For json-c gen_json functions
> -def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
> +def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
>      s = ""
>      if parent is None:
>          s += "json_object *jso;\n"
>          s += "int rc;\n"
> -        sub_scope_object = "jso_sub_1"
> +        depth = 1
>      else:
> -        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
> +        depth += 1

We could simply do `depth += 1` regardless of the value of parent, it
would have the same effect, since depth start at 0. We just need to
create a new variable name that is different from the one created by the
callers (`depth=random.randrange(9999, 99999999)` actually works :-D,
but no guaranty of having different values). Anyway, the code is fine as
is, no need to make last minute edit.

Cheers,

-- 
Anthony PERARD
Re: [PATCH] tools/libxl: Make gentypes.py compatible with older Python
Posted by Andrew Cooper 1 week, 1 day ago
On 21/10/2025 5:23 pm, Anthony PERARD wrote:
> On Thu, Oct 16, 2025 at 10:06:13PM -0400, Jason Andryuk wrote:
>> removeprefix is only added in Python 3.9.
>>
>> Instead of the prefix removal, switch to passing in a "depth" parameter,
>> and incrementing it for each level.
>>
>> There is a slight change in the generated _libxl_types.c.  instances of
>> KeyedUnion increment depth without outputing any code.  The net result
>> is some cases where jso_sub_1 is followed by jso_sub_3.  As an example:
>>
>> _libxl_types.c
>> _libxl_types.c
>> @@ -5535,12 +5535,12 @@
>>                  if (!jso_sub_1)
>>                      goto out;
>>                  if (!libxl__string_is_default(&p->u.pty.path)) {
>> -                    json_object *jso_sub_2 = NULL;
>> -                    rc = libxl__string_gen_jso(&jso_sub_2, p->u.pty.path);
>> +                    json_object *jso_sub_3 = NULL;
>> +                    rc = libxl__string_gen_jso(&jso_sub_3, p->u.pty.path);
>>                      if (rc)
>>                          goto out;
>> -                    if (json_object_object_add(jso_sub_1, "path", jso_sub_2)) {
>> -                        json_object_put(jso_sub_2);
>> +                    if (json_object_object_add(jso_sub_1, "path", jso_sub_3)) {
>> +                        json_object_put(jso_sub_3);
>>                          goto out;
>>                      }
>>                  }
>>
>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>> ---
>> Here's an alternative approach to workaround removeprefix.
> Yeah, this version is less obscure about what's going on. Let's go for
> it.
>
> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>

Thanks.  I'll take this version, and take the liberty of assuming that
the Release Ack is transferable to whichever solution the maintainers
prefer in the end.

>
>>  tools/libs/light/gentypes.py | 14 ++++++++------
>>  1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/tools/libs/light/gentypes.py b/tools/libs/light/gentypes.py
>> index 006bea170a..0e45c04f49 100644
>> --- a/tools/libs/light/gentypes.py
>> +++ b/tools/libs/light/gentypes.py
>> @@ -377,15 +377,16 @@ def get_default_expr(f, nparent, fexpr):
>>      return "%s" % fexpr
>>  
>>  # For json-c gen_json functions
>> -def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
>> +def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
>>      s = ""
>>      if parent is None:
>>          s += "json_object *jso;\n"
>>          s += "int rc;\n"
>> -        sub_scope_object = "jso_sub_1"
>> +        depth = 1
>>      else:
>> -        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
>> +        depth += 1
> We could simply do `depth += 1` regardless of the value of parent, it
> would have the same effect, since depth start at 0.

That makes the code even more simple, because it takes out the else. 
The net hunk is:

@@ -377,15 +377,14 @@ def get_default_expr(f, nparent, fexpr):
     return "%s" % fexpr
 
 # For json-c gen_json functions
-def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
+def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
     s = ""
     if parent is None:
         s += "json_object *jso;\n"
         s += "int rc;\n"
-        sub_scope_object = "jso_sub_1"
-    else:
-        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
 
+    depth += 1
+    sub_scope_object = "jso_sub_%d" % depth
     if isinstance(ty, idl.Array):
         if parent is None:
             raise Exception("Array type must have a parent")


~Andrew

Re: [PATCH] tools/libxl: Make gentypes.py compatible with older Python
Posted by Jason Andryuk 1 week, 1 day ago
On 2025-10-21 12:31, Andrew Cooper wrote:
> On 21/10/2025 5:23 pm, Anthony PERARD wrote:
>> On Thu, Oct 16, 2025 at 10:06:13PM -0400, Jason Andryuk wrote:
>>> removeprefix is only added in Python 3.9.
>>>
>>> Instead of the prefix removal, switch to passing in a "depth" parameter,
>>> and incrementing it for each level.
>>>
>>> There is a slight change in the generated _libxl_types.c.  instances of
>>> KeyedUnion increment depth without outputing any code.  The net result
>>> is some cases where jso_sub_1 is followed by jso_sub_3.  As an example:
>>>
>>> _libxl_types.c
>>> _libxl_types.c
>>> @@ -5535,12 +5535,12 @@
>>>                   if (!jso_sub_1)
>>>                       goto out;
>>>                   if (!libxl__string_is_default(&p->u.pty.path)) {
>>> -                    json_object *jso_sub_2 = NULL;
>>> -                    rc = libxl__string_gen_jso(&jso_sub_2, p->u.pty.path);
>>> +                    json_object *jso_sub_3 = NULL;
>>> +                    rc = libxl__string_gen_jso(&jso_sub_3, p->u.pty.path);
>>>                       if (rc)
>>>                           goto out;
>>> -                    if (json_object_object_add(jso_sub_1, "path", jso_sub_2)) {
>>> -                        json_object_put(jso_sub_2);
>>> +                    if (json_object_object_add(jso_sub_1, "path", jso_sub_3)) {
>>> +                        json_object_put(jso_sub_3);
>>>                           goto out;
>>>                       }
>>>                   }
>>>
>>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>>> ---
>>> Here's an alternative approach to workaround removeprefix.
>> Yeah, this version is less obscure about what's going on. Let's go for
>> it.
>>
>> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
> 
> Thanks.  I'll take this version, and take the liberty of assuming that
> the Release Ack is transferable to whichever solution the maintainers
> prefer in the end.
> 
>>
>>>   tools/libs/light/gentypes.py | 14 ++++++++------
>>>   1 file changed, 8 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/tools/libs/light/gentypes.py b/tools/libs/light/gentypes.py
>>> index 006bea170a..0e45c04f49 100644
>>> --- a/tools/libs/light/gentypes.py
>>> +++ b/tools/libs/light/gentypes.py
>>> @@ -377,15 +377,16 @@ def get_default_expr(f, nparent, fexpr):
>>>       return "%s" % fexpr
>>>   
>>>   # For json-c gen_json functions
>>> -def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
>>> +def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
>>>       s = ""
>>>       if parent is None:
>>>           s += "json_object *jso;\n"
>>>           s += "int rc;\n"
>>> -        sub_scope_object = "jso_sub_1"
>>> +        depth = 1
>>>       else:
>>> -        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
>>> +        depth += 1
>> We could simply do `depth += 1` regardless of the value of parent, it
>> would have the same effect, since depth start at 0.
> 
> That makes the code even more simple, because it takes out the else.
> The net hunk is:
> 
> @@ -377,15 +377,14 @@ def get_default_expr(f, nparent, fexpr):
>       return "%s" % fexpr
>   
>   # For json-c gen_json functions
> -def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso"):
> +def libxl_C_type_gen_jso(ty, v, indent = "    ", parent = None, scope_object = "jso", depth = 0):
>       s = ""
>       if parent is None:
>           s += "json_object *jso;\n"
>           s += "int rc;\n"
> -        sub_scope_object = "jso_sub_1"
> -    else:
> -        sub_scope_object = "jso_sub_%d" % (1+int(scope_object.removeprefix("jso_sub_")))
>   
> +    depth += 1
> +    sub_scope_object = "jso_sub_%d" % depth
>       if isinstance(ty, idl.Array):
>           if parent is None:
>               raise Exception("Array type must have a parent")
This works for me, thanks - I even tried it at some point while tracking 
down the jso_sub_2/3 difference from KeyedUnion.  I should have gone 
back to it :)

Regards,
Jason

Re: [PATCH] tools/libxl: Make gentypes.py compatible with older Python
Posted by Jan Beulich 1 week, 6 days ago
On 17.10.2025 04:06, Jason Andryuk wrote:
> removeprefix is only added in Python 3.9.
> 
> Instead of the prefix removal, switch to passing in a "depth" parameter,
> and incrementing it for each level.
> 
> There is a slight change in the generated _libxl_types.c.  instances of
> KeyedUnion increment depth without outputing any code.  The net result
> is some cases where jso_sub_1 is followed by jso_sub_3.  As an example:
> 
> _libxl_types.c
> _libxl_types.c
> @@ -5535,12 +5535,12 @@
>                  if (!jso_sub_1)
>                      goto out;
>                  if (!libxl__string_is_default(&p->u.pty.path)) {
> -                    json_object *jso_sub_2 = NULL;
> -                    rc = libxl__string_gen_jso(&jso_sub_2, p->u.pty.path);
> +                    json_object *jso_sub_3 = NULL;
> +                    rc = libxl__string_gen_jso(&jso_sub_3, p->u.pty.path);
>                      if (rc)
>                          goto out;
> -                    if (json_object_object_add(jso_sub_1, "path", jso_sub_2)) {
> -                        json_object_put(jso_sub_2);
> +                    if (json_object_object_add(jso_sub_1, "path", jso_sub_3)) {
> +                        json_object_put(jso_sub_3);
>                          goto out;
>                      }
>                  }
> 
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
> ---
> Here's an alternative approach to workaround removeprefix.

Fine with me; it's really Anthony's call. (He'll be back on Monday, aiui.)

Jan