| To: vim-dev@vim.org |
| Subject: Patch 7.3.013 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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 <dlfcn.h> |
| + # 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); |
| |
| |
| |
| *** 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 /// |