Patch 8.2.1653
Problem:    Expand('<stack>') does not include the final line number.
Solution:   Add the line nuber. (closes #6927)
Files:      src/vim.h, src/scriptfile.c, src/proto/scriptfile.pro,
            src/debugger.c, src/ex_docmd.c, src/ex_eval.c, src/message.c,
            src/testing.c, src/testdir/test_expand_func.vim


*** ../vim-8.2.1652/src/vim.h   2020-08-23 14:28:24.107838497 +0200
--- src/vim.h   2020-09-10 19:03:04.040325047 +0200
***************
*** 2097,2104 ****
  # define USE_PRINTF_FORMAT_ATTRIBUTE
  #endif
  
! typedef enum
! {
      ASSERT_EQUAL,
      ASSERT_NOTEQUAL,
      ASSERT_MATCH,
--- 2097,2103 ----
  # define USE_PRINTF_FORMAT_ATTRIBUTE
  #endif
  
! typedef enum {
      ASSERT_EQUAL,
      ASSERT_NOTEQUAL,
      ASSERT_MATCH,
***************
*** 2128,2133 ****
--- 2127,2139 ----
      USEPOPUP_HIDDEN   // use info popup initially hidden
  } use_popup_T;
  
+ // Argument for estack_sfile().
+ typedef enum {
+     ESTACK_NONE,
+     ESTACK_SFILE,
+     ESTACK_STACK
+ } estack_arg_T;
+ 
  // Flags for assignment functions.
  #define LET_IS_CONST  1   // ":const"
  #define LET_NO_COMMAND        2   // "var = expr" without ":let" or ":const"
*** ../vim-8.2.1652/src/scriptfile.c    2020-08-29 13:39:12.578557657 +0200
--- src/scriptfile.c    2020-09-10 18:53:01.950224042 +0200
***************
*** 111,120 ****
  
  /*
   * Get the current value for <sfile> in allocated memory.
!  * "is_sfile" is TRUE for <sfile> itself.
   */
      char_u *
! estack_sfile(int is_sfile UNUSED)
  {
      estack_T  *entry;
  #ifdef FEAT_EVAL
--- 111,120 ----
  
  /*
   * Get the current value for <sfile> in allocated memory.
!  * "which" is ESTACK_SFILE for <sfile> and ESTACK_STACK for <stack>.
   */
      char_u *
! estack_sfile(estack_arg_T which UNUSED)
  {
      estack_T  *entry;
  #ifdef FEAT_EVAL
***************
*** 127,133 ****
  
      entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
  #ifdef FEAT_EVAL
!     if (is_sfile && entry->es_type != ETYPE_UFUNC)
  #endif
      {
        if (entry->es_name == NULL)
--- 127,133 ----
  
      entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
  #ifdef FEAT_EVAL
!     if (which == ESTACK_SFILE && entry->es_type != ETYPE_UFUNC)
  #endif
      {
        if (entry->es_name == NULL)
***************
*** 144,149 ****
--- 144,151 ----
        entry = ((estack_T *)exestack.ga_data) + idx;
        if (entry->es_name != NULL)
        {
+           long lnum = 0;
+ 
            len = STRLEN(entry->es_name) + 15;
            type_name = "";
            if (entry->es_type != last_type)
***************
*** 159,173 ****
            len += STRLEN(type_name);
            if (ga_grow(&ga, (int)len) == FAIL)
                break;
!           if (idx == exestack.ga_len - 1 || entry->es_lnum == 0)
!               // For the bottom entry: do not add the line number, it is used
!               // in <slnum>.  Also leave it out when the number is not set.
                vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s%s",
                                type_name, entry->es_name,
                                idx == exestack.ga_len - 1 ? "" : "..");
            else
                vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s[%ld]..",
!                                   type_name, entry->es_name, entry->es_lnum);
            ga.ga_len += (int)STRLEN((char *)ga.ga_data + ga.ga_len);
        }
      }
--- 161,180 ----
            len += STRLEN(type_name);
            if (ga_grow(&ga, (int)len) == FAIL)
                break;
!           if (idx == exestack.ga_len - 1)
!               lnum = which == ESTACK_STACK ? SOURCING_LNUM : 0;
!           else
!               lnum = entry->es_lnum;
!           if (lnum == 0)
!               // For the bottom entry of <sfile>: do not add the line number,
!               // it is used in <slnum>.  Also leave it out when the number is
!               // not set.
                vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s%s",
                                type_name, entry->es_name,
                                idx == exestack.ga_len - 1 ? "" : "..");
            else
                vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s[%ld]..",
!                                   type_name, entry->es_name, lnum);
            ga.ga_len += (int)STRLEN((char *)ga.ga_data + ga.ga_len);
        }
      }
