fix(3p/nix): Update for usage of new attribute set API
The new attribute set API uses the iterators of the btree_map directly. This requires changes in various files because the internals of libexpr are very entangled. This code runs and compiles, but there is a bug causing empty attribute sets to be assigned incorrectly.
This commit is contained in:
		
							parent
							
								
									42205f27fc
								
							
						
					
					
						commit
						986a8f6b75
					
				
					 14 changed files with 187 additions and 176 deletions
				
			
		
							
								
								
									
										97
									
								
								third_party/nix/src/libexpr/primops.cc
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								third_party/nix/src/libexpr/primops.cc
									
										
									
									
										vendored
									
									
								
							|  | @ -148,8 +148,8 @@ static void prim_scopedImport(EvalState& state, const Pos& pos, Value** args, | |||
| 
 | ||||
|       unsigned int displ = 0; | ||||
|       for (auto& attr : *args[0]->attrs) { | ||||
|         staticEnv.vars[attr.name] = displ; | ||||
|         env->values[displ++] = attr.value; | ||||
|         staticEnv.vars[attr.second.name] = displ; | ||||
|         env->values[displ++] = attr.second.value; | ||||
|       } | ||||
| 
 | ||||
|       DLOG(INFO) << "evaluating file '" << realPath << "'"; | ||||
|  | @ -398,11 +398,11 @@ static void prim_genericClosure(EvalState& state, const Pos& pos, Value** args, | |||
|   if (startSet == args[0]->attrs->end()) { | ||||
|     throw EvalError(format("attribute 'startSet' required, at %1%") % pos); | ||||
|   } | ||||
|   state.forceList(*startSet->value, pos); | ||||
|   state.forceList(*startSet->second.value, pos); | ||||
| 
 | ||||
|   ValueList workSet; | ||||
|   for (unsigned int n = 0; n < startSet->value->listSize(); ++n) { | ||||
|     workSet.push_back(startSet->value->listElems()[n]); | ||||
|   for (unsigned int n = 0; n < startSet->second.value->listSize(); ++n) { | ||||
|     workSet.push_back(startSet->second.value->listElems()[n]); | ||||
|   } | ||||
| 
 | ||||
|   /* Get the operator. */ | ||||
|  | @ -411,7 +411,7 @@ static void prim_genericClosure(EvalState& state, const Pos& pos, Value** args, | |||
|   if (op == args[0]->attrs->end()) { | ||||
|     throw EvalError(format("attribute 'operator' required, at %1%") % pos); | ||||
|   } | ||||
|   state.forceValue(*op->value); | ||||
|   state.forceValue(*op->second.value); | ||||
| 
 | ||||
|   /* Construct the closure by applying the operator to element of
 | ||||
|      `workSet', adding the result to `workSet', continuing until | ||||
|  | @ -430,17 +430,17 @@ static void prim_genericClosure(EvalState& state, const Pos& pos, Value** args, | |||
|     if (key == e->attrs->end()) { | ||||
|       throw EvalError(format("attribute 'key' required, at %1%") % pos); | ||||
|     } | ||||
|     state.forceValue(*key->value); | ||||
|     state.forceValue(*key->second.value); | ||||
| 
 | ||||
|     if (doneKeys.find(key->value) != doneKeys.end()) { | ||||
|     if (doneKeys.find(key->second.value) != doneKeys.end()) { | ||||
|       continue; | ||||
|     } | ||||
|     doneKeys.insert(key->value); | ||||
|     doneKeys.insert(key->second.value); | ||||
|     res.push_back(e); | ||||
| 
 | ||||
|     /* Call the `operator' function with `e' as argument. */ | ||||
|     Value call; | ||||
|     mkApp(call, *op->value, *e); | ||||
|     mkApp(call, *op->second.value, *e); | ||||
|     state.forceList(call, pos); | ||||
| 
 | ||||
|     /* Add the values returned by the operator to the work set. */ | ||||
|  | @ -566,9 +566,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos, | |||
|     throw EvalError(format("required attribute 'name' missing, at %1%") % pos); | ||||
|   } | ||||
|   std::string drvName; | ||||
|   Pos& posDrvName(*attr->pos); | ||||
|   Pos& posDrvName(*attr->second.pos); | ||||
|   try { | ||||
|     drvName = state.forceStringNoCtx(*attr->value, pos); | ||||
|     drvName = state.forceStringNoCtx(*attr->second.value, pos); | ||||
|   } catch (Error& e) { | ||||
|     e.addPrefix( | ||||
|         format("while evaluating the derivation attribute 'name' at %1%:\n") % | ||||
|  | @ -580,7 +580,8 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos, | |||
|   std::ostringstream jsonBuf; | ||||
|   std::unique_ptr<JSONObject> jsonObject; | ||||
|   attr = args[0]->attrs->find(state.sStructuredAttrs); | ||||
|   if (attr != args[0]->attrs->end() && state.forceBool(*attr->value, pos)) { | ||||
|   if (attr != args[0]->attrs->end() && | ||||
|       state.forceBool(*attr->second.value, pos)) { | ||||
|     jsonObject = std::make_unique<JSONObject>(jsonBuf); | ||||
|   } | ||||
| 
 | ||||
|  | @ -588,7 +589,7 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos, | |||
|   bool ignoreNulls = false; | ||||
|   attr = args[0]->attrs->find(state.sIgnoreNulls); | ||||
|   if (attr != args[0]->attrs->end()) { | ||||
|     ignoreNulls = state.forceBool(*attr->value, pos); | ||||
|     ignoreNulls = state.forceBool(*attr->second.value, pos); | ||||
|   } | ||||
| 
 | ||||
|   /* Build the derivation expression by processing the attributes. */ | ||||
|  | @ -990,7 +991,7 @@ static void prim_findFile(EvalState& state, const Pos& pos, Value** args, | |||
|     std::string prefix; | ||||
|     Bindings::iterator i = v2.attrs->find(state.symbols.Create("prefix")); | ||||
|     if (i != v2.attrs->end()) { | ||||
|       prefix = state.forceStringNoCtx(*i->value, pos); | ||||
|       prefix = state.forceStringNoCtx(*i->second.value, pos); | ||||
|     } | ||||
| 
 | ||||
|     i = v2.attrs->find(state.symbols.Create("path")); | ||||
|  | @ -1000,7 +1001,7 @@ static void prim_findFile(EvalState& state, const Pos& pos, Value** args, | |||
| 
 | ||||
|     PathSet context; | ||||
|     std::string path = | ||||
|         state.coerceToString(pos, *i->value, context, false, false); | ||||
|         state.coerceToString(pos, *i->second.value, context, false, false); | ||||
| 
 | ||||
|     try { | ||||
|       state.realiseContext(context); | ||||
|  | @ -1219,29 +1220,30 @@ static void prim_path(EvalState& state, const Pos& pos, Value** args, | |||
|   Hash expectedHash; | ||||
| 
 | ||||
|   for (auto& attr : *args[0]->attrs) { | ||||
|     const std::string& n(attr.name); | ||||
|     const std::string& n(attr.second.name); | ||||
|     if (n == "path") { | ||||
|       PathSet context; | ||||
|       path = state.coerceToPath(*attr.pos, *attr.value, context); | ||||
|       path = state.coerceToPath(*attr.second.pos, *attr.second.value, context); | ||||
|       if (!context.empty()) { | ||||
|         throw EvalError( | ||||
|             format("string '%1%' cannot refer to other paths, at %2%") % path % | ||||
|             *attr.pos); | ||||
|             *attr.second.pos); | ||||
|       } | ||||
|     } else if (attr.name == state.sName) { | ||||
|       name = state.forceStringNoCtx(*attr.value, *attr.pos); | ||||
|     } else if (attr.second.name == state.sName) { | ||||
|       name = state.forceStringNoCtx(*attr.second.value, *attr.second.pos); | ||||
|     } else if (n == "filter") { | ||||
|       state.forceValue(*attr.value); | ||||
|       filterFun = attr.value; | ||||
|       state.forceValue(*attr.second.value); | ||||
|       filterFun = attr.second.value; | ||||
|     } else if (n == "recursive") { | ||||
|       recursive = state.forceBool(*attr.value, *attr.pos); | ||||
|       recursive = state.forceBool(*attr.second.value, *attr.second.pos); | ||||
|     } else if (n == "sha256") { | ||||
|       expectedHash = | ||||
|           Hash(state.forceStringNoCtx(*attr.value, *attr.pos), htSHA256); | ||||
|           Hash(state.forceStringNoCtx(*attr.second.value, *attr.second.pos), | ||||
|                htSHA256); | ||||
|     } else { | ||||
|       throw EvalError( | ||||
|           format("unsupported argument '%1%' to 'addPath', at %2%") % | ||||
|           attr.name % *attr.pos); | ||||
|           attr.second.name % *attr.second.pos); | ||||
|     } | ||||
|   } | ||||
|   if (path.empty()) { | ||||
|  | @ -1268,7 +1270,7 @@ static void prim_attrNames(EvalState& state, const Pos& pos, Value** args, | |||
| 
 | ||||
|   size_t n = 0; | ||||
|   for (auto& i : *args[0]->attrs) { | ||||
|     mkString(*(v.listElems()[n++] = state.allocValue()), i.name); | ||||
|     mkString(*(v.listElems()[n++] = state.allocValue()), i.second.name); | ||||
|   } | ||||
| 
 | ||||
|   std::sort(v.listElems(), v.listElems() + n, [](Value* v1, Value* v2) { | ||||
|  | @ -1308,11 +1310,11 @@ void prim_getAttr(EvalState& state, const Pos& pos, Value** args, Value& v) { | |||
|     throw EvalError(format("attribute '%1%' missing, at %2%") % attr % pos); | ||||
|   } | ||||
|   // !!! add to stack trace?
 | ||||
|   if (state.countCalls && (i->pos != nullptr)) { | ||||
|     state.attrSelects[*i->pos]++; | ||||
|   if (state.countCalls && (i->second.pos != nullptr)) { | ||||
|     state.attrSelects[*i->second.pos]++; | ||||
|   } | ||||
|   state.forceValue(*i->value); | ||||
|   v = *i->value; | ||||
|   state.forceValue(*i->second.value); | ||||
|   v = *i->second.value; | ||||
| } | ||||
| 
 | ||||
| /* Return position information of the specified attribute. */ | ||||
|  | @ -1324,7 +1326,7 @@ void prim_unsafeGetAttrPos(EvalState& state, const Pos& pos, Value** args, | |||
|   if (i == args[1]->attrs->end()) { | ||||
|     mkNull(v); | ||||
|   } else { | ||||
|     state.mkPos(v, i->pos); | ||||
|     state.mkPos(v, i->second.pos); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -1361,8 +1363,8 @@ static void prim_removeAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|      vector. */ | ||||
|   state.mkAttrs(v, args[0]->attrs->size()); | ||||
|   for (auto& i : *args[0]->attrs) { | ||||
|     if (names.find(i.name) == names.end()) { | ||||
|       v.attrs->push_back(i); | ||||
|     if (names.find(i.second.name) == names.end()) { | ||||
|       v.attrs->push_back(i.second); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -1391,7 +1393,7 @@ static void prim_listToAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|               "'name' attribute missing in a call to 'listToAttrs', at %1%") % | ||||
|           pos); | ||||
|     } | ||||
|     std::string name = state.forceStringNoCtx(*j->value, pos); | ||||
|     std::string name = state.forceStringNoCtx(*j->second.value, pos); | ||||
| 
 | ||||
|     Symbol sym = state.symbols.Create(name); | ||||
|     if (seen.find(sym) == seen.end()) { | ||||
|  | @ -1406,7 +1408,7 @@ static void prim_listToAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|                         pos); | ||||
|       } | ||||
| 
 | ||||
|       v.attrs->push_back(Attr(sym, j2->value, j2->pos)); | ||||
|       v.attrs->push_back(Attr(sym, j2->second.value, j2->second.pos)); | ||||
|       seen.insert(sym); | ||||
|     } | ||||
|   } | ||||
|  | @ -1425,9 +1427,9 @@ static void prim_intersectAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|   state.mkAttrs(v, std::min(args[0]->attrs->size(), args[1]->attrs->size())); | ||||
| 
 | ||||
|   for (auto& i : *args[0]->attrs) { | ||||
|     Bindings::iterator j = args[1]->attrs->find(i.name); | ||||
|     Bindings::iterator j = args[1]->attrs->find(i.second.name); | ||||
|     if (j != args[1]->attrs->end()) { | ||||
|       v.attrs->push_back(*j); | ||||
|       v.attrs->push_back(j->second); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -1452,7 +1454,7 @@ static void prim_catAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|     state.forceAttrs(v2, pos); | ||||
|     Bindings::iterator i = v2.attrs->find(attrName); | ||||
|     if (i != v2.attrs->end()) { | ||||
|       res[found++] = i->value; | ||||
|       res[found++] = i->second.value; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | @ -1506,9 +1508,9 @@ static void prim_mapAttrs(EvalState& state, const Pos& pos, Value** args, | |||
|   for (auto& i : *args[1]->attrs) { | ||||
|     Value* vName = state.allocValue(); | ||||
|     Value* vFun2 = state.allocValue(); | ||||
|     mkString(*vName, i.name); | ||||
|     mkString(*vName, i.second.name); | ||||
|     mkApp(*vFun2, *args[0], *vName); | ||||
|     mkApp(*state.allocAttr(v, i.name), *vFun2, *i.value); | ||||
|     mkApp(*state.allocAttr(v, i.second.name), *vFun2, *i.second.value); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -2198,17 +2200,20 @@ void fetch(EvalState& state, const Pos& pos, Value** args, Value& v, | |||
|     state.forceAttrs(*args[0], pos); | ||||
| 
 | ||||
|     for (auto& attr : *args[0]->attrs) { | ||||
|       std::string n(attr.name); | ||||
|       std::string n(attr.second.name); | ||||
|       if (n == "url") { | ||||
|         request.uri = state.forceStringNoCtx(*attr.value, *attr.pos); | ||||
|         request.uri = | ||||
|             state.forceStringNoCtx(*attr.second.value, *attr.second.pos); | ||||
|       } else if (n == "sha256") { | ||||
|         request.expectedHash = | ||||
|             Hash(state.forceStringNoCtx(*attr.value, *attr.pos), htSHA256); | ||||
|             Hash(state.forceStringNoCtx(*attr.second.value, *attr.second.pos), | ||||
|                  htSHA256); | ||||
|       } else if (n == "name") { | ||||
|         request.name = state.forceStringNoCtx(*attr.value, *attr.pos); | ||||
|         request.name = | ||||
|             state.forceStringNoCtx(*attr.second.value, *attr.second.pos); | ||||
|       } else { | ||||
|         throw EvalError(format("unsupported argument '%1%' to '%2%', at %3%") % | ||||
|                         attr.name % who % attr.pos); | ||||
|                         attr.second.name % who % attr.second.pos); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue