aboutsummaryrefslogtreecommitdiffhomepage
path: root/function.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/function.cpp b/function.cpp
index 08fb8556..11c23114 100644
--- a/function.cpp
+++ b/function.cpp
@@ -61,18 +61,12 @@ function_autoload_t::function_autoload_t() : autoload_t(L"fish_function_path", N
{
}
-/** Removes a function from our internal table, returning true if it was found and false if not */
-static bool function_remove_ignore_autoload(const wcstring &name);
-
/** Callback when an autoloaded function is removed */
void function_autoload_t::command_removed(const wcstring &cmd)
{
function_remove_ignore_autoload(cmd);
}
-/* Helper macro for vomiting */
-#define VOMIT_ON_FAILURE(a) do { if (0 != (a)) { int err = errno; fprintf(stderr, "%s failed on line %d in file %s: %d (%s)\n", #a, __LINE__, __FILE__, err, strerror(err)); abort(); }} while (0)
-
/**
Kludgy flag set by the load function in order to tell function_add
that the function being defined is autoloaded. There should be a
@@ -156,12 +150,23 @@ void function_init()
VOMIT_ON_FAILURE(pthread_mutexattr_destroy(&a));
}
+static std::map<wcstring,env_var_t> snapshot_vars(const wcstring_list_t &vars)
+{
+ std::map<wcstring,env_var_t> result;
+ for (wcstring_list_t::const_iterator it = vars.begin(), end = vars.end(); it != end; ++it)
+ {
+ result.insert(std::make_pair(*it, env_get_string(*it)));
+ }
+ return result;
+}
+
function_info_t::function_info_t(const function_data_t &data, const wchar_t *filename, int def_offset, bool autoload) :
definition(data.definition),
description(data.description),
definition_file(intern(filename)),
definition_offset(def_offset),
named_arguments(data.named_arguments),
+ inherit_vars(snapshot_vars(data.inherit_vars)),
is_autoload(autoload),
shadows(data.shadows)
{
@@ -173,12 +178,13 @@ function_info_t::function_info_t(const function_info_t &data, const wchar_t *fil
definition_file(intern(filename)),
definition_offset(def_offset),
named_arguments(data.named_arguments),
+ inherit_vars(data.inherit_vars),
is_autoload(autoload),
shadows(data.shadows)
{
}
-void function_add(const function_data_t &data, const parser_t &parser)
+void function_add(const function_data_t &data, const parser_t &parser, int definition_line_offset)
{
ASSERT_IS_MAIN_THREAD();
@@ -189,11 +195,10 @@ void function_add(const function_data_t &data, const parser_t &parser)
/* Remove the old function */
function_remove(data.name);
-
/* Create and store a new function */
const wchar_t *filename = reader_current_filename();
- int def_offset = parser.line_number_of_character_at_offset(parser.current_block->tok_pos) - 1;
- const function_map_t::value_type new_pair(data.name, function_info_t(data, filename, def_offset, is_autoload));
+
+ const function_map_t::value_type new_pair(data.name, function_info_t(data, filename, definition_line_offset, is_autoload));
loaded_functions.insert(new_pair);
/* Add event handlers */
@@ -220,7 +225,7 @@ int function_exists_no_autoload(const wcstring &cmd, const env_vars_snapshot_t &
return loaded_functions.find(cmd) != loaded_functions.end() || function_autoloader.can_load(cmd, vars);
}
-static bool function_remove_ignore_autoload(const wcstring &name)
+bool function_remove_ignore_autoload(const wcstring &name)
{
scoped_lock lock(functions_lock);
bool erased = (loaded_functions.erase(name) > 0);
@@ -275,6 +280,13 @@ wcstring_list_t function_get_named_arguments(const wcstring &name)
return func ? func->named_arguments : wcstring_list_t();
}
+std::map<wcstring,env_var_t> function_get_inherit_vars(const wcstring &name)
+{
+ scoped_lock lock(functions_lock);
+ const function_info_t *func = function_get(name);
+ return func ? func->inherit_vars : std::map<wcstring,env_var_t>();
+}
+
int function_get_shadows(const wcstring &name)
{
scoped_lock lock(functions_lock);