about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--third_party/nix/src/libexpr/primops.cc30
1 files changed, 9 insertions, 21 deletions
diff --git a/third_party/nix/src/libexpr/primops.cc b/third_party/nix/src/libexpr/primops.cc
index 713c31e4fa79..5a9f1fe72076 100644
--- a/third_party/nix/src/libexpr/primops.cc
+++ b/third_party/nix/src/libexpr/primops.cc
@@ -1263,35 +1263,23 @@ static void prim_attrNames(EvalState& state, const Pos& pos, Value** args,
 
   state.mkList(v, args[0]->attrs->size());
 
-  size_t n = 0;
-  for (auto& i : *args[0]->attrs) {
-    mkString(*(v.listElems()[n++] = state.allocValue()), i.second.name);
+  unsigned int n = 0;
+  for (auto& [key, value] : *args[0]->attrs) {
+    mkString(*(v.listElems()[n++] = state.allocValue()), key);
   }
-
-  std::sort(v.listElems(), v.listElems() + n, [](Value* v1, Value* v2) {
-    return strcmp(v1->string.s, v2->string.s) < 0;
-  });
 }
 
 /* Return the values of the attributes in a set as a list, in the same
    order as attrNames. */
-static void prim_attrValues(EvalState& state, const Pos& pos, Value** args,
-                            Value& v) {
-  state.forceAttrs(*args[0], pos);
+static void prim_attrValues(EvalState& state, const Pos& pos, Value** input,
+                            Value& output) {
+  state.forceAttrs(*input[0], pos);
 
-  state.mkList(v, args[0]->attrs->size());
+  state.mkList(output, input[0]->attrs->size());
 
   unsigned int n = 0;
-  for (auto& i : *args[0]->attrs) {
-    v.listElems()[n++] = (Value*)&i;
-  }
-
-  std::sort(v.listElems(), v.listElems() + n, [](Value* v1, Value* v2) {
-    return (string)((Attr*)v1)->name < (string)((Attr*)v2)->name;
-  });
-
-  for (unsigned int i = 0; i < n; ++i) {
-    v.listElems()[i] = ((Attr*)v.listElems()[i])->value;
+  for (auto& [key, value] : *input[0]->attrs) {
+    output.listElems()[n++] = value.value;
   }
 }