| 
					
				 | 
			
			
				@@ -528,9 +528,8 @@ namespace Avalonia.PropertyStore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private void InsertFrame(IValueFrame frame) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Debug.Assert(!_frames.Contains(frame)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var index = _frames.BinarySearch(frame, FrameInsertionComparer.Instance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (index < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                index = ~index; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var index = BinarySearchFrame(frame.Priority); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             _frames.Insert(index, frame); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ++_frameGeneration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             frame.SetOwner(this); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -569,15 +568,12 @@ namespace Avalonia.PropertyStore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Debug.Assert(priority != BindingPriority.LocalValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // TODO: Binary search? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (var i = _frames.Count - 1; i >= 0;  --i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var frame = _frames[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (frame is ImmediateValueFrame immediate &&  !immediate.Contains(property)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return immediate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (frame.Priority > priority) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var index = BinarySearchFrame(priority); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (index > 0 && _frames[index - 1] is ImmediateValueFrame f && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                f.Priority == priority && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                !f.Contains(property)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var result = new ImmediateValueFrame(priority); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             InsertFrame(result); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -915,14 +911,28 @@ namespace Avalonia.PropertyStore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private class FrameInsertionComparer : IComparer<IValueFrame> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int BinarySearchFrame(BindingPriority priority) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            public static readonly FrameInsertionComparer Instance = new FrameInsertionComparer(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            public int Compare(IValueFrame? x, IValueFrame? y) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var lo = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var hi = _frames.Count - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Binary search insertion point. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (lo <= hi) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var result = y!.Priority - x!.Priority; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return result != 0 ? result : -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var i = lo + ((hi - lo) >> 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var order = priority - _frames[i].Priority; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (order <= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    lo = i + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    hi = i - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return lo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private readonly struct OldNewValue 
			 |