MCPcopy Create free account
hub / github.com/GNOME/gjs / gjs_array_from_zero_terminated_c_array

Function gjs_array_from_zero_terminated_c_array

gi/arg.cpp:2859–2915  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2857}
2858
2859GJS_JSAPI_RETURN_CONVENTION
2860static 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

Callers 1

Calls 11

gjs_throwFunction · 0.85
is_basicMethod · 0.80
interfaceMethod · 0.80
is_structMethod · 0.80
display_stringMethod · 0.80
tagMethod · 0.45
is_pointerMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected