浏览代码

Shell: Allow builtins and functions as conditions for 'if'

AnotherTest 4 年之前
父节点
当前提交
cd0ddf27f3
共有 2 个文件被更改,包括 12 次插入13 次删除
  1. 8 8
      Shell/AST.cpp
  2. 4 5
      Shell/Shell.cpp

+ 8 - 8
Shell/AST.cpp

@@ -1209,16 +1209,16 @@ void IfCond::dump(int level) const
 RefPtr<Value> IfCond::run(RefPtr<Shell> shell)
 {
     auto cond = m_condition->run(shell)->resolve_without_cast(shell);
-    ASSERT(cond->is_job());
+    // The condition could be a builtin, in which case it has already run and exited.
+    if (cond && cond->is_job()) {
+        auto cond_job_value = static_cast<const JobValue*>(cond.ptr());
+        auto cond_job = cond_job_value->job();
 
-    auto cond_job_value = static_cast<const JobValue*>(cond.ptr());
-    auto cond_job = cond_job_value->job();
-
-    shell->block_on_job(cond_job);
-
-    if (cond_job->signaled())
-        return create<ListValue>({}); // Exit early.
+        shell->block_on_job(cond_job);
 
+        if (cond_job->signaled())
+            return create<ListValue>({}); // Exit early.
+    }
     if (shell->last_return_code == 0) {
         if (m_true_branch)
             return m_true_branch->run(shell);

+ 4 - 5
Shell/Shell.cpp

@@ -591,10 +591,9 @@ RefPtr<Job> Shell::run_command(const AST::Command& command)
             return nullptr;
     }
 
-    int retval = 0;
-    if (run_builtin(command, rewirings, retval)) {
+    if (run_builtin(command, rewirings, last_return_code)) {
         for (auto& next_in_chain : command.next_chain)
-            run_tail(next_in_chain, retval);
+            run_tail(next_in_chain, last_return_code);
         return nullptr;
     }
 
@@ -610,9 +609,9 @@ RefPtr<Job> Shell::run_command(const AST::Command& command)
             }
         }
 
-        if (invoke_function(command, retval)) {
+        if (invoke_function(command, last_return_code)) {
             for (auto& next_in_chain : command.next_chain)
-                run_tail(next_in_chain, retval);
+                run_tail(next_in_chain, last_return_code);
             return nullptr;
         }
     }