about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--third_party/nix/src/libexpr/primops.cc5
-rw-r--r--third_party/nix/src/tests/lang/eval-okay-functionargs.exp2
-rw-r--r--third_party/nix/src/tests/lang/eval-okay-functionargs.nix11
-rw-r--r--third_party/nix/src/tests/lang/eval-okay-types.exp2
-rw-r--r--third_party/nix/src/tests/lang/eval-okay-types.nix1
5 files changed, 18 insertions, 3 deletions
diff --git a/third_party/nix/src/libexpr/primops.cc b/third_party/nix/src/libexpr/primops.cc
index 49c43556fe9e..710d214ce7c2 100644
--- a/third_party/nix/src/libexpr/primops.cc
+++ b/third_party/nix/src/libexpr/primops.cc
@@ -1369,6 +1369,11 @@ static void prim_catAttrs(EvalState& state, const Pos& pos, Value** args,
 static void prim_functionArgs(EvalState& state, const Pos& pos, Value** args,
                               Value& v) {
   state.forceValue(*args[0]);
+  if (args[0]->type == tPrimOpApp || args[0]->type == tPrimOp) {
+    // TODO(sterni): return set of formal arguments for fetch* primops
+    state.mkAttrs(v, 0);
+    return;
+  }
   if (args[0]->type != tLambda) {
     throw TypeError(format("'functionArgs' requires a function, at %1%") % pos);
   }
diff --git a/third_party/nix/src/tests/lang/eval-okay-functionargs.exp b/third_party/nix/src/tests/lang/eval-okay-functionargs.exp
index c1c9f8ffaf69..f8ddea8e0bfa 100644
--- a/third_party/nix/src/tests/lang/eval-okay-functionargs.exp
+++ b/third_party/nix/src/tests/lang/eval-okay-functionargs.exp
@@ -1 +1 @@
-[ "stdenv" "fetchurl" "aterm-stdenv" "aterm-stdenv2" "libX11" "libXv" "mplayer-stdenv2.libXv-libX11" "mplayer-stdenv2.libXv-libX11_2" "nix-stdenv-aterm-stdenv" "nix-stdenv2-aterm2-stdenv2" ]
+[ { aterm = false; fetchurl = false; stdenv = false; } { color = false; name = true; } { } { } { } "stdenv" "fetchurl" "aterm-stdenv" "aterm-stdenv2" "libX11" "libXv" "mplayer-stdenv2.libXv-libX11" "mplayer-stdenv2.libXv-libX11_2" "nix-stdenv-aterm-stdenv" "nix-stdenv2-aterm2-stdenv2" ]
diff --git a/third_party/nix/src/tests/lang/eval-okay-functionargs.nix b/third_party/nix/src/tests/lang/eval-okay-functionargs.nix
index 68dca62ee18d..205bbf307aa7 100644
--- a/third_party/nix/src/tests/lang/eval-okay-functionargs.nix
+++ b/third_party/nix/src/tests/lang/eval-okay-functionargs.nix
@@ -6,6 +6,14 @@ let
   atermFun = { stdenv, fetchurl }: { name = "aterm-${stdenv.name}"; };
   aterm2Fun = { stdenv, fetchurl }: { name = "aterm2-${stdenv.name}"; };
   nixFun = { stdenv, fetchurl, aterm }: { name = "nix-${stdenv.name}-${aterm.name}"; };
+
+  trivialFunctionArgsUsage = [
+    (builtins.functionArgs nixFun)
+    (builtins.functionArgs ({ name ? "Karl", color }: "${name} is ${color}"))
+    (builtins.functionArgs (x: y: x + y))
+    (builtins.functionArgs builtins.map)
+    (builtins.functionArgs builtins.fetchurl)
+  ];
   
   mplayerFun =
     { stdenv, fetchurl, enableX11 ? false, xorg ? null, enableFoo ? true, foo ? null  }:
@@ -67,7 +75,8 @@ let
   
 in
 
-  [ pkgs.stdenv.name
+  trivialFunctionArgsUsage ++ [
+    pkgs.stdenv.name
     pkgs.fetchurl.name
     pkgs.aterm.name
     pkgs2.aterm.name
diff --git a/third_party/nix/src/tests/lang/eval-okay-types.exp b/third_party/nix/src/tests/lang/eval-okay-types.exp
index 92a15329935a..882c16dbfe36 100644
--- a/third_party/nix/src/tests/lang/eval-okay-types.exp
+++ b/third_party/nix/src/tests/lang/eval-okay-types.exp
@@ -1 +1 @@
-[ true false true false true false true false true true true true true true true true true true true false true true true false "int" "bool" "string" "null" "set" "list" "lambda" "lambda" "lambda" "lambda" ]
+[ true false true true false true false true false true true true true true true true true true true true false true true true false "int" "bool" "string" "null" "set" "list" "lambda" "lambda" "lambda" "lambda" ]
diff --git a/third_party/nix/src/tests/lang/eval-okay-types.nix b/third_party/nix/src/tests/lang/eval-okay-types.nix
index 9b58be5d1dd4..cc51d8cb7a25 100644
--- a/third_party/nix/src/tests/lang/eval-okay-types.nix
+++ b/third_party/nix/src/tests/lang/eval-okay-types.nix
@@ -3,6 +3,7 @@ with builtins;
 [ (isNull null)
   (isNull (x: x))
   (isFunction (x: x))
+  (isFunction functionArgs)
   (isFunction "fnord")
   (isString ("foo" + "bar"))
   (isString [ "x" ])