| To: vim-dev@vim.org |
| Subject: Patch 7.2.374 |
| 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.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 |
| |
| |
| |
| |
| |
| *** 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. |
| */ |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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 /// |