diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-02-24 15:48:04 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-02-24 15:48:04 +0100 |
commit | 3fac56e87e28b89fe89114343fc5cd013823c731 (patch) | |
tree | a3a83afec682d826fed8242a5e7904b389aadca2 | |
parent | a4e782eee07e064d2d7d05ec2d2cc445cef78d9a (diff) |
updated for version 7.2.374v7.2.374
Problem: Ruby eval() doesn't understand Vim types.
Solution: Add the vim_to_ruby() function. (George Gensure)
-rw-r--r-- | src/eval.c | 3 | ||||
-rw-r--r-- | src/if_ruby.c | 82 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 79 insertions, 8 deletions
diff --git a/src/eval.c b/src/eval.c index f4f3c7a1d8..87333c2bae 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5872,7 +5872,8 @@ list_equal(l1, l2, ic) return item1 == NULL && item2 == NULL; } -#if defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) || defined(PROTO) +#if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) \ + || defined(PROTO) /* * Return the dictitem that an entry in a hashtable points to. */ diff --git a/src/if_ruby.c b/src/if_ruby.c index 6135c5d5b3..6d28de37e5 100644 --- a/src/if_ruby.c +++ b/src/if_ruby.c @@ -660,20 +660,88 @@ static VALUE vim_command(VALUE self UNUSED, VALUE str) 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 - char_u *value = eval_to_string((char_u *)StringValuePtr(str), NULL, TRUE); + typval_T *tv; + VALUE result; - if (value != NULL) + tv = eval_expr((char_u *)StringValuePtr(str), NULL); + if (tv == NULL) { - VALUE val = rb_str_new2((char *)value); - vim_free(value); - return val; + return Qnil; } - else + result = vim_to_ruby(tv); + + free_tv(tv); + + return result; +#else + return Qnil; #endif - return Qnil; } static VALUE buffer_new(buf_T *buf) diff --git a/src/version.c b/src/version.c index 31377184e3..0fcb52fb2d 100644 --- a/src/version.c +++ b/src/version.c @@ -682,6 +682,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 374, +/**/ 373, /**/ 372, |