Browse Source

Fix memory leaks when using the driver

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1391/head
Dimitar Dobrev 5 years ago
parent
commit
1d9a07b693
  1. 2
      src/Generator.Tests/AST/TestAST.cs
  2. 16
      src/Generator.Tests/ASTTestFixture.cs
  3. 12
      src/Generator.Tests/ReadNativeDependenciesTest.cs
  4. 12
      src/Generator.Tests/ReadNativeSymbolsTest.cs
  5. 102
      src/Generator/Driver.cs

2
src/Generator.Tests/AST/TestAST.cs

@ -32,7 +32,7 @@ namespace CppSharp.Generator.Tests.AST
[OneTimeTearDown] [OneTimeTearDown]
public void CleanUp() public void CleanUp()
{ {
ParserOptions.Dispose(); Driver.Dispose();
} }
[Test] [Test]

16
src/Generator.Tests/ASTTestFixture.cs

@ -10,25 +10,23 @@ namespace CppSharp.Generator.Tests
public class ASTTestFixture public class ASTTestFixture
{ {
protected Driver Driver; protected Driver Driver;
protected DriverOptions Options;
protected ParserOptions ParserOptions;
protected ASTContext AstContext; protected ASTContext AstContext;
protected void ParseLibrary(params string[] files) protected void ParseLibrary(params string[] files)
{ {
Options = new DriverOptions { GeneratorKind = GeneratorKind.CSharp }; var options = new DriverOptions { GeneratorKind = GeneratorKind.CSharp };
ParserOptions = new ParserOptions(); var parserOptions = new ParserOptions();
var testsPath = GeneratorTest.GetTestsDirectory("Native"); var testsPath = GeneratorTest.GetTestsDirectory("Native");
ParserOptions.AddIncludeDirs(testsPath); parserOptions.AddIncludeDirs(testsPath);
ParserOptions.SkipPrivateDeclarations = true; parserOptions.SkipPrivateDeclarations = true;
var module = Options.AddModule("Test"); var module = options.AddModule("Test");
module.Headers.AddRange(files); module.Headers.AddRange(files);
Driver = new Driver(Options) Driver = new Driver(options)
{ {
ParserOptions = this.ParserOptions ParserOptions = parserOptions
}; };
Driver.Setup(); Driver.Setup();

12
src/Generator.Tests/ReadNativeDependenciesTest.cs

@ -39,14 +39,12 @@ namespace CppSharp.Generator.Tests
var driverOptions = new DriverOptions(); var driverOptions = new DriverOptions();
var module = driverOptions.AddModule("Test"); var module = driverOptions.AddModule("Test");
module.Libraries.Add(library); module.Libraries.Add(library);
var driver = new Driver(driverOptions) using (var driver = new Driver(driverOptions) { ParserOptions = parserOptions })
{ {
ParserOptions = parserOptions driver.Setup();
}; Assert.IsTrue(driver.ParseLibraries());
driver.Setup(); return driver.Context.Symbols.Libraries[0].Dependencies;
Assert.IsTrue(driver.ParseLibraries()); }
var dependencies = driver.Context.Symbols.Libraries[0].Dependencies;
return dependencies;
} }
} }
} }

12
src/Generator.Tests/ReadNativeSymbolsTest.cs

@ -311,14 +311,12 @@ namespace CppSharp.Generator.Tests
var driverOptions = new DriverOptions(); var driverOptions = new DriverOptions();
var module = driverOptions.AddModule("Test"); var module = driverOptions.AddModule("Test");
module.Libraries.Add(library); module.Libraries.Add(library);
var driver = new Driver(driverOptions) using (var driver = new Driver(driverOptions) { ParserOptions = parserOptions })
{ {
ParserOptions = parserOptions driver.Setup();
}; Assert.IsTrue(driver.ParseLibraries());
driver.Setup(); return driver.Context.Symbols.Libraries[0].Symbols;
Assert.IsTrue(driver.ParseLibraries()); }
var symbols = driver.Context.Symbols.Libraries[0].Symbols;
return symbols;
} }
} }
} }

