Parcourir la source

Shell: Make Node::resolve_as_list(nullptr) resolve to a 'pure' repr

'pure' as in "not requiring a shell", similar to
JS::Value::to_string_without_side_effects().
AnotherTest il y a 4 ans
Parent
commit
afe0ae586c
1 fichiers modifiés avec 15 ajouts et 0 suppressions
  1. 15 0
      Shell/AST.cpp

+ 15 - 0
Shell/AST.cpp

@@ -2316,6 +2316,9 @@ GlobValue::~GlobValue()
 }
 }
 Vector<String> GlobValue::resolve_as_list(RefPtr<Shell> shell)
 Vector<String> GlobValue::resolve_as_list(RefPtr<Shell> shell)
 {
 {
+    if (!shell)
+        return { m_glob };
+
     return shell->expand_globs(m_glob, shell->cwd);
     return shell->expand_globs(m_glob, shell->cwd);
 }
 }
 
 
@@ -2324,6 +2327,9 @@ SimpleVariableValue::~SimpleVariableValue()
 }
 }
 Vector<String> SimpleVariableValue::resolve_as_list(RefPtr<Shell> shell)
 Vector<String> SimpleVariableValue::resolve_as_list(RefPtr<Shell> shell)
 {
 {
+    if (!shell)
+        return {};
+
     if (auto value = resolve_without_cast(shell); value != this)
     if (auto value = resolve_without_cast(shell); value != this)
         return value->resolve_as_list(shell);
         return value->resolve_as_list(shell);
 
 
@@ -2341,6 +2347,8 @@ Vector<String> SimpleVariableValue::resolve_as_list(RefPtr<Shell> shell)
 
 
 NonnullRefPtr<Value> SimpleVariableValue::resolve_without_cast(RefPtr<Shell> shell)
 NonnullRefPtr<Value> SimpleVariableValue::resolve_without_cast(RefPtr<Shell> shell)
 {
 {
+    ASSERT(shell);
+
     if (auto value = shell->lookup_local_variable(m_name))
     if (auto value = shell->lookup_local_variable(m_name))
         return value.release_nonnull();
         return value.release_nonnull();
     return *this;
     return *this;
@@ -2352,6 +2360,9 @@ SpecialVariableValue::~SpecialVariableValue()
 
 
 Vector<String> SpecialVariableValue::resolve_as_list(RefPtr<Shell> shell)
 Vector<String> SpecialVariableValue::resolve_as_list(RefPtr<Shell> shell)
 {
 {
+    if (!shell)
+        return {};
+
     switch (m_name) {
     switch (m_name) {
     case '?':
     case '?':
         return { String::number(shell->last_return_code) };
         return { String::number(shell->last_return_code) };
@@ -2383,6 +2394,10 @@ Vector<String> TildeValue::resolve_as_list(RefPtr<Shell> shell)
     StringBuilder builder;
     StringBuilder builder;
     builder.append("~");
     builder.append("~");
     builder.append(m_username);
     builder.append(m_username);
+
+    if (!shell)
+        return { builder.to_string() };
+
     return { shell->expand_tilde(builder.to_string()) };
     return { shell->expand_tilde(builder.to_string()) };
 }
 }