From 13a6dacb827ac9d52bc9bfd344f6f79b288a334c Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Mon, 15 Jun 2026 16:47:23 +1200 Subject: [PATCH 1/5] Create test showing generator holding onto analyserModel. --- tests/generator/generator.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/generator/generator.cpp b/tests/generator/generator.cpp index 411080c523..4677dd5edb 100644 --- a/tests/generator/generator.cpp +++ b/tests/generator/generator.cpp @@ -1754,3 +1754,30 @@ TEST(Generator, generateCodeUsingProfileEnum) EXPECT_EQ_FILE_CONTENTS("generator/algebraic_eqn_computed_var_on_rhs/model.py", generator->implementationCode(analyserModel, libcellml::GeneratorProfile::Profile::PYTHON)); } + +TEST(Generator, checkGeneratorReleasesAnalyserModel) +{ + + auto parser = libcellml::Parser::create(); + auto algebraicModel = parser->parseModel(fileContents("generator/algebraic_eqn_computed_var_on_rhs/model.cellml")); + + auto analyser = libcellml::Analyser::create(); + + analyser->analyseModel(algebraicModel); + + auto analyserModel = analyser->analyserModel(); + + EXPECT_EQ(2, analyserModel.use_count()); + + EXPECT_EQ("x = a", libcellml::Generator::equationCode(analyserModel->analyserEquation(0)->ast())); + + EXPECT_EQ(2, analyserModel.use_count()); + + auto generator = libcellml::Generator::create(); + + EXPECT_EQ_FILE_CONTENTS("generator/algebraic_eqn_computed_var_on_rhs/model.c", generator->implementationCode(analyserModel)); + EXPECT_EQ(2, analyserModel.use_count()); + + EXPECT_EQ_FILE_CONTENTS("generator/algebraic_eqn_computed_var_on_rhs/model.h", generator->interfaceCode(analyserModel)); + EXPECT_EQ(2, analyserModel.use_count()); +} From 432049bf41f347299ec430039647d3ddedfa9eb3 Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Mon, 15 Jun 2026 17:01:59 +1200 Subject: [PATCH 2/5] Fix Generator holding onto AnalyserModel handles. --- src/generator.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/generator.cpp b/src/generator.cpp index be3bd6096e..694427ae28 100644 --- a/src/generator.cpp +++ b/src/generator.cpp @@ -2282,6 +2282,7 @@ std::string Generator::interfaceCode(const AnalyserModelPtr &analyserModel, cons pFunc()->addInterfaceComputeModelMethodsCode(); + pFunc()->mAnalyserModel = nullptr; return pFunc()->mCode; } @@ -2414,6 +2415,7 @@ std::string Generator::implementationCode(const AnalyserModelPtr &analyserModel, pFunc()->addImplementationComputeVariablesMethodCode(remainingAnalyserEquations); + pFunc()->mAnalyserModel = nullptr; return pFunc()->mCode; } From f436327214ab83d9d08fcf7dcfe722c117e144e1 Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Mon, 15 Jun 2026 17:15:23 +1200 Subject: [PATCH 3/5] Fix code formatting error in tests/generator/generator.cpp. --- tests/generator/generator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/generator/generator.cpp b/tests/generator/generator.cpp index 4677dd5edb..aabf9c79b2 100644 --- a/tests/generator/generator.cpp +++ b/tests/generator/generator.cpp @@ -1757,7 +1757,6 @@ TEST(Generator, generateCodeUsingProfileEnum) TEST(Generator, checkGeneratorReleasesAnalyserModel) { - auto parser = libcellml::Parser::create(); auto algebraicModel = parser->parseModel(fileContents("generator/algebraic_eqn_computed_var_on_rhs/model.cellml")); From e5afa1a6d772ef9d25e77288e4c93c6ee1c84312 Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Tue, 7 Jul 2026 10:18:27 +1200 Subject: [PATCH 4/5] Address review coments. --- src/generator.cpp | 2 ++ tests/generator/generator.cpp | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/generator.cpp b/src/generator.cpp index 694427ae28..4a4ecc2ec4 100644 --- a/src/generator.cpp +++ b/src/generator.cpp @@ -2283,6 +2283,7 @@ std::string Generator::interfaceCode(const AnalyserModelPtr &analyserModel, cons pFunc()->addInterfaceComputeModelMethodsCode(); pFunc()->mAnalyserModel = nullptr; + return pFunc()->mCode; } @@ -2416,6 +2417,7 @@ std::string Generator::implementationCode(const AnalyserModelPtr &analyserModel, pFunc()->addImplementationComputeVariablesMethodCode(remainingAnalyserEquations); pFunc()->mAnalyserModel = nullptr; + return pFunc()->mCode; } diff --git a/tests/generator/generator.cpp b/tests/generator/generator.cpp index aabf9c79b2..f9d81c6b5b 100644 --- a/tests/generator/generator.cpp +++ b/tests/generator/generator.cpp @@ -1758,11 +1758,10 @@ TEST(Generator, generateCodeUsingProfileEnum) TEST(Generator, checkGeneratorReleasesAnalyserModel) { auto parser = libcellml::Parser::create(); - auto algebraicModel = parser->parseModel(fileContents("generator/algebraic_eqn_computed_var_on_rhs/model.cellml")); - + auto model = parser->parseModel(fileContents("generator/algebraic_eqn_computed_var_on_rhs/model.cellml")); auto analyser = libcellml::Analyser::create(); - analyser->analyseModel(algebraicModel); + analyser->analyseModel(model); auto analyserModel = analyser->analyserModel(); From 326404a7351eb38a785f99cc4585a0646a99d79e Mon Sep 17 00:00:00 2001 From: Hugh Sorby Date: Tue, 7 Jul 2026 11:10:51 +1200 Subject: [PATCH 5/5] Delete empty lines. --- tests/generator/generator.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/generator/generator.cpp b/tests/generator/generator.cpp index f9d81c6b5b..13af89e313 100644 --- a/tests/generator/generator.cpp +++ b/tests/generator/generator.cpp @@ -1766,9 +1766,7 @@ TEST(Generator, checkGeneratorReleasesAnalyserModel) auto analyserModel = analyser->analyserModel(); EXPECT_EQ(2, analyserModel.use_count()); - EXPECT_EQ("x = a", libcellml::Generator::equationCode(analyserModel->analyserEquation(0)->ast())); - EXPECT_EQ(2, analyserModel.use_count()); auto generator = libcellml::Generator::create();