To: vim-dev@vim.org Subject: Patch 7.2.400 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.400 (after 7.2.387) Problem: Dynamic Ruby is not initialised properly for version 1.9.1. Ruby cannot create strings from NULL. Solution: Cleanup #ifdefs. Handle NULL like an empty string. Add ruby_init_stack. (Sergey Khorev) Files: src/if_ruby.c *** ../vim-7.2.399/src/if_ruby.c 2010-03-10 12:46:38.000000000 +0100 --- src/if_ruby.c 2010-03-17 17:37:53.000000000 +0100 *************** *** 53,58 **** --- 53,63 ---- # 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,67 **** #endif #include ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 # include #endif --- 66,72 ---- #endif #include ! #ifdef RUBY19_OR_LATER # include #endif *************** *** 172,179 **** # 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 # define rb_errinfo dll_rb_errinfo #else # define ruby_errinfo (*dll_ruby_errinfo) --- 177,183 ---- # define rb_ary_new dll_rb_ary_new # define rb_ary_push dll_rb_ary_push #endif ! #ifdef RUBY19_OR_LATER # define rb_errinfo dll_rb_errinfo #else # define ruby_errinfo (*dll_ruby_errinfo) *************** *** 185,196 **** # define rb_w32_snprintf dll_rb_w32_snprintf #endif ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 # 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 #endif /* --- 189,201 ---- # define rb_w32_snprintf dll_rb_w32_snprintf #endif ! #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,247 **** 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 static VALUE (*dll_rb_errinfo) (void); #else static VALUE *dll_ruby_errinfo; --- 245,251 ---- 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*); ! #ifdef RUBY19_OR_LATER static VALUE (*dll_rb_errinfo) (void); #else static VALUE *dll_ruby_errinfo; *************** *** 255,276 **** 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 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 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*, ...); #endif ! #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 static SIGNED_VALUE rb_num2long_stub(VALUE x) { return dll_rb_num2long(x); --- 259,281 ---- static VALUE (*dll_rb_ary_new) (void); static VALUE (*dll_rb_ary_push) (VALUE, VALUE); #endif ! #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 ! #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 ! #ifdef RUBY19_OR_LATER static SIGNED_VALUE rb_num2long_stub(VALUE x) { return dll_rb_num2long(x); *************** *** 336,343 **** {"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 {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo}, #else {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo}, --- 341,347 ---- {"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}, ! #ifdef RUBY19_OR_LATER {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo}, #else {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo}, *************** *** 360,374 **** {"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 {"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}, #endif {"", NULL}, }; --- 364,377 ---- {"rb_ary_new", (RUBY_PROC*)&dll_rb_ary_new}, {"rb_ary_push", (RUBY_PROC*)&dll_rb_ary_push}, #endif ! #ifdef RUBY19_OR_LATER {"rb_int2big", (RUBY_PROC*)&dll_rb_int2big}, {"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,473 **** static VALUE vim_str2rb_enc_str(const char *s) { ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 int isnum; long lval; char_u *sval; --- 470,476 ---- static VALUE vim_str2rb_enc_str(const char *s) { ! #ifdef RUBY19_OR_LATER int isnum; long lval; char_u *sval; *************** *** 489,495 **** static VALUE eval_enc_string_protect(const char *str, int *state) { ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 int isnum; long lval; char_u *sval; --- 492,498 ---- static VALUE eval_enc_string_protect(const char *str, int *state) { ! #ifdef RUBY19_OR_LATER int isnum; long lval; char_u *sval; *************** *** 591,606 **** char *argv[] = {"gvim.exe"}; NtInitialize(&argc, &argv); #endif ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 RUBY_INIT_STACK; #endif ruby_init(); ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 ruby_script("vim-ruby"); #endif ruby_init_loadpath(); ruby_io_init(); ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 rb_enc_find_index("encdb"); #endif ruby_vim_init(); --- 594,609 ---- char *argv[] = {"gvim.exe"}; NtInitialize(&argc, &argv); #endif ! #ifdef RUBY19_OR_LATER RUBY_INIT_STACK; #endif ruby_init(); ! #ifdef RUBY19_OR_LATER ruby_script("vim-ruby"); #endif ruby_init_loadpath(); ruby_io_init(); ! #ifdef RUBY19_OR_LATER rb_enc_find_index("encdb"); #endif ruby_vim_init(); *************** *** 657,664 **** break; case TAG_RAISE: case TAG_FATAL: ! #if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \ ! || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 eclass = CLASS_OF(rb_errinfo()); einfo = rb_obj_as_string(rb_errinfo()); #else --- 660,666 ---- break; case TAG_RAISE: case TAG_FATAL: ! #ifdef RUBY19_OR_LATER eclass = CLASS_OF(rb_errinfo()); einfo = rb_obj_as_string(rb_errinfo()); #else *************** *** 720,775 **** if (tv->v_type == VAR_STRING) { ! result = rb_str_new2((char *)tv->vval.v_string); } else if (tv->v_type == VAR_NUMBER) { ! result = INT2NUM(tv->vval.v_number); } # ifdef FEAT_FLOAT else if (tv->v_type == VAR_FLOAT) { ! result = rb_float_new(tv->vval.v_float); } # endif else if (tv->v_type == VAR_LIST) { ! list_T *list = tv->vval.v_list; ! listitem_T *curr; ! result = rb_ary_new(); ! if (list != NULL) ! { ! for (curr = list->lv_first; curr != NULL; curr = curr->li_next) ! { ! rb_ary_push(result, vim_to_ruby(&curr->li_tv)); ! } ! } } else if (tv->v_type == VAR_DICT) { ! result = rb_hash_new(); ! if (tv->vval.v_dict != NULL) ! { ! hashtab_T *ht = &tv->vval.v_dict->dv_hashtab; ! long_u todo = ht->ht_used; ! hashitem_T *hi; ! dictitem_T *di; ! ! for (hi = ht->ht_array; todo > 0; ++hi) ! { ! if (!HASHITEM_EMPTY(hi)) ! { ! --todo; ! di = dict_lookup(hi); ! rb_hash_aset(result, rb_str_new2((char *)hi->hi_key), vim_to_ruby(&di->di_tv)); ! } ! } ! } } /* else return Qnil; */ return result; --- 722,778 ---- if (tv->v_type == VAR_STRING) { ! result = rb_str_new2((char *)(tv->vval.v_string == NULL ! ? "" : tv->vval.v_string)); } else if (tv->v_type == VAR_NUMBER) { ! result = INT2NUM(tv->vval.v_number); } # ifdef FEAT_FLOAT else if (tv->v_type == VAR_FLOAT) { ! result = rb_float_new(tv->vval.v_float); } # endif else if (tv->v_type == VAR_LIST) { ! list_T *list = tv->vval.v_list; ! listitem_T *curr; ! result = rb_ary_new(); ! if (list != NULL) ! { ! for (curr = list->lv_first; curr != NULL; curr = curr->li_next) ! { ! rb_ary_push(result, vim_to_ruby(&curr->li_tv)); ! } ! } } else if (tv->v_type == VAR_DICT) { ! result = rb_hash_new(); ! if (tv->vval.v_dict != NULL) ! { ! hashtab_T *ht = &tv->vval.v_dict->dv_hashtab; ! long_u todo = ht->ht_used; ! hashitem_T *hi; ! dictitem_T *di; ! ! for (hi = ht->ht_array; todo > 0; ++hi) ! { ! if (!HASHITEM_EMPTY(hi)) ! { ! --todo; ! di = dict_lookup(hi); ! rb_hash_aset(result, rb_str_new2((char *)hi->hi_key), vim_to_ruby(&di->di_tv)); ! } ! } ! } } /* else return Qnil; */ return result; *************** *** 785,791 **** tv = eval_expr((char_u *)StringValuePtr(str), NULL); if (tv == NULL) { ! return Qnil; } result = vim_to_ruby(tv); --- 788,794 ---- tv = eval_expr((char_u *)StringValuePtr(str), NULL); if (tv == NULL) { ! return Qnil; } result = vim_to_ruby(tv); *** ../vim-7.2.399/src/version.c 2010-03-17 17:24:58.000000000 +0100 --- src/version.c 2010-03-17 18:14:31.000000000 +0100 *************** *** 683,684 **** --- 683,686 ---- { /* Add new patch number below this line */ + /**/ + 400, /**/ -- Q: What do you call a fish without an eye? A: fsh! Q: What do you call a deer with no eyes? A: no eye deer. Q: What do you call a deer with no eyes and no legs? A: still no eye deer. /// 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 ///