diff options
author | Benjamin Berg <bberg@redhat.com> | 2021-12-29 05:04:26 +0100 |
---|---|---|
committer | Benjamin Berg <bberg@redhat.com> | 2022-03-28 10:17:09 +0200 |
commit | 086c99c41ccc7b06c6a158d69038d5afdba558dc (patch) | |
tree | 0fb61703dc5d8a9bd025d6ab1d80f8d9569ded13 | |
parent | 8a1b5754b3a180c448241a481d124dccf8555242 (diff) | |
download | pygobject-086c99c41ccc7b06c6a158d69038d5afdba558dc.tar.gz |
gi: Fix GArray length calculation for other item sizes
-rw-r--r-- | gi/pygi-argument.c | 11 | ||||
-rw-r--r-- | gi/pygi-array.c | 21 | ||||
-rw-r--r-- | tests/test_gi.py | 1 |
3 files changed, 28 insertions, 5 deletions
diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c index 9b98d9c2..5f1726cb 100644 --- a/gi/pygi-argument.c +++ b/gi/pygi-argument.c @@ -269,7 +269,16 @@ _pygi_argument_to_array (GIArgument *arg, g_base_info_unref ( (GIBaseInfo *) item_type_info); if (is_zero_terminated) { - length = g_strv_length (arg->v_pointer); + if (item_size == sizeof(gpointer)) + length = g_strv_length ((gchar **)arg->v_pointer); + else if (item_size == 1) + length = strlen ((gchar*)arg->v_pointer); + else if (item_size == sizeof(int)) + for (length = 0; *(((int*)arg->v_pointer) + length); length++); + else if (item_size == sizeof(short)) + for (length = 0; *(((short*)arg->v_pointer) + length); length++); + else + g_assert_not_reached (); } else { length = g_type_info_get_array_fixed_size (type_info); if (length < 0) { diff --git a/gi/pygi-array.c b/gi/pygi-array.c index 735bb419..d5b817f1 100644 --- a/gi/pygi-array.c +++ b/gi/pygi-array.c @@ -545,10 +545,16 @@ _pygi_marshal_to_py_array (PyGIInvokeState *state, } else if (array_cache->is_zero_terminated) { if (arg->v_pointer == NULL) { len = 0; - } else if (seq_cache->item_cache->type_tag == GI_TYPE_TAG_UINT8) { + } else if (array_cache->item_size == 1) { len = strlen (arg->v_pointer); - } else { + } else if (array_cache->item_size == sizeof(gpointer)) { len = g_strv_length ((gchar **)arg->v_pointer); + } else if (array_cache->item_size == sizeof(int)) { + for (len = 0; *(((int*)arg->v_pointer) + len); len++); + } else if (array_cache->item_size == sizeof(short)) { + for (len = 0; *(((short*)arg->v_pointer) + len); len++); + } else { + g_assert_not_reached (); } } else { GIArgument *len_arg = &state->args[array_cache->len_arg_index].arg_value; @@ -717,7 +723,16 @@ _wrap_c_array (PyGIInvokeState *state, if (array_cache->fixed_size >= 0) { len = array_cache->fixed_size; } else if (array_cache->is_zero_terminated) { - len = g_strv_length ((gchar **)data); + if (array_cache->item_size == sizeof(gpointer)) + len = g_strv_length ((gchar **)data); + else if (array_cache->item_size == 1) + len = strlen ((gchar*)data); + else if (array_cache->item_size == sizeof(int)) + for (len = 0; *(((int*)data) + len); len++); + else if (array_cache->item_size == sizeof(short)) + for (len = 0; *(((short*)data) + len); len++); + else + g_assert_not_reached (); } else if (array_cache->len_arg_index >= 0) { GIArgument *len_arg = &state->args[array_cache->len_arg_index].arg_value; len = len_arg->v_long; diff --git a/tests/test_gi.py b/tests/test_gi.py index 12789207..5560a61b 100644 --- a/tests/test_gi.py +++ b/tests/test_gi.py @@ -920,7 +920,6 @@ class TestArray(unittest.TestCase): result = list(CONSTANT_UCS4) assert GIMarshallingTests.array_unichar_out() == result - @unittest.skip("broken") def test_array_zero_terminated_return_unichar(self): assert GIMarshallingTests.array_zero_terminated_return_unichar() == \ list(CONSTANT_UCS4) |