Slightly optimize listToAttrs
This commit is contained in:
		
							parent
							
								
									36e67ff16b
								
							
						
					
					
						commit
						ea6bf0c21f
					
				
					 3 changed files with 10 additions and 9 deletions
				
			
		|  | @ -136,6 +136,7 @@ EvalState::EvalState() | ||||||
|     , sType(symbols.create("type")) |     , sType(symbols.create("type")) | ||||||
|     , sMeta(symbols.create("meta")) |     , sMeta(symbols.create("meta")) | ||||||
|     , sName(symbols.create("name")) |     , sName(symbols.create("name")) | ||||||
|  |     , sValue(symbols.create("value")) | ||||||
|     , sSystem(symbols.create("system")) |     , sSystem(symbols.create("system")) | ||||||
|     , sOverrides(symbols.create("__overrides")) |     , sOverrides(symbols.create("__overrides")) | ||||||
|     , sOutputs(symbols.create("outputs")) |     , sOutputs(symbols.create("outputs")) | ||||||
|  |  | ||||||
|  | @ -93,7 +93,7 @@ class EvalState | ||||||
| public: | public: | ||||||
|     SymbolTable symbols; |     SymbolTable symbols; | ||||||
| 
 | 
 | ||||||
|     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, |     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, | ||||||
|         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls; |         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls; | ||||||
|     Symbol sDerivationNix; |     Symbol sDerivationNix; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -277,10 +277,10 @@ static void prim_tryEval(EvalState & state, Value * * args, Value & v) | ||||||
|     state.mkAttrs(v, 2); |     state.mkAttrs(v, 2); | ||||||
|     try { |     try { | ||||||
|         state.forceValue(*args[0]); |         state.forceValue(*args[0]); | ||||||
|         v.attrs->push_back(Attr(state.symbols.create("value"), args[0])); |         v.attrs->push_back(Attr(state.sValue, args[0])); | ||||||
|         mkBool(*state.allocAttr(v, state.symbols.create("success")), true); |         mkBool(*state.allocAttr(v, state.symbols.create("success")), true); | ||||||
|     } catch (AssertionError & e) { |     } catch (AssertionError & e) { | ||||||
|         mkBool(*state.allocAttr(v, state.symbols.create("value")), false); |         mkBool(*state.allocAttr(v, state.sValue), false); | ||||||
|         mkBool(*state.allocAttr(v, state.symbols.create("success")), false); |         mkBool(*state.allocAttr(v, state.symbols.create("success")), false); | ||||||
|     } |     } | ||||||
|     v.attrs->sort(); |     v.attrs->sort(); | ||||||
|  | @ -810,7 +810,8 @@ static void prim_removeAttrs(EvalState & state, Value * * args, Value & v) | ||||||
| /* Builds a set from a list specifying (name, value) pairs.  To be
 | /* Builds a set from a list specifying (name, value) pairs.  To be
 | ||||||
|    precise, a list [{name = "name1"; value = value1;} ... {name = |    precise, a list [{name = "name1"; value = value1;} ... {name = | ||||||
|    "nameN"; value = valueN;}] is transformed to {name1 = value1; |    "nameN"; value = valueN;}] is transformed to {name1 = value1; | ||||||
|    ... nameN = valueN;}. */ |    ... nameN = valueN;}.  In case of duplicate occurences of the same | ||||||
|  |    name, the first takes precedence. */ | ||||||
| static void prim_listToAttrs(EvalState & state, Value * * args, Value & v) | static void prim_listToAttrs(EvalState & state, Value * * args, Value & v) | ||||||
| { | { | ||||||
|     state.forceList(*args[0]); |     state.forceList(*args[0]); | ||||||
|  | @ -828,16 +829,15 @@ static void prim_listToAttrs(EvalState & state, Value * * args, Value & v) | ||||||
|             throw TypeError("`name' attribute missing in a call to `listToAttrs'"); |             throw TypeError("`name' attribute missing in a call to `listToAttrs'"); | ||||||
|         string name = state.forceStringNoCtx(*j->value); |         string name = state.forceStringNoCtx(*j->value); | ||||||
| 
 | 
 | ||||||
|         Bindings::iterator j2 = v2.attrs->find(state.symbols.create("value")); |  | ||||||
|         if (j2 == v2.attrs->end()) |  | ||||||
|             throw TypeError("`value' attribute missing in a call to `listToAttrs'"); |  | ||||||
| 
 |  | ||||||
|         Symbol sym = state.symbols.create(name); |         Symbol sym = state.symbols.create(name); | ||||||
|         if (seen.find(sym) == seen.end()) { |         if (seen.find(sym) == seen.end()) { | ||||||
|  |             Bindings::iterator j2 = v2.attrs->find(state.symbols.create(state.sValue)); | ||||||
|  |             if (j2 == v2.attrs->end()) | ||||||
|  |                 throw TypeError("`value' attribute missing in a call to `listToAttrs'"); | ||||||
|  | 
 | ||||||
|             v.attrs->push_back(Attr(sym, j2->value, j2->pos)); |             v.attrs->push_back(Attr(sym, j2->value, j2->pos)); | ||||||
|             seen.insert(sym); |             seen.insert(sym); | ||||||
|         } |         } | ||||||
|         /* !!! Throw an error if `name' already exists? */ |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     v.attrs->sort(); |     v.attrs->sort(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue