To: vim-dev@vim.org Subject: Patch 7.3.013 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.013 Problem: Dynamic loading with Ruby doesn't work for 1.9.2. Solution: Handle rb_str2cstr differently. Also support dynamic loading on Unix. (Jon Maken) Files: src/if_ruby.c *** ../vim-7.3.012/src/if_ruby.c 2010-08-15 21:57:25.000000000 +0200 --- src/if_ruby.c 2010-09-29 12:49:50.000000000 +0200 *************** *** 4,9 **** --- 4,10 ---- * * Ruby interface by Shugo Maeda * with improvements by SegPhault (Ryan Paul) + * with improvements by Jon Maken * * Do ":help uganda" in Vim to read copying and usage conditions. * Do ":help credits" in Vim to see a list of people who contributed. *************** *** 26,37 **** # define RUBYEXTERN extern #endif /* * This is tricky. In ruby.h there is (inline) function rb_class_of() * definition. This function use these variables. But we want function to * use dll_* variables. */ - #ifdef DYNAMIC_RUBY # define rb_cFalseClass (*dll_rb_cFalseClass) # define rb_cFixnum (*dll_rb_cFixnum) # define rb_cNilClass (*dll_rb_cNilClass) --- 27,38 ---- # define RUBYEXTERN extern #endif + #ifdef DYNAMIC_RUBY /* * This is tricky. In ruby.h there is (inline) function rb_class_of() * definition. This function use these variables. But we want function to * use dll_* variables. */ # define rb_cFalseClass (*dll_rb_cFalseClass) # define rb_cFixnum (*dll_rb_cFixnum) # define rb_cNilClass (*dll_rb_cNilClass) *************** *** 46,53 **** --- 47,67 ---- */ # define RUBY_EXPORT # endif + + #if !(defined(WIN32) || defined(_WIN64)) + # include + # define HANDLE void* + # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) + # define symbol_from_dll dlsym + # define close_dll dlclose + #else + # define load_dll LoadLibrary + # define symbol_from_dll GetProcAddress + # define close_dll FreeLibrary #endif + #endif /* ifdef DYNAMIC_RUBY */ + /* suggested by Ariya Mizutani */ #if (_MSC_VER == 1200) # undef _WIN32_WINNT *************** *** 166,172 **** #define rb_obj_as_string dll_rb_obj_as_string #define rb_obj_id dll_rb_obj_id #define rb_raise dll_rb_raise - #define rb_str2cstr dll_rb_str2cstr #define rb_str_cat dll_rb_str_cat #define rb_str_concat dll_rb_str_concat #define rb_str_new dll_rb_str_new --- 180,185 ---- *************** *** 178,187 **** --- 191,203 ---- # define rb_str_new2 dll_rb_str_new2 #endif #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 + # define rb_string_value dll_rb_string_value # define rb_string_value_ptr dll_rb_string_value_ptr # define rb_float_new dll_rb_float_new # define rb_ary_new dll_rb_ary_new # define rb_ary_push dll_rb_ary_push + #else + # define rb_str2cstr dll_rb_str2cstr #endif #ifdef RUBY19_OR_LATER # define rb_errinfo dll_rb_errinfo *************** *** 246,252 **** --- 262,272 ---- static VALUE (*dll_rb_obj_as_string) (VALUE); static VALUE (*dll_rb_obj_id) (VALUE); static void (*dll_rb_raise) (VALUE, const char*, ...); + #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 + static VALUE (*dll_rb_string_value) (volatile VALUE*); + #else static char *(*dll_rb_str2cstr) (VALUE,int*); + #endif static VALUE (*dll_rb_str_cat) (VALUE, const char*, long); static VALUE (*dll_rb_str_concat) (VALUE, VALUE); static VALUE (*dll_rb_str_new) (const char*, long); *************** *** 347,353 **** --- 367,377 ---- {"rb_obj_as_string", (RUBY_PROC*)&dll_rb_obj_as_string}, {"rb_obj_id", (RUBY_PROC*)&dll_rb_obj_id}, {"rb_raise", (RUBY_PROC*)&dll_rb_raise}, + #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 + {"rb_string_value", (RUBY_PROC*)&dll_rb_string_value}, + #else {"rb_str2cstr", (RUBY_PROC*)&dll_rb_str2cstr}, + #endif {"rb_str_cat", (RUBY_PROC*)&dll_rb_str_cat}, {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat}, {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new}, *************** *** 399,405 **** { if (hinstRuby) { ! FreeLibrary(hinstRuby); hinstRuby = 0; } } --- 423,429 ---- { if (hinstRuby) { ! close_dll(hinstRuby); hinstRuby = 0; } } *************** *** 416,422 **** if (hinstRuby) return OK; ! hinstRuby = LoadLibrary(libname); if (!hinstRuby) { if (verbose) --- 440,446 ---- if (hinstRuby) return OK; ! hinstRuby = load_dll(libname); if (!hinstRuby) { if (verbose) *************** *** 426,435 **** for (i = 0; ruby_funcname_table[i].ptr; ++i) { ! if (!(*ruby_funcname_table[i].ptr = GetProcAddress(hinstRuby, ruby_funcname_table[i].name))) { ! FreeLibrary(hinstRuby); hinstRuby = 0; if (verbose) EMSG2(_(e_loadfunc), ruby_funcname_table[i].name); --- 450,459 ---- for (i = 0; ruby_funcname_table[i].ptr; ++i) { ! if (!(*ruby_funcname_table[i].ptr = symbol_from_dll(hinstRuby, ruby_funcname_table[i].name))) { ! close_dll(hinstRuby); hinstRuby = 0; if (verbose) EMSG2(_(e_loadfunc), ruby_funcname_table[i].name); *** ../vim-7.3.012/src/version.c 2010-09-29 12:37:53.000000000 +0200 --- src/version.c 2010-09-29 13:00:42.000000000 +0200 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 13, /**/ -- hundred-and-one symptoms of being an internet addict: 223. You set up a web-cam as your home's security system. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///