From c5d900423600a52a1a88d8e2e40d6c0c7340643c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 30 Jun 2023 19:24:03 +0200 Subject: [PATCH] gdbus-codegen: Use direct-access GValue macros for marshallers and GValues This is the same we're doing in code generated by glib-genmarshaller and what gmarshal does internally. Since the generated gdbus C code can be considered private too, this is safe to do, and will allow faster access to GValue objects. --- gio/gdbus-2.0/codegen/codegen.py | 49 +++++++++++++++++++ gio/gdbus-2.0/codegen/dbustypes.py | 38 +++++++-------- gio/tests/codegen.py | 78 +++++++++++++++++++++++++----- 3 files changed, 134 insertions(+), 31 deletions(-) diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py index 88e08196b..f96a6f5ce 100644 --- a/gio/gdbus-2.0/codegen/codegen.py +++ b/gio/gdbus-2.0/codegen/codegen.py @@ -1486,6 +1486,55 @@ class CodeGenerator: "#ifdef G_OS_UNIX\n" "# include \n" "#endif\n" "\n" ) + self.outfile.write( + """#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_schar (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#define g_marshal_value_peek_variant(v) g_value_get_variant (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */""" + "\n\n" + ) + self.outfile.write( "typedef struct\n" "{\n" diff --git a/gio/gdbus-2.0/codegen/dbustypes.py b/gio/gdbus-2.0/codegen/dbustypes.py index dcc0be9db..42ca7dae8 100644 --- a/gio/gdbus-2.0/codegen/dbustypes.py +++ b/gio/gdbus-2.0/codegen/dbustypes.py @@ -83,7 +83,7 @@ class Arg: self.format_in = "@" + self.signature self.format_out = "@" + self.signature self.gvariant_get = "XXX" - self.gvalue_get = "g_value_get_variant" + self.gvalue_get = "g_marshal_value_peek_variant" self.gvalue_set = "g_value_take_variant" self.array_annotation = "" @@ -100,7 +100,7 @@ class Arg: self.format_in = "b" self.format_out = "b" self.gvariant_get = "g_variant_get_boolean" - self.gvalue_get = "g_value_get_boolean" + self.gvalue_get = "g_marshal_value_peek_boolean" self.gvalue_set = "g_value_set_boolean" elif self.signature == "y": self.ctype_in_g = "guchar " @@ -112,7 +112,7 @@ class Arg: self.format_in = "y" self.format_out = "y" self.gvariant_get = "g_variant_get_byte" - self.gvalue_get = "g_value_get_uchar" + self.gvalue_get = "g_marshal_value_peek_uchar" self.gvalue_set = "g_value_set_uchar" elif self.signature == "n": self.ctype_in_g = "gint " @@ -124,7 +124,7 @@ class Arg: self.format_in = "n" self.format_out = "n" self.gvariant_get = "g_variant_get_int16" - self.gvalue_get = "g_value_get_int" + self.gvalue_get = "g_marshal_value_peek_int" self.gvalue_set = "g_value_set_int" elif self.signature == "q": self.ctype_in_g = "guint " @@ -136,7 +136,7 @@ class Arg: self.format_in = "q" self.format_out = "q" self.gvariant_get = "g_variant_get_uint16" - self.gvalue_get = "g_value_get_uint" + self.gvalue_get = "g_marshal_value_peek_uint" self.gvalue_set = "g_value_set_uint" elif self.signature == "i": self.ctype_in_g = "gint " @@ -148,7 +148,7 @@ class Arg: self.format_in = "i" self.format_out = "i" self.gvariant_get = "g_variant_get_int32" - self.gvalue_get = "g_value_get_int" + self.gvalue_get = "g_marshal_value_peek_int" self.gvalue_set = "g_value_set_int" elif self.signature == "u": self.ctype_in_g = "guint " @@ -160,7 +160,7 @@ class Arg: self.format_in = "u" self.format_out = "u" self.gvariant_get = "g_variant_get_uint32" - self.gvalue_get = "g_value_get_uint" + self.gvalue_get = "g_marshal_value_peek_uint" self.gvalue_set = "g_value_set_uint" elif self.signature == "x": self.ctype_in_g = "gint64 " @@ -172,7 +172,7 @@ class Arg: self.format_in = "x" self.format_out = "x" self.gvariant_get = "g_variant_get_int64" - self.gvalue_get = "g_value_get_int64" + self.gvalue_get = "g_marshal_value_peek_int64" self.gvalue_set = "g_value_set_int64" elif self.signature == "t": self.ctype_in_g = "guint64 " @@ -184,7 +184,7 @@ class Arg: self.format_in = "t" self.format_out = "t" self.gvariant_get = "g_variant_get_uint64" - self.gvalue_get = "g_value_get_uint64" + self.gvalue_get = "g_marshal_value_peek_uint64" self.gvalue_set = "g_value_set_uint64" elif self.signature == "d": self.ctype_in_g = "gdouble " @@ -196,7 +196,7 @@ class Arg: self.format_in = "d" self.format_out = "d" self.gvariant_get = "g_variant_get_double" - self.gvalue_get = "g_value_get_double" + self.gvalue_get = "g_marshal_value_peek_double" self.gvalue_set = "g_value_set_double" elif self.signature == "s": self.ctype_in_g = "const gchar *" @@ -209,7 +209,7 @@ class Arg: self.format_in = "s" self.format_out = "s" self.gvariant_get = "g_variant_get_string" - self.gvalue_get = "g_value_get_string" + self.gvalue_get = "g_marshal_value_peek_string" self.gvalue_set = "g_value_set_string" elif self.signature == "o": self.ctype_in_g = "const gchar *" @@ -222,7 +222,7 @@ class Arg: self.format_in = "o" self.format_out = "o" self.gvariant_get = "g_variant_get_string" - self.gvalue_get = "g_value_get_string" + self.gvalue_get = "g_marshal_value_peek_string" self.gvalue_set = "g_value_set_string" elif self.signature == "g": self.ctype_in_g = "const gchar *" @@ -235,7 +235,7 @@ class Arg: self.format_in = "g" self.format_out = "g" self.gvariant_get = "g_variant_get_string" - self.gvalue_get = "g_value_get_string" + self.gvalue_get = "g_marshal_value_peek_string" self.gvalue_set = "g_value_set_string" elif self.signature == "ay": self.ctype_in_g = "const gchar *" @@ -248,7 +248,7 @@ class Arg: self.format_in = "^ay" self.format_out = "^ay" self.gvariant_get = "g_variant_get_bytestring" - self.gvalue_get = "g_value_get_string" + self.gvalue_get = "g_marshal_value_peek_string" self.gvalue_set = "g_value_set_string" elif self.signature == "as": self.ctype_in_g = "const gchar *const *" @@ -261,7 +261,7 @@ class Arg: self.format_in = "^as" self.format_out = "^as" self.gvariant_get = "g_variant_get_strv" - self.gvalue_get = "g_value_get_boxed" + self.gvalue_get = "g_marshal_value_peek_boxed" self.gvalue_set = "g_value_take_boxed" self.array_annotation = "(array zero-terminated=1)" elif self.signature == "ao": @@ -275,7 +275,7 @@ class Arg: self.format_in = "^ao" self.format_out = "^ao" self.gvariant_get = "g_variant_get_objv" - self.gvalue_get = "g_value_get_boxed" + self.gvalue_get = "g_marshal_value_peek_boxed" self.gvalue_set = "g_value_take_boxed" self.array_annotation = "(array zero-terminated=1)" elif self.signature == "aay": @@ -289,7 +289,7 @@ class Arg: self.format_in = "^aay" self.format_out = "^aay" self.gvariant_get = "g_variant_get_bytestring_array" - self.gvalue_get = "g_value_get_boxed" + self.gvalue_get = "g_marshal_value_peek_boxed" self.gvalue_set = "g_value_take_boxed" self.array_annotation = "(array zero-terminated=1)" @@ -358,13 +358,13 @@ class Method: method_invocation_arg = Arg("method_invocation", None) method_invocation_arg.ctype_in = "GDBusMethodInvocation *" - method_invocation_arg.gvalue_get = "g_value_get_object" + method_invocation_arg.gvalue_get = "g_marshal_value_peek_object" self.marshaller_in_args = [method_invocation_arg] + self.in_args if self.unix_fd: fd_list_arg = Arg("fd_list", None) fd_list_arg.ctype_in = "GUnixFDList *" - fd_list_arg.gvalue_get = "g_value_get_object" + fd_list_arg.gvalue_get = "g_marshal_value_peek_object" self.marshaller_in_args.insert(0, fd_list_arg) for a in self.annotations: diff --git a/gio/tests/codegen.py b/gio/tests/codegen.py index 746517204..bd2543118 100644 --- a/gio/tests/codegen.py +++ b/gio/tests/codegen.py @@ -147,6 +147,51 @@ class TestCodegen(unittest.TestCase): "#ifdef G_OS_UNIX\n" "# include \n" "#endif", + "private_gvalues_getters": """#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_schar (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#define g_marshal_value_peek_variant(v) g_value_get_variant (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */""", "standard_typedefs_and_helpers": "typedef struct\n" "{\n" " GDBusArgInfo parent_struct;\n" @@ -346,6 +391,8 @@ G_END_DECLS {standard_header_includes} +{private_gvalues_getters} + {standard_typedefs_and_helpers}""".format( **result.subs ), @@ -854,7 +901,7 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name} ("), 1) self.assertIs( stripped_out.count( - f"g_value_get_{props['value_type']} (param_values + 1)" + f"g_marshal_value_peek_{props['value_type']} (param_values + 1)" ), 1, ) @@ -897,7 +944,7 @@ G_END_DECLS for props in self.ARGUMENTS_TYPES.values(): self.assertIs( stripped_out.count( - f"g_value_get_{props['value_type']} (param_values + {index})" + f"g_marshal_value_peek_{props['value_type']} (param_values + {index})" ), 1, ) @@ -931,7 +978,9 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name},"), 1) self.assertIs(stripped_out.count(f"{func_name} ("), 1) - self.assertIs(stripped_out.count("g_value_get_object (param_values + 1)"), 2) + self.assertIs( + stripped_out.count("g_marshal_value_peek_object (param_values + 1)"), 2 + ) self.assertIs( stripped_out.count("g_value_set_boolean (return_value, v_return);"), 2 ) @@ -963,14 +1012,14 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name},"), 1) self.assertIs(stripped_out.count(f"{func_name} ("), 1) self.assertIs( - stripped_out.count("g_value_get_object (param_values + 1)"), 1 + stripped_out.count("g_marshal_value_peek_object (param_values + 1)"), 1 ) self.assertIs( stripped_out.count("g_value_set_boolean (return_value, v_return);"), 1 ) self.assertIs( stripped_out.count( - f"g_value_get_{props['value_type']} (param_values + 2)" + f"g_marshal_value_peek_{props['value_type']} (param_values + 2)" ), 1, ) @@ -1002,7 +1051,7 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name},"), 1) self.assertIs(stripped_out.count(f"{func_name} ("), 1) self.assertIs( - stripped_out.count("g_value_get_object (param_values + 1)"), 1 + stripped_out.count("g_marshal_value_peek_object (param_values + 1)"), 1 ) self.assertIs( stripped_out.count("g_value_set_boolean (return_value, v_return);"), 1 @@ -1040,14 +1089,15 @@ G_END_DECLS # Check access to MultipleArgsMethod arguments index = 1 self.assertIs( - stripped_out.count(f"g_value_get_object (param_values + {index})"), 1 + stripped_out.count(f"g_marshal_value_peek_object (param_values + {index})"), + 1, ) index += 1 for props in self.ARGUMENTS_TYPES.values(): self.assertIs( stripped_out.count( - f"g_value_get_{props['value_type']} (param_values + {index})" + f"g_marshal_value_peek_{props['value_type']} (param_values + {index})" ), 1, ) @@ -1088,7 +1138,8 @@ G_END_DECLS # Check access to MultipleArgsMethod arguments index = 1 self.assertIs( - stripped_out.count(f"g_value_get_object (param_values + {index})"), 1 + stripped_out.count(f"g_marshal_value_peek_object (param_values + {index})"), + 1, ) index += 1 @@ -1126,17 +1177,20 @@ G_END_DECLS index = 1 self.assertIs( - stripped_out.count(f"g_value_get_object (param_values + {index})"), 1 + stripped_out.count(f"g_marshal_value_peek_object (param_values + {index})"), + 1, ) index += 1 self.assertIs( - stripped_out.count(f"g_value_get_object (param_values + {index})"), 1 + stripped_out.count(f"g_marshal_value_peek_object (param_values + {index})"), + 1, ) index += 1 self.assertIs( - stripped_out.count(f"g_value_get_string (param_values + {index})"), 1 + stripped_out.count(f"g_marshal_value_peek_string (param_values + {index})"), + 1, ) index += 1