Revert "libexpr: Fix prim_replaceStrings() to work on an empty source string"
This reverts commit 4ea9707591.
It causes an infinite loop in Nixpkgs evaluation,
e.g. "nix-instantiate -A hello" hung.
PR #1886.
			
			
This commit is contained in:
		
							parent
							
								
									a6c497f526
								
							
						
					
					
						commit
						e2d71bd186
					
				
					 3 changed files with 4 additions and 11 deletions
				
			
		|  | @ -1913,26 +1913,21 @@ static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * ar | ||||||
|     auto s = state.forceString(*args[2], context, pos); |     auto s = state.forceString(*args[2], context, pos); | ||||||
| 
 | 
 | ||||||
|     string res; |     string res; | ||||||
|     // Loops one past last character to handle the case where 'from' contains an empty string.
 |     for (size_t p = 0; p < s.size(); ) { | ||||||
|     for (size_t p = 0; p <= s.size(); ) { |  | ||||||
|         bool found = false; |         bool found = false; | ||||||
|         auto i = from.begin(); |         auto i = from.begin(); | ||||||
|         auto j = to.begin(); |         auto j = to.begin(); | ||||||
|         for (; i != from.end(); ++i, ++j) |         for (; i != from.end(); ++i, ++j) | ||||||
|             if (s.compare(p, i->size(), *i) == 0) { |             if (s.compare(p, i->size(), *i) == 0) { | ||||||
|                 found = true; |                 found = true; | ||||||
|                 res += j->first; |  | ||||||
|                 if (i->empty()) { |  | ||||||
|                     res += s[p++]; |  | ||||||
|                 } else { |  | ||||||
|                 p += i->size(); |                 p += i->size(); | ||||||
|                 } |                 res += j->first; | ||||||
|                 for (auto& path : j->second) |                 for (auto& path : j->second) | ||||||
|                     context.insert(path); |                     context.insert(path); | ||||||
|                 j->second.clear(); |                 j->second.clear(); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         if (!found && p < s.size()) res += s[p++]; |         if (!found) res += s[p++]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     mkString(v, res, context); |     mkString(v, res, context); | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| [ "faabar" "fbar" "fubar" "faboor" "fubar" "XaXbXcX" "X" ] | [ "faabar" "fbar" "fubar" "faboor" "fubar" ] | ||||||
|  |  | ||||||
|  | @ -5,6 +5,4 @@ with builtins; | ||||||
|   (replaceStrings ["oo"] ["u"] "foobar") |   (replaceStrings ["oo"] ["u"] "foobar") | ||||||
|   (replaceStrings ["oo" "a"] ["a" "oo"] "foobar") |   (replaceStrings ["oo" "a"] ["a" "oo"] "foobar") | ||||||
|   (replaceStrings ["oo" "oo"] ["u" "i"] "foobar") |   (replaceStrings ["oo" "oo"] ["u" "i"] "foobar") | ||||||
|   (replaceStrings [""] ["X"] "abc") |  | ||||||
|   (replaceStrings [""] ["X"] "") |  | ||||||
| ] | ] | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue