From ff0bf71889b041be794e8bd47d5be57f6eb07ad1 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 9 Dec 2020 19:51:43 +0300 Subject: Copy parent scope's test program list in runner's entry() function rather than in scope's constructor --- libbuild2/test/script/runner.cxx | 12 ++++++++++++ libbuild2/test/script/script.cxx | 29 ++++++++--------------------- libbuild2/test/script/script.hxx | 18 +++++++++--------- 3 files changed, 29 insertions(+), 30 deletions(-) (limited to 'libbuild2') diff --git a/libbuild2/test/script/runner.cxx b/libbuild2/test/script/runner.cxx index eb30e02..af5f30a 100644 --- a/libbuild2/test/script/runner.cxx +++ b/libbuild2/test/script/runner.cxx @@ -41,6 +41,18 @@ namespace build2 dr << info << "test id: " << sp.id_path.posix_string (); }); + // Note that we could probably keep the test programs sets fully + // independent across the scopes and check if the program is a test by + // traversing the scopes upwards recursively. Note though, that the + // parent scope's set cannot change during the nested scope execution + // and normally contains just a single entry. Thus, it seems more + // efficient to get rid of the recursion by copying the set from the + // parent now and potentially changing it later on the test variable + // assignment, etc. + // + if (sp.parent != nullptr) + sp.test_programs = sp.parent->test_programs; + // Scope working directory shall be empty (the script working // directory is cleaned up by the test rule prior the script // execution). diff --git a/libbuild2/test/script/script.cxx b/libbuild2/test/script/script.cxx index 32bd989..165b9b7 100644 --- a/libbuild2/test/script/script.cxx +++ b/libbuild2/test/script/script.cxx @@ -94,37 +94,24 @@ namespace build2 const_cast (id_path) = path (move (s)); } - // Calculate the working directory path and the test programs set - // unless this is the root scope (handled in an ad hoc way). + // Calculate the working directory path unless this is the root scope + // (handled in an ad hoc way). // if (p != nullptr) - { const_cast (*work_dir.path) = dir_path (*p->work_dir.path) /= id; - - // Note that we could probably keep the test programs sets fully - // independent across the scopes and check if the program is a test - // by traversing the scopes upwards recursively. Note though, that - // the parent scope's set cannot change during the nested scope - // lifetime and normally contains just a single entry. Thus, it - // seems more efficient to get rid of the recursion by copying the - // set from the parent now and potentially changing it later on the - // test variable assignment, etc. - // - test_programs_ = p->test_programs_; - } } bool scope:: test_program (const path& p) { - assert (!test_programs_.empty ()); + assert (!test_programs.empty ()); - return find_if (test_programs_.begin (), test_programs_.end (), + return find_if (test_programs.begin (), test_programs.end (), [&p] (const path* tp) { return tp != nullptr ? *tp == p : false; - }) != test_programs_.end (); + }) != test_programs.end (); } void scope:: @@ -319,7 +306,7 @@ namespace build2 // variable. Note that the value will be assigned by the below // reset_special() call. // - test_programs_.push_back (nullptr); + test_programs.push_back (nullptr); // Set the special $*, $N variables. // @@ -430,7 +417,7 @@ namespace build2 const path& p (cast (l)); s.push_back (p.representation ()); - test_programs_[0] = &p; + test_programs[0] = &p; if (auto l = lookup (root.options_var)) append (cast (l)); @@ -439,7 +426,7 @@ namespace build2 append (cast (l)); } else - test_programs_[0] = nullptr; + test_programs[0] = nullptr; // Keep redirects/cleanups out of $N. // diff --git a/libbuild2/test/script/script.hxx b/libbuild2/test/script/script.hxx index 53e4329..ea1f579 100644 --- a/libbuild2/test/script/script.hxx +++ b/libbuild2/test/script/script.hxx @@ -95,6 +95,15 @@ namespace build2 scope_state state = scope_state::unknown; + // Test program paths. + // + // Currently always contains a single element (see test_program() for + // details). While in the future there can be more of them, the zero + // index will always refer to the test variable value and can + // potentially be NULL (see reset_special() for details). + // + small_vector test_programs; + void set_variable (string&& name, names&&, @@ -174,15 +183,6 @@ namespace build2 location end_loc_; optional if_cond_; - - // Test program paths. - // - // Currently always contains a single element (see test_program() for - // details). While in the future there can be more of them, the zero - // index will always refer to the test variable value and can - // potentially be NULL (see reset_special() for details). - // - small_vector test_programs_; }; // group -- cgit v1.1