forked from aniani/vim
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".
This commit is contained in:
@@ -1866,9 +1866,9 @@ script_prof_save(
|
||||
{
|
||||
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 @@ script_prof_restore(proftime_T *tm)
|
||||
{
|
||||
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 @@ script_dump_profile(FILE *fd)
|
||||
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 @@ do_source(
|
||||
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 @@ do_source(
|
||||
* 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 @@ do_source(
|
||||
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 @@ do_source(
|
||||
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 @@ do_source(
|
||||
# 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 @@ do_source(
|
||||
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 @@ do_source(
|
||||
|
||||
#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 @@ script_line_start(void)
|
||||
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 @@ script_line_exec(void)
|
||||
{
|
||||
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 @@ script_line_end(void)
|
||||
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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user