From 4875d6ab068f09df88d24d81de40dcd8d56e243d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 17 Aug 2022 15:55:51 +0100 Subject: [PATCH] patch 9.0.0224: Using NULL pointer when skipping compiled code Problem: Using NULL pointer when skipping compiled code. Solution: Check for skipping. --- src/testdir/test_vim9_script.vim | 13 +++++++++++++ src/version.c | 2 ++ src/vim9compile.c | 14 ++++++++++---- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 3199ac3953740..56a39efcf79bc 100644 --- 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 = '' diff --git a/src/version.c b/src/version.c index 1566e4dfcfcfb..e477f9e315d0e 100644 --- a/src/version.c +++ b/src/version.c @@ -731,6 +731,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 224, /**/ 223, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index d1e2c87fd82c6..d8596e99effb4 100644 --- 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