mirror of
				https://github.com/vim/vim.git
				synced 2025-10-29 09:37:35 -04:00 
			
		
		
		
	patch 9.0.0622: matchaddpos() can get slow when adding many matches
Problem:    matchaddpos() can get slow when adding many matches.
Solution:   Update the next available match ID when manually picking an ID and
            remove check if the available ID can be used. (idea by Rick Howe)
			
			
This commit is contained in:
		
							
								
								
									
										32
									
								
								src/match.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								src/match.c
									
									
									
									
									
								
							| @@ -50,19 +50,28 @@ match_add( | ||||
| 	semsg(_(e_invalid_id_nr_must_be_greater_than_or_equal_to_one_1), id); | ||||
| 	return -1; | ||||
|     } | ||||
|     if (id != -1) | ||||
|     if (id == -1) | ||||
|     { | ||||
| 	cur = wp->w_match_head; | ||||
| 	while (cur != NULL) | ||||
| 	{ | ||||
| 	// use the next available match ID | ||||
| 	id = wp->w_next_match_id++; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| 	// check the given ID is not already in use | ||||
| 	for (cur = wp->w_match_head; cur != NULL; cur = cur->mit_next) | ||||
| 	    if (cur->mit_id == id) | ||||
| 	    { | ||||
| 		semsg(_(e_id_already_taken_nr), id); | ||||
| 		return -1; | ||||
| 	    } | ||||
| 	    cur = cur->mit_next; | ||||
| 	} | ||||
|  | ||||
| 	// Make sure the next match ID is always higher than the highest | ||||
| 	// manually selected ID.  Add some extra in case a few more IDs are | ||||
| 	// added soon. | ||||
| 	if (wp->w_next_match_id < id + 100) | ||||
| 	    wp->w_next_match_id = id + 100; | ||||
|     } | ||||
|  | ||||
|     if ((hlg_id = syn_namen2id(grp, (int)STRLEN(grp))) == 0) | ||||
|     { | ||||
| 	semsg(_(e_no_such_highlight_group_name_str), grp); | ||||
| @@ -74,17 +83,6 @@ match_add( | ||||
| 	return -1; | ||||
|     } | ||||
|  | ||||
|     // Find available match ID. | ||||
|     while (id == -1) | ||||
|     { | ||||
| 	cur = wp->w_match_head; | ||||
| 	while (cur != NULL && cur->mit_id != wp->w_next_match_id) | ||||
| 	    cur = cur->mit_next; | ||||
| 	if (cur == NULL) | ||||
| 	    id = wp->w_next_match_id; | ||||
| 	wp->w_next_match_id++; | ||||
|     } | ||||
|  | ||||
|     // Build new match. | ||||
|     m = ALLOC_CLEAR_ONE(matchitem_T); | ||||
|     if (m == NULL) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user