diff --git a/xo-alloc/include/xo/alloc/Forwarding1.hpp b/xo-alloc/include/xo/alloc/Forwarding1.hpp index 6276c1ad..77e081f9 100644 --- a/xo-alloc/include/xo/alloc/Forwarding1.hpp +++ b/xo-alloc/include/xo/alloc/Forwarding1.hpp @@ -30,7 +30,7 @@ namespace xo { /** required by Object i/face, but never called on Forwarding1 **/ virtual std::size_t _shallow_size() const final override; /** required by Object i/face, but never called on Forwarding1 **/ - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; /** required by Object i/face, but never called on Forwarding1 **/ virtual std::size_t _forward_children() final override; diff --git a/xo-alloc/include/xo/alloc/Object.hpp b/xo-alloc/include/xo/alloc/Object.hpp index 5727331e..849cf9bb 100644 --- a/xo-alloc/include/xo/alloc/Object.hpp +++ b/xo-alloc/include/xo/alloc/Object.hpp @@ -57,6 +57,9 @@ namespace xo { return (u2 <= u1 + sizeof(std::uintptr_t)); } + /** (for consistency's sake) **/ + T * get() const { return ptr_; } + T * ptr() const { return ptr_; } T ** ptr_address() { return &ptr_; } @@ -204,7 +207,7 @@ namespace xo { * * Require: @ref mm is an instance of @ref gc::GC **/ - virtual Object * _shallow_copy() const = 0; + virtual Object * _shallow_copy(gc::IAlloc * mm) const = 0; /** update child pointers that refer to forwarding pointers, * replacing them with the correct destination. diff --git a/xo-alloc/src/alloc/Forwarding1.cpp b/xo-alloc/src/alloc/Forwarding1.cpp index 4b47e4f2..b4a44ff6 100644 --- a/xo-alloc/src/alloc/Forwarding1.cpp +++ b/xo-alloc/src/alloc/Forwarding1.cpp @@ -52,7 +52,7 @@ namespace xo { // LCOV_EXCL_START Object * - Forwarding1::_shallow_copy() const { + Forwarding1::_shallow_copy(gc::IAlloc *) const { assert(false); return nullptr; } diff --git a/xo-alloc/src/alloc/Object.cpp b/xo-alloc/src/alloc/Object.cpp index 475d84ad..309e0886 100644 --- a/xo-alloc/src/alloc/Object.cpp +++ b/xo-alloc/src/alloc/Object.cpp @@ -170,7 +170,7 @@ namespace xo { */ if (gc->fromspace_contains(src)) { - Object * dest = src->_shallow_copy(); + Object * dest = src->_shallow_copy(gc); if (dest != src) src->_forward_to(dest); diff --git a/xo-interpreter/include/xo/interpreter/GlobalEnv.hpp b/xo-interpreter/include/xo/interpreter/GlobalEnv.hpp index d45f9cb4..bed452da 100644 --- a/xo-interpreter/include/xo/interpreter/GlobalEnv.hpp +++ b/xo-interpreter/include/xo/interpreter/GlobalEnv.hpp @@ -12,6 +12,9 @@ namespace xo { * @brief Top-level global environment **/ class GlobalEnv : public Env { + public: + using map_type = std::map>; + public: /** Create top-level global environment, allocating via @p mm. * Expect one of these per interpreter session. @@ -19,7 +22,9 @@ namespace xo { static gp make_empty(gc::IAlloc * mm, const rp & symtab); +#ifdef NOT_USING gc::IAlloc * get_mm() const { return mm_; } +#endif // inherited from Env.. virtual bool local_contains_var(const std::string & vname) const final override; @@ -29,10 +34,11 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: + GlobalEnv(const GlobalEnv & x); GlobalEnv(gc::IAlloc * mm, const rp & symtab); private: @@ -56,7 +62,7 @@ namespace xo { * TODO: probably want to hash here instead. * May also want lhs names to be separately hashed symbols **/ - std::map> slot_map_; + up slot_map_; }; } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-interpreter/include/xo/interpreter/LocalEnv.hpp b/xo-interpreter/include/xo/interpreter/LocalEnv.hpp index f7515fa2..e762d7d7 100644 --- a/xo-interpreter/include/xo/interpreter/LocalEnv.hpp +++ b/xo-interpreter/include/xo/interpreter/LocalEnv.hpp @@ -102,7 +102,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-interpreter/src/interpreter/GlobalEnv.cpp b/xo-interpreter/src/interpreter/GlobalEnv.cpp index 5ecb598d..38b9ff1c 100644 --- a/xo-interpreter/src/interpreter/GlobalEnv.cpp +++ b/xo-interpreter/src/interpreter/GlobalEnv.cpp @@ -16,9 +16,17 @@ namespace xo { return new GlobalEnv(mm, symtab); } + GlobalEnv::GlobalEnv(const GlobalEnv & x) + : mm_{x.mm_}, + symtab_{x.symtab_}, + slot_map_{std::make_unique(*x.slot_map_)} + { + } + GlobalEnv::GlobalEnv(gc::IAlloc * mm, const rp & symtab) : mm_{mm}, - symtab_{symtab} + symtab_{symtab}, + slot_map_{std::make_unique()} {} bool @@ -52,7 +60,7 @@ namespace xo { this->symtab_->require_global(var->name(), var); - this->slot_map_[var->name()] = gp(); + (*this->slot_map_)[var->name()] = gp(); } TaggedPtr @@ -64,31 +72,29 @@ namespace xo { void GlobalEnv::display(std::ostream & os) const { - os << ""; + os << "size()) << ">"; } std::size_t GlobalEnv::_shallow_size() const { - /** 0: since not allocated in gc-space */ - return 0; + return sizeof(GlobalEnv); } Object * - GlobalEnv::_shallow_copy() const + GlobalEnv::_shallow_copy(gc::IAlloc * mm) const { - /* by design, don't copy; not subject to GC */ - return const_cast(this); + Cpof cpof(mm, this); + + return new (cpof) GlobalEnv(*this); } std::size_t GlobalEnv::_forward_children() { - /* All global slots are treated as GC roots; this means we - * don't have to forward them - * - * This works only as long as global env is immortal. - */ + for (auto & ix : *slot_map_) { + Object::_forward_inplace(ix.second); + } return _shallow_size(); } } /*namespace scm*/ diff --git a/xo-interpreter/src/interpreter/LocalEnv.cpp b/xo-interpreter/src/interpreter/LocalEnv.cpp index 38cea06d..6042d00d 100644 --- a/xo-interpreter/src/interpreter/LocalEnv.cpp +++ b/xo-interpreter/src/interpreter/LocalEnv.cpp @@ -97,9 +97,9 @@ namespace xo { } Object * - LocalEnv::_shallow_copy() const + LocalEnv::_shallow_copy(gc::IAlloc * mm) const { - Cpof cpof(Object::mm, this); + Cpof cpof(mm, this); size_t z = size(); diff --git a/xo-object/include/xo/object/Boolean.hpp b/xo-object/include/xo/object/Boolean.hpp index 66f01ed7..e0b9217c 100644 --- a/xo-object/include/xo/object/Boolean.hpp +++ b/xo-object/include/xo/object/Boolean.hpp @@ -24,7 +24,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-object/include/xo/object/Float.hpp b/xo-object/include/xo/object/Float.hpp index 7ca1a8c0..507aefff 100644 --- a/xo-object/include/xo/object/Float.hpp +++ b/xo-object/include/xo/object/Float.hpp @@ -29,7 +29,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-object/include/xo/object/Integer.hpp b/xo-object/include/xo/object/Integer.hpp index 5f3a2d86..d3ebd22d 100644 --- a/xo-object/include/xo/object/Integer.hpp +++ b/xo-object/include/xo/object/Integer.hpp @@ -29,7 +29,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-object/include/xo/object/List.hpp b/xo-object/include/xo/object/List.hpp index 6272d0a2..cc601a16 100644 --- a/xo-object/include/xo/object/List.hpp +++ b/xo-object/include/xo/object/List.hpp @@ -58,7 +58,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-object/include/xo/object/String.hpp b/xo-object/include/xo/object/String.hpp index b63744aa..90d8c536 100644 --- a/xo-object/include/xo/object/String.hpp +++ b/xo-object/include/xo/object/String.hpp @@ -36,7 +36,7 @@ namespace xo { virtual TaggedPtr self_tp() const final override; virtual void display(std::ostream & os) const final override; virtual std::size_t _shallow_size() const final override; - virtual Object * _shallow_copy() const final override; + virtual Object * _shallow_copy(gc::IAlloc * mm) const final override; virtual std::size_t _forward_children() final override; private: diff --git a/xo-object/src/object/Boolean.cpp b/xo-object/src/object/Boolean.cpp index 43d822a3..13cf3f01 100644 --- a/xo-object/src/object/Boolean.cpp +++ b/xo-object/src/object/Boolean.cpp @@ -56,7 +56,7 @@ namespace xo { // LCOV_EXCL_START Object * - Boolean::_shallow_copy() const + Boolean::_shallow_copy(gc::IAlloc *) const { /* Boolean instances not created in GC-owned space, diff --git a/xo-object/src/object/Float.cpp b/xo-object/src/object/Float.cpp index b723dbfd..4939fa49 100644 --- a/xo-object/src/object/Float.cpp +++ b/xo-object/src/object/Float.cpp @@ -42,8 +42,8 @@ namespace xo { } Object * - Float::_shallow_copy() const { - Cpof cpof(Object::mm, this); + Float::_shallow_copy(gc::IAlloc * mm) const { + Cpof cpof(mm, this); return new (cpof) Float(*this); } diff --git a/xo-object/src/object/Integer.cpp b/xo-object/src/object/Integer.cpp index 4d5f663f..f5587b1f 100644 --- a/xo-object/src/object/Integer.cpp +++ b/xo-object/src/object/Integer.cpp @@ -43,8 +43,8 @@ namespace xo { } Object * - Integer::_shallow_copy() const { - Cpof cpof(Object::mm, this); + Integer::_shallow_copy(gc::IAlloc * mm) const { + Cpof cpof(mm, this); return new (cpof) Integer(*this); } diff --git a/xo-object/src/object/List.cpp b/xo-object/src/object/List.cpp index 91674920..a82c7cc5 100644 --- a/xo-object/src/object/List.cpp +++ b/xo-object/src/object/List.cpp @@ -97,12 +97,12 @@ namespace xo { } Object * - List::_shallow_copy() const { - scope log(XO_DEBUG(Object::mm->debug_flag())); + List::_shallow_copy(gc::IAlloc * mm) const { + scope log(XO_DEBUG(mm->debug_flag())); assert(!(this->is_nil())); - Cpof cpof(Object::mm, this); + Cpof cpof(mm, this); return new (cpof) List(*this); } diff --git a/xo-object/src/object/String.cpp b/xo-object/src/object/String.cpp index c5de286e..400d187c 100644 --- a/xo-object/src/object/String.cpp +++ b/xo-object/src/object/String.cpp @@ -126,11 +126,11 @@ namespace xo { } Object * - String::_shallow_copy() const + String::_shallow_copy(gc::IAlloc * mm) const { // Reminder: String must come before secondary allocation, - Cpof cpof(Object::mm, this); + Cpof cpof(mm, this); // might expect to write: // gp copy = new (gcm) String(Object::mm, owner_, z_chars_, chars_);