To: vim_dev@googlegroups.com Subject: Patch 8.2.2387 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2387 Problem: Runtime type check does not mention argument index. Solution: Add ct_arg_idx. (closes #7720) Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_disassemble.vim, src/testdir/test_vim9_func.vim *** ../vim-8.2.2386/src/vim9.h 2021-01-10 18:33:08.011683523 +0100 --- src/vim9.h 2021-01-21 20:03:18.551137054 +0100 *************** *** 224,230 **** // arguments to ISN_CHECKTYPE typedef struct { type_T *ct_type; ! int ct_off; // offset in stack, -1 is bottom } checktype_T; // arguments to ISN_STORENR --- 224,231 ---- // arguments to ISN_CHECKTYPE typedef struct { type_T *ct_type; ! char ct_off; // offset in stack, -1 is bottom ! char ct_arg_idx; // argument index or zero } checktype_T; // arguments to ISN_STORENR *** ../vim-8.2.2386/src/vim9compile.c 2021-01-21 12:34:11.441508288 +0100 --- src/vim9compile.c 2021-01-21 20:09:04.850377122 +0100 *************** *** 816,822 **** generate_TYPECHECK( cctx_T *cctx, type_T *expected, ! int offset) { isn_T *isn; garray_T *stack = &cctx->ctx_type_stack; --- 816,823 ---- generate_TYPECHECK( cctx_T *cctx, type_T *expected, ! int offset, ! int argidx) { isn_T *isn; garray_T *stack = &cctx->ctx_type_stack; *************** *** 826,831 **** --- 827,833 ---- return FAIL; isn->isn_arg.type.ct_type = alloc_type(expected); isn->isn_arg.type.ct_off = offset; + isn->isn_arg.type.ct_arg_idx = argidx; // type becomes expected ((type_T **)stack->ga_data)[stack->ga_len + offset] = expected; *************** *** 904,910 **** // If it's a constant a runtime check makes no sense. if (!actual_is_const && use_typecheck(actual, expected)) { ! generate_TYPECHECK(cctx, expected, offset); return OK; } --- 906,912 ---- // If it's a constant a runtime check makes no sense. if (!actual_is_const && use_typecheck(actual, expected)) { ! generate_TYPECHECK(cctx, expected, offset, arg_idx); return OK; } *************** *** 1637,1643 **** if (maptype != NULL && maptype->tt_member != NULL && maptype->tt_member != &t_any) // Check that map() didn't change the item types. ! generate_TYPECHECK(cctx, maptype, -1); return OK; } --- 1639,1645 ---- if (maptype != NULL && maptype->tt_member != NULL && maptype->tt_member != &t_any) // Check that map() didn't change the item types. ! generate_TYPECHECK(cctx, maptype, -1, 1); return OK; } *************** *** 1735,1741 **** else expected = ufunc->uf_va_type->tt_member; actual = ((type_T **)stack->ga_data)[stack->ga_len - argcount + i]; ! if (need_type(actual, expected, -argcount + i, 0, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); --- 1737,1743 ---- else expected = ufunc->uf_va_type->tt_member; actual = ((type_T **)stack->ga_data)[stack->ga_len - argcount + i]; ! if (need_type(actual, expected, -argcount + i, i + 1, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); *************** *** 1852,1858 **** type->tt_argcount - 1]->tt_member; else expected = type->tt_args[i]; ! if (need_type(actual, expected, offset, 0, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); --- 1854,1860 ---- type->tt_argcount - 1]->tt_member; else expected = type->tt_args[i]; ! if (need_type(actual, expected, offset, i + 1, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); *** ../vim-8.2.2386/src/vim9execute.c 2021-01-21 19:41:13.041961910 +0100 --- src/vim9execute.c 2021-01-21 20:17:13.337256669 +0100 *************** *** 3242,3248 **** tv = STACK_TV_BOT(ct->ct_off); SOURCING_LNUM = iptr->isn_lnum; ! if (check_typval_type(ct->ct_type, tv, 0) == FAIL) goto on_error; // number 0 is FALSE, number 1 is TRUE --- 3242,3249 ---- tv = STACK_TV_BOT(ct->ct_off); SOURCING_LNUM = iptr->isn_lnum; ! if (check_typval_type(ct->ct_type, tv, ct->ct_arg_idx) ! == FAIL) goto on_error; // number 0 is FALSE, number 1 is TRUE *************** *** 4235,4245 **** case ISN_CHECKNR: smsg("%4d CHECKNR", current); break; case ISN_CHECKTYPE: { char *tofree; ! smsg("%4d CHECKTYPE %s stack[%d]", current, ! type_name(iptr->isn_arg.type.ct_type, &tofree), ! iptr->isn_arg.type.ct_off); vim_free(tofree); break; } --- 4236,4253 ---- case ISN_CHECKNR: smsg("%4d CHECKNR", current); break; case ISN_CHECKTYPE: { + checktype_T *ct = &iptr->isn_arg.type; char *tofree; ! if (ct->ct_arg_idx == 0) ! smsg("%4d CHECKTYPE %s stack[%d]", current, ! type_name(ct->ct_type, &tofree), ! (int)ct->ct_off); ! else ! smsg("%4d CHECKTYPE %s stack[%d] arg %d", current, ! type_name(ct->ct_type, &tofree), ! (int)ct->ct_off, ! (int)ct->ct_arg_idx); vim_free(tofree); break; } *** ../vim-8.2.2386/src/testdir/test_vim9_builtin.vim 2021-01-17 16:16:19.997563189 +0100 --- src/testdir/test_vim9_builtin.vim 2021-01-21 20:15:05.993551944 +0100 *************** *** 263,269 **** CheckDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') CheckDefFailure(['extend([1], ["b"])'], 'E1013: Argument 2: type mismatch, expected list but got list') ! CheckDefExecFailure(['extend([1], ["b", 1])'], 'E1012: Type mismatch; expected list but got list') enddef def Test_extendnew() --- 263,269 ---- CheckDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') CheckDefFailure(['extend([1], ["b"])'], 'E1013: Argument 2: type mismatch, expected list but got list') ! CheckDefExecFailure(['extend([1], ["b", 1])'], 'E1013: Argument 2: type mismatch, expected list but got list') enddef def Test_extendnew() *** ../vim-8.2.2386/src/testdir/test_vim9_disassemble.vim 2021-01-17 16:16:19.997563189 +0100 --- src/testdir/test_vim9_disassemble.vim 2021-01-21 20:17:53.753162581 +0100 *************** *** 934,940 **** 'return Ref(g:value)\_s*' .. '\d LOADG g:value\_s*' .. '\d LOAD $0\_s*' .. ! '\d CHECKTYPE number stack\[-2\]\_s*' .. '\d PCALL (argc 1)\_s*' .. '\d RETURN', instr) --- 934,940 ---- 'return Ref(g:value)\_s*' .. '\d LOADG g:value\_s*' .. '\d LOAD $0\_s*' .. ! '\d CHECKTYPE number stack\[-2\] arg 1\_s*' .. '\d PCALL (argc 1)\_s*' .. '\d RETURN', instr) *** ../vim-8.2.2386/src/testdir/test_vim9_func.vim 2021-01-21 19:41:13.041961910 +0100 --- src/testdir/test_vim9_func.vim 2021-01-21 20:12:40.573886859 +0100 *************** *** 144,149 **** --- 144,165 ---- assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal') enddef + def Test_check_argument_type() + var lines =<< trim END + vim9script + def Val(a: number, b: number): number + return 0 + enddef + def Func() + var x: any = true + Val(0, x) + enddef + disass Func + Func() + END + CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got bool', 2) + enddef + def Test_missing_return() CheckDefFailure(['def Missing(): number', ' if g:cond', *** ../vim-8.2.2386/src/version.c 2021-01-21 19:41:13.041961910 +0100 --- src/version.c 2021-01-21 20:04:10.207026612 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2387, /**/ -- hundred-and-one symptoms of being an internet addict: 202. You're amazed to find out Spam is a food. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///