Mercurial > vim
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