static gboolean set_out_arg (JSContext *js_context, GIFunctionInfo *func_info, gboolean is_return_value, GIArgInfo *arg_info, GITypeInfo *type_info, gpointer ptr, jsval js_value) { gboolean nullable; GITransfer transfer; GIArgument argument; GjsArgumentType arg_type; if (is_return_value) { arg_type = GJS_ARGUMENT_RETURN_VALUE; nullable = g_callable_info_may_return_null (func_info); transfer = g_callable_info_get_caller_owns (func_info); } else { arg_type = GJS_ARGUMENT_ARGUMENT; nullable = g_arg_info_may_be_null (arg_info); transfer = g_arg_info_get_ownership_transfer (arg_info); } if (!gjs_value_to_g_argument (js_context, js_value, type_info, NULL, arg_type, transfer, nullable, &argument)) { if (is_return_value) { g_warning ("Error failed to convert return value to GIArgument"); } else { g_warning ("Error failed to convert OUT argument '%s' from " "jsval to GIArgument", g_base_info_get_name (arg_info)); } return FALSE; } peas_gi_argument_to_pointer (type_info, &argument, ptr); return TRUE; }
static JSBool boxed_set_field_from_value(JSContext *context, Boxed *priv, GIFieldInfo *field_info, jsval value) { GITypeInfo *type_info; GArgument arg; gboolean success = FALSE; gboolean need_release = FALSE; type_info = g_field_info_get_type (field_info); if (!g_type_info_is_pointer (type_info) && g_type_info_get_tag (type_info) == GI_TYPE_TAG_INTERFACE) { GIBaseInfo *interface_info = g_type_info_get_interface(type_info); if (g_base_info_get_type (interface_info) == GI_INFO_TYPE_STRUCT || g_base_info_get_type (interface_info) == GI_INFO_TYPE_BOXED) { success = set_nested_interface_object (context, priv, field_info, type_info, interface_info, value); g_base_info_unref ((GIBaseInfo *)interface_info); goto out; } g_base_info_unref ((GIBaseInfo *)interface_info); } if (!gjs_value_to_g_argument(context, value, type_info, g_base_info_get_name ((GIBaseInfo *)field_info), GJS_ARGUMENT_FIELD, GI_TRANSFER_NOTHING, TRUE, &arg)) goto out; need_release = TRUE; if (!g_field_info_set_field (field_info, priv->gboxed, &arg)) { gjs_throw(context, "Writing field %s.%s is not supported", g_base_info_get_name ((GIBaseInfo *)priv->info), g_base_info_get_name ((GIBaseInfo *)field_info)); goto out; } success = TRUE; out: if (need_release) gjs_g_argument_release (context, GI_TRANSFER_NOTHING, type_info, &arg); g_base_info_unref ((GIBaseInfo *)type_info); return success; }