From: Kouhei S. <nu...@co...> - 2017-07-10 15:37:21
|
Kouhei Sutou 2017-07-11 00:36:42 +0900 (Tue, 11 Jul 2017) New Revision: 7586dc207fbdb236d06be31b6b5cdd2432e126ea https://github.com/ruby-gnome2/ruby-gnome2/commit/7586dc207fbdb236d06be31b6b5cdd2432e126ea Message: gi: support GHashTable<UTF-8, UTF-8> Modified files: gobject-introspection/ext/gobject-introspection/rb-gi-argument.c Modified: gobject-introspection/ext/gobject-introspection/rb-gi-argument.c (+98 -3) =================================================================== --- gobject-introspection/ext/gobject-introspection/rb-gi-argument.c 2017-07-10 23:59:57 +0900 (afd09c0) +++ gobject-introspection/ext/gobject-introspection/rb-gi-argument.c 2017-07-11 00:36:42 +0900 (3426e6c) @@ -1079,6 +1079,101 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info) return rb_argument; } +static void +rb_gi_argument_to_ruby_ghash_utf8_utf8_body(gpointer key, + gpointer value, + gpointer user_data) +{ + VALUE rb_table = (VALUE)user_data; + VALUE rb_key; + VALUE rb_value; + + rb_key = CSTR2RVAL(key); + rb_value = CSTR2RVAL(value); + rb_hash_aset(rb_table, rb_key, rb_value); +} + +static VALUE +rb_gi_argument_to_ruby_ghash_utf8_utf8(GHashTable *table) +{ + VALUE rb_table; + + rb_table = rb_hash_new(); + rb_p(rb_table); + g_hash_table_foreach(table, + rb_gi_argument_to_ruby_ghash_utf8_utf8_body, + (gpointer)(rb_table)); + return rb_table; +} + +static VALUE +rb_gi_argument_to_ruby_ghash(GIArgument *argument, GITypeInfo *type_info) +{ + VALUE rb_argument; + GITypeInfo *key_type_info; + GITypeTag key_type_tag; + GITypeInfo *value_type_info; + GITypeTag value_type_tag; + + key_type_info = g_type_info_get_param_type(type_info, 0); + key_type_tag = g_type_info_get_tag(key_type_info); + value_type_info = g_type_info_get_param_type(type_info, 1); + value_type_tag = g_type_info_get_tag(value_type_info); + + switch (key_type_tag) { + case GI_TYPE_TAG_VOID: + case GI_TYPE_TAG_BOOLEAN: + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + case GI_TYPE_TAG_GTYPE: + g_base_info_unref(key_type_info); + g_base_info_unref(value_type_info); + rb_raise(rb_eNotImpError, + "TODO: GIArgument(GHash)[%s][%s] -> Ruby", + g_type_tag_to_string(key_type_tag), + g_type_tag_to_string(value_type_tag)); + break; + case GI_TYPE_TAG_UTF8: + if (value_type_tag == GI_TYPE_TAG_UTF8) { + g_base_info_unref(key_type_info); + g_base_info_unref(value_type_info); + rb_argument = + rb_gi_argument_to_ruby_ghash_utf8_utf8(argument->v_pointer); + break; + } + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_INTERFACE: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + case GI_TYPE_TAG_UNICHAR: + g_base_info_unref(key_type_info); + g_base_info_unref(value_type_info); + rb_raise(rb_eNotImpError, + "TODO: GIArgument(GHash)[%s][%s] -> Ruby", + g_type_tag_to_string(key_type_tag), + g_type_tag_to_string(value_type_tag)); + break; + default: + g_base_info_unref(key_type_info); + g_base_info_unref(value_type_info); + g_assert_not_reached(); + break; + } + + return rb_argument; +} + static VALUE rb_gi_argument_to_ruby_unichar(GIArgument *argument) { @@ -1183,9 +1278,7 @@ rb_gi_argument_to_ruby(GIArgument *argument, rb_argument = rb_gi_argument_to_ruby_gslist(argument, type_info); break; case GI_TYPE_TAG_GHASH: - rb_raise(rb_eNotImpError, - "TODO: GIArgument(%s) -> Ruby", - g_type_tag_to_string(type_tag)); + rb_argument = rb_gi_argument_to_ruby_ghash(argument, type_info); break; case GI_TYPE_TAG_ERROR: rb_argument = GERROR2RVAL(argument->v_pointer); @@ -1970,6 +2063,8 @@ rb_gi_return_argument_free_container(GIArgument *argument, g_slist_free(argument->v_pointer); break; case GI_TYPE_TAG_GHASH: + g_hash_table_unref(argument->v_pointer); + break; case GI_TYPE_TAG_ERROR: case GI_TYPE_TAG_UNICHAR: rb_raise(rb_eNotImpError, |