*** ../vim-8.2.1652/src/proto/scriptfile.pro    2020-08-20 15:02:38.536534973 
+0200
--- src/proto/scriptfile.pro    2020-09-10 18:54:17.113989660 +0200
***************
*** 4,10 ****
  estack_T *estack_push_ufunc(ufunc_T *ufunc, long lnum);
  int estack_top_is_ufunc(ufunc_T *ufunc, long lnum);
  estack_T *estack_pop(void);
! char_u *estack_sfile(int is_sfile);
  void ex_runtime(exarg_T *eap);
  int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u 
*fname, void *ck), void *cookie);
  int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u 
*fname, void *ck), void *cookie);
--- 4,10 ----
  estack_T *estack_push_ufunc(ufunc_T *ufunc, long lnum);
  int estack_top_is_ufunc(ufunc_T *ufunc, long lnum);
  estack_T *estack_pop(void);
! char_u *estack_sfile(estack_arg_T which);
  void ex_runtime(exarg_T *eap);
  int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u 
*fname, void *ck), void *cookie);
  int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u 
*fname, void *ck), void *cookie);
*** ../vim-8.2.1652/src/debugger.c      2020-07-26 15:36:12.963172976 +0200
--- src/debugger.c      2020-09-10 18:50:25.054709380 +0200
***************
*** 105,111 ****
        vim_free(debug_newval);
        debug_newval = NULL;
      }
!     sname = estack_sfile(FALSE);
      if (sname != NULL)
        msg((char *)sname);
      vim_free(sname);
--- 105,111 ----
        vim_free(debug_newval);
        debug_newval = NULL;
      }
!     sname = estack_sfile(ESTACK_NONE);
      if (sname != NULL)
        msg((char *)sname);
      vim_free(sname);
