don't iterate handles while potential invalidation occurs (#757)
This commit is contained in:
		
							parent
							
								
									d75fd3a880
								
							
						
					
					
						commit
						46da74d32e
					
				@ -479,20 +479,26 @@ pub fn symbolReferences(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if (!workspace) return builder.locations;
 | 
					            if (!workspace) return builder.locations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var dependencies = std.StringArrayHashMapUnmanaged(void){};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (store.handles.values()) |handle| {
 | 
					            for (store.handles.values()) |handle| {
 | 
				
			||||||
                if (skip_std_references and std.mem.indexOf(u8, handle.uri, "std") != null) {
 | 
					                if (skip_std_references and std.mem.indexOf(u8, handle.uri, "std") != null) {
 | 
				
			||||||
                    if (!include_decl or !std.mem.eql(u8, handle.uri, curr_handle.uri))
 | 
					                    if (!include_decl or !std.mem.eql(u8, handle.uri, curr_handle.uri))
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var dependencies = std.ArrayListUnmanaged([]const u8){};
 | 
					                var handle_dependencies = std.ArrayListUnmanaged([]const u8){};
 | 
				
			||||||
                try store.collectDependencies(store.allocator, handle.*, &dependencies);
 | 
					                try store.collectDependencies(store.allocator, handle.*, &handle_dependencies);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (dependencies.items) |uri| {
 | 
					                for (handle_dependencies.items) |uri| {
 | 
				
			||||||
                    const hdl = store.getHandle(uri) orelse continue;
 | 
					                    try dependencies.put(arena.allocator(), uri, {});
 | 
				
			||||||
                    try symbolReferencesInternal(&builder, 0, hdl, true);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (dependencies.keys()) |uri| {
 | 
				
			||||||
 | 
					                const handle = store.getHandle(uri) orelse continue;
 | 
				
			||||||
 | 
					                try symbolReferencesInternal(&builder, 0, handle, true);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        .pointer_payload,
 | 
					        .pointer_payload,
 | 
				
			||||||
        .switch_payload,
 | 
					        .switch_payload,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user