| 761 | } |
| 762 | |
| 763 | GJS_JSAPI_RETURN_CONVENTION |
| 764 | static bool gjs_array_to_array(JSContext* cx, JS::HandleValue array_value, |
| 765 | size_t length, GITransfer transfer, |
| 766 | const GI::TypeInfo& param_info, void** arr_p) { |
| 767 | GITypeTag element_type = param_info.storage_type(); |
| 768 | |
| 769 | if (GI_TYPE_TAG_IS_BASIC(element_type)) { |
| 770 | return gjs_array_to_basic_array(cx, array_value, length, element_type, |
| 771 | arr_p); |
| 772 | } |
| 773 | |
| 774 | switch (element_type) { |
| 775 | case GI_TYPE_TAG_INTERFACE: |
| 776 | if (!param_info.is_pointer()) { |
| 777 | GI::AutoBaseInfo interface_info{param_info.interface()}; |
| 778 | if (auto reg_info = |
| 779 | interface_info.as<GI::InfoTag::REGISTERED_TYPE>(); |
| 780 | reg_info && GI::is_g_value(*reg_info)) { |
| 781 | // Special case for GValue "flat arrays", this could also |
| 782 | // using the generic case, but if we do so we're leaking |
| 783 | // atm. |
| 784 | return gjs_array_to_auto_array<GValue>(cx, array_value, |
| 785 | length, arr_p); |
| 786 | } |
| 787 | |
| 788 | size_t element_size = |
| 789 | gjs_type_get_element_size(param_info.tag(), param_info); |
| 790 | if (element_size) { |
| 791 | return gjs_array_to_flat_array(cx, array_value, length, |
| 792 | param_info, element_size, |
| 793 | arr_p); |
| 794 | } |
| 795 | } |
| 796 | [[fallthrough]]; |
| 797 | case GI_TYPE_TAG_ARRAY: |
| 798 | case GI_TYPE_TAG_GLIST: |
| 799 | case GI_TYPE_TAG_GSLIST: |
| 800 | case GI_TYPE_TAG_GHASH: |
| 801 | case GI_TYPE_TAG_ERROR: |
| 802 | return gjs_array_to_ptrarray(cx, array_value, length, |
| 803 | transfer == GI_TRANSFER_CONTAINER |
| 804 | ? GI_TRANSFER_NOTHING |
| 805 | : transfer, |
| 806 | param_info, arr_p); |
| 807 | default: |
| 808 | // Basic types already handled in gjs_array_to_basic_array() |
| 809 | gjs_throw(cx, "Unhandled array element type %d", element_type); |
| 810 | return false; |
| 811 | } |
| 812 | } |
| 813 | |
| 814 | static inline size_t basic_type_element_size(GITypeTag element_tag) { |
| 815 | g_assert(GI_TYPE_TAG_IS_BASIC(element_tag)); |
no test coverage detected