From ce800d700c141ee543db8ba9ef6f759442c37dac Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sat, 28 Mar 2026 09:43:43 -0400 Subject: [PATCH] xo-reader2: expand utest to run gc [WIP] --- src/reader2/DLambdaSsm.cpp | 4 + src/reader2/ParserStateMachine.cpp | 9 + utest/SchematikaParser.test.cpp | 411 ++++++++++++++++++----------- 3 files changed, 267 insertions(+), 157 deletions(-) diff --git a/src/reader2/DLambdaSsm.cpp b/src/reader2/DLambdaSsm.cpp index 8f5a0bc3..d23f04e6 100644 --- a/src/reader2/DLambdaSsm.cpp +++ b/src/reader2/DLambdaSsm.cpp @@ -477,6 +477,10 @@ namespace xo { DLambdaSsm::forward_children(obj gc) noexcept { gc.forward_inplace(&local_symtab_); + + // explicit_return_td not gcobject + // lambda_td not gcobject + gc.forward_pivot_inplace(&body_); gc.forward_pivot_inplace(&parent_symtab_); } diff --git a/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 0b95da88..bb5fd4c8 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/src/reader2/ParserStateMachine.cpp @@ -913,9 +913,12 @@ namespace xo { void ParserStateMachine::forward_children(obj gc) noexcept { + scope log(XO_DEBUG(true)); + assert(!stringtable_.is_gc_eligible()); assert(!parser_alloc_.is_gc_eligible()); + log && log("forward stack_"); if (stack_) { stack_->forward_children(gc); } @@ -923,10 +926,16 @@ namespace xo { // static_assert(!expr_alloc_.is_gc_eligible()); // static_assert(!aux_alloc_.is_gc_eligible()); + log && log("global_symtab_"); gc.forward_inplace(&global_symtab_); + + log && log("local_symtab_"); gc.forward_inplace(&local_symtab_); + + log && log("global_env_"); gc.forward_inplace(&global_env_); + log && log("result_"); result_.forward_children(gc); } diff --git a/utest/SchematikaParser.test.cpp b/utest/SchematikaParser.test.cpp index 87f16e78..df0f5e56 100644 --- a/utest/SchematikaParser.test.cpp +++ b/utest/SchematikaParser.test.cpp @@ -77,7 +77,7 @@ namespace xo { = (X1CollectorConfig() .with_name("gc") .with_size(32 * 1024) - .with_debug_flag(true) + .with_debug_flag(debug_flag) .with_sanitize_flag(true)); dp expr_x1_dp @@ -371,10 +371,10 @@ namespace xo { test_subject(&fixture); } - } } +#ifdef NOPE TEST_CASE("SchematikaParser-batch-def", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); @@ -490,82 +490,87 @@ namespace xo { c_debug_flag_v); } -#ifdef NOPE + namespace { + void test_interactive_def2(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; + + parser->begin_interactive_session(); + + { + /** Walkthrough parsing input equivalent to: + * + * def foo : f64 = 3.141593 ; + * + **/ + + std::vector tk_v{ + Token::def_token(), + Token::symbol_token("foo"), + Token::colon_token(), + Token::symbol_token("f64"), + Token::singleassign_token(), + Token::f64_token("3.141593"), + Token::semicolon_token(), + }; + + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); + + const auto & result = parser->result(); + { + auto expr = obj::from(result.result_expr()); + REQUIRE(expr); + } + + parser->reset_result(); + } + + { + /** Walkthrough parsing input equivalent to: + * + * foo ; + * + **/ + + std::vector tk_v{ +// Token::f64_token("2.0"), +// Token::star_token(), + Token::symbol_token("foo"), + Token::semicolon_token(), + }; + + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); + + const auto & result = parser->result(); + { + auto expr = obj::from(result.result_expr()); + REQUIRE(expr); + } + } + + log && fixture->log_memory_layout(&log); + } + } + TEST_CASE("SchematikaParser-interactive-def2", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; - - parser->begin_interactive_session(); - - { - /** Walkthrough parsing input equivalent to: - * - * def foo : f64 = 3.141593 ; - * - **/ - - std::vector tk_v{ - Token::def_token(), - Token::symbol_token("foo"), - Token::colon_token(), - Token::symbol_token("f64"), - Token::singleassign_token(), - Token::f64_token("3.141593"), - Token::semicolon_token(), - }; - - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); - - const auto & result = parser->result(); - { - auto expr = obj::from(result.result_expr()); - REQUIRE(expr); - } - - parser->reset_result(); - } - - { - /** Walkthrough parsing input equivalent to: - * - * foo ; - * - **/ - - std::vector tk_v{ -// Token::f64_token("2.0"), -// Token::star_token(), - Token::symbol_token("foo"), - Token::semicolon_token(), - }; - - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); - - const auto & result = parser->result(); - { - auto expr = obj::from(result.result_expr()); - REQUIRE(expr); - } - } - - log && fixture.log_memory_layout(&log); + test_driver(testname, + &test_interactive_def2, + c_debug_flag_v); } - TEST_CASE("SchematikaParser-interactive-integer", "[reader2][SchematikaParser]") + void test_interactive_integer(ParserFixture * fixture) { - const auto & testname = Catch::getResultCapture().getCurrentTestName(); + scope log(XO_DEBUG(fixture->debug_flag_)); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); - - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -615,18 +620,26 @@ namespace xo { //// illegal input on token //REQUIRE(result.error_description()); - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-float", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-integer", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_integer, + c_debug_flag_v); + } + + void test_interactive_float(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -676,18 +689,26 @@ namespace xo { //// illegal input on token //REQUIRE(result.error_description()); - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-string", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-float", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_float, + c_debug_flag_v); + } + + void test_interactive_string(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -737,18 +758,26 @@ namespace xo { //// illegal input on token //REQUIRE(result.error_description()); - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-nil", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-string", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_string, + c_debug_flag_v); + } + + void test_interactive_nil(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -798,18 +827,26 @@ namespace xo { //// illegal input on token //REQUIRE(result.error_description()); - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-arith", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-nil", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_nil, + c_debug_flag_v); + } + + void test_interactive_arith(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -826,7 +863,7 @@ namespace xo { Token::semicolon_token(), }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -857,18 +894,26 @@ namespace xo { REQUIRE(rhs_f64->value() == 0.5); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-arith2", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-arith", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_arith, + c_debug_flag_v); + } + + void test_interactive_arith2(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -885,9 +930,7 @@ namespace xo { Token::semicolon_token(), }; - INFO(testname); - - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -918,18 +961,26 @@ namespace xo { REQUIRE(rhs_f64->value() == 10.0); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-arith3", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-arith2", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_arith2, + c_debug_flag_v); + } + + void test_interactive_arith3(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -948,9 +999,7 @@ namespace xo { Token::semicolon_token(), }; - INFO(testname); - - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -988,18 +1037,26 @@ namespace xo { REQUIRE(rhs_i64->value() == 3); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-arith4", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-arith3", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = true; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_arith3, + c_debug_flag_v); + } + + void test_interactive_arith4(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -1018,9 +1075,7 @@ namespace xo { Token::semicolon_token(), }; - INFO(testname); - - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -1057,7 +1112,19 @@ namespace xo { REQUIRE(rhs_rhs_i64->value() == 3); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); + } /*test_interactive_arith4*/ + + TEST_CASE("SchematikaParser-interactive-arith4", "[reader2][SchematikaParser]") + { + const auto & testname = Catch::getResultCapture().getCurrentTestName(); + + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; + + test_driver(testname, + &test_interactive_arith4, + c_debug_flag_v); } #ifdef OBSOLETE @@ -1133,16 +1200,11 @@ namespace xo { } #endif - TEST_CASE("SchematikaParser-interactive-cmpne", "[reader2][SchematikaParser]") + void test_interactive_cmpne(ParserFixture * fixture) { - const auto & testname = Catch::getResultCapture().getCurrentTestName(); + scope log(XO_DEBUG(fixture->debug_flag_)); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), - xtag("test", testname)); - - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -1160,7 +1222,7 @@ namespace xo { /* [3] */ Token::semicolon_token(), }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -1191,19 +1253,26 @@ namespace xo { REQUIRE(rhs_i64->value() == 312); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-cmpeq", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-cmpne", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), - xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_cmpne, + c_debug_flag_v); + } + + void test_interactive_cmpeq(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -1221,7 +1290,7 @@ namespace xo { /* [3] */ Token::semicolon_token(), }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); const auto & result = parser->result(); { @@ -1252,19 +1321,26 @@ namespace xo { REQUIRE(rhs_i64->value() == 312); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-if1", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-cmpeq", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), - xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_cmpeq, + c_debug_flag_v); + } + + void test_interactive_if1(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -1284,7 +1360,7 @@ namespace xo { /* [4] */ Token::semicolon_token() }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); } { @@ -1321,7 +1397,7 @@ namespace xo { /* [c] */ Token::semicolon_token() }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); } const auto & result = parser->result(); @@ -1330,18 +1406,27 @@ namespace xo { REQUIRE(expr); } - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } - TEST_CASE("SchematikaParser-interactive-lambda", "[reader2][SchematikaParser]") + TEST_CASE("SchematikaParser-interactive-if1", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); - constexpr bool c_debug_flag = false; - scope log(XO_DEBUG(c_debug_flag), xtag("test", testname)); + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, false}}; - ParserFixture fixture(testname, false /*!gc*/, c_debug_flag); - auto parser = fixture.parser_; + test_driver(testname, + &test_interactive_if1, + c_debug_flag_v); + } +#endif + + void test_interactive_lambda(ParserFixture * fixture) + { + scope log(XO_DEBUG(fixture->debug_flag_)); + + auto parser = fixture->parser_; parser->begin_interactive_session(); @@ -1371,11 +1456,23 @@ namespace xo { /* [ e] */ Token::rightbrace_token(), }; - utest_tokenizer_loop(&fixture, tk_v, c_debug_flag); + utest_tokenizer_loop(fixture, tk_v, fixture->debug_flag_); - log && fixture.log_memory_layout(&log); + log && fixture->log_memory_layout(&log); } + TEST_CASE("SchematikaParser-interactive-lambda", "[reader2][SchematikaParser]") + { + const auto & testname = Catch::getResultCapture().getCurrentTestName(); + + // [0] arena; [1] gc + constexpr std::array c_debug_flag_v = {{false, true}}; + test_driver(testname, + &test_interactive_lambda, + c_debug_flag_v); + } + +#ifdef NOPE TEST_CASE("SchematikaParser-interactive-if2", "[reader2][SchematikaParser]") { const auto & testname = Catch::getResultCapture().getCurrentTestName(); @@ -1894,7 +1991,7 @@ namespace xo { log && fixture.log_memory_layout(&log); } - +#endif } /*namespace ut*/ } /*namespace xo*/