Patch 8.2.2812

6 views
Skip to first unread message

Bram Moolenaar

unread,
Apr 26, 2021, 2:33:35 PM4/26/21
to vim...@googlegroups.com

Patch 8.2.2812
Problem: Vim9: still crash when using substitute expression.
Solution: Put the instruction list in the stack frame. (closes #8154)
Files: src/vim9execute.c, src/vim9.h, src/testdir/test_vim9_cmd.vim


*** ../vim-8.2.2811/src/vim9execute.c 2021-04-25 14:48:45.500794221 +0200
--- src/vim9execute.c 2021-04-26 20:28:26.379200014 +0200
***************
*** 279,284 ****
--- 279,285 ----
// Store current execution state in stack frame for ISN_RETURN.
STACK_TV_BOT(STACK_FRAME_FUNC_OFF)->vval.v_number = ectx->ec_dfunc_idx;
STACK_TV_BOT(STACK_FRAME_IIDX_OFF)->vval.v_number = ectx->ec_iidx;
+ STACK_TV_BOT(STACK_FRAME_INSTR_OFF)->vval.v_string = (void *)ectx->ec_instr;
STACK_TV_BOT(STACK_FRAME_OUTER_OFF)->vval.v_string = (void *)ectx->ec_outer;
STACK_TV_BOT(STACK_FRAME_FUNCLOCAL_OFF)->vval.v_string = (void *)floc;
STACK_TV_BOT(STACK_FRAME_IDX_OFF)->vval.v_number = ectx->ec_frame_idx;
***************
*** 592,597 ****
--- 593,600 ----
ectx->ec_dfunc_idx = prev_dfunc_idx;
ectx->ec_iidx = STACK_TV(ectx->ec_frame_idx
+ STACK_FRAME_IIDX_OFF)->vval.v_number;
+ ectx->ec_instr = (void *)STACK_TV(ectx->ec_frame_idx
+ + STACK_FRAME_INSTR_OFF)->vval.v_string;
ectx->ec_outer = (void *)STACK_TV(ectx->ec_frame_idx
+ STACK_FRAME_OUTER_OFF)->vval.v_string;
floc = (void *)STACK_TV(ectx->ec_frame_idx
***************
*** 599,611 ****
// restoring ec_frame_idx must be last
ectx->ec_frame_idx = STACK_TV(ectx->ec_frame_idx
+ STACK_FRAME_IDX_OFF)->vval.v_number;
- ectx->ec_instr = INSTRUCTIONS(prev_dfunc);
-
- // If the call was inside an ISN_SUBSTITUTE instruction need to use its
- // list of instructions.
- if (ectx->ec_instr[ectx->ec_iidx - 1].isn_type == ISN_SUBSTITUTE)
- ectx->ec_instr = ectx->ec_instr[ectx->ec_iidx - 1]
- .isn_arg.subs.subs_instr;

if (floc == NULL)
ectx->ec_funclocal.floc_restore_cmdmod = FALSE;
--- 602,607 ----
*** ../vim-8.2.2811/src/vim9.h 2021-04-19 20:49:58.156857538 +0200
--- src/vim9.h 2021-04-26 20:22:43.064076181 +0200
***************
*** 427,441 ****
// Number of entries used by stack frame for a function call.
// - ec_dfunc_idx: function index
// - ec_iidx: instruction index
// - ec_outer: stack used for closures
// - funclocal: function-local data
// - ec_frame_idx: previous frame index
#define STACK_FRAME_FUNC_OFF 0
#define STACK_FRAME_IIDX_OFF 1
! #define STACK_FRAME_OUTER_OFF 2
! #define STACK_FRAME_FUNCLOCAL_OFF 3
! #define STACK_FRAME_IDX_OFF 4
! #define STACK_FRAME_SIZE 5


#ifdef DEFINE_VIM9_GLOBALS
--- 427,443 ----
// Number of entries used by stack frame for a function call.
// - ec_dfunc_idx: function index
// - ec_iidx: instruction index
+ // - ec_instr: instruction list pointer
// - ec_outer: stack used for closures
// - funclocal: function-local data
// - ec_frame_idx: previous frame index
#define STACK_FRAME_FUNC_OFF 0
#define STACK_FRAME_IIDX_OFF 1
! #define STACK_FRAME_INSTR_OFF 2
! #define STACK_FRAME_OUTER_OFF 3
! #define STACK_FRAME_FUNCLOCAL_OFF 4
! #define STACK_FRAME_IDX_OFF 5
! #define STACK_FRAME_SIZE 6


#ifdef DEFINE_VIM9_GLOBALS
*** ../vim-8.2.2811/src/testdir/test_vim9_cmd.vim 2021-04-25 16:35:52.101622736 +0200
--- src/testdir/test_vim9_cmd.vim 2021-04-26 20:29:44.006995388 +0200
***************
*** 1208,1222 ****
--- 1208,1225 ----
CheckDefFailure(['s/from/\="x"/9'], 'E488:')

# When calling a function the right instruction list needs to be restored.
+ g:cond = true
var lines =<< trim END
vim9script
def Foo()
Bar([])
enddef
def Bar(l: list<number>)
+ if g:cond
s/^/\=Rep()/
for n in l[:]
endfor
+ endif
enddef
def Rep(): string
return 'rep'
***************
*** 1227,1232 ****
--- 1230,1236 ----
bwipe!
END
CheckScriptSuccess(lines)
+ unlet g:cond
enddef

def Test_redir_to_var()
*** ../vim-8.2.2811/src/version.c 2021-04-25 16:35:52.101622736 +0200
--- src/version.c 2021-04-26 20:31:35.054699695 +0200
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2812,
/**/

--
The CIA drives around in cars with the "Intel inside" logo.

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

John Marriott

unread,
Apr 26, 2021, 3:30:02 PM4/26/21
to vim...@googlegroups.com

On 27-Apr-2021 04:33, Bram Moolenaar wrote:
> Patch 8.2.2812
> Problem: Vim9: still crash when using substitute expression.
> Solution: Put the instruction list in the stack frame. (closes #8154)
> Files: src/vim9execute.c, src/vim9.h, src/testdir/test_vim9_cmd.vim
>
>
After this patch I noticed this warning from mingw64 (gcc 10.3.0):
<snip>
gcc -c -I. -Iproto -DWIN32 -DWINVER=0x0603 -D_WIN32_WINNT=0x0603
-DHAVE_PATHDEF -DFEAT_NORMAL -DHAVE_STDINT_H -D__USE_MINGW_ANSI_STDIO
-pipe -march=native -Wall -O3 -fomit-frame-pointer -freg-struct-return
-fpie -fPIE -DFEAT_GUI_MSWIN -DFEAT_CLIPBOARD vim9execute.c -o
gobjnative/vim9execute.o
vim9execute.c: In function 'func_return':
vim9execute.c:546:14: warning: unused variable 'prev_dfunc'
[-Wunused-variable]
  546 |     dfunc_T *prev_dfunc = ((dfunc_T *)def_functions.ga_data)
      |              ^~~~~~~~~~
</snip>

I think this warning came from patch 8.2.2530 which is where the
relevant lines were added but it is weird that I hadn't noticed the
warning before.

Anyway, the attached patch tries to fix it.

Cheers
vim9execute.c.8.2.2812.patch
Reply all
Reply to author
Forward
0 new messages