Mercurial > vim
changeset 29769:e0259a817d82 v9.0.0224
patch 9.0.0224: Using NULL pointer when skipping compiled code
Commit: https://github.com/vim/vim/commit/4875d6ab068f09df88d24d81de40dcd8d56e243d
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Aug 17 15:55:51 2022 +0100
patch 9.0.0224: Using NULL pointer when skipping compiled code
Problem: Using NULL pointer when skipping compiled code.
Solution: Check for skipping.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 17 Aug 2022 17:00:05 +0200 |
parents | eda99dab5f01 |
children | 653c04c1dcf1 |
files | src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c |
diffstat | 3 files changed, 25 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2097,6 +2097,19 @@ def Test_for_skipped_block() v9.CheckDefAndScriptSuccess(lines) enddef +def Test_skipped_redir() + var lines =<< trim END + def T() + if 0 + redir =>l[0] + redir END + endif + enddef + defcompile + END + v9.CheckScriptSuccess(lines) +enddef + def Test_for_loop() var lines =<< trim END var result = ''
--- a/src/version.c +++ b/src/version.c @@ -732,6 +732,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 224, +/**/ 223, /**/ 222,
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1165,11 +1165,14 @@ generate_loadvar( generate_LOADV(cctx, name + 2); break; case dest_local: - if (lvar->lv_from_outer > 0) - generate_LOADOUTER(cctx, lvar->lv_idx, lvar->lv_from_outer, + if (cctx->ctx_skip != SKIP_YES) + { + if (lvar->lv_from_outer > 0) + generate_LOADOUTER(cctx, lvar->lv_idx, lvar->lv_from_outer, type); - else - generate_LOAD(cctx, ISN_LOAD, lvar->lv_idx, NULL, type); + else + generate_LOAD(cctx, ISN_LOAD, lvar->lv_idx, NULL, type); + } break; case dest_expr: // list or dict value should already be on the stack. @@ -1952,6 +1955,9 @@ compile_assign_unlet( } } + if (cctx->ctx_skip == SKIP_YES) + return OK; + // Load the dict or list. On the stack we then have: // - value (for assignment, not for :unlet) // - index