| 3049 | } |
| 3050 | |
| 3051 | bool 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 |
no test coverage detected