Fixed memory leak caused by DocumentStore.resolveImports
This commit is contained in:
		
							parent
							
								
									2415e7ca6d
								
							
						
					
					
						commit
						40edfadc26
					
				| @ -532,15 +532,13 @@ pub fn uriFromImportStr( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn resolveImport(self: *DocumentStore, handle: *Handle, import_str: []const u8) !?*Handle { | pub fn resolveImport(self: *DocumentStore, handle: *Handle, import_str: []const u8) !?*Handle { | ||||||
|     std.debug.print("RESOLVING IMPORT STR: {s}\n", .{import_str}); |  | ||||||
|     const allocator = self.allocator; |     const allocator = self.allocator; | ||||||
|     const final_uri = (try self.uriFromImportStr( |     const final_uri = (try self.uriFromImportStr( | ||||||
|         self.allocator, |         self.allocator, | ||||||
|         handle.*, |         handle.*, | ||||||
|         import_str, |         import_str, | ||||||
|     )) orelse return null; |     )) orelse return null; | ||||||
|     var consumed_final_uri = false; |     defer allocator.free(final_uri); | ||||||
|     defer if (!consumed_final_uri) allocator.free(final_uri); |  | ||||||
| 
 | 
 | ||||||
|     for (handle.imports_used.items) |uri| { |     for (handle.imports_used.items) |uri| { | ||||||
|         if (std.mem.eql(u8, uri, final_uri)) { |         if (std.mem.eql(u8, uri, final_uri)) { | ||||||
| @ -548,14 +546,19 @@ pub fn resolveImport(self: *DocumentStore, handle: *Handle, import_str: []const | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // The URI must be somewhere in the import_uris | ||||||
|  |     const handle_uri = for (handle.import_uris) |uri| { | ||||||
|  |         if (std.mem.eql(u8, uri, final_uri)) { | ||||||
|  |             break uri; | ||||||
|  |         } | ||||||
|  |     } else return null; | ||||||
|  | 
 | ||||||
|     // New import. |     // New import. | ||||||
|     // Check if the import is already opened by others. |     // Check if the import is already opened by others. | ||||||
|     if (self.getHandle(final_uri)) |new_handle| { |     if (self.getHandle(final_uri)) |new_handle| { | ||||||
|         // If it is, append it to our imports, increment the count, set our new handle |         // If it is, append it to our imports, increment the count, set our new handle | ||||||
|         // and return the parsed tree root node. |         // and return the parsed tree root node. | ||||||
|         try handle.imports_used.append(self.allocator, final_uri); |         try handle.imports_used.append(self.allocator, handle_uri); | ||||||
|         consumed_final_uri = true; |  | ||||||
| 
 |  | ||||||
|         new_handle.count += 1; |         new_handle.count += 1; | ||||||
|         return new_handle; |         return new_handle; | ||||||
|     } |     } | ||||||
| @ -582,9 +585,7 @@ pub fn resolveImport(self: *DocumentStore, handle: *Handle, import_str: []const | |||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         // Add to import table of current handle. |         // Add to import table of current handle. | ||||||
|         try handle.imports_used.append(self.allocator, final_uri); |         try handle.imports_used.append(self.allocator, handle_uri); | ||||||
|         consumed_final_uri = true; |  | ||||||
| 
 |  | ||||||
|         // Swap handles. |         // Swap handles. | ||||||
|         // This takes ownership of the passed uri and text. |         // This takes ownership of the passed uri and text. | ||||||
|         const duped_final_uri = try std.mem.dupe(allocator, u8, final_uri); |         const duped_final_uri = try std.mem.dupe(allocator, u8, final_uri); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user