diff --git a/lib/wplua/value.c b/lib/wplua/value.c index ccb74622..bc2b44cc 100644 --- a/lib/wplua/value.c +++ b/lib/wplua/value.c @@ -103,51 +103,6 @@ wplua_table_to_asv (lua_State *L, int idx) return g_variant_builder_end (&b); } -void -wplua_asv_to_table (lua_State *L, GVariant *asv) -{ - lua_newtable (L); - if (asv) { - GVariantIter iter; - g_variant_iter_init (&iter, asv); - const gchar *key; - GVariant *value; - - while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) { - lua_pushstring (L, key); - - if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) { - lua_pushboolean (L, g_variant_get_boolean (value)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT16)) { - lua_pushinteger (L, g_variant_get_int16 (value)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32)) { - lua_pushinteger (L, g_variant_get_int32 (value)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT64)) { - lua_pushinteger (L, g_variant_get_int64 (value)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)) { - lua_pushnumber (L, g_variant_get_double (value)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) { - lua_pushstring (L, g_variant_get_string (value, NULL)); - } - else if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARDICT)) { - wplua_asv_to_table (L, value); - } - else { - wp_warning ("skipping bad value (its type cannot be represented in lua)"); - lua_pop (L, 1); - continue; - } - - lua_settable (L, -3); - } - } -} - void wplua_lua_to_gvalue (lua_State *L, int idx, GValue *v) { @@ -229,6 +184,126 @@ wplua_lua_to_gvalue (lua_State *L, int idx, GValue *v) } } +void +wplua_gvariant_to_table (lua_State *L, GVariant *variant) +{ + if (variant == NULL) { + lua_pushnil (L); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16)) { + lua_pushinteger (L, g_variant_get_int16 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32)) { + lua_pushinteger (L, g_variant_get_int32 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64)) { + lua_pushinteger (L, g_variant_get_int64 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16)) { + lua_pushinteger (L, g_variant_get_uint16 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)) { + lua_pushinteger (L, g_variant_get_uint32 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64)) { + lua_pushinteger (L, g_variant_get_uint64 (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE)) { + lua_pushnumber (L, g_variant_get_double (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) { + lua_pushboolean (L, g_variant_get_boolean (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)) { + lua_pushstring (L, g_variant_get_string (variant, NULL)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARIANT)) { + wplua_gvariant_to_table (L, g_variant_get_variant (variant)); + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARDICT)) { + lua_newtable (L); + GVariantIter iter; + g_variant_iter_init (&iter, variant); + const gchar *key; + GVariant *value; + while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) { + lua_pushstring (L, key); + if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN)) { + lua_pushboolean (L, g_variant_get_boolean (value)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT16)) { + lua_pushinteger (L, g_variant_get_int16 (value)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32)) { + lua_pushinteger (L, g_variant_get_int32 (value)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_INT64)) { + lua_pushinteger (L, g_variant_get_int64 (value)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)) { + lua_pushnumber (L, g_variant_get_double (value)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) { + lua_pushstring (L, g_variant_get_string (value, NULL)); + } + else if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARDICT)) { + wplua_gvariant_to_table (L, value); + } + else { + wp_warning ("skipping bad value (its type cannot be represented in lua)"); + lua_pop (L, 1); + continue; + } + lua_settable (L, -3); + } + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DICTIONARY)) { + gsize n_children, i; + n_children = g_variant_n_children (variant); + lua_createtable (L, 0, n_children); + for (i = 0; i < n_children; i++) { + g_autoptr (GVariant) key, value; + g_variant_get_child (variant, i, "{@?@*}", &key, &value); + wplua_gvariant_to_table (L, key); + wplua_gvariant_to_table (L, value); + lua_settable (L, -3); + } + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("a?"))) { + gsize n_children, i; + n_children = g_variant_n_children (variant); + lua_createtable (L, n_children, 0); + for (i = 0; i < n_children; i++) { + g_autoptr (GVariant) value; + value = g_variant_get_child_value (variant, i); + wplua_gvariant_to_table (L, value); + lua_seti (L, -2, i); + } + } + + /* FIXME maybe implement if needed */ + else { + g_autofree gchar *type_name = + g_variant_type_dup_string (g_variant_get_type (variant)); + wp_warning ("Unhandled gvariant type %s", type_name); + lua_pushnil (L); + } +} + + int wplua_gvalue_to_lua (lua_State *L, const GValue *v) { @@ -301,12 +376,8 @@ wplua_gvalue_to_lua (lua_State *L, const GValue *v) break; } case G_TYPE_VARIANT: { - GVariant *asv = g_value_get_variant (v); - if (g_variant_is_of_type (asv, G_VARIANT_TYPE_VARDICT)) - wplua_asv_to_table (L, asv); - else - /* FIXME maybe implement if needed */ - lua_pushnil (L); + GVariant *variant = g_value_get_variant (v); + wplua_gvariant_to_table (L, variant); break; } default: diff --git a/lib/wplua/wplua.h b/lib/wplua/wplua.h index c55e345a..0b347a5a 100644 --- a/lib/wplua/wplua.h +++ b/lib/wplua/wplua.h @@ -73,7 +73,7 @@ WpProperties * wplua_table_to_properties (lua_State *L, int idx); void wplua_properties_to_table (lua_State *L, WpProperties *p); GVariant * wplua_table_to_asv (lua_State *L, int idx); -void wplua_asv_to_table (lua_State *L, GVariant *p); +void wplua_gvariant_to_table (lua_State *L, GVariant *p); gboolean wplua_load_buffer (lua_State * L, const gchar *buf, gsize size, int nargs, int nres, GError **error); diff --git a/modules/module-lua-scripting.c b/modules/module-lua-scripting.c index a9a7ef01..a3d730b6 100644 --- a/modules/module-lua-scripting.c +++ b/modules/module-lua-scripting.c @@ -41,7 +41,7 @@ execute_script (lua_State *L, struct ScriptData * s, GError ** error) { int nargs = 0; if (s->args) { - wplua_asv_to_table (L, s->args); + wplua_gvariant_to_table (L, s->args); nargs++; } return wplua_load_path (L, s->filename, nargs, 0, error); diff --git a/tests/wplua/wplua.c b/tests/wplua/wplua.c index 5ba36639..13024a86 100644 --- a/tests/wplua/wplua.c +++ b/tests/wplua/wplua.c @@ -515,7 +515,7 @@ test_wplua_convert_asv () "'test-boolean': , " "'nested-table': <@a{sv} { 'string': <'baz'> }> " "}"); - wplua_asv_to_table (L, v); + wplua_gvariant_to_table (L, v); lua_setglobal (L, "o"); const gchar code2[] = @@ -571,7 +571,7 @@ test_wplua_script_arguments () "'test-boolean': , " "'nested-table': <@a{sv} { 'string': <'baz'> }> " "}"); - wplua_asv_to_table (L, v); + wplua_gvariant_to_table (L, v); const gchar code2[] = "local o = ...\n" @@ -585,7 +585,7 @@ test_wplua_script_arguments () /* same test, but with sandbox enabled */ wplua_enable_sandbox (L, WP_LUA_SANDBOX_ISOLATE_ENV); - wplua_asv_to_table (L, v); + wplua_gvariant_to_table (L, v); wplua_load_buffer (L, code2, sizeof (code2) - 1, 1, 0, &error); g_assert_no_error (error);