mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
refactor: move ga_loaded to runtime.c (#22626)
This commit is contained in:
parent
a1edbd3564
commit
402c31a82d
@ -114,9 +114,6 @@ bool *eval_lavars_used = NULL;
|
||||
|
||||
static int echo_attr = 0; // attributes used for ":echo"
|
||||
|
||||
// The names of packages that once were loaded are remembered.
|
||||
static garray_T ga_loaded = { 0, 0, sizeof(char *), 4, NULL };
|
||||
|
||||
/// Info used by a ":for" loop.
|
||||
typedef struct {
|
||||
int fi_semicolon; // true if ending in '; var]'
|
||||
@ -503,7 +500,7 @@ void eval_clear(void)
|
||||
# endif
|
||||
|
||||
// autoloaded script names
|
||||
ga_clear_strings(&ga_loaded);
|
||||
free_autoload_scriptnames();
|
||||
|
||||
// unreferenced lists and dicts
|
||||
(void)garbage_collect(false);
|
||||
@ -7530,80 +7527,6 @@ const char *find_option_end(const char **const arg, int *const scope)
|
||||
return p;
|
||||
}
|
||||
|
||||
/// Return the autoload script name for a function or variable name
|
||||
/// Caller must make sure that "name" contains AUTOLOAD_CHAR.
|
||||
///
|
||||
/// @param[in] name Variable/function name.
|
||||
/// @param[in] name_len Name length.
|
||||
///
|
||||
/// @return [allocated] autoload script name.
|
||||
char *autoload_name(const char *const name, const size_t name_len)
|
||||
FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
// Get the script file name: replace '#' with '/', append ".vim".
|
||||
char *const scriptname = xmalloc(name_len + sizeof("autoload/.vim"));
|
||||
memcpy(scriptname, "autoload/", sizeof("autoload/") - 1);
|
||||
memcpy(scriptname + sizeof("autoload/") - 1, name, name_len);
|
||||
size_t auchar_idx = 0;
|
||||
for (size_t i = sizeof("autoload/") - 1;
|
||||
i - sizeof("autoload/") + 1 < name_len;
|
||||
i++) {
|
||||
if (scriptname[i] == AUTOLOAD_CHAR) {
|
||||
scriptname[i] = '/';
|
||||
auchar_idx = i;
|
||||
}
|
||||
}
|
||||
memcpy(scriptname + auchar_idx, ".vim", sizeof(".vim"));
|
||||
|
||||
return scriptname;
|
||||
}
|
||||
|
||||
/// If name has a package name try autoloading the script for it
|
||||
///
|
||||
/// @param[in] name Variable/function name.
|
||||
/// @param[in] name_len Name length.
|
||||
/// @param[in] reload If true, load script again when already loaded.
|
||||
///
|
||||
/// @return true if a package was loaded.
|
||||
bool script_autoload(const char *const name, const size_t name_len, const bool reload)
|
||||
{
|
||||
// If there is no '#' after name[0] there is no package name.
|
||||
const char *p = memchr(name, AUTOLOAD_CHAR, name_len);
|
||||
if (p == NULL || p == name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = false;
|
||||
char *tofree = autoload_name(name, name_len);
|
||||
char *scriptname = tofree;
|
||||
|
||||
// Find the name in the list of previously loaded package names. Skip
|
||||
// "autoload/", it's always the same.
|
||||
int i = 0;
|
||||
for (; i < ga_loaded.ga_len; i++) {
|
||||
if (strcmp(((char **)ga_loaded.ga_data)[i] + 9, scriptname + 9) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!reload && i < ga_loaded.ga_len) {
|
||||
ret = false; // Was loaded already.
|
||||
} else {
|
||||
// Remember the name if it wasn't loaded already.
|
||||
if (i == ga_loaded.ga_len) {
|
||||
GA_APPEND(char *, &ga_loaded, scriptname);
|
||||
tofree = NULL;
|
||||
}
|
||||
|
||||
// Try loading the package from $VIMRUNTIME/autoload/<name>.vim
|
||||
if (source_runtime(scriptname, 0) == OK) {
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
|
||||
xfree(tofree);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static var_flavour_T var_flavour(char *varname)
|
||||
FUNC_ATTR_PURE
|
||||
{
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/buffer_defs.h"
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
#include "nvim/eval/typval_defs.h"
|
||||
#include "nvim/ex_eval.h"
|
||||
@ -38,6 +37,7 @@
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/pos.h"
|
||||
#include "nvim/regexp.h"
|
||||
#include "nvim/runtime.h"
|
||||
#include "nvim/types.h"
|
||||
#include "nvim/vim.h"
|
||||
|
||||
|
@ -75,6 +75,9 @@ struct source_cookie {
|
||||
garray_T exestack = { 0, 0, sizeof(estack_T), 50, NULL };
|
||||
garray_T script_items = { 0, 0, sizeof(scriptitem_T *), 20, NULL };
|
||||
|
||||
/// The names of packages that once were loaded are remembered.
|
||||
static garray_T ga_loaded = { 0, 0, sizeof(char *), 4, NULL };
|
||||
|
||||
/// Initialize the execution stack.
|
||||
void estack_init(void)
|
||||
{
|
||||
@ -2339,6 +2342,11 @@ void free_scriptnames(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void free_autoload_scriptnames(void)
|
||||
{
|
||||
ga_clear_strings(&ga_loaded);
|
||||
}
|
||||
|
||||
linenr_T get_sourced_lnum(LineGetter fgetline, void *cookie)
|
||||
FUNC_ATTR_PURE
|
||||
{
|
||||
@ -2630,3 +2638,77 @@ bool source_finished(LineGetter fgetline, void *cookie)
|
||||
return getline_equal(fgetline, cookie, getsourceline)
|
||||
&& ((struct source_cookie *)getline_cookie(fgetline, cookie))->finished;
|
||||
}
|
||||
|
||||
/// Return the autoload script name for a function or variable name
|
||||
/// Caller must make sure that "name" contains AUTOLOAD_CHAR.
|
||||
///
|
||||
/// @param[in] name Variable/function name.
|
||||
/// @param[in] name_len Name length.
|
||||
///
|
||||
/// @return [allocated] autoload script name.
|
||||
char *autoload_name(const char *const name, const size_t name_len)
|
||||
FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
// Get the script file name: replace '#' with '/', append ".vim".
|
||||
char *const scriptname = xmalloc(name_len + sizeof("autoload/.vim"));
|
||||
memcpy(scriptname, "autoload/", sizeof("autoload/") - 1);
|
||||
memcpy(scriptname + sizeof("autoload/") - 1, name, name_len);
|
||||
size_t auchar_idx = 0;
|
||||
for (size_t i = sizeof("autoload/") - 1;
|
||||
i - sizeof("autoload/") + 1 < name_len;
|
||||
i++) {
|
||||
if (scriptname[i] == AUTOLOAD_CHAR) {
|
||||
scriptname[i] = '/';
|
||||
auchar_idx = i;
|
||||
}
|
||||
}
|
||||
memcpy(scriptname + auchar_idx, ".vim", sizeof(".vim"));
|
||||
|
||||
return scriptname;
|
||||
}
|
||||
|
||||
/// If name has a package name try autoloading the script for it
|
||||
///
|
||||
/// @param[in] name Variable/function name.
|
||||
/// @param[in] name_len Name length.
|
||||
/// @param[in] reload If true, load script again when already loaded.
|
||||
///
|
||||
/// @return true if a package was loaded.
|
||||
bool script_autoload(const char *const name, const size_t name_len, const bool reload)
|
||||
{
|
||||
// If there is no '#' after name[0] there is no package name.
|
||||
const char *p = memchr(name, AUTOLOAD_CHAR, name_len);
|
||||
if (p == NULL || p == name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = false;
|
||||
char *tofree = autoload_name(name, name_len);
|
||||
char *scriptname = tofree;
|
||||
|
||||
// Find the name in the list of previously loaded package names. Skip
|
||||
// "autoload/", it's always the same.
|
||||
int i = 0;
|
||||
for (; i < ga_loaded.ga_len; i++) {
|
||||
if (strcmp(((char **)ga_loaded.ga_data)[i] + 9, scriptname + 9) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!reload && i < ga_loaded.ga_len) {
|
||||
ret = false; // Was loaded already.
|
||||
} else {
|
||||
// Remember the name if it wasn't loaded already.
|
||||
if (i == ga_loaded.ga_len) {
|
||||
GA_APPEND(char *, &ga_loaded, scriptname);
|
||||
tofree = NULL;
|
||||
}
|
||||
|
||||
// Try loading the package from $VIMRUNTIME/autoload/<name>.vim
|
||||
if (source_runtime(scriptname, 0) == OK) {
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
|
||||
xfree(tofree);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user