xo-interpreter2 stack: + reason arg to visit_gco_children()

Helps streamline DX1Collector in xo-gc/.
Want both forward and verify entry points for the same
representation.
This commit is contained in:
Roland Conybeare 2026-04-10 01:10:03 -04:00
commit d14f119a37
102 changed files with 258 additions and 167 deletions

View file

@ -50,6 +50,8 @@ public:
using AGCObjectVisitor = xo::mm::AGCObjectVisitor;
/** gc-aware object **/
using AGCObject = xo::mm::AGCObject;
/** hint when traversing gco graph **/
using VisitReason = xo::mm::VisitReason;
///@}
/** @defgroup scm-syntaxstatemachine-methods **/
@ -91,7 +93,7 @@ public:
/** update state machine for nested quoted literal @p lit **/
virtual void on_quoted_literal(Opaque data, obj<AGCObject> lit, ParserStateMachine * p_psm) = 0;
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
virtual void visit_gco_children(Opaque data, obj<AGCObjectVisitor> gc) = 0;
virtual void visit_gco_children(Opaque data, VisitReason reason, obj<AGCObjectVisitor> gc) = 0;
///@}
}; /*ASyntaxStateMachine*/

View file

@ -47,6 +47,7 @@ namespace scm {
using TypeDescr = ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = ASyntaxStateMachine::AGCObject;
using VisitReason = ASyntaxStateMachine::VisitReason;
///@}
/** @defgroup scm-syntaxstatemachine-any-methods **/
@ -75,7 +76,7 @@ namespace scm {
[[noreturn]] void on_parsed_expression(Opaque, obj<AExpression>, ParserStateMachine *) override;
[[noreturn]] void on_parsed_expression_with_token(Opaque, obj<AExpression>, const Token &, ParserStateMachine *) override;
[[noreturn]] void on_quoted_literal(Opaque, obj<AGCObject>, ParserStateMachine *) override;
[[noreturn]] void visit_gco_children(Opaque, obj<AGCObjectVisitor>) override;
[[noreturn]] void visit_gco_children(Opaque, VisitReason, obj<AGCObjectVisitor>) override;
///@}

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectExprSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectExprSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectExprSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectFormalArglistSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectFormalArglistSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectFormalArglistSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectQArraySsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectQArraySsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectQArraySsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectQListSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectQListSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectQListSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectQLiteralSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectQLiteralSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectQLiteralSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectSymbolSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectSymbolSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectSymbolSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DExpectTypeSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DExpectTypeSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DExpectTypeSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DProgressSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DProgressSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DProgressSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DSequenceSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DSequenceSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DSequenceSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -44,6 +44,7 @@ namespace xo {
using TypeDescr = xo::scm::ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = xo::scm::ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = xo::scm::ASyntaxStateMachine::AGCObject;
using VisitReason = xo::scm::ASyntaxStateMachine::VisitReason;
using Copaque = xo::scm::ASyntaxStateMachine::Copaque;
using Opaque = xo::scm::ASyntaxStateMachine::Opaque;
///@}
@ -77,7 +78,7 @@ namespace xo {
/** update state machine for nested quoted literal @p lit **/
static void on_quoted_literal(DToplevelSeqSsm & self, obj<AGCObject> lit, ParserStateMachine * p_psm);
/** gc support: visit immediate gc-aware child pointers with @p gc. Call gc.visit_child() for each **/
static void visit_gco_children(DToplevelSeqSsm & self, obj<AGCObjectVisitor> gc);
static void visit_gco_children(DToplevelSeqSsm & self, VisitReason reason, obj<AGCObjectVisitor> gc);
///@}
};

View file

@ -36,6 +36,7 @@ namespace scm {
using TypeDescr = ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = ASyntaxStateMachine::AGCObject;
using VisitReason = ASyntaxStateMachine::VisitReason;
///@}
/** @defgroup scm-syntaxstatemachine-xfer-methods **/
@ -89,8 +90,8 @@ namespace scm {
void on_quoted_literal(Opaque data, obj<AGCObject> lit, ParserStateMachine * p_psm) override {
return I::on_quoted_literal(_dcast(data), lit, p_psm);
}
void visit_gco_children(Opaque data, obj<AGCObjectVisitor> gc) override {
return I::visit_gco_children(_dcast(data), gc);
void visit_gco_children(Opaque data, VisitReason reason, obj<AGCObjectVisitor> gc) override {
return I::visit_gco_children(_dcast(data), reason, gc);
}
///@}

View file

@ -34,6 +34,7 @@ public:
using TypeDescr = ASyntaxStateMachine::TypeDescr;
using AGCObjectVisitor = ASyntaxStateMachine::AGCObjectVisitor;
using AGCObject = ASyntaxStateMachine::AGCObject;
using VisitReason = ASyntaxStateMachine::VisitReason;
///@}
/** @defgroup scm-syntaxstatemachine-router-ctors **/
@ -93,8 +94,8 @@ public:
void on_quoted_literal(obj<AGCObject> lit, ParserStateMachine * p_psm) {
return O::iface()->on_quoted_literal(O::data(), lit, p_psm);
}
void visit_gco_children(obj<AGCObjectVisitor> gc) {
return O::iface()->visit_gco_children(O::data(), gc);
void visit_gco_children(VisitReason reason, obj<AGCObjectVisitor> gc) {
return O::iface()->visit_gco_children(O::data(), reason, gc);
}
///@}