***************
*** 344,350 ****
      }
      else
      {
!       char_u  *sname = estack_sfile(FALSE);
        int     max = get_maxbacktrace_level(sname);
  
        if (debug_backtrace_level > max)
--- 344,350 ----
      }
      else
      {
!       char_u  *sname = estack_sfile(ESTACK_NONE);
        int     max = get_maxbacktrace_level(sname);
  
        if (debug_backtrace_level > max)
***************
*** 365,371 ****
      int           i = 0;
      int           max;
  
!     sname = estack_sfile(FALSE);
      max = get_maxbacktrace_level(sname);
      if (sname != NULL)
      {
--- 365,371 ----
      int           i = 0;
      int           max;
  
!     sname = estack_sfile(ESTACK_NONE);
      max = get_maxbacktrace_level(sname);
      if (sname != NULL)
      {
*** ../vim-8.2.1652/src/ex_docmd.c      2020-09-08 22:45:31.113504961 +0200
--- src/ex_docmd.c      2020-09-10 18:51:05.982583357 +0200
***************
*** 8389,8394 ****
--- 8389,8395 ----
   *      '<cexpr>' to C-expression under the cursor
   *      '<cfile>' to path name under the cursor
   *      '<sfile>' to sourced file name
+  *      '<stack>' to call stack
   *      '<slnum>' to sourced file line number
   *      '<afile>' to file name for autocommand
   *      '<abuf>'  to buffer number for autocommand
***************
*** 8606,8612 ****
  
        case SPEC_SFILE:        // file name for ":so" command
        case SPEC_STACK:        // call stack
!               result = estack_sfile(spec_idx == SPEC_SFILE);
                if (result == NULL)
                {
                    *errormsg = spec_idx == SPEC_SFILE
--- 8607,8614 ----
  
        case SPEC_SFILE:        // file name for ":so" command
        case SPEC_STACK:        // call stack
!               result = estack_sfile(spec_idx == SPEC_SFILE
!                                               ? ESTACK_SFILE : ESTACK_STACK);
                if (result == NULL)
                {
                    *errormsg = spec_idx == SPEC_SFILE
*** ../vim-8.2.1652/src/ex_eval.c       2020-07-26 15:36:12.963172976 +0200
--- src/ex_eval.c       2020-09-10 18:51:35.098493433 +0200
***************
*** 290,296 ****
  
                    // Get the source name and lnum now, it may change before
                    // reaching do_errthrow().
!                   elem->sfile = estack_sfile(FALSE);
                    elem->slnum = SOURCING_LNUM;
                }
            }
--- 290,296 ----
  
                    // Get the source name and lnum now, it may change before
                    // reaching do_errthrow().
!                   elem->sfile = estack_sfile(ESTACK_NONE);
                    elem->slnum = SOURCING_LNUM;
                }
            }
***************
*** 549,555 ****
      }
      else
      {
!       excp->throw_name = estack_sfile(FALSE);
        if (excp->throw_name == NULL)
            excp->throw_name = vim_strsave((char_u *)"");
        if (excp->throw_name == NULL)
--- 549,555 ----
      }
      else
      {
!       excp->throw_name = estack_sfile(ESTACK_NONE);
        if (excp->throw_name == NULL)
            excp->throw_name = vim_strsave((char_u *)"");
        if (excp->throw_name == NULL)
*** ../vim-8.2.1652/src/message.c       2020-09-06 21:47:39.323041533 +0200
--- src/message.c       2020-09-10 18:51:46.818457177 +0200
***************
*** 461,467 ****
  
      if (SOURCING_NAME != NULL && other_sourcing_name())
      {
!       char_u      *sname = estack_sfile(FALSE);
        char_u      *tofree = sname;
  
        if (sname == NULL)
--- 461,467 ----
  
      if (SOURCING_NAME != NULL && other_sourcing_name())
      {
!       char_u      *sname = estack_sfile(ESTACK_NONE);
        char_u      *tofree = sname;
  
        if (sname == NULL)
*** ../vim-8.2.1652/src/testing.c       2020-09-06 22:26:53.418275627 +0200
--- src/testing.c       2020-09-10 18:53:11.318194891 +0200
***************
*** 22,28 ****
  prepare_assert_error(garray_T *gap)
  {
      char    buf[NUMBUFLEN];
!     char_u  *sname = estack_sfile(FALSE);
  
      ga_init2(gap, 1, 100);
      if (sname != NULL)
--- 22,28 ----
  prepare_assert_error(garray_T *gap)
  {
      char    buf[NUMBUFLEN];
!     char_u  *sname = estack_sfile(ESTACK_NONE);
  
      ga_init2(gap, 1, 100);
      if (sname != NULL)
*** ../vim-8.2.1652/src/testdir/test_expand_func.vim    2020-08-01 
20:45:06.928096141 +0200
--- src/testdir/test_expand_func.vim    2020-09-10 19:14:29.402134650 +0200
***************
*** 39,47 ****
  
  func Test_expand_sfile_and_stack()
    call assert_match('test_expand_func\.vim$', s:sfile)
!   let expected = 'script .*testdir/runtest.vim\[\d\+\]\.\.function 
RunTheTest\[\d\+\]\.\.Test_expand_sfile_and_stack$'
!   call assert_match(expected , expand('<sfile>'))
!   call assert_match(expected , expand('<stack>'))
  
    " Call in script-local function
    call assert_match('script .*testdir/runtest.vim\[\d\+\]\.\.function 
RunTheTest\[\d\+\]\.\.Test_expand_sfile_and_stack\[7\]\.\.<SNR>\d\+_expand_sfile$',
 s:expand_sfile())
--- 39,47 ----
  
  func Test_expand_sfile_and_stack()
    call assert_match('test_expand_func\.vim$', s:sfile)
!   let expected = 'script .*testdir/runtest.vim\[\d\+\]\.\.function 
RunTheTest\[\d\+\]\.\.Test_expand_sfile_and_stack'
!   call assert_match(expected .. '$', expand('<sfile>'))
!   call assert_match(expected .. '\[4\]' , expand('<stack>'))
  
    " Call in script-local function
    call assert_match('script .*testdir/runtest.vim\[\d\+\]\.\.function 
RunTheTest\[\d\+\]\.\.Test_expand_sfile_and_stack\[7\]\.\.<SNR>\d\+_expand_sfile$',
 s:expand_sfile())
***************
*** 53,63 ****
  
    " Use <stack> from sourced script.
    let lines =<< trim END
      let g:stack_value = expand('<stack>')
    END
    call writefile(lines, 'Xstack')
    source Xstack
!   call assert_match('\<Xstack$', g:stack_value)
    call delete('Xstack')
  endfunc
  
--- 53,64 ----
  
    " Use <stack> from sourced script.
    let lines =<< trim END
+     " comment here
      let g:stack_value = expand('<stack>')
    END
    call writefile(lines, 'Xstack')
    source Xstack
!   call assert_match('\<Xstack\[2\]', g:stack_value)
    call delete('Xstack')
  endfunc
  
*** ../vim-8.2.1652/src/version.c       2020-09-10 14:25:22.224537747 +0200
--- src/version.c       2020-09-10 19:24:11.140346957 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     1653,
  /**/

-- 
BEDEVERE:  Oooooh!
LAUNCELOT: No "Aaaaarrrrrrggghhh ... " at the back of the throat.
BEDEVERE:  No!  "Oooooh!" in surprise and alarm!
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202009101725.08AHPYab672172%40masaka.moolenaar.net.

Raspunde prin e-mail lui