]> granicus.if.org Git - vim/commitdiff
updated for version 7.2.374 v7.2.374
authorBram Moolenaar <Bram@vim.org>
Wed, 24 Feb 2010 14:48:04 +0000 (15:48 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 24 Feb 2010 14:48:04 +0000 (15:48 +0100)
Problem:    Ruby eval() doesn't understand Vim types.
Solution:   Add the vim_to_ruby() function.  (George Gensure)

src/eval.c
src/if_ruby.c
src/version.c

index f4f3c7a1d823ca70e0a1f5f5eb2480a3fd588215..87333c2bae2a04a58fe82bc07a77d502a26ed9e0 100644 (file)
@@ -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.
  */
index 6135c5d5b3470e5d2e408baa70684cd5dc05bf20..6d28de37e54809831a459a68b2c3493d94118d3f 100644 (file)
@@ -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)
index 31377184e318a52f0cdbc69c009ac5cff4152cb8..0fcb52fb2df81c13367245710dfa2e5af4e8e29b 100644 (file)
@@ -681,6 +681,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    374,
 /**/
     373,
 /**/