* Store Value nodes outside of attribute sets. I.e., Attr now stores
a pointer to a Value, rather than the Value directly. This improves the effectiveness of garbage collection a lot: if the Value is stored inside the set directly, then any live pointer to the Value causes all other attributes in the set to be live as well.
This commit is contained in:
		
							parent
							
								
									64c3325b0b
								
							
						
					
					
						commit
						41c45a9b31
					
				
					 15 changed files with 150 additions and 130 deletions
				
			
		|  | @ -25,7 +25,8 @@ DrvInfos queryInstalled(EvalState & state, const Path & userEnv) | |||
|     if (pathExists(manifestFile)) { | ||||
|         Value v; | ||||
|         state.eval(parseExprFromFile(state, manifestFile), v); | ||||
|         getDerivations(state, v, "", Bindings(), elems); | ||||
|         Bindings bindings; | ||||
|         getDerivations(state, v, "", bindings, elems); | ||||
|     } else if (pathExists(oldManifestFile)) | ||||
|         readLegacyManifest(oldManifestFile, elems); | ||||
| 
 | ||||
|  | @ -62,19 +63,19 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, | |||
|         manifest.list.elems[n++] = &v; | ||||
|         state.mkAttrs(v); | ||||
| 
 | ||||
|         mkString((*v.attrs)[state.sType].value, "derivation"); | ||||
|         mkString((*v.attrs)[state.sName].value, i->name); | ||||
|         mkString((*v.attrs)[state.sSystem].value, i->system); | ||||
|         mkString((*v.attrs)[state.sOutPath].value, i->queryOutPath(state)); | ||||
|         mkString(*state.allocAttr(v, state.sType), "derivation"); | ||||
|         mkString(*state.allocAttr(v, state.sName), i->name); | ||||
|         mkString(*state.allocAttr(v, state.sSystem), i->system); | ||||
|         mkString(*state.allocAttr(v, state.sOutPath), i->queryOutPath(state)); | ||||
|         if (drvPath != "") | ||||
|             mkString((*v.attrs)[state.sDrvPath].value, i->queryDrvPath(state)); | ||||
|             mkString(*state.allocAttr(v, state.sDrvPath), i->queryDrvPath(state)); | ||||
|          | ||||
|         state.mkAttrs((*v.attrs)[state.sMeta].value); | ||||
|         state.mkAttrs(*state.allocAttr(v, state.sMeta)); | ||||
|          | ||||
|         MetaInfo meta = i->queryMetaInfo(state); | ||||
| 
 | ||||
|         foreach (MetaInfo::const_iterator, j, meta) { | ||||
|             Value & v2((*(*v.attrs)[state.sMeta].value.attrs)[state.symbols.create(j->first)].value); | ||||
|             Value & v2(*state.allocAttr(*(*v.attrs)[state.sMeta].value, state.symbols.create(j->first))); | ||||
|             switch (j->second.type) { | ||||
|                 case MetaValue::tpInt: mkInt(v2, j->second.intValue); break; | ||||
|                 case MetaValue::tpString: mkString(v2, j->second.stringValue); break; | ||||
|  | @ -114,10 +115,10 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, | |||
|        builder with the manifest as argument. */ | ||||
|     Value args, topLevel; | ||||
|     state.mkAttrs(args); | ||||
|     mkString((*args.attrs)[state.sSystem].value, thisSystem); | ||||
|     mkString((*args.attrs)[state.symbols.create("manifest")].value, | ||||
|     mkString(*state.allocAttr(args, state.sSystem), thisSystem); | ||||
|     mkString(*state.allocAttr(args, state.symbols.create("manifest")), | ||||
|         manifestFile, singleton<PathSet>(manifestFile)); | ||||
|     (*args.attrs)[state.symbols.create("derivations")].value = manifest; | ||||
|     (*args.attrs)[state.symbols.create("derivations")].value = &manifest; | ||||
|     mkApp(topLevel, envBuilder, args); | ||||
|          | ||||
|     /* Evaluate it. */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue