| 666 | } |
| 667 | |
| 668 | GJS_JSAPI_RETURN_CONVENTION |
| 669 | static bool gjs_array_to_flat_array(JSContext* cx, JS::HandleValue array_value, |
| 670 | unsigned length, |
| 671 | const GI::TypeInfo& param_info, |
| 672 | size_t param_size, void** arr_p) { |
| 673 | g_assert((param_size > 0) && |
| 674 | "Only flat arrays of elements of known size are supported"); |
| 675 | |
| 676 | Gjs::AutoPointer<uint8_t> flat_array{g_new0(uint8_t, param_size * length)}; |
| 677 | |
| 678 | JS::RootedObject array(cx, &array_value.toObject()); |
| 679 | JS::RootedValue elem(cx); |
| 680 | for (unsigned i = 0; i < length; i++) { |
| 681 | elem = JS::UndefinedValue(); |
| 682 | |
| 683 | if (!JS_GetElement(cx, array, i, &elem)) { |
| 684 | gjs_throw(cx, "Missing array element %u", i); |
| 685 | return false; |
| 686 | } |
| 687 | |
| 688 | GIArgument arg; |
| 689 | if (!gjs_value_to_gi_argument(cx, elem, param_info, |
| 690 | GJS_ARGUMENT_ARRAY_ELEMENT, |
| 691 | GI_TRANSFER_NOTHING, &arg)) |
| 692 | return false; |
| 693 | |
| 694 | memcpy(&flat_array[param_size * i], gjs_arg_get<void*>(&arg), |
| 695 | param_size); |
| 696 | } |
| 697 | |
| 698 | *arr_p = flat_array.release(); |
| 699 | return true; |
| 700 | } |
| 701 | |
| 702 | GJS_JSAPI_RETURN_CONVENTION |
| 703 | static bool gjs_array_to_basic_array(JSContext* cx, JS::HandleValue v_array, |
no test coverage detected