| 2857 | } |
| 2858 | |
| 2859 | GJS_JSAPI_RETURN_CONVENTION |
| 2860 | static bool gjs_array_from_zero_terminated_c_array( |
| 2861 | JSContext* cx, JS::MutableHandleValue value_p, |
| 2862 | const GI::TypeInfo& element_type, GITransfer transfer, void* c_array) { |
| 2863 | GITypeTag element_tag = element_type.tag(); |
| 2864 | |
| 2865 | if (element_type.is_basic()) { |
| 2866 | return gjs_array_from_basic_zero_terminated_array(cx, value_p, |
| 2867 | element_tag, c_array); |
| 2868 | } |
| 2869 | |
| 2870 | JS::RootedValueVector elems{cx}; |
| 2871 | |
| 2872 | GIArgument arg; |
| 2873 | switch (element_tag) { |
| 2874 | case GI_TYPE_TAG_INTERFACE: { |
| 2875 | GI::AutoBaseInfo interface_info{element_type.interface()}; |
| 2876 | auto reg_info = interface_info.as<GI::InfoTag::REGISTERED_TYPE>(); |
| 2877 | bool element_is_pointer = element_type.is_pointer(); |
| 2878 | bool is_struct = reg_info->is_struct(); |
| 2879 | |
| 2880 | if (!element_is_pointer && is_struct) { |
| 2881 | auto struct_info = interface_info.as<GI::InfoTag::STRUCT>(); |
| 2882 | size_t element_size = struct_info->size(); |
| 2883 | |
| 2884 | if (!fill_vector_from_zero_terminated_non_pointer_carray( |
| 2885 | cx, elems, element_type, &arg, element_size, c_array)) |
| 2886 | return false; |
| 2887 | break; |
| 2888 | } |
| 2889 | |
| 2890 | [[fallthrough]]; |
| 2891 | } |
| 2892 | case GI_TYPE_TAG_ARRAY: |
| 2893 | case GI_TYPE_TAG_GLIST: |
| 2894 | case GI_TYPE_TAG_GSLIST: |
| 2895 | case GI_TYPE_TAG_GHASH: |
| 2896 | case GI_TYPE_TAG_ERROR: |
| 2897 | if (!fill_vector_from_zero_terminated_pointer_carray( |
| 2898 | cx, elems, element_type, &arg, c_array, transfer)) |
| 2899 | return false; |
| 2900 | break; |
| 2901 | default: |
| 2902 | // Handled in gjs_array_from_basic_zero_terminated_c_array() |
| 2903 | gjs_throw(cx, "Unknown element-type %s", |
| 2904 | element_type.display_string()); |
| 2905 | return false; |
| 2906 | } |
| 2907 | |
| 2908 | JSObject* obj = JS::NewArrayObject(cx, elems); |
| 2909 | if (!obj) |
| 2910 | return false; |
| 2911 | |
| 2912 | value_p.setObject(*obj); |
| 2913 | |
| 2914 | return true; |
| 2915 | } |
| 2916 |
no test coverage detected