diff --git a/include/xo/reader2/SchematikaReader.hpp b/include/xo/reader2/SchematikaReader.hpp index 58c77ec8..de3da42f 100644 --- a/include/xo/reader2/SchematikaReader.hpp +++ b/include/xo/reader2/SchematikaReader.hpp @@ -12,10 +12,14 @@ namespace xo { namespace scm { struct ReaderResult { + using ACollector = xo::mm::ACollector; using span_type = xo::mm::span; bool is_tk_error() const { return tk_error_.is_error(); } + /** forward gc-aware pointers (called during gc cycle) **/ + void forward_children(obj gc) noexcept; + /** schematika expression parsed from input **/ obj expr_; /** unconsumed portion of input span @@ -35,6 +39,7 @@ namespace xo { **/ class SchematikaReader { public: + using ACollector = xo::mm::ACollector; using AAllocator = xo::mm::AAllocator; using MemorySizeVisitor = xo::mm::MemorySizeVisitor; using span_type = xo::mm::span; @@ -101,6 +106,9 @@ namespace xo { **/ void reset_to_idle_toplevel(); + /** update gc-aware child pointers **/ + void forward_children(obj gc) noexcept; + private: /** tokenizer converts a stream of chars * to a stream of lexical tokens diff --git a/src/reader2/SchematikaReader.cpp b/src/reader2/SchematikaReader.cpp index 0db3f337..ba681bab 100644 --- a/src/reader2/SchematikaReader.cpp +++ b/src/reader2/SchematikaReader.cpp @@ -9,6 +9,14 @@ namespace xo { using xo::mm::MemorySizeInfo; namespace scm { + void + ReaderResult::forward_children(obj gc) noexcept + { + gc.forward_pivot_inplace(&expr_); + } + + // ----- SchematikaReader ----- + SchematikaReader::SchematikaReader(const ReaderConfig & config, obj expr_alloc, obj aux_alloc) @@ -198,6 +206,16 @@ namespace xo { this->tokenizer_.discard_current_line(); this->parser_.reset_to_idle_toplevel(); } + + void + SchematikaReader::forward_children(obj gc) noexcept + { + // tokenizer doesn't contain any gc-aware pointers. + + parser_.forward_children(gc); + result_.forward_children(gc); + } + } /*namespace scm*/ } /*namespace xo*/