From: Kouhei S. <nu...@co...> - 2017-11-27 15:20:08
|
Kouhei Sutou 2017-11-28 00:19:03 +0900 (Tue, 28 Nov 2017) New Revision: cedb1d8bf30ad309460f300e690edb721a2c97a2 https://github.com/ruby-gnome2/ruby-gnome2/commit/cedb1d8bf30ad309460f300e690edb721a2c97a2 Message: gi: add nil argument check Modified files: gobject-introspection/ext/gobject-introspection/rb-gi-argument.c gobject-introspection/ext/gobject-introspection/rb-gi-conversions.h gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c Modified: gobject-introspection/ext/gobject-introspection/rb-gi-argument.c (+26 -5) =================================================================== --- gobject-introspection/ext/gobject-introspection/rb-gi-argument.c 2017-11-26 22:53:37 +0900 (67c35092f) +++ gobject-introspection/ext/gobject-introspection/rb-gi-argument.c 2017-11-28 00:19:03 +0900 (b6900d5ee) @@ -3406,14 +3406,35 @@ rb_gi_in_argument_transfer(GIArgument *argument, GITransfer transfer, } GIArgument * -rb_gi_in_argument_from_ruby(GIArgument *argument, GIArgInfo *arg_info, - VALUE rb_argument, VALUE self) +rb_gi_in_argument_from_ruby(GIArgument *argument, + GIArgInfo *arg_info, + guint nth_rb_argument, + VALUE rb_argument, + VALUE self) { GITypeInfo type_info; - if (g_arg_info_may_be_null(arg_info) && NIL_P(rb_argument)) { - memset(argument, 0, sizeof(GIArgument)); - return argument; + if (NIL_P(rb_argument)) { + if (g_arg_info_may_be_null(arg_info)) { + memset(argument, 0, sizeof(GIArgument)); + return argument; + } else { + const char *suffix; + if (nth_rb_argument == 1) { + suffix = "st"; + } else if (nth_rb_argument == 2) { + suffix = "nd"; + } else if (nth_rb_argument == 3) { + suffix = "rd"; + } else { + suffix = "th"; + } + rb_raise(rb_eArgError, + "the %u%s argument must not nil: <%s>", + nth_rb_argument, + suffix, + g_base_info_get_name(arg_info)); + } } g_arg_info_load_type(arg_info, &type_info); Modified: gobject-introspection/ext/gobject-introspection/rb-gi-conversions.h (+1 -3) =================================================================== --- gobject-introspection/ext/gobject-introspection/rb-gi-conversions.h 2017-11-26 22:53:37 +0900 (ab2eab4bd) +++ gobject-introspection/ext/gobject-introspection/rb-gi-conversions.h 2017-11-28 00:19:03 +0900 (e1fd95bd3) @@ -46,9 +46,6 @@ #define RVAL2GI_VALUE_ARGUMENT(argument, type_info, rb_argument, self) \ (rb_gi_value_argument_from_ruby((argument), (type_info), \ (rb_argument), (self))) -#define RVAL2GI_IN_ARGUMENT(argument, arg_info, rb_argument, self) \ - (rb_gi_in_argument_from_ruby((argument), (arg_info), \ - (rb_argument), (self))) #define RVAL2GI_IN_ARRAY_ARGUMENT(array_argument, length_argument, \ array_arg_info, length_arg_info, \ rb_argument) \ @@ -129,6 +126,7 @@ GIArgument *rb_gi_value_argument_from_ruby (GIArgument *argument, VALUE self); GIArgument *rb_gi_in_argument_from_ruby (GIArgument *argument, GIArgInfo *arg_info, + guint nth_rb_argument, VALUE rb_argument, VALUE self); GIArgument *rb_gi_in_array_argument_from_ruby (GIArgument *array_argument, Modified: gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c (+5 -4) =================================================================== --- gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c 2017-11-26 22:53:37 +0900 (06ace93cf) +++ gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c 2017-11-28 00:19:03 +0900 (f74a25688) @@ -1172,10 +1172,11 @@ in_argument_from_ruby(RBGIArgMetadata *metadata, VALUE rb_arguments, rb_argument = RARRAY_PTR(rb_arguments)[metadata->rb_arg_index]; } argument = &(g_array_index(in_args, GIArgument, metadata->in_arg_index)); - RVAL2GI_IN_ARGUMENT(argument, - &(metadata->arg_info), - rb_argument, - self); + rb_gi_in_argument_from_ruby(argument, + &(metadata->arg_info), + metadata->rb_arg_index, + rb_argument, + self); } } |