mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-23 03:03:57 +08:00
Cache if tracing is enabled
Like the comment said: That var lookup was kind of expensive. So we simply use variable dispatch like we do for countless other things.
This commit is contained in:
parent
e89bd95d58
commit
5c6c405b9e
|
@ -53,6 +53,7 @@
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "termsize.h"
|
#include "termsize.h"
|
||||||
|
#include "trace.h"
|
||||||
#include "wutil.h" // IWYU pragma: keep
|
#include "wutil.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#define DEFAULT_TERM1 "ansi"
|
#define DEFAULT_TERM1 "ansi"
|
||||||
|
@ -311,6 +312,10 @@ static void handle_read_limit_change(const environment_t &vars) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_fish_trace(const environment_t &vars) {
|
||||||
|
trace_set_enabled(!vars.get(L"fish_trace").missing_or_empty());
|
||||||
|
}
|
||||||
|
|
||||||
/// Populate the dispatch table used by `env_dispatch_var_change()` to efficiently call the
|
/// Populate the dispatch table used by `env_dispatch_var_change()` to efficiently call the
|
||||||
/// appropriate function to handle a change to a variable.
|
/// appropriate function to handle a change to a variable.
|
||||||
/// Note this returns a new-allocated value that we expect to leak.
|
/// Note this returns a new-allocated value that we expect to leak.
|
||||||
|
@ -337,6 +342,7 @@ static std::unique_ptr<const var_dispatch_table_t> create_dispatch_table() {
|
||||||
var_dispatch_table->add(L"fish_history", handle_fish_history_change);
|
var_dispatch_table->add(L"fish_history", handle_fish_history_change);
|
||||||
var_dispatch_table->add(L"TZ", handle_tz_change);
|
var_dispatch_table->add(L"TZ", handle_tz_change);
|
||||||
var_dispatch_table->add(L"fish_use_posix_spawn", handle_fish_use_posix_spawn_change);
|
var_dispatch_table->add(L"fish_use_posix_spawn", handle_fish_use_posix_spawn_change);
|
||||||
|
var_dispatch_table->add(L"fish_trace", handle_fish_trace);
|
||||||
|
|
||||||
// This std::move is required to avoid a build error on old versions of libc++ (#5801),
|
// This std::move is required to avoid a build error on old versions of libc++ (#5801),
|
||||||
// but it causes a different warning under newer versions of GCC (observed under GCC 9.3.0,
|
// but it causes a different warning under newer versions of GCC (observed under GCC 9.3.0,
|
||||||
|
@ -359,6 +365,7 @@ static void run_inits(const environment_t &vars) {
|
||||||
update_wait_on_escape_ms(vars);
|
update_wait_on_escape_ms(vars);
|
||||||
handle_read_limit_change(vars);
|
handle_read_limit_change(vars);
|
||||||
handle_fish_use_posix_spawn_change(vars);
|
handle_fish_use_posix_spawn_change(vars);
|
||||||
|
handle_fish_trace(vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates our idea of whether we support term256 and term24bit (see issue #10222).
|
/// Updates our idea of whether we support term256 and term24bit (see issue #10222).
|
||||||
|
|
|
@ -6,13 +6,16 @@
|
||||||
#include "flog.h"
|
#include "flog.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
static const wcstring VAR_fish_trace = L"fish_trace";
|
static bool do_trace = false;
|
||||||
|
|
||||||
|
void trace_set_enabled(bool do_enable) {
|
||||||
|
do_trace = do_enable;
|
||||||
|
}
|
||||||
|
|
||||||
bool trace_enabled(const parser_t &parser) {
|
bool trace_enabled(const parser_t &parser) {
|
||||||
const auto &ld = parser.libdata();
|
const auto &ld = parser.libdata();
|
||||||
if (ld.suppress_fish_trace) return false;
|
if (ld.suppress_fish_trace) return false;
|
||||||
// TODO: this variable lookup is somewhat expensive, consider how to make this cheaper.
|
return do_trace;
|
||||||
return !parser.vars().get(VAR_fish_trace).missing_or_empty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trace an "argv": a list of arguments where the first is the command.
|
/// Trace an "argv": a list of arguments where the first is the command.
|
||||||
|
|
|
@ -16,6 +16,9 @@ void trace_argv(const parser_t &parser, const wchar_t *command, const wcstring_l
|
||||||
/// \return whether tracing is enabled.
|
/// \return whether tracing is enabled.
|
||||||
bool trace_enabled(const parser_t &parser);
|
bool trace_enabled(const parser_t &parser);
|
||||||
|
|
||||||
|
/// Enable or disable tracing.
|
||||||
|
void trace_set_enabled(bool do_enable);
|
||||||
|
|
||||||
/// Convenience helper to trace a single string if tracing is enabled.
|
/// Convenience helper to trace a single string if tracing is enabled.
|
||||||
void trace_if_enabled(const parser_t &parser, const wchar_t *command,
|
void trace_if_enabled(const parser_t &parser, const wchar_t *command,
|
||||||
const wcstring_list_t &argv = {});
|
const wcstring_list_t &argv = {});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user