]> granicus.if.org Git - vim/commitdiff
patch 8.2.0340: Vim9: function and partial types not tested v8.2.0340
authorBram Moolenaar <Bram@vim.org>
Sun, 1 Mar 2020 14:36:42 +0000 (15:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 1 Mar 2020 14:36:42 +0000 (15:36 +0100)
Problem:    Vim9: function and partial types not tested.
Solution:   Support more for partial, add tests.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9.h
src/vim9compile.c
src/vim9execute.c

index e5b3b476e46040a66e7643c4c2e64f2e1d93e4f4..aace2397872e64a5335ab71e33eaf60a6511cfd4 100644 (file)
@@ -60,7 +60,10 @@ def Test_assignment()
   if has('float')
     let float1: float = 3.4
   endif
-  let party: partial = funcref('Test_syntax')
+  let funky1: func
+  let funky2: func = function('len')
+  let party1: partial
+  let party2: partial = funcref('Test_syntax')
 
   g:newvar = 'new'
   assert_equal('new', g:newvar)
index bdb40d312f3c14e23b56e8d1841c32c2c8727b94..3d126b068f4c81bf8ea49a91aef9bf6db8cd47d0 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    340,
 /**/
     339,
 /**/
index 3a09c0fecb7d83f95be172b9dcd854fdf04cae6c..35d34e3af40b15cbcb20399e62eea0b8aa5df522 100644 (file)
@@ -215,6 +215,7 @@ typedef struct {
 #endif
        channel_T           *channel;
        job_T               *job;
+       partial_T           *partial;
        jump_T              jump;
        forloop_T           forloop;
        try_T               try;
index 4fb5478443696f85ef1e1a36cb512dfd7752cd8c..64ed03800910c609916ec486063a0689b274dda8 100644 (file)
@@ -705,6 +705,23 @@ generate_PUSHFUNC(cctx_T *cctx, char_u *name)
     return OK;
 }
 
+/*
+ * Generate an ISN_PUSHPARTIAL instruction with partial "part".
+ * Consumes "name".
+ */
+    static int
+generate_PUSHPARTIAL(cctx_T *cctx, partial_T *part)
+{
+    isn_T      *isn;
+
+    if ((isn = generate_instr_type(cctx, ISN_PUSHPARTIAL,
+                                                     &t_partial_any)) == NULL)
+       return FAIL;
+    isn->isn_arg.partial = part;
+
+    return OK;
+}
+
 /*
  * Generate an ISN_STORE instruction.
  */
@@ -3605,8 +3622,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                generate_PUSHFUNC(cctx, NULL);
                break;
            case VAR_PARTIAL:
-               // generate_PUSHPARTIAL(cctx, NULL);
-               emsg("Partial type not supported yet");
+               generate_PUSHPARTIAL(cctx, NULL);
                break;
            case VAR_LIST:
                generate_NEWLIST(cctx, 0);
@@ -5228,7 +5244,7 @@ delete_instr(isn_T *isn)
            break;
 
        case ISN_PUSHPARTIAL:
-           // TODO
+           partial_unref(isn->isn_arg.partial);
            break;
 
        case ISN_PUSHJOB:
index 9d187c4b44ec8f4ee71b665c35c1e2314c617597..be19b1f7ff4a7bae0d9a2f608ea02ea2c6474aca 100644 (file)
@@ -873,10 +873,17 @@ call_def_function(
                        break;
                    case ISN_PUSHFUNC:
                        tv->v_type = VAR_FUNC;
-                       tv->vval.v_string = vim_strsave(iptr->isn_arg.string);
+                       if (iptr->isn_arg.string == NULL)
+                           tv->vval.v_string = NULL;
+                       else
+                           tv->vval.v_string =
+                                            vim_strsave(iptr->isn_arg.string);
                        break;
                    case ISN_PUSHPARTIAL:
-                       tv->v_type = VAR_UNKNOWN;
+                       tv->v_type = VAR_PARTIAL;
+                       tv->vval.v_partial = iptr->isn_arg.partial;
+                       if (tv->vval.v_partial != NULL)
+                           ++tv->vval.v_partial->pt_refcount;
                        break;
                    case ISN_PUSHCHANNEL:
 #ifdef FEAT_JOB_CHANNEL
@@ -1874,11 +1881,20 @@ ex_disassemble(exarg_T *eap)
                }
                break;
            case ISN_PUSHFUNC:
-               smsg("%4d PUSHFUNC \"%s\"", current, iptr->isn_arg.string);
+               {
+                   char *name = (char *)iptr->isn_arg.string;
+
+                   smsg("%4d PUSHFUNC \"%s\"", current,
+                                              name == NULL ? "[none]" : name);
+               }
                break;
            case ISN_PUSHPARTIAL:
-               // TODO
-               smsg("%4d PUSHPARTIAL", current);
+               {
+                   partial_T *part = iptr->isn_arg.partial;
+
+                   smsg("%4d PUSHPARTIAL \"%s\"", current,
+                        part == NULL ? "[none]" : (char *)partial_name(part));
+               }
                break;
            case ISN_PUSHCHANNEL:
 #ifdef FEAT_JOB_CHANNEL