[pkg-d-commits] [ldc] 118/149: Fix LDMD regression when generating response file

Matthias Klumpp mak at moszumanska.debian.org
Sun Apr 23 22:37:04 UTC 2017


This is an automated email from the git hooks/post-receive script.

mak pushed a commit to annotated tag v1.2.0
in repository ldc.

commit de360802b10af4195b8f22b618de59b8f869b458
Author: Martin <noone at nowhere.com>
Date:   Tue Mar 7 01:59:16 2017 +0100

    Fix LDMD regression when generating response file
    
    It wrongly started with argv[0] (path to ldc2 binary).
---
 driver/ldmd.cpp        | 61 +++++++++++++++++++++++++-------------------------
 tests/d2/dmd-testsuite |  2 +-
 2 files changed, 31 insertions(+), 32 deletions(-)

diff --git a/driver/ldmd.cpp b/driver/ldmd.cpp
index 863c8cf..e6e7d21 100644
--- a/driver/ldmd.cpp
+++ b/driver/ldmd.cpp
@@ -576,7 +576,7 @@ void translateArgs(size_t originalArgc, char **originalArgv,
       }
     } else {
       const auto ext = ls::path::extension(p);
-      if (ext.equals_lower("exe")) {
+      if (ext.equals_lower(".exe")) {
         // should be for Windows targets only
         ldcArgs.push_back(concat("-of=", p));
         continue;
@@ -650,10 +650,6 @@ std::string locateBinary(std::string exeName) {
   return "";
 }
 
-static size_t addStrlen(size_t acc, const char *str) {
-  return acc + (str ? strlen(str) : 0);
-}
-
 // In driver/main.d
 int main(int argc, char **argv);
 
@@ -677,38 +673,41 @@ int cppmain(int argc, char **argv) {
 
   args.push_back(nullptr);
 
-  // Check if we need to write out a response file.
-  size_t totalLen = std::accumulate(args.begin(), args.end(), 0, addStrlen);
-  if (totalLen > maxCommandLineLen()) {
-    int rspFd;
-    llvm::SmallString<128> rspPath;
-    if (ls::fs::createUniqueFile("ldmd-%%-%%-%%-%%.rsp", rspFd, rspPath)) {
-      error("Could not open temporary response file.");
-    }
+  // Check if we can get away without a response file.
+  const size_t totalLen = std::accumulate(
+      args.begin(), args.end() - 1,
+      args.size() * 3, // quotes + space
+      [](size_t acc, const char *arg) { return acc + strlen(arg); });
+  if (totalLen <= maxCommandLineLen()) {
+    return execute(ldcPath, args.data());
+  }
 
-    {
-      llvm::raw_fd_ostream rspOut(rspFd, /*shouldClose=*/true);
-      for (auto arg : args) {
-        rspOut << arg << '\n';
-      }
-    }
+  int rspFd;
+  llvm::SmallString<128> rspPath;
+  if (ls::fs::createUniqueFile("ldmd-%%-%%-%%-%%.rsp", rspFd, rspPath)) {
+    error("Could not open temporary response file.");
+  }
 
-    std::string rspArg = "@";
-    rspArg += rspPath.str();
+  {
+    llvm::raw_fd_ostream rspOut(rspFd, /*shouldClose=*/true);
+    // skip argv[0] and terminating NULL
+    for (auto it = args.begin() + 1, end = args.end() - 1; it != end; ++it) {
+      rspOut << *it << '\n';
+    }
+  }
 
-    std::vector<const char *> newArgs;
-    newArgs.push_back(argv[0]);
-    newArgs.push_back(rspArg.c_str());
-    newArgs.push_back(nullptr);
+  std::string rspArg = "@";
+  rspArg += rspPath.str();
 
-    int rc = execute(ldcPath, &newArgs[0]);
+  args.resize(1);
+  args.push_back(rspArg.c_str());
+  args.push_back(nullptr);
 
-    if (ls::fs::remove(rspPath.str())) {
-      warning("Could not remove response file.");
-    }
+  int rc = execute(ldcPath, args.data());
 
-    return rc;
+  if (ls::fs::remove(rspPath.str())) {
+    warning("Could not remove response file.");
   }
 
-  return execute(ldcPath, &args[0]);
+  return rc;
 }
diff --git a/tests/d2/dmd-testsuite b/tests/d2/dmd-testsuite
index e677829..6add0c4 160000
--- a/tests/d2/dmd-testsuite
+++ b/tests/d2/dmd-testsuite
@@ -1 +1 @@
-Subproject commit e677829f5167a95565e0af234e46e730deec7346
+Subproject commit 6add0c447d6be7ec66b6bf3f1b210142a9b930bf

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git



More information about the pkg-d-commits mailing list