73 lines
2.6 KiB
C++
73 lines
2.6 KiB
C++
/** @file GlobalEnv.hpp **/
|
|
|
|
#pragma once
|
|
|
|
#include "Env.hpp"
|
|
#include "xo/alloc/IAlloc.hpp"
|
|
#include "xo/expression/GlobalSymtab.hpp"
|
|
|
|
namespace xo {
|
|
namespace scm {
|
|
/** @class GlobalEnv
|
|
* @brief Top-level global environment
|
|
**/
|
|
class GlobalEnv : public Env {
|
|
public:
|
|
using map_type = std::map<std::string, gp<Object>>;
|
|
|
|
public:
|
|
/** Create top-level global environment, allocating via @p mm.
|
|
* Expect one of these per interpreter session.
|
|
**/
|
|
static gp<GlobalEnv> make_empty(gc::IAlloc * mm,
|
|
const rp<GlobalSymtab> & symtab);
|
|
|
|
#ifdef NOT_USING
|
|
gc::IAlloc * get_mm() const { return mm_; }
|
|
#endif
|
|
|
|
const rp<GlobalSymtab> & symtab() const { return symtab_; }
|
|
|
|
// inherited from Env..
|
|
virtual bool local_contains_var(const std::string & vname) const final override;
|
|
virtual gp<Object> * lookup_slot(const std::string & vname) final override;
|
|
virtual gp<Object> * establish_var(bp<Variable> var) final override;
|
|
|
|
// inherited from Object..
|
|
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(gc::IAlloc * mm) const final override;
|
|
virtual std::size_t _forward_children(gc::IAlloc * mm) final override;
|
|
|
|
private:
|
|
GlobalEnv(const GlobalEnv & x);
|
|
GlobalEnv(gc::IAlloc * mm, const rp<GlobalSymtab> & symtab);
|
|
|
|
private:
|
|
/** memory manager to use **/
|
|
gc::IAlloc * mm_ = nullptr;
|
|
|
|
/** global symbol table.
|
|
* variables known to @c symtab_ are represented by
|
|
* corresponding values in @p slot_map_
|
|
**/
|
|
rp<GlobalSymtab> symtab_;
|
|
|
|
/** environment contents.
|
|
* expression @c symtab_->lookup_binding(vname)
|
|
* has associated value @c slot_map_.at(vname)
|
|
*
|
|
* TODO: replace with something subject to GC ?
|
|
* every member of @ref slot_map_ will have to be a
|
|
* GC root
|
|
*
|
|
* TODO: probably want to hash here instead.
|
|
* May also want lhs names to be separately hashed symbols
|
|
**/
|
|
up<map_type> slot_map_;
|
|
};
|
|
} /*namespace scm*/
|
|
} /*namespace xo*/
|
|
|
|
/* end GlobalEnv.hpp */
|