]> granicus.if.org Git - vim/commitdiff
patch 7.4.1303 v7.4.1303
authorBram Moolenaar <Bram@vim.org>
Thu, 11 Feb 2016 19:48:34 +0000 (20:48 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 11 Feb 2016 19:48:34 +0000 (20:48 +0100)
Problem:    A Funcref is not accepted as a callback.
Solution:   Make a Funcref work. (Damien)

src/eval.c
src/testdir/test_channel.vim
src/version.c

index 10f57e8b10333baa2befbf13f4e64c9d09faca42..42f305e4ae001bd902aa8c21f010419056a362de 100644 (file)
@@ -9871,12 +9871,13 @@ f_ch_open(typval_T *argvars, typval_T *rettv)
 
     if (argvars[1].v_type == VAR_DICT)
     {
-       /* parse argdict */
-       dict_T  *dict = argvars[1].vval.v_dict;
+       dict_T      *dict = argvars[1].vval.v_dict;
+       dictitem_T  *item;
 
-       if (dict_find(dict, (char_u *)"mode", -1) != NULL)
+       /* parse argdict */
+       if ((item = dict_find(dict, (char_u *)"mode", -1)) != NULL)
        {
-           mode = get_dict_string(dict, (char_u *)"mode", FALSE);
+           mode = get_tv_string(&item->di_tv);
            if (STRCMP(mode, "raw") == 0)
                ch_mode = MODE_RAW;
            else if (STRCMP(mode, "js") == 0)
@@ -9889,12 +9890,12 @@ f_ch_open(typval_T *argvars, typval_T *rettv)
                return;
            }
        }
-       if (dict_find(dict, (char_u *)"waittime", -1) != NULL)
-           waittime = get_dict_number(dict, (char_u *)"waittime");
-       if (dict_find(dict, (char_u *)"timeout", -1) != NULL)
-           timeout = get_dict_number(dict, (char_u *)"timeout");
-       if (dict_find(dict, (char_u *)"callback", -1) != NULL)
-           callback = get_dict_string(dict, (char_u *)"callback", FALSE);
+       if ((item = dict_find(dict, (char_u *)"waittime", -1)) != NULL)
+           waittime = get_tv_number(&item->di_tv);
+       if ((item = dict_find(dict, (char_u *)"timeout", -1)) != NULL)
+           timeout = get_tv_number(&item->di_tv);
+       if ((item = dict_find(dict, (char_u *)"callback", -1)) != NULL)
+           callback = get_callback(&item->di_tv);
     }
     if (waittime < 0 || timeout < 0)
     {
index 6e5bbbb52d012f0e2a15d3778ac4951063bdf8e0..9f52eb77e7b3ba2a78fe9597be2515a77e0c6d8b 100644 (file)
@@ -118,6 +118,13 @@ func s:communicate(port)
   call assert_equal(handle, s:responseHandle)
   call assert_equal('got it', s:responseMsg)
 
+  let s:responseHandle = -1
+  let s:responseMsg = ''
+  call ch_sendexpr(handle, 'hello!', function('s:RequestHandler'))
+  sleep 10m
+  call assert_equal(handle, s:responseHandle)
+  call assert_equal('got it', s:responseMsg)
+
   " Send an eval request that works.
   call assert_equal('ok', ch_sendexpr(handle, 'eval-works'))
   sleep 10m
@@ -206,13 +213,12 @@ endfunc
 
 let s:reply = ""
 func s:Handler(chan, msg)
+  unlet s:reply
   let s:reply = a:msg
 endfunc
 
 func s:channel_handler(port)
-  let chopt = copy(s:chopt)
-  let chopt['callback'] = 's:Handler'
-  let handle = ch_open('localhost:' . a:port, chopt)
+  let handle = ch_open('localhost:' . a:port, s:chopt)
   if handle < 0
     call assert_false(1, "Can't open channel")
     return
@@ -230,7 +236,11 @@ func s:channel_handler(port)
 endfunc
 
 func Test_channel_handler()
+  let s:chopt.callback = 's:Handler'
+  call s:run_server('s:channel_handler')
+  let s:chopt.callback = function('s:Handler')
   call s:run_server('s:channel_handler')
+  unlet s:chopt.callback
 endfunc
 
 " Test that trying to connect to a non-existing port fails quickly.
index e3f432e57c2f1db05cb154b6a240de8ae55afde3..af6e9f5c8cd19623f5494eae5f884f616839b0a9 100644 (file)
@@ -747,6 +747,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1303,
 /**/
     1302,
 /**/