From 7a6dfd62e2083d66c8141ae148e1facf41fbb7e9 Mon Sep 17 00:00:00 2001 From: cparsons Date: Wed, 31 Jan 2018 12:45:20 -0800 Subject: Make CcToolchainProvider structField methods resilient to null fields structField methods must not throw an exception in all cases. Null fields were technically used for incomplete toolchain objects (such as the EMPTY_TOOLCHAIN_IS_ERROR object). RELNOTES: None. PiperOrigin-RevId: 184031908 --- .../build/lib/rules/cpp/CcToolchainProvider.java | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java index 2777c52b84..2f4ca798f3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java @@ -560,21 +560,24 @@ public final class CcToolchainProvider extends ToolchainInfo { } /** Returns the compiler version string (e.g. "gcc-4.1.1"). */ - @SkylarkCallable(name = "compiler", structField = true, doc = "C++ compiler.") + @SkylarkCallable(name = "compiler", structField = true, doc = "C++ compiler.", + allowReturnNones = true) public String getCompiler() { - return toolchainInfo.getCompiler(); + return toolchainInfo == null ? null : toolchainInfo.getCompiler(); } /** Returns the libc version string (e.g. "glibc-2.2.2"). */ - @SkylarkCallable(name = "libc", structField = true, doc = "libc version string.") + @SkylarkCallable(name = "libc", structField = true, doc = "libc version string.", + allowReturnNones = true) public String getTargetLibc() { - return toolchainInfo.getTargetLibc(); + return toolchainInfo == null ? null : toolchainInfo.getTargetLibc(); } /** Returns the target architecture using blaze-specific constants (e.g. "piii"). */ - @SkylarkCallable(name = "cpu", structField = true, doc = "Target CPU of the C++ toolchain.") + @SkylarkCallable(name = "cpu", structField = true, doc = "Target CPU of the C++ toolchain.", + allowReturnNones = true) public String getTargetCpu() { - return toolchainInfo.getTargetCpu(); + return toolchainInfo == null ? null : toolchainInfo.getTargetCpu(); } /** @@ -619,7 +622,9 @@ public final class CcToolchainProvider extends ToolchainInfo { + "inferred from the command-line options." ) public ImmutableList getLinkOptionsWithSysroot() { - return cppConfiguration.getLinkOptionsDoNotUse(sysroot); + return cppConfiguration == null + ? ImmutableList.of() + : cppConfiguration.getLinkOptionsDoNotUse(sysroot); } public ImmutableList getLinkOptions() { @@ -761,10 +766,11 @@ public final class CcToolchainProvider extends ToolchainInfo { @SkylarkCallable( name = "target_gnu_system_name", structField = true, - doc = "The GNU System Name." + doc = "The GNU System Name.", + allowReturnNones = true ) public String getTargetGnuSystemName() { - return toolchainInfo.getTargetGnuSystemName(); + return toolchainInfo == null ? null : toolchainInfo.getTargetGnuSystemName(); } /** Returns the architecture component of the GNU System Name */ -- cgit v1.2.3