102
src/Generator/Driver.cs

@ -17,7 +17,7 @@ using CppSharp.Generators.Cpp;
namespace CppSharp namespace CppSharp
{ {
public class Driver public class Driver : IDisposable
{ {
public DriverOptions Options { get; private set; } public DriverOptions Options { get; private set; }
public ParserOptions ParserOptions { get; set; } public ParserOptions ParserOptions { get; set; }
@ -399,6 +399,13 @@ namespace CppSharp
Context.GeneratorOutputPasses.AddPass(pass); Context.GeneratorOutputPasses.AddPass(pass);
} }
public void Dispose()
{
Generator.Dispose();
Context.TargetInfo?.Dispose();
ParserOptions.Dispose();
}
private bool hasParsingErrors; private bool hasParsingErrors;
} }
@ -407,72 +414,69 @@ namespace CppSharp
public static void Run(ILibrary library) public static void Run(ILibrary library)
{ {
var options = new DriverOptions(); var options = new DriverOptions();
var driver = new Driver(options); using (var driver = new Driver(options))
{
library.Setup(driver); library.Setup(driver);
driver.Setup();
if(driver.Options.Verbose) driver.Setup();
Diagnostics.Level = DiagnosticKind.Debug;
if (!options.Quiet) if (driver.Options.Verbose)
Diagnostics.Message("Parsing libraries..."); Diagnostics.Level = DiagnosticKind.Debug;
if (!driver.ParseLibraries()) if (!options.Quiet)
return; Diagnostics.Message("Parsing libraries...");
if (!options.Quiet) if (!driver.ParseLibraries())
Diagnostics.Message("Parsing code..."); return;
if (!driver.ParseCode()) if (!options.Quiet)
{ Diagnostics.Message("Parsing code...");
Diagnostics.Error("CppSharp has encountered an error while parsing code.");
return;
}
new CleanUnitPass { Context = driver.Context }.VisitASTContext(driver.Context.ASTContext); if (!driver.ParseCode())
options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any()); {
Diagnostics.Error("CppSharp has encountered an error while parsing code.");
return;
}
if (!options.Quiet) new CleanUnitPass { Context = driver.Context }.VisitASTContext(driver.Context.ASTContext);
Diagnostics.Message("Processing code..."); options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any());
driver.SetupPasses(library); if (!options.Quiet)
driver.SetupTypeMaps(); Diagnostics.Message("Processing code...");
library.Preprocess(driver, driver.Context.ASTContext); driver.SetupPasses(library);
driver.SetupTypeMaps();
driver.ProcessCode(); library.Preprocess(driver, driver.Context.ASTContext);
library.Postprocess(driver, driver.Context.ASTContext);
if (!options.Quiet) driver.ProcessCode();
Diagnostics.Message("Generating code..."); library.Postprocess(driver, driver.Context.ASTContext);
if (!options.DryRun) if (!options.Quiet)
{ Diagnostics.Message("Generating code...");
var outputs = driver.GenerateCode();
foreach (var output in outputs) if (!options.DryRun)
{ {
foreach (var pass in driver.Context.GeneratorOutputPasses.Passes) var outputs = driver.GenerateCode();
{
pass.VisitGeneratorOutput(output);
}
}
driver.SaveCode(outputs); foreach (var output in outputs)
if (driver.Options.IsCSharpGenerator && driver.Options.CompileCode)
foreach (var module in driver.Options.Modules)
{ {
driver.CompileCode(module); foreach (var pass in driver.Context.GeneratorOutputPasses.Passes)
if (driver.HasCompilationErrors) {
break; pass.VisitGeneratorOutput(output);
}
} }
}
driver.Generator.Dispose(); driver.SaveCode(outputs);
driver.Context.TargetInfo.Dispose(); if (driver.Options.IsCSharpGenerator && driver.Options.CompileCode)
driver.ParserOptions.Dispose(); foreach (var module in driver.Options.Modules)
{
driver.CompileCode(module);
if (driver.HasCompilationErrors)
break;
}
}
}
} }
} }
} }

Loading…
Cancel
Save