mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-03-27 14:45:13 +08:00
Miscellaneous optimizations to reduce string copying
This commit is contained in:
parent
cb6be2a50d
commit
b34721b3f4
@ -4460,7 +4460,7 @@ void builtin_get_names(std::vector<completion_t> &list)
|
|||||||
{
|
{
|
||||||
for (size_t i=0; i < BUILTIN_COUNT; i++)
|
for (size_t i=0; i < BUILTIN_COUNT; i++)
|
||||||
{
|
{
|
||||||
list.push_back(completion_t(builtin_datas[i].name));
|
append_completion(list, builtin_datas[i].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
complete.cpp
10
complete.cpp
@ -466,7 +466,13 @@ void completion_autoload_t::command_removed(const wcstring &cmd)
|
|||||||
/** Create a new completion entry */
|
/** Create a new completion entry */
|
||||||
void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc, complete_flags_t flags, string_fuzzy_match_t match)
|
void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc, complete_flags_t flags, string_fuzzy_match_t match)
|
||||||
{
|
{
|
||||||
completions.push_back(completion_t(comp, desc, match, flags));
|
/* If we just constructed the completion and used push_back, we would get two string copies. Try to avoid that by making a stubby completion in the vector first, and then copying our string in. */
|
||||||
|
completions.push_back(completion_t(wcstring()));
|
||||||
|
completion_t *last = &completions.back();
|
||||||
|
last->completion = comp;
|
||||||
|
last->description = desc;
|
||||||
|
last->match = match;
|
||||||
|
last->flags = flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1191,7 +1197,7 @@ void completer_t::complete_cmd(const wcstring &str_cmd, bool use_function, bool
|
|||||||
wcstring_list_t names = function_get_names(str_cmd.at(0) == L'_');
|
wcstring_list_t names = function_get_names(str_cmd.at(0) == L'_');
|
||||||
for (size_t i=0; i < names.size(); i++)
|
for (size_t i=0; i < names.size(); i++)
|
||||||
{
|
{
|
||||||
possible_comp.push_back(completion_t(names.at(i)));
|
append_completion(possible_comp, names.at(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
this->complete_strings(str_cmd, 0, &complete_function_desc, possible_comp, 0);
|
this->complete_strings(str_cmd, 0, &complete_function_desc, possible_comp, 0);
|
||||||
|
@ -124,7 +124,7 @@ public:
|
|||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
/* Construction. Note: defining these so that they are not inlined reduces the executable size. */
|
/* Construction. Note: defining these so that they are not inlined reduces the executable size. */
|
||||||
completion_t(const wcstring &comp, const wcstring &desc = L"", string_fuzzy_match_t match = string_fuzzy_match_t(fuzzy_match_exact), int flags_val = 0);
|
completion_t(const wcstring &comp, const wcstring &desc = wcstring(), string_fuzzy_match_t match = string_fuzzy_match_t(fuzzy_match_exact), int flags_val = 0);
|
||||||
completion_t(const completion_t &);
|
completion_t(const completion_t &);
|
||||||
completion_t &operator=(const completion_t &);
|
completion_t &operator=(const completion_t &);
|
||||||
|
|
||||||
@ -268,7 +268,7 @@ void complete_load(const wcstring &cmd, bool reload);
|
|||||||
\param flags completion flags
|
\param flags completion flags
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc = L"", int flags = 0, string_fuzzy_match_t match = string_fuzzy_match_t(fuzzy_match_exact));
|
void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc = wcstring(), int flags = 0, string_fuzzy_match_t match = string_fuzzy_match_t(fuzzy_match_exact));
|
||||||
|
|
||||||
/* Function used for testing */
|
/* Function used for testing */
|
||||||
void complete_set_variable_names(const wcstring_list_t *names);
|
void complete_set_variable_names(const wcstring_list_t *names);
|
||||||
|
1
env.cpp
1
env.cpp
@ -892,6 +892,7 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode)
|
|||||||
if (!is_universal)
|
if (!is_universal)
|
||||||
{
|
{
|
||||||
event_t ev = event_t::variable_event(key);
|
event_t ev = event_t::variable_event(key);
|
||||||
|
ev.arguments.reserve(3);
|
||||||
ev.arguments.push_back(L"VARIABLE");
|
ev.arguments.push_back(L"VARIABLE");
|
||||||
ev.arguments.push_back(L"SET");
|
ev.arguments.push_back(L"SET");
|
||||||
ev.arguments.push_back(key);
|
ev.arguments.push_back(key);
|
||||||
|
54
expand.cpp
54
expand.cpp
@ -785,7 +785,15 @@ static int expand_pid(const wcstring &instr_with_sep,
|
|||||||
expand_flags_t flags,
|
expand_flags_t flags,
|
||||||
std::vector<completion_t> &out)
|
std::vector<completion_t> &out)
|
||||||
{
|
{
|
||||||
|
/* Hack. If there's no INTERNAL_SEP and no PROCESS_EXPAND, then there's nothing to do. Check out this "null terminated string." */
|
||||||
|
const wchar_t some_chars[] = {INTERNAL_SEPARATOR, PROCESS_EXPAND, L'\0'};
|
||||||
|
if (instr_with_sep.find_first_of(some_chars) == wcstring::npos)
|
||||||
|
{
|
||||||
|
/* Nothing to do */
|
||||||
|
append_completion(out, instr_with_sep);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* expand_string calls us with internal separators in instr...sigh */
|
/* expand_string calls us with internal separators in instr...sigh */
|
||||||
wcstring instr = instr_with_sep;
|
wcstring instr = instr_with_sep;
|
||||||
remove_internal_separator(instr, false);
|
remove_internal_separator(instr, false);
|
||||||
@ -1372,7 +1380,7 @@ static int expand_brackets(parser_t &parser, const wcstring &instr, int flags, s
|
|||||||
/**
|
/**
|
||||||
Perform cmdsubst expansion
|
Perform cmdsubst expansion
|
||||||
*/
|
*/
|
||||||
static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector<completion_t> &outList)
|
static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector<completion_t> &out_list)
|
||||||
{
|
{
|
||||||
wchar_t *paran_begin=0, *paran_end=0;
|
wchar_t *paran_begin=0, *paran_end=0;
|
||||||
std::vector<wcstring> sub_res;
|
std::vector<wcstring> sub_res;
|
||||||
@ -1390,7 +1398,7 @@ static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector<
|
|||||||
L"Mismatched parenthesis");
|
L"Mismatched parenthesis");
|
||||||
return 0;
|
return 0;
|
||||||
case 0:
|
case 0:
|
||||||
outList.push_back(completion_t(input));
|
append_completion(out_list, input);
|
||||||
return 1;
|
return 1;
|
||||||
case 1:
|
case 1:
|
||||||
|
|
||||||
@ -1455,15 +1463,15 @@ static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector<
|
|||||||
*/
|
*/
|
||||||
for (i=0; i<sub_res.size(); i++)
|
for (i=0; i<sub_res.size(); i++)
|
||||||
{
|
{
|
||||||
wcstring sub_item = sub_res.at(i);
|
const wcstring &sub_item = sub_res.at(i);
|
||||||
wcstring sub_item2 = escape_string(sub_item, 1);
|
const wcstring sub_item2 = escape_string(sub_item, 1);
|
||||||
|
|
||||||
|
wcstring whole_item;
|
||||||
|
|
||||||
for (j=0; j < tail_expand.size(); j++)
|
for (j=0; j < tail_expand.size(); j++)
|
||||||
{
|
{
|
||||||
|
whole_item.clear();
|
||||||
wcstring whole_item;
|
const wcstring &tail_item = tail_expand.at(j).completion;
|
||||||
|
|
||||||
wcstring tail_item = tail_expand.at(j).completion;
|
|
||||||
|
|
||||||
//sb_append_substring( &whole_item, in, len1 );
|
//sb_append_substring( &whole_item, in, len1 );
|
||||||
whole_item.append(in, paran_begin-in);
|
whole_item.append(in, paran_begin-in);
|
||||||
@ -1481,7 +1489,7 @@ static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector<
|
|||||||
whole_item.append(tail_item);
|
whole_item.append(tail_item);
|
||||||
|
|
||||||
//al_push( out, whole_item.buff );
|
//al_push( out, whole_item.buff );
|
||||||
outList.push_back(completion_t(whole_item));
|
append_completion(out_list, whole_item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1665,7 +1673,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
|
|
||||||
if ((!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean(input.c_str()))
|
if ((!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean(input.c_str()))
|
||||||
{
|
{
|
||||||
output.push_back(completion_t(input));
|
append_completion(output, input);
|
||||||
return EXPAND_OK;
|
return EXPAND_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1681,7 +1689,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
parser.error(CMDSUBST_ERROR, -1, L"Command substitutions not allowed");
|
parser.error(CMDSUBST_ERROR, -1, L"Command substitutions not allowed");
|
||||||
return EXPAND_ERROR;
|
return EXPAND_ERROR;
|
||||||
}
|
}
|
||||||
in->push_back(completion_t(input));
|
append_completion(*in, input);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1709,7 +1717,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
next[i] = L'$';
|
next[i] = L'$';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out->push_back(completion_t(next));
|
append_completion(*out, next);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1725,7 +1733,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
|
|
||||||
for (i=0; i < in->size(); i++)
|
for (i=0; i < in->size(); i++)
|
||||||
{
|
{
|
||||||
wcstring next = in->at(i).completion;
|
const wcstring &next = in->at(i).completion;
|
||||||
|
|
||||||
if (!expand_brackets(parser, next, flags, *out))
|
if (!expand_brackets(parser, next, flags, *out))
|
||||||
{
|
{
|
||||||
@ -1745,7 +1753,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
|
|
||||||
if (flags & ACCEPT_INCOMPLETE)
|
if (flags & ACCEPT_INCOMPLETE)
|
||||||
{
|
{
|
||||||
if (next[0] == PROCESS_EXPAND)
|
if (! next.empty() && next.at(0) == PROCESS_EXPAND)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
If process expansion matches, we are not
|
If process expansion matches, we are not
|
||||||
@ -1758,7 +1766,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out->push_back(completion_t(next));
|
append_completion(*out, next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1840,7 +1848,7 @@ int expand_string(const wcstring &input, std::vector<completion_t> &output, expa
|
|||||||
{
|
{
|
||||||
if (!(flags & ACCEPT_INCOMPLETE))
|
if (!(flags & ACCEPT_INCOMPLETE))
|
||||||
{
|
{
|
||||||
out->push_back(completion_t(next_str));
|
append_completion(*out, next_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1970,19 +1978,19 @@ bool fish_openSUSE_dbus_hack_hack_hack_hack(std::vector<completion_t> *args)
|
|||||||
val.resize(last_good + 1);
|
val.resize(last_good + 1);
|
||||||
|
|
||||||
args->clear();
|
args->clear();
|
||||||
args->push_back(completion_t(L"set"));
|
append_completion(*args, L"set");
|
||||||
if (key == L"DBUS_SESSION_BUS_ADDRESS")
|
if (key == L"DBUS_SESSION_BUS_ADDRESS")
|
||||||
args->push_back(completion_t(L"-x"));
|
append_completion(*args, L"-x");
|
||||||
args->push_back(completion_t(key));
|
append_completion(*args, key);
|
||||||
args->push_back(completion_t(val));
|
append_completion(*args, val);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
else if (string_prefixes_string(L"export DBUS_SESSION_BUS_ADDRESS;", cmd))
|
else if (string_prefixes_string(L"export DBUS_SESSION_BUS_ADDRESS;", cmd))
|
||||||
{
|
{
|
||||||
/* Nothing, we already exported it */
|
/* Nothing, we already exported it */
|
||||||
args->clear();
|
args->clear();
|
||||||
args->push_back(completion_t(L"echo"));
|
append_completion(*args, L"echo");
|
||||||
args->push_back(completion_t(L"-n"));
|
append_completion(*args, L"-n");
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -805,11 +805,11 @@ parse_execution_result_t parse_execution_context_t::populate_plain_process(job_t
|
|||||||
return parse_execution_errored;
|
return parse_execution_errored;
|
||||||
}
|
}
|
||||||
|
|
||||||
wcstring actual_cmd;
|
wcstring path_to_external_command;
|
||||||
if (process_type == EXTERNAL)
|
if (process_type == EXTERNAL)
|
||||||
{
|
{
|
||||||
/* Determine the actual command. This may be an implicit cd. */
|
/* Determine the actual command. This may be an implicit cd. */
|
||||||
bool has_command = path_get_path(cmd, &actual_cmd);
|
bool has_command = path_get_path(cmd, &path_to_external_command);
|
||||||
|
|
||||||
/* If there was no command, then we care about the value of errno after checking for it, to distinguish between e.g. no file vs permissions problem */
|
/* If there was no command, then we care about the value of errno after checking for it, to distinguish between e.g. no file vs permissions problem */
|
||||||
const int no_cmd_err_code = errno;
|
const int no_cmd_err_code = errno;
|
||||||
@ -843,7 +843,7 @@ parse_execution_result_t parse_execution_context_t::populate_plain_process(job_t
|
|||||||
/* Implicit cd is simple */
|
/* Implicit cd is simple */
|
||||||
argument_list.push_back(L"cd");
|
argument_list.push_back(L"cd");
|
||||||
argument_list.push_back(cmd);
|
argument_list.push_back(cmd);
|
||||||
actual_cmd.clear();
|
path_to_external_command.clear();
|
||||||
|
|
||||||
/* If we have defined a wrapper around cd, use it, otherwise use the cd builtin */
|
/* If we have defined a wrapper around cd, use it, otherwise use the cd builtin */
|
||||||
process_type = function_exists(L"cd") ? INTERNAL_FUNCTION : INTERNAL_BUILTIN;
|
process_type = function_exists(L"cd") ? INTERNAL_FUNCTION : INTERNAL_BUILTIN;
|
||||||
@ -878,7 +878,7 @@ parse_execution_result_t parse_execution_context_t::populate_plain_process(job_t
|
|||||||
proc->type = process_type;
|
proc->type = process_type;
|
||||||
proc->set_argv(argument_list);
|
proc->set_argv(argument_list);
|
||||||
proc->set_io_chain(process_io_chain);
|
proc->set_io_chain(process_io_chain);
|
||||||
proc->actual_cmd = actual_cmd;
|
proc->actual_cmd = path_to_external_command;
|
||||||
return parse_execution_success;
|
return parse_execution_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1939,7 +1939,7 @@ int parser_t::parse_job(process_t *p, job_t *j, tokenizer_t *tok)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
args.push_back(completion_t(nxt));
|
append_completion(args, nxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error_code == 0)
|
if (error_code == 0)
|
||||||
@ -1982,8 +1982,8 @@ int parser_t::parse_job(process_t *p, job_t *j, tokenizer_t *tok)
|
|||||||
if (use_implicit_cd)
|
if (use_implicit_cd)
|
||||||
{
|
{
|
||||||
args.clear();
|
args.clear();
|
||||||
args.push_back(completion_t(L"cd"));
|
append_completion(args, L"cd");
|
||||||
args.push_back(completion_t(implicit_cd_path));
|
append_completion(args, implicit_cd_path);
|
||||||
|
|
||||||
/* If we have defined a wrapper around cd, use it, otherwise use the cd builtin */
|
/* If we have defined a wrapper around cd, use it, otherwise use the cd builtin */
|
||||||
if (use_function && function_exists(L"cd"))
|
if (use_function && function_exists(L"cd"))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user