changeset 19566:ec1eeb1b69e2 v8.2.0340

patch 8.2.0340: Vim9: function and partial types not tested Commit: https://github.com/vim/vim/commit/087d2e15184bea3bf455dd266bd6ed66a45396e5 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 1 15:36:42 2020 +0100 patch 8.2.0340: Vim9: function and partial types not tested Problem: Vim9: function and partial types not tested. Solution: Support more for partial, add tests.
author Bram Moolenaar <Bram@vim.org>
date Sun, 01 Mar 2020 15:45:03 +0100
parents 9b03bf56d05e
children b8c9eb5e8c2d
files src/testdir/test_vim9_script.vim src/version.c src/vim9.h src/vim9compile.c src/vim9execute.c
diffstat 5 files changed, 47 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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)
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    340,
+/**/
     339,
 /**/
     338,
--- a/src/vim9.h
+++ b/src/vim9.h
@@ -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;
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -706,6 +706,23 @@ generate_PUSHFUNC(cctx_T *cctx, char_u *
 }
 
 /*
+ * 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.
  */
     static int
@@ -3605,8 +3622,7 @@ compile_assignment(char_u *arg, exarg_T 
 		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:
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -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