static void peas_extension_gjs_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { PeasExtensionGjs *gexten = PEAS_EXTENSION_GJS (object); gchar *prop_name; jsval js_value; prop_name = convert_property_name (g_param_spec_get_name (pspec)); if (!JS_GetProperty (gexten->js_context, gexten->js_object, prop_name, &js_value)) { g_warning ("Error: failed to get property '%s'", prop_name); } else if (!gjs_value_to_g_value (gexten->js_context, js_value, value)) { g_warning ("Error: failed to convert jsval to " "GValue for property '%s'", prop_name); } g_free (prop_name); }
static void test_extension_gjs_plugin_info (PeasEngine *engine) { PeasPluginInfo *info; PeasExtension *extension; PeasExtensionGjs *gexten; jsval js_value; GValue gvalue = { 0 }; info = peas_engine_get_plugin_info (engine, "extension-gjs"); g_assert (peas_engine_load_plugin (engine, info)); extension = peas_engine_create_extension (engine, info, INTROSPECTION_TYPE_CALLABLE, NULL); g_assert (PEAS_IS_EXTENSION (extension)); gexten = (PeasExtensionGjs *) extension; g_value_init (&gvalue, PEAS_TYPE_PLUGIN_INFO); g_assert (JS_GetProperty (gexten->js_context, gexten->js_object, "plugin_info", &js_value)); g_assert (gjs_value_to_g_value (gexten->js_context, js_value, &gvalue)); g_assert (g_value_get_boxed (&gvalue) == info); g_value_unset (&gvalue); g_object_unref (extension); }
static void closure_marshal(GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { JSRuntime *runtime; JSContext *context; int argc; jsval *argv; jsval rval; int i; GSignalQuery signal_query = { 0, }; gjs_debug_marshal(GJS_DEBUG_GCLOSURE, "Marshal closure %p", closure); if (!gjs_closure_is_valid(closure)) { /* We were destroyed; become a no-op */ return; } runtime = gjs_closure_get_runtime(closure); context = gjs_runtime_get_current_context(runtime); JS_BeginRequest(context); argc = n_param_values; argv = g_newa(jsval, n_param_values); rval = JSVAL_VOID; gjs_set_values(context, argv, argc, JSVAL_VOID); gjs_root_value_locations(context, argv, argc); JS_AddValueRoot(context, &rval); if (marshal_data) { /* we are used for a signal handler */ guint signal_id; signal_id = GPOINTER_TO_UINT(marshal_data); g_signal_query(signal_id, &signal_query); if (!signal_query.signal_id) { gjs_debug(GJS_DEBUG_GCLOSURE, "Signal handler being called on invalid signal"); goto cleanup; } if (signal_query.n_params + 1 != n_param_values) { gjs_debug(GJS_DEBUG_GCLOSURE, "Signal handler being called with wrong number of parameters"); goto cleanup; } } for (i = 0; i < argc; ++i) { const GValue *gval = ¶m_values[i]; gboolean no_copy; no_copy = FALSE; if (i >= 1 && signal_query.signal_id) { no_copy = (signal_query.param_types[i - 1] & G_SIGNAL_TYPE_STATIC_SCOPE) != 0; } if (!gjs_value_from_g_value_internal(context, &argv[i], gval, no_copy, &signal_query, i)) { gjs_debug(GJS_DEBUG_GCLOSURE, "Unable to convert arg %d in order to invoke closure", i); gjs_log_exception(context, NULL); goto cleanup; } } gjs_closure_invoke(closure, argc, argv, &rval); if (return_value != NULL) { if (JSVAL_IS_VOID(rval)) { /* something went wrong invoking, error should be set already */ goto cleanup; } if (!gjs_value_to_g_value(context, rval, return_value)) { gjs_debug(GJS_DEBUG_GCLOSURE, "Unable to convert return value when invoking closure"); gjs_log_exception(context, NULL); goto cleanup; } } cleanup: gjs_unroot_value_locations(context, argv, argc); JS_RemoveValueRoot(context, &rval); JS_EndRequest(context); }