| 1208 | } |
| 1209 | |
| 1210 | GJS_JSAPI_RETURN_CONVENTION |
| 1211 | static JSNative create_getter_invoker(JSContext* cx, GParamSpec* pspec, |
| 1212 | const GI::FunctionInfo& getter, |
| 1213 | const GI::TypeInfo& type, |
| 1214 | JS::MutableHandleValue wrapper_out) { |
| 1215 | JS::RootedObject wrapper{cx}; |
| 1216 | |
| 1217 | GITransfer transfer = getter.caller_owns(); |
| 1218 | JSNative js_getter = get_getter_for_type(type, transfer); |
| 1219 | |
| 1220 | Gjs::GErrorResult<> init_result{Ok{}}; |
| 1221 | if (js_getter) { |
| 1222 | wrapper = new_object_with_stashed_pointer<ObjectPropertyPspecCaller>( |
| 1223 | cx, pspec); |
| 1224 | if (!wrapper) |
| 1225 | return nullptr; |
| 1226 | auto* caller = |
| 1227 | JS::ObjectGetStashedPointer<ObjectPropertyPspecCaller>(cx, wrapper); |
| 1228 | init_result = caller->init(getter); |
| 1229 | } else { |
| 1230 | wrapper = new_object_with_stashed_pointer<ObjectPropertyInfoCaller>( |
| 1231 | cx, getter); |
| 1232 | if (!wrapper) |
| 1233 | return nullptr; |
| 1234 | js_getter = &ObjectBase::prop_getter_func; |
| 1235 | auto* caller = |
| 1236 | JS::ObjectGetStashedPointer<ObjectPropertyInfoCaller>(cx, wrapper); |
| 1237 | init_result = caller->init(); |
| 1238 | } |
| 1239 | |
| 1240 | if (init_result.isErr()) { |
| 1241 | gjs_throw(cx, "Impossible to create invoker for %s: %s", getter.name(), |
| 1242 | init_result.inspectErr()->message); |
| 1243 | return nullptr; |
| 1244 | } |
| 1245 | |
| 1246 | wrapper_out.setObject(*wrapper); |
| 1247 | return js_getter; |
| 1248 | } |
| 1249 | |
| 1250 | // We cannot use g_base_info_equal because the GITypeInfo of properties is |
| 1251 | // not marked as a pointer in GIR files, while it is marked as a pointer in the |
no test coverage detected