| 1384 | } |
| 1385 | |
| 1386 | GJS_JSAPI_RETURN_CONVENTION |
| 1387 | static JSNative create_setter_invoker(JSContext* cx, GParamSpec* pspec, |
| 1388 | const GI::FunctionInfo& setter, |
| 1389 | const GI::ArgInfo& value_arg, |
| 1390 | const GI::TypeInfo& type, |
| 1391 | JS::MutableHandleValue wrapper_out) { |
| 1392 | JS::RootedObject wrapper{cx}; |
| 1393 | |
| 1394 | GITransfer transfer = value_arg.ownership_transfer(); |
| 1395 | JSNative js_setter = get_setter_for_type(type, transfer); |
| 1396 | |
| 1397 | Gjs::GErrorResult<> init_result{Ok{}}; |
| 1398 | if (js_setter) { |
| 1399 | wrapper = new_object_with_stashed_pointer<ObjectPropertyPspecCaller>( |
| 1400 | cx, pspec); |
| 1401 | if (!wrapper) |
| 1402 | return nullptr; |
| 1403 | auto* caller = |
| 1404 | JS::ObjectGetStashedPointer<ObjectPropertyPspecCaller>(cx, wrapper); |
| 1405 | init_result = caller->init(setter); |
| 1406 | } else { |
| 1407 | wrapper = new_object_with_stashed_pointer<ObjectPropertyInfoCaller>( |
| 1408 | cx, setter); |
| 1409 | if (!wrapper) |
| 1410 | return nullptr; |
| 1411 | js_setter = &ObjectBase::prop_setter_func; |
| 1412 | auto* caller = |
| 1413 | JS::ObjectGetStashedPointer<ObjectPropertyInfoCaller>(cx, wrapper); |
| 1414 | init_result = caller->init(); |
| 1415 | } |
| 1416 | |
| 1417 | if (init_result.isErr()) { |
| 1418 | gjs_throw(cx, "Impossible to create invoker for %s: %s", setter.name(), |
| 1419 | init_result.inspectErr()->message); |
| 1420 | return nullptr; |
| 1421 | } |
| 1422 | |
| 1423 | wrapper_out.setObject(*wrapper); |
| 1424 | return js_setter; |
| 1425 | } |
| 1426 | |
| 1427 | GJS_JSAPI_RETURN_CONVENTION |
| 1428 | static JSNative get_setter_for_property( |
no test coverage detected