summaryrefslogtreecommitdiffstats
path: root/src/if_ruby.c
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 /src/if_ruby.c
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)
Diffstat (limited to 'src/if_ruby.c')
-rw-r--r--src/if_ruby.c82
1 files changed, 75 insertions, 7 deletions
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)