Deduplicate filenames in Pos
This saves ~4 MiB of RAM for NixOS system instantiation, and ~18 MiB for "nix-env -qa".
This commit is contained in:
		
							parent
							
								
									b1e3b1a4ac
								
							
						
					
					
						commit
						9deb822180
					
				
					 3 changed files with 7 additions and 6 deletions
				
			
		|  | @ -636,7 +636,6 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v) | |||
|             if (state.countCalls && pos) state.attrSelects[*pos]++; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         state.forceValue(*vAttrs); | ||||
| 
 | ||||
|     } catch (Error & e) { | ||||
|  |  | |||
|  | @ -23,14 +23,16 @@ MakeError(UndefinedVarError, Error) | |||
| 
 | ||||
| struct Pos | ||||
| { | ||||
|     string file; | ||||
|     Symbol file; | ||||
|     unsigned int line, column; | ||||
|     Pos() : line(0), column(0) { }; | ||||
|     Pos(const string & file, unsigned int line, unsigned int column) | ||||
|     Pos(const Symbol & file, unsigned int line, unsigned int column) | ||||
|         : file(file), line(line), column(column) { }; | ||||
|     bool operator < (const Pos & p2) const | ||||
|     { | ||||
|         int d = file.compare(p2.file); | ||||
|         if (!line) return p2.line; | ||||
|         if (!p2.line) return false; | ||||
|         int d = ((string) file).compare((string) p2.file); | ||||
|         if (d < 0) return true; | ||||
|         if (d > 0) return false; | ||||
|         if (line < p2.line) return true; | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ namespace nix { | |||
|         SymbolTable & symbols; | ||||
|         Expr * result; | ||||
|         Path basePath; | ||||
|         Path path; | ||||
|         Symbol path; | ||||
|         string error; | ||||
|         Symbol sLetBody; | ||||
|         ParseData(EvalState & state) | ||||
|  | @ -486,7 +486,7 @@ Expr * EvalState::parse(const char * text, | |||
|     yyscan_t scanner; | ||||
|     ParseData data(*this); | ||||
|     data.basePath = basePath; | ||||
|     data.path = path; | ||||
|     data.path = data.symbols.create(path); | ||||
| 
 | ||||
|     yylex_init(&scanner); | ||||
|     yy_scan_string(text, scanner); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue