>> at least on my computer, vim crashes when evaluating this line: >> >> :ruby require 'e2mmap' >> >> With ruby 1.8.7 everything is okay. >> >> Another thing I noticed (now with ruby 1.8.7 or 1.8.6). When you try >> >> :ruby p VIM::evaluate("input('Foo')") >> >> And press<esc>, you get an error message: >> >> ArgumentError:(eval):1240: in `evaluate`: NULL pointer given > I confirm this with vim 7.2-385 and ruby 1.9.1 built with mingw on Win > XP.
It seems there are two issues here: 1) dynamic Ruby is not initialised properly for version 1.9.1 2) Ruby cannot create strings from NULL (perhaps after 7.2.374) Attached patch provides clean up required. -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php
--- vim-bak/src/if_ruby.c Wed Mar 10 17:16:12 2010 +0100 +++ ./src/if_ruby.c Sat Mar 13 14:32:08 2010 +0300 @@ -53,6 +53,11 @@ # undef _WIN32_WINNT #endif +#if (defined(RUBY_VERSION) && RUBY_VERSION >= 19) \ + || (defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19) +# define RUBY19_OR_LATER 1 +#endif + #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 /* Ruby 1.9 defines a number of static functions which use rb_num2long and * rb_int2big */ @@ -61,7 +66,7 @@ #endif #include <ruby.h> -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER # include <ruby/encoding.h> #endif @@ -172,8 +177,7 @@ # define rb_ary_new dll_rb_ary_new # define rb_ary_push dll_rb_ary_push #endif -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \ - || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER # define rb_errinfo dll_rb_errinfo #else # define ruby_errinfo (*dll_ruby_errinfo) @@ -185,12 +189,13 @@ # define rb_w32_snprintf dll_rb_w32_snprintf #endif -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER # define ruby_script dll_ruby_script # define rb_enc_find_index dll_rb_enc_find_index # define rb_enc_find dll_rb_enc_find # define rb_enc_str_new dll_rb_enc_str_new # define rb_sprintf dll_rb_sprintf +# define ruby_init_stack dll_ruby_init_stack #endif /* @@ -240,8 +245,7 @@ static VALUE (*dll_rb_str_concat) (VALUE, VALUE); static VALUE (*dll_rb_str_new) (const char*, long); static VALUE (*dll_rb_str_new2) (const char*); -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \ - || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER static VALUE (*dll_rb_errinfo) (void); #else static VALUE *dll_ruby_errinfo; @@ -255,22 +259,23 @@ static VALUE (*dll_rb_ary_new) (void); static VALUE (*dll_rb_ary_push) (VALUE, VALUE); #endif -#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER static VALUE (*dll_rb_int2big)(SIGNED_VALUE); #endif #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...); #endif -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER static void (*dll_ruby_script) (const char*); static int (*dll_rb_enc_find_index) (const char*); static rb_encoding* (*dll_rb_enc_find) (const char*); static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); static VALUE (*dll_rb_sprintf) (const char*, ...); +static void (*ruby_init_stack)(VALUE*); #endif -#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER static SIGNED_VALUE rb_num2long_stub(VALUE x) { return dll_rb_num2long(x); @@ -336,8 +341,7 @@ {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat}, {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new}, {"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2}, -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \ - || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo}, #else {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo}, @@ -360,15 +364,14 @@ {"rb_ary_new", (RUBY_PROC*)&dll_rb_ary_new}, {"rb_ary_push", (RUBY_PROC*)&dll_rb_ary_push}, #endif -#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER {"rb_int2big", (RUBY_PROC*)&dll_rb_int2big}, -#endif -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 {"ruby_script", (RUBY_PROC*)&dll_ruby_script}, {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index}, {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find}, {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new}, {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf}, + {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack}, #endif {"", NULL}, }; @@ -467,7 +470,7 @@ static VALUE vim_str2rb_enc_str(const char *s) { -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER int isnum; long lval; char_u *sval; @@ -489,7 +492,7 @@ static VALUE eval_enc_string_protect(const char *str, int *state) { -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER int isnum; long lval; char_u *sval; @@ -591,16 +594,16 @@ char *argv[] = {"gvim.exe"}; NtInitialize(&argc, &argv); #endif -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER RUBY_INIT_STACK; #endif ruby_init(); -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER ruby_script("vim-ruby"); #endif ruby_init_loadpath(); ruby_io_init(); -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 +#ifdef RUBY19_OR_LATER rb_enc_find_index("encdb"); #endif ruby_vim_init(); @@ -657,8 +660,7 @@ break; case TAG_RAISE: case TAG_FATAL: -#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \ - || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 +#ifdef RUBY19_OR_LATER eclass = CLASS_OF(rb_errinfo()); einfo = rb_obj_as_string(rb_errinfo()); #else @@ -720,7 +722,7 @@ if (tv->v_type == VAR_STRING) { - result = rb_str_new2((char *)tv->vval.v_string); + result = rb_str_new2((char *)(tv->vval.v_string==NULL?"":tv->vval.v_string)); } else if (tv->v_type == VAR_NUMBER) {