| 1022 | } |
| 1023 | |
| 1024 | bool 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 |
no test coverage detected