ruby-changes:48294
From: normal <ko1@a...>
Date: Wed, 25 Oct 2017 08:35:57 +0900 (JST)
Subject: [ruby-changes:48294] normal:r60408 (trunk): file.c: fix possible alignment bugs in r60386
normal 2017-10-25 08:35:52 +0900 (Wed, 25 Oct 2017) New Revision: 60408 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60408 Log: file.c: fix possible alignment bugs in r60386 * file.c (struct apply_filename): split out from struct apply_arg * file.c (apply2files): use offsetof for flex array size calculation * file.c (apply2files): avoid redundant marking with ALLOCV [ruby-core:83535] Modified files: trunk/file.c Index: file.c =================================================================== --- file.c (revision 60407) +++ file.c (revision 60408) @@ -349,16 +349,18 @@ ignored_char_p(const char *p, const char https://github.com/ruby/ruby/blob/trunk/file.c#L349 #define apply2args(n) (rb_check_arity(argc, n, UNLIMITED_ARGUMENTS), argc-=n) +struct apply_filename { + const char *ptr; + VALUE path; +}; + struct apply_arg { int i; int argc; int errnum; int (*func)(const char *, void *); void *arg; - struct { - const char *ptr; - VALUE path; - } fn[1]; /* flexible array */ + struct apply_filename fn[1]; /* flexible array */ }; static void * @@ -384,9 +386,8 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/file.c#L386 apply2files(int (*func)(const char *, void *), int argc, VALUE *argv, void *arg) { VALUE v; - VALUE tmp = Qfalse; - size_t size = sizeof(const char *) + sizeof(VALUE); - const long len = (long)(sizeof(struct apply_arg) + (size * argc) - size); + const size_t size = sizeof(struct apply_filename); + const long len = (long)(offsetof(struct apply_arg, fn) + (size * argc)); struct apply_arg *aa = ALLOCV(v, len); aa->errnum = 0; @@ -394,24 +395,12 @@ apply2files(int (*func)(const char *, vo https://github.com/ruby/ruby/blob/trunk/file.c#L395 aa->arg = arg; aa->func = func; - /* - * aa is on-stack for small argc, we must ensure paths are marked - * for large argv if aa is on the heap. - */ - if (v) { - tmp = rb_ary_tmp_new(argc); - } - for (aa->i = 0; aa->i < argc; aa->i++) { VALUE path = rb_get_path(argv[aa->i]); path = rb_str_encode_ospath(path); aa->fn[aa->i].ptr = RSTRING_PTR(path); aa->fn[aa->i].path = path; - - if (tmp != Qfalse) { - rb_ary_push(tmp, path); - } } rb_thread_call_without_gvl(no_gvl_apply2files, aa, RUBY_UBF_IO, 0); @@ -426,10 +415,6 @@ apply2files(int (*func)(const char *, vo https://github.com/ruby/ruby/blob/trunk/file.c#L415 if (v) { ALLOCV_END(v); } - if (tmp != Qfalse) { - rb_ary_clear(tmp); - rb_gc_force_recycle(tmp); - } return LONG2FIX(argc); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/