patch 8.1.0362: cannot get the script line number when executing a function
Problem: Cannot get the script line number when executing a function.
Solution: Store the line number besides the script ID. (Ozaki Kiichi,
closes #3362) Also display the line number with ":verbose set".
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 08eb181..28245d1 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1866,9 +1866,9 @@
{
scriptitem_T *si;
- if (current_SID > 0 && current_SID <= script_items.ga_len)
+ if (current_sctx.sc_sid > 0 && current_sctx.sc_sid <= script_items.ga_len)
{
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && si->sn_pr_nest++ == 0)
profile_start(&si->sn_pr_child);
}
@@ -1883,9 +1883,9 @@
{
scriptitem_T *si;
- if (current_SID > 0 && current_SID <= script_items.ga_len)
+ if (current_sctx.sc_sid > 0 && current_sctx.sc_sid <= script_items.ga_len)
{
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && --si->sn_pr_nest == 0)
{
profile_end(&si->sn_pr_child);
@@ -2003,8 +2003,8 @@
int
prof_def_func(void)
{
- if (current_SID > 0)
- return SCRIPT_ITEM(current_SID).sn_pr_force;
+ if (current_sctx.sc_sid > 0)
+ return SCRIPT_ITEM(current_sctx.sc_sid).sn_pr_force;
return FALSE;
}
@@ -4351,7 +4351,7 @@
char_u *firstline = NULL;
int retval = FAIL;
#ifdef FEAT_EVAL
- scid_T save_current_SID;
+ sctx_T save_current_sctx;
static scid_T last_current_SID = 0;
void *save_funccalp;
int save_debug_break_level = debug_break_level;
@@ -4521,13 +4521,15 @@
* Check if this script was sourced before to finds its SID.
* If it's new, generate a new SID.
*/
- save_current_SID = current_SID;
+ save_current_sctx = current_sctx;
+ current_sctx.sc_lnum = 0;
# ifdef UNIX
stat_ok = (mch_stat((char *)fname_exp, &st) >= 0);
# endif
- for (current_SID = script_items.ga_len; current_SID > 0; --current_SID)
+ for (current_sctx.sc_sid = script_items.ga_len; current_sctx.sc_sid > 0;
+ --current_sctx.sc_sid)
{
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_name != NULL
&& (
# ifdef UNIX
@@ -4541,13 +4543,13 @@
fnamecmp(si->sn_name, fname_exp) == 0))
break;
}
- if (current_SID == 0)
+ if (current_sctx.sc_sid == 0)
{
- current_SID = ++last_current_SID;
- if (ga_grow(&script_items, (int)(current_SID - script_items.ga_len))
- == FAIL)
+ current_sctx.sc_sid = ++last_current_SID;
+ if (ga_grow(&script_items,
+ (int)(current_sctx.sc_sid - script_items.ga_len)) == FAIL)
goto almosttheend;
- while (script_items.ga_len < current_SID)
+ while (script_items.ga_len < current_sctx.sc_sid)
{
++script_items.ga_len;
SCRIPT_ITEM(script_items.ga_len).sn_name = NULL;
@@ -4555,7 +4557,7 @@
SCRIPT_ITEM(script_items.ga_len).sn_prof_on = FALSE;
# endif
}
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
si->sn_name = fname_exp;
fname_exp = NULL;
# ifdef UNIX
@@ -4570,7 +4572,7 @@
# endif
/* Allocate the local script variables to use for this script. */
- new_script_vars(current_SID);
+ new_script_vars(current_sctx.sc_sid);
}
# ifdef FEAT_PROFILE
@@ -4626,7 +4628,7 @@
if (do_profiling == PROF_YES)
{
/* Get "si" again, "script_items" may have been reallocated. */
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on)
{
profile_end(&si->sn_pr_start);
@@ -4671,7 +4673,7 @@
#ifdef FEAT_EVAL
almosttheend:
- current_SID = save_current_SID;
+ current_sctx = save_current_sctx;
restore_funccal(save_funccalp);
# ifdef FEAT_PROFILE
if (do_profiling == PROF_YES)
@@ -5090,9 +5092,9 @@
scriptitem_T *si;
sn_prl_T *pp;
- if (current_SID <= 0 || current_SID > script_items.ga_len)
+ if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len)
return;
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && sourcing_lnum >= 1)
{
/* Grow the array before starting the timer, so that the time spent
@@ -5125,9 +5127,9 @@
{
scriptitem_T *si;
- if (current_SID <= 0 || current_SID > script_items.ga_len)
+ if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len)
return;
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && si->sn_prl_idx >= 0)
si->sn_prl_execed = TRUE;
}
@@ -5141,9 +5143,9 @@
scriptitem_T *si;
sn_prl_T *pp;
- if (current_SID <= 0 || current_SID > script_items.ga_len)
+ if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len)
return;
- si = &SCRIPT_ITEM(current_SID);
+ si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_prof_on && si->sn_prl_idx >= 0
&& si->sn_prl_idx < si->sn_prl_ga.ga_len)
{