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

Function gjs_array_to_basic_explicit_array

gi/arg.cpp:1024–1084  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1022}
1023
1024bool gjs_array_to_basic_explicit_array(
1025 JSContext* cx, JS::HandleValue value, GITypeTag element_tag,
1026 const char* arg_name, GjsArgumentType arg_type, GjsArgumentFlags flags,
1027 void** contents_out, size_t* length_out) {
1028 g_assert(contents_out && length_out && "forgot out parameter");
1029
1030 gjs_debug_marshal(GJS_DEBUG_GFUNCTION,
1031 "Converting argument '%s' JS value %s to C array",
1032 arg_name, gjs_debug_value(value).c_str());
1033
1034 if ((value.isNull() && !(flags & GjsArgumentFlags::MAY_BE_NULL)) ||
1035 (!value.isString() && !value.isObjectOrNull())) {
1036 return throw_invalid_argument_tag(cx, value, element_tag, arg_name,
1037 arg_type);
1038 }
1039
1040 if (value.isNull()) {
1041 *contents_out = nullptr;
1042 *length_out = 0;
1043 return true;
1044 }
1045
1046 if (value.isString()) {
1047 // Allow strings as int8/uint8/int16/uint16 arrays
1048 JS::RootedString str{cx, value.toString()};
1049 return gjs_string_to_intarray(cx, str, element_tag, contents_out,
1050 length_out);
1051 }
1052
1053 JS::RootedObject array_obj{cx, &value.toObject()};
1054 if (JS_IsUint8Array(array_obj) &&
1055 (element_tag == GI_TYPE_TAG_INT8 || element_tag == GI_TYPE_TAG_UINT8)) {
1056 GBytes* bytes = gjs_byte_array_get_bytes(array_obj);
1057 *contents_out = g_bytes_unref_to_data(bytes, length_out);
1058 return true;
1059 }
1060
1061 const GjsAtoms& atoms = GjsContextPrivate::atoms(cx);
1062 bool found_length;
1063 if (!JS_HasPropertyById(cx, array_obj, atoms.length(), &found_length))
1064 return false;
1065 if (found_length) {
1066 uint32_t length;
1067
1068 if (!gjs_object_require_converted_property(cx, array_obj, nullptr,
1069 atoms.length(), &length)) {
1070 return false;
1071 }
1072
1073 // For basic types, type tag == storage type
1074 if (!gjs_array_to_basic_array(cx, value, length, element_tag,
1075 contents_out))
1076 return false;
1077
1078 *length_out = length;
1079 return true;
1080 }
1081

Callers 4

inMethod · 0.85

Calls 8

gjs_debug_valueFunction · 0.85
gjs_string_to_intarrayFunction · 0.85
gjs_byte_array_get_bytesFunction · 0.85
gjs_array_to_basic_arrayFunction · 0.85
lengthMethod · 0.80
toStringMethod · 0.45

Tested by

no test coverage detected