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 { | ||||
|     std.debug.print("RESOLVING IMPORT STR: {s}\n", .{import_str}); | ||||
|     const allocator = self.allocator; | ||||
|     const final_uri = (try self.uriFromImportStr( | ||||
|         self.allocator, | ||||
|         handle.*, | ||||
|         import_str, | ||||
|     )) orelse return null; | ||||
|     var consumed_final_uri = false; | ||||
|     defer if (!consumed_final_uri) allocator.free(final_uri); | ||||
|     defer allocator.free(final_uri); | ||||
| 
 | ||||
|     for (handle.imports_used.items) |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. | ||||
|     // Check if the import is already opened by others. | ||||
|     if (self.getHandle(final_uri)) |new_handle| { | ||||
|         // If it is, append it to our imports, increment the count, set our new handle | ||||
|         // and return the parsed tree root node. | ||||
|         try handle.imports_used.append(self.allocator, final_uri); | ||||
|         consumed_final_uri = true; | ||||
| 
 | ||||
|         try handle.imports_used.append(self.allocator, handle_uri); | ||||
|         new_handle.count += 1; | ||||
|         return new_handle; | ||||
|     } | ||||
| @ -582,9 +585,7 @@ pub fn resolveImport(self: *DocumentStore, handle: *Handle, import_str: []const | ||||
|         }; | ||||
| 
 | ||||
|         // Add to import table of current handle. | ||||
|         try handle.imports_used.append(self.allocator, final_uri); | ||||
|         consumed_final_uri = true; | ||||
| 
 | ||||
|         try handle.imports_used.append(self.allocator, handle_uri); | ||||
|         // Swap handles. | ||||
|         // This takes ownership of the passed uri and text. | ||||
|         const duped_final_uri = try std.mem.dupe(allocator, u8, final_uri); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user