To: vim_dev@googlegroups.com Subject: Patch 8.2.2235 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2235 Problem: Build failure with some Ruby versions. Solution: Adjust the code for Ruby 3.0. (Ozaki Kiichi, closes #7564) Files: ci/config.mk.clang.sed, src/if_ruby.c *** ../vim-8.2.2234/ci/config.mk.clang.sed 2020-05-26 20:09:06.910102525 +0200 --- ci/config.mk.clang.sed 2020-12-28 15:02:12.762545837 +0100 *************** *** 1,2 **** /^CFLAGS[[:blank:]]*=/s/$/ -Wno-error=missing-field-initializers/ ! /^RUBY_CFLAGS[[:blank:]]*=/s/$/ -Wno-error=unknown-attributes -Wno-error=ignored-attributes/ --- 1,2 ---- /^CFLAGS[[:blank:]]*=/s/$/ -Wno-error=missing-field-initializers/ ! /^RUBY_CFLAGS[[:blank:]]*=/s/$/ -Wno-error=unknown-attributes -Wno-error=ignored-attributes -fms-extensions/ *** ../vim-8.2.2234/src/if_ruby.c 2020-12-10 20:50:31.046939538 +0100 --- src/if_ruby.c 2020-12-28 15:02:12.762545837 +0100 *************** *** 32,39 **** # define RUBYEXTERN extern #endif ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 24 ! # define USE_RUBY_INTEGER #endif #ifdef DYNAMIC_RUBY --- 32,40 ---- # define RUBYEXTERN extern #endif ! // suggested by Ariya Mizutani ! #if (_MSC_VER == 1200) ! # undef _WIN32_WINNT #endif #ifdef DYNAMIC_RUBY *************** *** 42,47 **** --- 43,52 ---- * definition. This function use these variables. But we want function to * use dll_* variables. */ + # if RUBY_VERSION >= 24 + # define USE_RUBY_INTEGER + # endif + # define rb_cFalseClass (*dll_rb_cFalseClass) # define rb_cFixnum (*dll_rb_cFixnum) # if defined(USE_RUBY_INTEGER) *************** *** 54,59 **** --- 59,65 ---- # define rb_cString (*dll_rb_cString) # define rb_cSymbol (*dll_rb_cSymbol) # define rb_cTrueClass (*dll_rb_cTrueClass) + # if RUBY_VERSION >= 18 /* * On ver 1.8, all Ruby functions are exported with "__declspec(dllimport)" *************** *** 64,103 **** # define RUBY_EXPORT # endif ! #endif // ifdef DYNAMIC_RUBY ! ! // suggested by Ariya Mizutani ! #if (_MSC_VER == 1200) ! # undef _WIN32_WINNT ! #endif ! ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 19 // Ruby 1.9 defines a number of static functions which use rb_num2long and // rb_int2big ! # define rb_num2long rb_num2long_stub ! # define rb_int2big rb_int2big_stub ! #endif ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 19 \ ! && VIM_SIZEOF_INT < VIM_SIZEOF_LONG // Ruby 1.9 defines a number of static functions which use rb_fix2int and // rb_num2int if VIM_SIZEOF_INT < VIM_SIZEOF_LONG (64bit) ! # define rb_fix2int rb_fix2int_stub ! # define rb_num2int rb_num2int_stub ! #endif ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION == 21 // Ruby 2.1 adds new GC called RGenGC and RARRAY_PTR uses // rb_gc_writebarrier_unprotect_promoted if USE_RGENGC ! # define rb_gc_writebarrier_unprotect_promoted rb_gc_writebarrier_unprotect_promoted_stub ! #endif ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 22 ! # define rb_gc_writebarrier_unprotect rb_gc_writebarrier_unprotect_stub ! #endif ! #if defined(DYNAMIC_RUBY) && RUBY_VERSION >= 26 ! # define rb_ary_detransient rb_ary_detransient_stub ! #endif // On macOS pre-installed Ruby defines "SIZEOF_TIME_T" as "SIZEOF_LONG" so it // conflicts with the definition in config.h then causes a macro-redefined --- 70,110 ---- # define RUBY_EXPORT # endif ! # if RUBY_VERSION >= 19 // Ruby 1.9 defines a number of static functions which use rb_num2long and // rb_int2big ! # define rb_num2long rb_num2long_stub ! # define rb_int2big rb_int2big_stub ! # if RUBY_VERSION >= 30 || VIM_SIZEOF_INT < VIM_SIZEOF_LONG // Ruby 1.9 defines a number of static functions which use rb_fix2int and // rb_num2int if VIM_SIZEOF_INT < VIM_SIZEOF_LONG (64bit) ! # define rb_fix2int rb_fix2int_stub ! # define rb_num2int rb_num2int_stub ! # endif ! # endif ! # if RUBY_VERSION == 21 // Ruby 2.1 adds new GC called RGenGC and RARRAY_PTR uses // rb_gc_writebarrier_unprotect_promoted if USE_RGENGC ! # define rb_gc_writebarrier_unprotect_promoted rb_gc_writebarrier_unprotect_promoted_stub ! # endif ! # if RUBY_VERSION >= 22 ! # define rb_gc_writebarrier_unprotect rb_gc_writebarrier_unprotect_stub ! # endif ! ! # if RUBY_VERSION >= 26 ! # define rb_ary_detransient rb_ary_detransient_stub ! # endif ! ! # if RUBY_VERSION >= 30 ! # define rb_check_type rb_check_type_stub ! # define rb_num2uint rb_num2uint_stub ! # define ruby_malloc_size_overflow ruby_malloc_size_overflow_stub ! # endif ! ! #endif // ifdef DYNAMIC_RUBY // On macOS pre-installed Ruby defines "SIZEOF_TIME_T" as "SIZEOF_LONG" so it // conflicts with the definition in config.h then causes a macro-redefined *************** *** 232,238 **** # define rb_assoc_new dll_rb_assoc_new # define rb_cObject (*dll_rb_cObject) # define rb_class_new_instance dll_rb_class_new_instance ! # define rb_check_type dll_rb_check_type # ifdef USE_TYPEDDATA # define rb_check_typeddata dll_rb_check_typeddata # endif --- 239,247 ---- # define rb_assoc_new dll_rb_assoc_new # define rb_cObject (*dll_rb_cObject) # define rb_class_new_instance dll_rb_class_new_instance ! # if RUBY_VERSION < 30 ! # define rb_check_type dll_rb_check_type ! # endif # ifdef USE_TYPEDDATA # define rb_check_typeddata dll_rb_check_typeddata # endif *************** *** 283,289 **** # define rb_fix2int dll_rb_fix2int # define rb_num2int dll_rb_num2int # endif ! # define rb_num2uint dll_rb_num2uint # endif # define rb_num2dbl dll_rb_num2dbl # define rb_lastline_get dll_rb_lastline_get --- 292,300 ---- # define rb_fix2int dll_rb_fix2int # define rb_num2int dll_rb_num2int # endif ! # if RUBY_VERSION < 30 ! # define rb_num2uint dll_rb_num2uint ! # endif # endif # define rb_num2dbl dll_rb_num2dbl # define rb_lastline_get dll_rb_lastline_get *************** *** 501,507 **** static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); static VALUE (*dll_rb_sprintf) (const char*, ...); static VALUE (*dll_rb_require) (const char*); ! static void* (*ruby_options)(int, char**); # endif # if defined(USE_RGENGC) && USE_RGENGC --- 512,518 ---- static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); static VALUE (*dll_rb_sprintf) (const char*, ...); static VALUE (*dll_rb_require) (const char*); ! static void* (*dll_ruby_options)(int, char**); # endif # if defined(USE_RGENGC) && USE_RGENGC *************** *** 512,543 **** # endif # endif # if RUBY_VERSION >= 26 void rb_ary_detransient_stub(VALUE x); # endif ! # if (RUBY_VERSION >= 19) && !defined(PROTO) ! # if RUBY_VERSION >= 22 long rb_num2long_stub(VALUE x) ! # else SIGNED_VALUE rb_num2long_stub(VALUE x) ! # endif { return dll_rb_num2long(x); } ! # if RUBY_VERSION >= 26 VALUE rb_int2big_stub(intptr_t x) ! # else VALUE rb_int2big_stub(SIGNED_VALUE x) ! # endif { return dll_rb_int2big(x); } ! # if (RUBY_VERSION >= 19) && (VIM_SIZEOF_INT < VIM_SIZEOF_LONG) long rb_fix2int_stub(VALUE x) { --- 523,560 ---- # endif # endif + # if RUBY_VERSION >= 30 + NORETURN(static void (*dll_ruby_malloc_size_overflow)(size_t, size_t)); + # endif + # if RUBY_VERSION >= 26 void rb_ary_detransient_stub(VALUE x); # endif ! // Do not generate a prototype here, VALUE isn't always defined. ! # ifndef PROTO ! # if RUBY_VERSION >= 19 ! # if RUBY_VERSION >= 22 long rb_num2long_stub(VALUE x) ! # else SIGNED_VALUE rb_num2long_stub(VALUE x) ! # endif { return dll_rb_num2long(x); } ! # if RUBY_VERSION >= 26 VALUE rb_int2big_stub(intptr_t x) ! # else VALUE rb_int2big_stub(SIGNED_VALUE x) ! # endif { return dll_rb_int2big(x); } ! # if VIM_SIZEOF_INT < VIM_SIZEOF_LONG long rb_fix2int_stub(VALUE x) { *************** *** 548,597 **** { return dll_rb_num2int(x); } ! # endif ! # if RUBY_VERSION >= 20 VALUE rb_float_new_in_heap(double d) { return dll_rb_float_new(d); } ! # if RUBY_VERSION >= 22 unsigned long rb_num2ulong(VALUE x) ! # else VALUE rb_num2ulong(VALUE x) ! # endif { return (long)RSHIFT((SIGNED_VALUE)(x),1); } # endif ! # endif ! ! // Do not generate a prototype here, VALUE isn't always defined. ! # if defined(USE_RGENGC) && USE_RGENGC && !defined(PROTO) ! # if RUBY_VERSION == 21 void rb_gc_writebarrier_unprotect_promoted_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect_promoted(obj); } ! # else void rb_gc_writebarrier_unprotect_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect(obj); } # endif ! # endif ! ! # if RUBY_VERSION >= 26 void rb_ary_detransient_stub(VALUE x) { dll_rb_ary_detransient(x); } ! # endif static HINSTANCE hinstRuby = NULL; // Instance of ruby.dll --- 565,629 ---- { return dll_rb_num2int(x); } ! # endif ! # if RUBY_VERSION >= 20 VALUE rb_float_new_in_heap(double d) { return dll_rb_float_new(d); } ! # if RUBY_VERSION >= 22 unsigned long rb_num2ulong(VALUE x) ! # else VALUE rb_num2ulong(VALUE x) ! # endif { return (long)RSHIFT((SIGNED_VALUE)(x),1); } + # endif # endif ! # if defined(USE_RGENGC) && USE_RGENGC ! # if RUBY_VERSION == 21 void rb_gc_writebarrier_unprotect_promoted_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect_promoted(obj); } ! # else void rb_gc_writebarrier_unprotect_stub(VALUE obj) { dll_rb_gc_writebarrier_unprotect(obj); } + # endif # endif ! # if RUBY_VERSION >= 26 void rb_ary_detransient_stub(VALUE x) { dll_rb_ary_detransient(x); } ! # endif ! # if RUBY_VERSION >= 30 ! void ! rb_check_type_stub(VALUE obj, int t) ! { ! dll_rb_check_type(obj, t); ! } ! unsigned long ! rb_num2uint_stub(VALUE x) ! { ! return dll_rb_num2uint(x); ! } ! void ! ruby_malloc_size_overflow_stub(size_t x, size_t y) ! { ! dll_ruby_malloc_size_overflow(x, y); ! } ! # endif ! # endif // ifndef PROTO static HINSTANCE hinstRuby = NULL; // Instance of ruby.dll *************** *** 748,753 **** --- 780,788 ---- {"rb_gc_writebarrier_unprotect", (RUBY_PROC*)&dll_rb_gc_writebarrier_unprotect}, # endif # endif + # if RUBY_VERSION >= 30 + {"ruby_malloc_size_overflow", (RUBY_PROC*)&dll_ruby_malloc_size_overflow}, + # endif {"", NULL}, }; *************** *** 1827,1833 **** dict_T *d = (dict_T *)arg; dictitem_T *di; ! di = dictitem_alloc((char_u *)RSTRING_PTR(RSTRING(rb_obj_as_string(key)))); if (di == NULL || ruby_convert_to_vim_value(val, &di->di_tv) != OK || dict_add(d, di) != OK) { --- 1862,1868 ---- dict_T *d = (dict_T *)arg; dictitem_T *di; ! di = dictitem_alloc((char_u *)RSTRING_PTR(rb_obj_as_string(key))); if (di == NULL || ruby_convert_to_vim_value(val, &di->di_tv) != OK || dict_add(d, di) != OK) { *** ../vim-8.2.2234/src/version.c 2020-12-28 13:41:49.642920468 +0100 --- src/version.c 2020-12-28 15:04:09.326140866 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2235, /**/ -- Know this story about a nerd who fell into a river and drowned, despite his cries of "F1! F1!"? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///