static VALUE rg_invoke(VALUE self, VALUE rb_arguments) { GIFunctionInfo *info; VALUE rb_out_args; VALUE rb_return_value; info = SELF(self); /* TODO: use rb_protect() */ rb_out_args = rb_gi_function_info_invoke_raw(info, self, Qnil, rb_arguments, NULL, &rb_return_value); if (NIL_P(rb_out_args)) { return rb_return_value; } else { GICallableInfo *callable_info = (GICallableInfo *)info; GITypeInfo return_value_info; g_callable_info_load_return_type(callable_info, &return_value_info); if (g_type_info_get_tag(&return_value_info) != GI_TYPE_TAG_VOID) { rb_ary_unshift(rb_out_args, rb_return_value); } if (RARRAY_LEN(rb_out_args) == 1) { return RARRAY_PTR(rb_out_args)[0]; } else { return rb_out_args; } } }
static VALUE rg_invoke(VALUE self, VALUE rb_receiver, VALUE rb_arguments) { GIFunctionInfo *info; GICallableInfo *callable_info; GIArgument return_value; GITypeInfo return_value_info; info = SELF(self); callable_info = (GICallableInfo *)info; if (NIL_P(rb_receiver)) { rb_raise(rb_eArgError, "receiver is missing"); } /* TODO: use rb_protect */ rb_gi_function_info_invoke_raw(info, self, Qnil, rb_arguments, &return_value, NULL); g_callable_info_load_return_type(callable_info, &return_value_info); initialize_receiver(rb_receiver, &return_value_info, &return_value); return rb_receiver; }