summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-02-24 15:48:04 +0100
committerBram Moolenaar <Bram@vim.org>2010-02-24 15:48:04 +0100
commit3fac56e87e28b89fe89114343fc5cd013823c731 (patch)
treea3a83afec682d826fed8242a5e7904b389aadca2
parenta4e782eee07e064d2d7d05ec2d2cc445cef78d9a (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.c3
-rw-r--r--src/if_ruby.c82
-rw-r--r--src/version.c2
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,