0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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.
This commit is contained in:
Bram Moolenaar
2020-03-01 15:36:42 +01:00
parent fbdd08ed9b
commit 087d2e1518
5 changed files with 47 additions and 9 deletions

View 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)

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
340,
/**/
339,
/**/

View 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;

View 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:

View 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