diff options
Diffstat (limited to 'function.cpp')
-rw-r--r-- | function.cpp | 34 |
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); |