MCPcopy Create free account
hub / github.com/GNOME/gjs / emit_impl

Method emit_impl

gi/object.cpp:3051–3140  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3049}
3050
3051bool ObjectInstance::emit_impl(JSContext* cx, const JS::CallArgs& args) {
3052 GQuark signal_detail;
3053 GSignalQuery signal_query;
3054
3055 gjs_debug_gsignal("emit obj %p priv %p argc %d", m_wrapper.get(), this,
3056 args.length());
3057
3058 if (!check_gobject_finalized("emit any signal on")) {
3059 args.rval().setUndefined();
3060 return true;
3061 }
3062
3063 JS::UniqueChars signal_name;
3064 if (!gjs_parse_call_args(cx, "emit", args, "!s", "signal name",
3065 &signal_name))
3066 return false;
3067
3068 std::string full_name{GJS_PROFILER_DYNAMIC_STRING(
3069 cx, format_name() + " emit('" + signal_name.get() + "')")};
3070 AutoProfilerLabel label{cx, "", full_name};
3071
3072 unsigned signal_id;
3073 if (!g_signal_parse_name(signal_name.get(), gtype(), &signal_id,
3074 &signal_detail, false)) {
3075 gjs_throw(cx, "No signal '%s' on object '%s'", signal_name.get(),
3076 type_name());
3077 return false;
3078 }
3079
3080 g_signal_query(signal_id, &signal_query);
3081
3082 if ((args.length() - 1) != signal_query.n_params) {
3083 gjs_throw(cx, "Signal '%s' on %s requires %d args got %d",
3084 signal_name.get(), type_name(), signal_query.n_params,
3085 args.length() - 1);
3086 return false;
3087 }
3088
3089 AutoGValueVector instance_and_args;
3090 instance_and_args.reserve(signal_query.n_params + 1);
3091 std::vector<Gjs::AutoGValue*> args_to_steal;
3092 Gjs::AutoGValue& instance = instance_and_args.emplace_back(gtype());
3093 g_value_set_instance(&instance, m_ptr);
3094
3095 for (unsigned i = 0; i < signal_query.n_params; ++i) {
3096 GType gtype = signal_query.param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
3097 Gjs::AutoGValue& value = instance_and_args.emplace_back(gtype);
3098 if ((signal_query.param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE) != 0) {
3099 if (!gjs_value_to_g_value_no_copy(cx, args[i + 1], &value))
3100 return false;
3101 } else {
3102 if (!gjs_value_to_g_value(cx, args[i + 1], &value))
3103 return false;
3104 }
3105
3106 if (!ObjectBase::info())
3107 continue;
3108

Callers 1

emitMethod · 0.80

Calls 15

gjs_parse_call_argsFunction · 0.85
gjs_throwFunction · 0.85
gjs_value_to_g_valueFunction · 0.85
infoFunction · 0.85
gjs_value_from_g_valueFunction · 0.85
lengthMethod · 0.80
argMethod · 0.80
ownership_transferMethod · 0.80
dataMethod · 0.80
beginMethod · 0.80
endMethod · 0.80

Tested by

no test coverage detected