mirror of
https://github.com/neovim/neovim.git
synced 2025-10-01 23:48:32 +00:00
vim-patch:8.2.0154: reallocating the list of scripts is inefficient
Problem: Reallocating the list of scripts is inefficient.
Solution: Instead of using a growarray of scriptitem_T, store pointers and
allocate each scriptitem_T separately. Also avoids that the
growarray pointers change when sourcing a new script.
21b9e9773d
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
@@ -232,7 +232,7 @@ void profile_reset(void)
|
||||
{
|
||||
// Reset sourced files.
|
||||
for (int id = 1; id <= script_items.ga_len; id++) {
|
||||
scriptitem_T *si = &SCRIPT_ITEM(id);
|
||||
scriptitem_T *si = SCRIPT_ITEM(id);
|
||||
if (si->sn_prof_on) {
|
||||
si->sn_prof_on = false;
|
||||
si->sn_pr_force = false;
|
||||
@@ -407,7 +407,7 @@ bool prof_def_func(void)
|
||||
FUNC_ATTR_PURE
|
||||
{
|
||||
if (current_sctx.sc_sid > 0) {
|
||||
return SCRIPT_ITEM(current_sctx.sc_sid).sn_pr_force;
|
||||
return SCRIPT_ITEM(current_sctx.sc_sid)->sn_pr_force;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -690,7 +690,7 @@ void profile_init(scriptitem_T *si)
|
||||
void script_prof_save(proftime_T *tm)
|
||||
{
|
||||
if (current_sctx.sc_sid > 0 && current_sctx.sc_sid <= script_items.ga_len) {
|
||||
scriptitem_T *si = &SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
if (si->sn_prof_on && si->sn_pr_nest++ == 0) {
|
||||
si->sn_pr_child = profile_start();
|
||||
}
|
||||
@@ -705,7 +705,7 @@ void script_prof_restore(const proftime_T *tm)
|
||||
return;
|
||||
}
|
||||
|
||||
scriptitem_T *si = &SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
if (si->sn_prof_on && --si->sn_pr_nest == 0) {
|
||||
si->sn_pr_child = profile_end(si->sn_pr_child);
|
||||
// don't count wait time
|
||||
@@ -722,7 +722,7 @@ static void script_dump_profile(FILE *fd)
|
||||
sn_prl_T *pp;
|
||||
|
||||
for (int id = 1; id <= script_items.ga_len; id++) {
|
||||
scriptitem_T *si = &SCRIPT_ITEM(id);
|
||||
scriptitem_T *si = SCRIPT_ITEM(id);
|
||||
if (si->sn_prof_on) {
|
||||
fprintf(fd, "SCRIPT %s\n", si->sn_name);
|
||||
if (si->sn_pr_count == 1) {
|
||||
@@ -804,12 +804,10 @@ void profile_dump(void)
|
||||
/// until later and we need to store the time now.
|
||||
void script_line_start(void)
|
||||
{
|
||||
scriptitem_T *si;
|
||||
|
||||
if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len) {
|
||||
return;
|
||||
}
|
||||
si = &SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
scriptitem_T *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
|
||||
// here isn't counted.
|
||||
@@ -834,12 +832,10 @@ void script_line_start(void)
|
||||
/// Called when actually executing a function line.
|
||||
void script_line_exec(void)
|
||||
{
|
||||
scriptitem_T *si;
|
||||
|
||||
if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len) {
|
||||
return;
|
||||
}
|
||||
si = &SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
if (si->sn_prof_on && si->sn_prl_idx >= 0) {
|
||||
si->sn_prl_execed = true;
|
||||
}
|
||||
@@ -848,12 +844,10 @@ void script_line_exec(void)
|
||||
/// Called when done with a function line.
|
||||
void script_line_end(void)
|
||||
{
|
||||
scriptitem_T *si;
|
||||
|
||||
if (current_sctx.sc_sid <= 0 || current_sctx.sc_sid > script_items.ga_len) {
|
||||
return;
|
||||
}
|
||||
si = &SCRIPT_ITEM(current_sctx.sc_sid);
|
||||
scriptitem_T *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) {
|
||||
if (si->sn_prl_execed) {
|
||||
|
Reference in New Issue
Block a user