aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/env.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-10-23 15:15:39 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-10-23 15:15:39 -0700
commitd5f3a09ce932779346d521afe1ba0ffdcb1cbfa9 (patch)
tree6ba863d5eba6c7b02e505e3d7b30ec21a13f88db /src/env.cpp
parent036a29acf5d5184a4850475a1ae2f9512058744a (diff)
Make 'set -ql' search up to function scope
Previously 'set -ql' would only look for variables in the immediate local scope. This was not very useful. It's also arguably surprising, since a 'set -l' in a function, followed by a 'set -ql' in a child block, would fail. There was also no way to check for a function-scoped variable, since omitting the scope would also pull in global variables. We could revisit this and introduce an explicit function scope. Fixes #2502
Diffstat (limited to 'src/env.cpp')
-rw-r--r--src/env.cpp37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/env.cpp b/src/env.cpp
index 4f2004e2..3c73fb07 100644
--- a/src/env.cpp
+++ b/src/env.cpp
@@ -93,7 +93,8 @@ struct env_node_t
const var_entry_t *find_entry(const wcstring &key);
/* Returns the next scope to search in order, respecting the new_scope flag, or NULL if we're done. */
- env_node_t *next_scope_to_search(void);
+ env_node_t *next_scope_to_search();
+ const env_node_t *next_scope_to_search() const;
};
class variable_entry_t
@@ -195,11 +196,17 @@ const var_entry_t *env_node_t::find_entry(const wcstring &key)
return result;
}
-env_node_t *env_node_t::next_scope_to_search(void)
+env_node_t *env_node_t::next_scope_to_search()
{
return this->new_scope ? global_env : this->next;
}
+const env_node_t *env_node_t::next_scope_to_search() const
+{
+ return this->new_scope ? global_env : this->next;
+}
+
+
/**
Return the current umask value.
*/
@@ -1010,8 +1017,6 @@ env_var_t env_get_string(const wcstring &key, env_mode_flags_t mode)
bool env_exist(const wchar_t *key, env_mode_flags_t mode)
{
- env_node_t *env;
-
CHECK(key, false);
const bool has_scope = mode & (ENV_LOCAL | ENV_GLOBAL | ENV_UNIVERSAL);
@@ -1037,27 +1042,21 @@ bool env_exist(const wchar_t *key, env_mode_flags_t mode)
if (test_local || test_global)
{
- env = test_local ? top : global_env;
-
- while (env)
+ const env_node_t *env = test_local ? top : global_env;
+ while (env != NULL)
{
- var_table_t::iterator result = env->env.find(key);
-
+ if (env == global_env && ! test_global)
+ {
+ break;
+ }
+
+ var_table_t::const_iterator result = env->env.find(key);
if (result != env->env.end())
{
const var_entry_t &res = result->second;
return res.exportv ? test_exported : test_unexported;
}
-
- if (has_scope)
- {
- if (!test_global || env == global_env) break;
- env = global_env;
- }
- else
- {
- env = env->next_scope_to_search();
- }
+ env = env->next_scope_to_search();
}
}