diff --git a/7.2.374 b/7.2.374 new file mode 100644 index 0000000..50d3e74 --- /dev/null +++ b/7.2.374 @@ -0,0 +1,168 @@ +To: vim-dev@vim.org +Subject: Patch 7.2.374 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.2.374 +Problem: Ruby eval() doesn't understand Vim types. +Solution: Add the vim_to_ruby() function. (George Gensure) +Files: src/eval.c, src/if_ruby.c + + +*** ../vim-7.2.373/src/eval.c 2010-01-19 15:51:29.000000000 +0100 +--- src/eval.c 2010-02-24 15:36:40.000000000 +0100 +*************** +*** 5872,5878 **** + return item1 == NULL && item2 == NULL; + } + +! #if defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) || defined(PROTO) + /* + * Return the dictitem that an entry in a hashtable points to. + */ +--- 5872,5879 ---- + return item1 == NULL && item2 == NULL; + } + +! #if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) \ +! || defined(PROTO) + /* + * Return the dictitem that an entry in a hashtable points to. + */ +*** ../vim-7.2.373/src/if_ruby.c 2010-02-18 15:51:25.000000000 +0100 +--- src/if_ruby.c 2010-02-24 15:45:15.000000000 +0100 +*************** +*** 660,679 **** + return Qnil; + } + + static VALUE vim_evaluate(VALUE self UNUSED, VALUE str) + { + #ifdef FEAT_EVAL +! char_u *value = eval_to_string((char_u *)StringValuePtr(str), NULL, TRUE); + +! if (value != NULL) + { +! VALUE val = rb_str_new2((char *)value); +! vim_free(value); +! return val; + } +! else + #endif +- return Qnil; + } + + static VALUE buffer_new(buf_T *buf) +--- 660,747 ---- + return Qnil; + } + ++ #ifdef FEAT_EVAL ++ static VALUE vim_to_ruby(typval_T *tv) ++ { ++ VALUE result = Qnil; ++ ++ 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; ++ } ++ #endif ++ + static VALUE vim_evaluate(VALUE self UNUSED, VALUE str) + { + #ifdef FEAT_EVAL +! typval_T *tv; +! VALUE result; + +! tv = eval_expr((char_u *)StringValuePtr(str), NULL); +! if (tv == NULL) + { +! return Qnil; + } +! result = vim_to_ruby(tv); +! +! free_tv(tv); +! +! return result; +! #else +! return Qnil; + #endif + } + + static VALUE buffer_new(buf_T *buf) +*** ../vim-7.2.373/src/version.c 2010-02-24 15:25:13.000000000 +0100 +--- src/version.c 2010-02-24 15:46:57.000000000 +0100 +*************** +*** 683,684 **** +--- 683,686 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 374, + /**/ + +-- +ARTHUR: (as the MAN next to him is squashed by a sheep) Knights! Run away! + Midst echoing shouts of "run away" the KNIGHTS retreat to cover with the odd + cow or goose hitting them still. The KNIGHTS crouch down under cover. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// 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 ///