diff --git a/include/xo/interpreter2/VirtualSchematikaMachine.hpp b/include/xo/interpreter2/VirtualSchematikaMachine.hpp index 1e19bcdb..1bfa5ecb 100644 --- a/include/xo/interpreter2/VirtualSchematikaMachine.hpp +++ b/include/xo/interpreter2/VirtualSchematikaMachine.hpp @@ -100,6 +100,9 @@ namespace xo { /** visit vsm-owned memory pools; call visitor(info) for each **/ void visit_pools(const MemorySizeVisitor & visitor) const; + /** install hardwired functions into global {symtab,env} **/ + void install_core_primitives(); + /** begin interactive session. **/ void begin_interactive_session(); /** begin batch session **/ diff --git a/src/interpreter2/VirtualSchematikaMachine.cpp b/src/interpreter2/VirtualSchematikaMachine.cpp index c2221aed..dc600768 100644 --- a/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/src/interpreter2/VirtualSchematikaMachine.cpp @@ -20,9 +20,9 @@ #include #include #include -//#include -#include -#include +#include +#include +#include #include #include #include @@ -32,8 +32,9 @@ namespace xo { using xo::print::APrintable; using xo::print::ppconfig; using xo::print::ppstate_standalone; + using xo::reflect::Reflect; using xo::mm::AGCObject; - //using xo::mm::MemorySizeInfo; // not used yet + using xo::mm::MemorySizeInfo; using xo::mm::AAllocator; using xo::mm::DX1Collector; using xo::mm::DArena; @@ -60,9 +61,10 @@ namespace xo { VirtualSchematikaMachine::VirtualSchematikaMachine(const VsmConfig & config, obj aux_mm) : config_{config}, - mm_(abox::make(aux_mm, config.x1_config_)), - rcx_(abox::make(aux_mm, this)), - reader_{config.rdr_config_, mm_.to_op(), aux_mm} + aux_mm_{aux_mm}, + mm_(abox::make(aux_mm_, config.x1_config_)), + rcx_(abox::make(aux_mm_, this)), + reader_{config.rdr_config_, mm_.to_op(), aux_mm_} { { DArena * arena = new DArena(config_.error_config_); @@ -72,6 +74,8 @@ namespace xo { } this->global_env_ = DGlobalEnv::_make(mm_.to_op(), reader_.global_symtab()); + + this->install_core_primitives(); } obj @@ -95,6 +99,7 @@ namespace xo { void VirtualSchematikaMachine::visit_pools(const MemorySizeVisitor & visitor) const { + aux_mm_.visit_pools(visitor); mm_.visit_pools(visitor); error_mm_.visit_pools(visitor); reader_.visit_pools(visitor); @@ -857,7 +862,43 @@ namespace xo { } } + obj + xfer_report_memory_use(obj rcx) + { + scope log(XO_DEBUG(true)); + + auto visitor = [&log](const MemorySizeInfo & info) { + log && log(xtag("resource", info.resource_name_), + xtag("used", info.used_), + xtag("alloc", info.allocated_), + xtag("commit", info.committed_), + xtag("resv", info.reserved_)); + }; + + rcx.visit_pools(visitor); + + return DBoolean::box(rcx.allocator(), true); + } + + static DPrimitive_gco_0 s_report_memory_use_pm("_report_memory_use", + &xfer_report_memory_use); + + void + VirtualSchematikaMachine::install_core_primitives() + { + { + const DUniqueString * name + = reader_.intern_string("report_memory_use"); + + global_env_->_upsert_value + (mm_.to_op(), + name, + Reflect::require(), + obj(&s_report_memory_use_pm)); + } + } + } /*namespace scm*/ } /*namespace xo*/ -/* end VirtualSchematikaMachine.hpp */ +/* end VirtualSchematikaMachine.cpp */